Commit: 28f11d30ddc750e472dd22fdd949833ae3fb0ede
Author: Lukas Tönne
Date:   Sun Jun 10 08:09:11 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB28f11d30ddc750e472dd22fdd949833ae3fb0ede

Support hair fiber drawing in the workbench engine.

===================================================================

M       source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M       source/blender/draw/engines/workbench/workbench_deferred.c
M       source/blender/draw/engines/workbench/workbench_forward.c
M       source/blender/draw/engines/workbench/workbench_materials.c
M       source/blender/draw/engines/workbench/workbench_private.h

===================================================================

diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl 
b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
index 702978adfd7..fbcdfd66572 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
@@ -8,16 +8,14 @@ uniform mat3 WorldNormalMatrix;
 uniform mat3 NormalMatrix;
 #endif
 
-#ifdef HAIR_SHADER
-
+#ifndef HAIR_SHADER
+in vec3 pos;
+in vec3 nor;
+#else
 #ifdef HAIR_SHADER_FIBERS
 in int fiber_index;
 in float curve_param;
 #endif
-
-#else
-in vec3 pos;
-in vec3 nor;
 #endif
 
 out vec3 worldPosition;
@@ -50,7 +48,7 @@ void main()
 #ifdef HAIR_SHADER
        bool is_persp = (ProjectionMatrix[3][3] == 0.0);
 
-#ifdef HAIR_SHADER_FIBERS
+#  ifdef HAIR_SHADER_FIBERS
        vec3 pos, tang, binor;
        hair_fiber_get_vertex(
                fiber_index, curve_param,
@@ -65,7 +63,7 @@ void main()
        hairTangent = (ModelMatrix * vec4(tang, 0.0)).xyz;
        worldNormal = (ModelMatrix * vec4(nor, 0.0)).xyz;
        viewNormal = normalize(mat3(ViewMatrix) * worldNormal);
-#else
+#  else
        hairStrandID = hair_get_strand_id();
        vec3 pos, binor;
        hair_get_pos_tan_binor_time(
@@ -78,15 +76,15 @@ void main()
        hairTangent = normalize(hairTangent);
        worldNormal = cross(binor, hairTangent);
        viewNormal = normalize(mat3(ViewMatrix) * worldNormal);
-#endif
+#  endif
 
-#else
+#else /* HAIR_SHADER */
        gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
        viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz;
        worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz;
        worldNormal = normalize(WorldNormalMatrix * nor);
        viewNormal = normalize(NormalMatrix * nor);
-#endif
+#endif /* HAIR_SHADER */
 
        /* Used for planar reflections */
        gl_ClipDistance[0] = dot(vec4(worldPosition, 1.0), ClipPlanes[0]);
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 82443e7336b..fb051bddb1c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -2,6 +2,7 @@ uniform mat4 ModelViewProjectionMatrix;
 uniform mat4 ProjectionMatrix;
 uniform mat4 ViewProjectionMatrix;
 uniform mat4 ViewMatrixInverse;
+uniform mat4 ModelViewMatrixInverse;
 uniform mat3 NormalMatrix;
 
 #ifndef HAIR_SHADER
@@ -13,6 +14,10 @@ in vec2 uv;
 uniform samplerBuffer u; /* active texture layer */
 #  endif
 flat out float hair_rand;
+#  ifdef HAIR_SHADER_FIBERS
+in int fiber_index;
+in float curve_param;
+#  endif
 #endif /* HAIR_SHADER */
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
@@ -34,27 +39,42 @@ float integer_noise(int n)
 void main()
 {
 #ifdef HAIR_SHADER
-#  ifdef OB_TEXTURE
+       bool is_persp = (ProjectionMatrix[3][3] == 0.0);
+
+#  ifdef HAIR_SHADER_FIBERS
+       vec2 uv = vec2(0.0); /* TODO */
+       float time, thick_time, thickness;
+       vec3 pos, tang, binor;
+       hair_fiber_get_vertex(
+               fiber_index, curve_param,
+               is_persp, ModelViewMatrixInverse[3].xyz, 
ModelViewMatrixInverse[2].xyz,
+               pos, tang, binor,
+               time, thickness, thick_time);
+       gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+       hair_rand = integer_noise(fiber_index);
+#  else
+#    ifdef OB_TEXTURE
        vec2 uv = hair_get_customdata_vec2(u);
-#  endif
+#    endif
        float time, thick_time, thickness;
-       vec3 pos, tan, binor;
+       vec3 pos, tang, binor;
        hair_get_pos_tan_binor_time(
-               (ProjectionMatrix[3][3] == 0.0),
-               ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz,
-               pos, tan, binor, time, thickness, thick_time);
-       /* To "simulate" anisotropic shading, randomize hair normal per strand. 
*/
+               is_persp, ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz,
+               pos, tang, binor, time, thickness, thick_time);
+       gl_Position = ViewProjectionMatrix * vec4(pos, 1.0);
        hair_rand = integer_noise(hair_get_strand_id());
-       tan = normalize(tan);
-       vec3 nor = normalize(cross(binor, tan));
-       nor = normalize(mix(nor, -tan, hair_rand * 0.10));
+#  endif
+       /* To "simulate" anisotropic shading, randomize hair normal per strand. 
*/
+       tang = normalize(tang);
+       vec3 nor = normalize(cross(binor, tang));
+       nor = normalize(mix(nor, -tang, hair_rand * 0.10));
        float cos_theta = (hair_rand*2.0 - 1.0) * 0.20;
        float sin_theta = sqrt(max(0.0, 1.0f - cos_theta*cos_theta));
        nor = nor * sin_theta + binor * cos_theta;
-       gl_Position = ViewProjectionMatrix * vec4(pos, 1.0);
-#else
+#else /* HAIR_SHADER */
        gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
-#endif
+#endif /* HAIR_SHADER */
+
 #ifdef OB_TEXTURE
        uv_interp = uv;
 #endif
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c 
b/source/blender/draw/engines/workbench/workbench_deferred.c
index c4fa82d39b7..3aea1b31a5a 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -32,9 +32,11 @@
 #include "BLI_utildefines.h"
 #include "BLI_rand.h"
 
+#include "BKE_groom.h"
 #include "BKE_node.h"
 #include "BKE_particle.h"
 
+#include "DNA_groom_types.h"
 #include "DNA_image_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
@@ -85,6 +87,7 @@ static struct {
 
 /* Shaders */
 extern char datatoc_common_hair_lib_glsl[];
+extern char datatoc_hair_lib_glsl[];
 
 extern char datatoc_workbench_prepass_vert_glsl[];
 extern char datatoc_workbench_prepass_frag_glsl[];
@@ -149,6 +152,7 @@ static char *workbench_build_prepass_vert(void)
        DynStr *ds = BLI_dynstr_new();
 
        BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl);
+       BLI_dynstr_append(ds, datatoc_hair_lib_glsl);
        BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl);
 
        str = BLI_dynstr_get_cstring(ds);
@@ -171,17 +175,17 @@ static char *workbench_build_cavity_frag(void)
        return str;
 }
 
-static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int 
drawtype, bool is_hair)
+static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int 
drawtype, DRWShaderHairType hair_type)
 {
        if (e_data.prepass_sh_cache[index] == NULL) {
-               char *defines = workbench_material_build_defines(wpd, drawtype, 
is_hair);
+               char *defines = workbench_material_build_defines(wpd, drawtype, 
hair_type);
                char *composite_frag = workbench_build_composite_frag(wpd);
                char *prepass_vert = workbench_build_prepass_vert();
                char *prepass_frag = workbench_build_prepass_frag();
                e_data.prepass_sh_cache[index] = DRW_shader_create(
                        prepass_vert, NULL,
                        prepass_frag, defines);
-               if (drawtype == OB_SOLID && !is_hair) {
+               if (drawtype == OB_SOLID && hair_type == DRW_SHADER_HAIR_NONE) {
                        e_data.composite_sh_cache[index] = 
DRW_shader_create_fullscreen(composite_frag, defines);
                }
                MEM_freeN(prepass_vert);
@@ -193,20 +197,26 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData 
*wpd, int index, int d
 
 static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
 {
-       int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, 
false);
-       int index_solid_hair = workbench_material_get_shader_index(wpd, 
OB_SOLID, true);
-       int index_texture = workbench_material_get_shader_index(wpd, 
OB_TEXTURE, false);
-       int index_texture_hair = workbench_material_get_shader_index(wpd, 
OB_TEXTURE, true);
-
-       ensure_deferred_shaders(wpd, index_solid, OB_SOLID, false);
-       ensure_deferred_shaders(wpd, index_solid_hair, OB_SOLID, true);
-       ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE, false);
-       ensure_deferred_shaders(wpd, index_texture_hair, OB_TEXTURE, true);
+       int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, 
DRW_SHADER_HAIR_NONE);
+       int index_solid_hair = workbench_material_get_shader_index(wpd, 
OB_SOLID, DRW_SHADER_HAIR_PARTICLES);
+       int index_solid_hair_fibers = workbench_material_get_shader_index(wpd, 
OB_SOLID, DRW_SHADER_HAIR_FIBERS);
+       int index_texture = workbench_material_get_shader_index(wpd, 
OB_TEXTURE, DRW_SHADER_HAIR_NONE);
+       int index_texture_hair = workbench_material_get_shader_index(wpd, 
OB_TEXTURE, DRW_SHADER_HAIR_PARTICLES);
+       int index_texture_hair_fibers = 
workbench_material_get_shader_index(wpd, OB_TEXTURE, DRW_SHADER_HAIR_FIBERS);
+
+       ensure_deferred_shaders(wpd, index_solid, OB_SOLID, 
DRW_SHADER_HAIR_NONE);
+       ensure_deferred_shaders(wpd, index_solid_hair, OB_SOLID, 
DRW_SHADER_HAIR_PARTICLES);
+       ensure_deferred_shaders(wpd, index_solid_hair_fibers, OB_SOLID, 
DRW_SHADER_HAIR_FIBERS);
+       ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE, 
DRW_SHADER_HAIR_NONE);
+       ensure_deferred_shaders(wpd, index_texture_hair, OB_TEXTURE, 
DRW_SHADER_HAIR_PARTICLES);
+       ensure_deferred_shaders(wpd, index_texture_hair_fibers, OB_TEXTURE, 
DRW_SHADER_HAIR_FIBERS);
 
        wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid];
        wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair];
+       wpd->prepass_solid_hair_fibers_sh = 
e_data.prepass_sh_cache[index_solid_hair_fibers];
        wpd->prepass_texture_sh = e_data.prepass_sh_cache[index_texture];
        wpd->prepass_texture_hair_sh = 
e_data.prepass_sh_cache[index_texture_hair];
+       wpd->prepass_texture_hair_fibers_sh = 
e_data.prepass_sh_cache[index_texture_hair_fibers];
        wpd->composite_sh = e_data.composite_sh_cache[index_solid];
 }
 
@@ -656,6 +666,47 @@ static void 
workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
        }
 }
 
+static void workbench_cache_populate_groom(WORKBENCH_Data *vedata, Object *ob)
+{
+       const Groom *groom = ob->data;
+       WORKBENCH_StorageList *stl = vedata->stl;
+       WORKBENCH_PassList *psl = vedata->psl;
+       WORKBENCH_PrivateData *wpd = stl->g_data;
+       const DRWContextState *draw_ctx = DRW_context_state_get();
+       
+       Image *image = NULL;
+       Material *mat = give_current_material(ob, groom->material_index);
+       int mat_drawtype = OB_SOLID;
+
+       if (wpd->drawtype == OB_TEXTURE) {
+               ED_object_get_active_image(ob, groom->material_index, &image, 
NULL, NULL, NULL);
+               /* use OB_SOLID when no texture could be determined */
+               if (image) {
+                       mat_drawtype = OB_TEXTURE;
+               }
+       }
+       
+       WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, 
ob, mat, image, mat_drawtype);
+       struct GPUShader *shader = (mat_drawt

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to