[Bf-blender-cvs] [dec92e6ba1a] hair_guides hair_guides_grooming: Backport hair drawing improvements and workbench support from the grooming branch.

Lukas Tönne noreply at git.blender.org
Fri Jun 15 07:49:15 CEST 2018


Commit: dec92e6ba1a1944c642ded967d7f65fc5d8e704a
Author: Lukas Tönne
Date:   Fri Jun 15 06:45:51 2018 +0100
Branches: hair_guides hair_guides_grooming
https://developer.blender.org/rBdec92e6ba1a1944c642ded967d7f65fc5d8e704a

Backport hair drawing improvements and workbench support from the grooming branch.

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

M	intern/cycles/blender/blender_mesh.cpp
M	source/blender/blenkernel/BKE_hair.h
M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/hair_draw.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_materials.c
D	source/blender/draw/engines/eevee/shaders/hair_lib.glsl
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
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/intern/draw_hair_fibers.c
A	source/blender/draw/modes/shaders/common_hair_guides_lib.glsl
M	source/blender/makesdna/DNA_hair_types.h
M	source/blender/makesrna/intern/rna_hair.c
M	source/blender/makesrna/intern/rna_modifier.c

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 6fe650f3699..1fd47056c33 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -1203,14 +1203,16 @@ Mesh *BlenderSync::sync_mesh(BL::Depsgraph& b_depsgraph,
 
 				create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
 			}
+		}
 
-			if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
-				sync_curves(mesh, b_mesh, b_ob, false);
+		if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
+			sync_curves(mesh, b_mesh, b_ob, false);
 
-			if(can_free_caches) {
-				b_ob.cache_release();
-			}
+		if(can_free_caches) {
+			b_ob.cache_release();
+		}
 
+		if(b_mesh) {
 			/* free derived mesh */
 			b_data.meshes.remove(b_mesh, false, true, false);
 		}
diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index cad25348e43..73f8e3d9c12 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -65,7 +65,8 @@ void BKE_hair_guide_curves_begin(struct HairSystem *hsys, int totcurves);
  * \param mesh_sample Origin of the guide curve on the scalp mesh.
  * \param numverts Number of vertices in this guide curve
  */
-void BKE_hair_set_guide_curve(struct HairSystem *hsys, int index, const struct MeshSample *mesh_sample, int numverts);
+void BKE_hair_set_guide_curve(struct HairSystem *hsys, int index, const struct MeshSample *mesh_sample, int numverts,
+                              float taper_length, float taper_thickness);
 
 /* Finalize guide curve update */
 void BKE_hair_guide_curves_end(struct HairSystem *hsys);
@@ -130,13 +131,17 @@ void BKE_hair_draw_settings_free(struct HairDrawSettings *draw_settings);
 /* Intermediate data for export */
 typedef struct HairExportCache
 {
+	/* Per guide curve data */
 	int totguidecurves;
-	int totguideverts;
 	struct HairGuideCurve *guide_curves;
+	
+	/* Per guide vertex data */
+	int totguideverts;
 	struct HairGuideVertex *guide_verts;
 	float (*guide_tangents)[3];             /* Tangent vectors on guide curves */
 	float (*guide_normals)[3];              /* Normal vectors on guide curves */
 	
+	/* Per fiber data */
 	int totfibercurves;
 	int totfiberverts;
 	int *fiber_numverts;                    /* Number of vertices in each fiber */
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index cca003142da..70ae53b58c8 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -228,13 +228,16 @@ void BKE_hair_guide_curves_begin(HairSystem *hsys, int totcurves)
 	}
 }
 
-void BKE_hair_set_guide_curve(HairSystem *hsys, int index, const MeshSample *mesh_sample, int numverts)
+void BKE_hair_set_guide_curve(HairSystem *hsys, int index, const MeshSample *mesh_sample, int numverts,
+                              float taper_length, float taper_thickness)
 {
 	BLI_assert(index <= hsys->guides.totcurves);
 	
 	HairGuideCurve *curve = &hsys->guides.curves[index];
 	memcpy(&curve->mesh_sample, mesh_sample, sizeof(MeshSample));
 	curve->numverts = numverts;
+	curve->taper_length = taper_length;
+	curve->taper_thickness = taper_thickness;
 	
 	hsys->flag |= HAIR_SYSTEM_UPDATE_FOLLICLE_BINDING;
 	BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
@@ -672,7 +675,7 @@ int BKE_hair_export_cache_update(HairExportCache *cache, const HairSystem *hsys,
 			const HairGuideCurve *curve_orig = &hsys->guides.curves[i];
 			HairGuideCurve *curve = &cache->guide_curves[i];
 			
-			memcpy(&curve->mesh_sample, &curve_orig->mesh_sample, sizeof(MeshSample));
+			memcpy(curve, curve_orig, sizeof(HairGuideCurve));
 			curve->numverts = hair_get_strand_subdiv_length(curve_orig->numverts, subdiv);
 			curve->vertstart = totguideverts;
 			
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 4135c7833c1..18b81b243d2 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -48,7 +48,13 @@ HairDrawSettings* BKE_hair_draw_settings_new(void)
 {
 	HairDrawSettings *draw_settings = MEM_callocN(sizeof(HairDrawSettings), "hair draw settings");
 	
-	draw_settings->follicle_mode = HAIR_DRAW_FOLLICLE_NONE;
+	draw_settings->follicle_mode = HAIR_DRAW_FOLLICLE_POINTS;
+	draw_settings->guide_mode = HAIR_DRAW_GUIDE_CURVES;
+	draw_settings->shape_flag = HAIR_DRAW_CLOSE_TIP;
+	draw_settings->shape = 0.0f;
+	draw_settings->root_radius = 1.0f;
+	draw_settings->tip_radius = 0.0f;
+	draw_settings->radius_scale = 0.01f;
 	
 	return draw_settings;
 }
@@ -78,13 +84,17 @@ typedef struct HairStrandVertexTextureBuffer {
 	float co[3];
 	float nor[3];
 	float tang[3];
-	int pad;
+	float len;
 } HairStrandVertexTextureBuffer;
 BLI_STATIC_ASSERT_ALIGN(HairStrandVertexTextureBuffer, 8)
 
 typedef struct HairStrandMapTextureBuffer {
 	unsigned int vertex_start;
 	unsigned int vertex_count;
+	
+	/* Shape attributes */
+	float taper_length;         /* Distance at which final thickness is reached */
+	float taper_thickness;      /* Relative thickness of the strand */
 } HairStrandMapTextureBuffer;
 BLI_STATIC_ASSERT_ALIGN(HairStrandMapTextureBuffer, 8)
 
@@ -103,12 +113,21 @@ static void hair_get_strand_buffer(
 		
 		smap->vertex_start = curve->vertstart;
 		smap->vertex_count = curve->numverts;
+		smap->taper_length = curve->taper_length;
+		smap->taper_thickness = curve->taper_thickness;
 		
+		float len = 0.0f;
 		for (int j = 0; j < curve->numverts; ++j)
 		{
 			copy_v3_v3(svert[j].co, verts[j].co);
 			copy_v3_v3(svert[j].tang, tangents[j]);
 			copy_v3_v3(svert[j].nor, normals[j]);
+			
+			if (j > 0)
+			{
+				len += len_v3v3(verts[j-1].co, verts[j].co);
+			}
+			svert[j].len = len;
 		}
 	}
 }
@@ -183,7 +202,7 @@ void BKE_hair_batch_cache_free(HairSystem* hsys)
 /* === Fiber Curve Interpolation === */
 
 /* NOTE: Keep this code in sync with the GLSL version!
- * see hair_lib.glsl
+ * see common_hair_guides_lib.glsl
  */
 
 static void interpolate_parent_curve(
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 6743bea350b..6d2d273e497 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -163,7 +163,6 @@ data_to_c_simple(engines/eevee/shaders/default_world_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/concentric_samples_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/hair_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lamps_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl SRC)
@@ -243,6 +242,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_hair_lib.glsl SRC)
+data_to_c_simple(modes/shaders/common_hair_guides_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_hair_refine_vert.glsl SRC)
 data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index a511cc3f994..a356c30aece 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -92,6 +92,7 @@ extern char datatoc_bsdf_direct_lib_glsl[];
 extern char datatoc_bsdf_sampling_lib_glsl[];
 extern char datatoc_common_uniforms_lib_glsl[];
 extern char datatoc_common_hair_lib_glsl[];
+extern char datatoc_common_hair_guides_lib_glsl[];
 extern char datatoc_common_view_lib_glsl[];
 extern char datatoc_irradiance_lib_glsl[];
 extern char datatoc_octahedron_lib_glsl[];
@@ -108,7 +109,6 @@ extern char datatoc_volumetric_vert_glsl[];
 extern char datatoc_volumetric_geom_glsl[];
 extern char datatoc_volumetric_frag_glsl[];
 extern char datatoc_volumetric_lib_glsl[];
-extern char datatoc_hair_lib_glsl[];
 
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 
@@ -591,7 +591,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
 		e_data.vert_shader_str = BLI_string_joinN(
 		        datatoc_common_view_lib_glsl,
 		        datatoc_common_hair_lib_glsl,
-		        datatoc_hair_lib_glsl,
+		        datatoc_common_hair_guides_lib_glsl,
 		        datatoc_lit_surface_vert_glsl);
 
 		e_data.default_background = DRW_shader_create(
@@ -613,7 +613,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
 		char *hair_fiber_vert_str = BLI_string_joinN(
 		        datatoc_common_view_lib_glsl,
 		        datatoc_common_hair_lib_glsl,
-		        datatoc_hair_lib_glsl,
+		        datatoc_common_hair_guides_lib_glsl,
 		        datatoc_prepass_vert_glsl);
 
 		e_data.default_prepass_hair_fiber_sh = DRW_shader_create(
@@ -1533,6 +1533,8 @@ static void material_hair(
         EEVEE_ViewLayerData *sldata,
         Object *ob,
         HairSystem *hsys,
+        const HairDrawSettings *draw_set,
+        Material *ma,
         struct Mesh *scalp)
 {
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
@@ -1543,16 +1545,15 @@ static void material_hair(
 	float mat[4][4];
 	copy_m4_m4(mat, ob->obmat);
 	
-	Material *ma = give_current_material(ob, hsys->material_index);
 	if (ma == NULL) {
 		ma = &defmaterial;
 	}
 	
 	{
-		/*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, psl->depth_pass, e_data.default_prepass_hair_fiber_sh);
+		/*DRWShadingGroup *shgrp =*/ DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass, e_data.default_prepass_hair_fiber_sh);
 	}
 	{
-		DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, psl->depth_pass_clip, e_data.default_prepass_hair_fiber_clip_sh);
+		DRWShadingGroup *shgrp = DRW_shgroup_hair_fibers_create(scene, ob, hsys, scalp, draw_set, psl->depth_pass_clip, e_data.defaul

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list