[Bf-blender-cvs] [e9cf9776f80] hair_guides: Move guide curve into a nested struct, so it can be replace in one operation.

Lukas Tönne noreply at git.blender.org
Sun Apr 15 14:39:30 CEST 2018


Commit: e9cf9776f80ab1d8efdfc46020995a48382dee09
Author: Lukas Tönne
Date:   Sun Apr 15 12:54:39 2018 +0100
Branches: hair_guides
https://developer.blender.org/rBe9cf9776f80ab1d8efdfc46020995a48382dee09

Move guide curve into a nested struct, so it can be replace in one operation.

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

M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/hair_draw.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/makesdna/DNA_hair_types.h

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

diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 5a9af8aba58..9d9f9df26c8 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -74,13 +74,13 @@ HairSystem* BKE_hair_copy(HairSystem *hsys)
 		nhsys->pattern->follicles = MEM_dupallocN(hsys->pattern->follicles);
 	}
 	
-	if (hsys->curves)
+	if (hsys->guides.curves)
 	{
-		nhsys->curves = MEM_dupallocN(hsys->curves);
+		nhsys->guides.curves = MEM_dupallocN(hsys->guides.curves);
 	}
-	if (hsys->verts)
+	if (hsys->guides.verts)
 	{
-		nhsys->verts = MEM_dupallocN(hsys->verts);
+		nhsys->guides.verts = MEM_dupallocN(hsys->guides.verts);
 	}
 	
 	nhsys->draw_batch_cache = NULL;
@@ -93,13 +93,13 @@ void BKE_hair_free(HairSystem *hsys)
 {
 	BKE_hair_batch_cache_free(hsys);
 	
-	if (hsys->curves)
+	if (hsys->guides.curves)
 	{
-		MEM_freeN(hsys->curves);
+		MEM_freeN(hsys->guides.curves);
 	}
-	if (hsys->verts)
+	if (hsys->guides.verts)
 	{
-		MEM_freeN(hsys->verts);
+		MEM_freeN(hsys->guides.verts);
 	}
 	
 	if (hsys->pattern)
@@ -206,10 +206,10 @@ void BKE_hair_generate_follicles(
 
 void BKE_hair_guide_curves_begin(HairSystem *hsys, int totcurves)
 {
-	if (totcurves != hsys->totcurves)
+	if (totcurves != hsys->guides.totcurves)
 	{
-		hsys->curves = MEM_reallocN(hsys->curves, sizeof(HairGuideCurve) * totcurves);
-		hsys->totcurves = totcurves;
+		hsys->guides.curves = MEM_reallocN(hsys->guides.curves, sizeof(HairGuideCurve) * totcurves);
+		hsys->guides.totcurves = totcurves;
 
 		hsys->flag |= HAIR_SYSTEM_UPDATE_FOLLICLE_BINDING;
 		BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
@@ -218,9 +218,9 @@ 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)
 {
-	BLI_assert(index <= hsys->totcurves);
+	BLI_assert(index <= hsys->guides.totcurves);
 	
-	HairGuideCurve *curve = &hsys->curves[index];
+	HairGuideCurve *curve = &hsys->guides.curves[index];
 	memcpy(&curve->mesh_sample, mesh_sample, sizeof(MeshSample));
 	curve->numverts = numverts;
 	
@@ -232,16 +232,16 @@ void BKE_hair_guide_curves_end(HairSystem *hsys)
 {
 	/* Recalculate vertex count and start offsets in curves */
 	int vertstart = 0;
-	for (int i = 0; i < hsys->totcurves; ++i)
+	for (int i = 0; i < hsys->guides.totcurves; ++i)
 	{
-		hsys->curves[i].vertstart = vertstart;
-		vertstart += hsys->curves[i].numverts;
+		hsys->guides.curves[i].vertstart = vertstart;
+		vertstart += hsys->guides.curves[i].numverts;
 	}
 
-	if (vertstart != hsys->totverts)
+	if (vertstart != hsys->guides.totverts)
 	{
-		hsys->verts = MEM_reallocN(hsys->verts, sizeof(HairGuideVertex) * vertstart);
-		hsys->totverts = vertstart;
+		hsys->guides.verts = MEM_reallocN(hsys->guides.verts, sizeof(HairGuideVertex) * vertstart);
+		hsys->guides.totverts = vertstart;
 
 		BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
 	}
@@ -249,9 +249,9 @@ void BKE_hair_guide_curves_end(HairSystem *hsys)
 
 void BKE_hair_set_guide_vertex(HairSystem *hsys, int index, int flag, const float co[3])
 {
-	BLI_assert(index <= hsys->totverts);
+	BLI_assert(index <= hsys->guides.totverts);
 	
-	HairGuideVertex *vertex = &hsys->verts[index];
+	HairGuideVertex *vertex = &hsys->guides.verts[index];
 	vertex->flag = flag;
 	copy_v3_v3(vertex->co, co);
 	
@@ -353,7 +353,7 @@ void BKE_hair_bind_follicles(HairSystem *hsys, DerivedMesh *scalp)
 	hsys->flag &= ~HAIR_SYSTEM_UPDATE_FOLLICLE_BINDING;
 	
 	HairPattern *pattern = hsys->pattern;
-	const int num_strands = hsys->totcurves;
+	const int num_strands = hsys->guides.totcurves;
 	if (num_strands == 0 || !pattern)
 		return;
 	
@@ -361,7 +361,7 @@ void BKE_hair_bind_follicles(HairSystem *hsys, DerivedMesh *scalp)
 	{
 		for (int i = 0; i < num_strands; ++i) {
 			float nor[3], tang[3];
-			if (!BKE_mesh_sample_eval(scalp, &hsys->curves[i].mesh_sample, strandloc[i], nor, tang)) {
+			if (!BKE_mesh_sample_eval(scalp, &hsys->guides.curves[i].mesh_sample, strandloc[i], nor, tang)) {
 				zero_v3(strandloc[i]);
 			}
 		}
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 37de8bc742d..da90ff7aa4a 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -86,11 +86,11 @@ int* BKE_hair_get_fiber_lengths(const HairSystem *hsys, int subdiv)
 	const int totfibers = hsys->pattern->num_follicles;
 	int *fiber_length = MEM_mallocN(sizeof(int) * totfibers, "fiber length");
 	
-	const int num_strands = hsys->totcurves;
+	const int num_strands = hsys->guides.totcurves;
 	/* Cache subdivided lengths for repeated lookup */
 	int *lengths = MEM_mallocN(sizeof(int) * num_strands, "strand length");
-	for (int i = 0; i < hsys->totcurves; ++i) {
-		lengths[i] = hair_get_strand_subdiv_length(hsys->curves[i].numverts, subdiv);
+	for (int i = 0; i < hsys->guides.totcurves; ++i) {
+		lengths[i] = hair_get_strand_subdiv_length(hsys->guides.curves[i].numverts, subdiv);
 	}
 	
 	// Calculate the length of the fiber from the weighted average of its guide strands
@@ -198,7 +198,7 @@ static int hair_strand_subdivide(const HairSystem *hsys, const HairGuideCurve* c
 		float (*dst)[3] = verts;
 		int vertend = curve->vertstart + curve->numverts;
 		for (int i = curve->vertstart; i < vertend; ++i) {
-			copy_v3_v3(*dst, hsys->verts[i].co);
+			copy_v3_v3(*dst, hsys->guides.verts[i].co);
 			dst += step;
 		}
 	}
@@ -239,15 +239,15 @@ static void hair_get_strand_buffer(
         HairStrandMapTextureBuffer *strand_map_buffer,
         HairStrandVertexTextureBuffer *strand_vertex_buffer)
 {
-	const int numverts = hair_get_strand_subdiv_numverts(hsys->totcurves, hsys->totverts, subdiv);
+	const int numverts = hair_get_strand_subdiv_numverts(hsys->guides.totcurves, hsys->guides.totverts, subdiv);
 	
 	float (*vertco)[3] = MEM_mallocN(sizeof(float[3]) * numverts, "strand vertex positions subdivided");
 	
 	HairStrandMapTextureBuffer *smap = strand_map_buffer;
 	HairStrandVertexTextureBuffer *svert = strand_vertex_buffer;
 	int vertex_start = 0;
-	for (int i = 0; i < hsys->totcurves; ++i) {
-		const HairGuideCurve *curve = &hsys->curves[i];
+	for (int i = 0; i < hsys->guides.totcurves; ++i) {
+		const HairGuideCurve *curve = &hsys->guides.curves[i];
 		const int len_orig = curve->numverts;
 		const int len = hair_get_strand_subdiv_length(len_orig, subdiv);
 		smap->vertex_start = vertex_start;
@@ -258,7 +258,7 @@ static void hair_get_strand_buffer(
 		{
 			float pos[3];
 			float matrix[3][3];
-			BKE_mesh_sample_eval(scalp, &hsys->curves[i].mesh_sample, pos, matrix[2], matrix[0]);
+			BKE_mesh_sample_eval(scalp, &hsys->guides.curves[i].mesh_sample, pos, matrix[2], matrix[0]);
 			cross_v3_v3v3(matrix[1], matrix[2], matrix[0]);
 			hair_strand_calc_vectors(vertco + vertex_start, len, matrix, svert);
 		}
@@ -300,8 +300,8 @@ void BKE_hair_get_texture_buffer_size(
         int *r_strand_vertex_start,
         int *r_fiber_start)
 {
-	int numstrands = hsys->totcurves;
-	int numverts_orig = hsys->totverts;
+	int numstrands = hsys->guides.totcurves;
+	int numverts_orig = hsys->guides.totverts;
 	int numfibers = hsys->pattern ? hsys->pattern->num_follicles : 0;
 	const int numverts = hair_get_strand_subdiv_numverts(numstrands, numverts_orig, subdiv);
 	*r_strand_map_start = 0;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ac5673e1402..452ce42d5a3 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5228,8 +5228,8 @@ static void direct_link_hair(FileData *fd, HairSystem* hsys)
 		hsys->pattern->follicles = newdataadr(fd, hsys->pattern->follicles);
 	}
 	
-	hsys->curves = newdataadr(fd, hsys->curves);
-	hsys->verts = newdataadr(fd, hsys->verts);
+	hsys->guides.curves = newdataadr(fd, hsys->guides.curves);
+	hsys->guides.verts = newdataadr(fd, hsys->guides.verts);
 	
 	hsys->draw_batch_cache = NULL;
 	hsys->draw_texture_cache = NULL;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 973fac1d13a..580d821be5b 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1775,8 +1775,8 @@ static void write_hair(WriteData *wd, HairSystem *hsys)
 		writestruct(wd, DATA, HairFollicle, hsys->pattern->num_follicles, hsys->pattern->follicles);
 	}
 	
-	writestruct(wd, DATA, HairGuideCurve, hsys->totcurves, hsys->curves);
-	writestruct(wd, DATA, HairGuideVertex, hsys->totverts, hsys->verts);
+	writestruct(wd, DATA, HairGuideCurve, hsys->guides.totcurves, hsys->guides.curves);
+	writestruct(wd, DATA, HairGuideVertex, hsys->guides.totverts, hsys->guides.verts);
 }
 
 static void write_modifiers(WriteData *wd, ListBase *modbase)
diff --git a/source/blender/makesdna/DNA_hair_types.h b/source/blender/makesdna/DNA_hair_types.h
index 8a95077c7f6..26833792ab2 100644
--- a/source/blender/makesdna/DNA_hair_types.h
+++ b/source/blender/makesdna/DNA_hair_types.h
@@ -68,13 +68,9 @@ typedef struct HairGuideVertex {
 	float co[3];
 } HairGuideVertex;
 
-typedef struct HairSystem {
-	int flag;
-	int pad;
-	
-	/* Set of hair follicles on the scalp mesh */
-	struct HairPattern *pattern;
-	
+/* Guide curve data */
+typedef struct HairGuideData
+{
 	/* Curves for guiding hair fibers */
 	struct HairGuideCurve *curves;
 	/* Control vertices on guide curves */
@@ -83,6 +79,17 @@ typedef struct HairSystem {
 	int totcurves;
 	/* Number of guide curve vertices */
 	int totverts;
+} HairGuideData;
+
+typedef struct HairSystem {
+	int flag;
+	int pad;
+	
+	/* Set of hair follicles on the scalp mesh */
+	struct HairPattern *pattern;
+	
+	/* Guide curve data */
+	HairGuideData guides;
 	
 	/* Material used for drawing and rendering hair fibers */
 	int material_index;



More information about the Bf-blender-cvs mailing list