[Bf-blender-cvs] [e027e10f5de] hair_guides_grooming: Clean up guide interpolation function.

Lukas Tönne noreply at git.blender.org
Thu Jun 28 10:10:13 CEST 2018


Commit: e027e10f5dea7185aaa09bf9736940649b1a36a6
Author: Lukas Tönne
Date:   Thu Jun 28 06:53:07 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rBe027e10f5dea7185aaa09bf9736940649b1a36a6

Clean up guide interpolation function.

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

M	source/blender/blenkernel/intern/groom.c

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

diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index 4d43864dc4d..3d62f827720 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -1037,37 +1037,54 @@ typedef struct GroomGuideIterator
 	double q[4][3];
 } GroomGuideIterator;
 
-static void groom_guide_curve_section_init(
-        GroomGuideIterator *iter,
+static bool groom_guide_curve_get_section(
+        const GroomGuideIterator *iter,
         const GroomRegion *region,
         const Mesh *scalp,
         int section_idx,
         float r_co[3])
 {
 	const GroomBundle *bundle = &region->bundle;
-	const int shapesize = region->numverts;
 	
-	if (section_idx < bundle->totsections-2)
+	if (section_idx >= 0 && section_idx < bundle->totsections)
 	{
 		/* Compute barycentric guide location from shape */
+		const int shapesize = region->numverts;
 		zero_v3(r_co);
 		for (int j = 0; j < shapesize; ++j)
 		{
 			float shape_co[3];
-			groom_eval_shape_vertex(region, scalp, j, section_idx + 2, shape_co);
+			groom_eval_shape_vertex(region, scalp, j, section_idx, shape_co);
 			madd_v3_v3fl(r_co, shape_co, iter->weights[j]);
 		}
+		
+		return true;
 	}
 	
+	return false;
+}
+
+static void groom_guide_curve_section_init(
+        GroomGuideIterator *iter,
+        const GroomRegion *region,
+        const Mesh *scalp)
+{
+	const GroomBundle *bundle = &region->bundle;
+	
+	copy_v3_v3(iter->co0, iter->co1);
+	copy_v3_v3(iter->co1, iter->co2);
+	copy_v3_v3(iter->co2, iter->co3);
+	groom_guide_curve_get_section(iter, region, scalp, iter->section_idx + 2, iter->co3);
+	
+	iter->step = 0;
+	
 	groom_forward_diff_init_hermite(
-	            section_idx > 0 ? iter->co0 : NULL,
+	            iter->section_idx > 0 ? iter->co0 : NULL,
 	            iter->co1,
 	            iter->co2,
-	            section_idx < bundle->totsections-2 ? iter->co3 : NULL,
+	            iter->section_idx < bundle->totsections-2 ? iter->co3 : NULL,
 	            iter->stepsize,
 	            iter->q);
-	
-	iter->step = 0;
 }
 
 static bool groom_guide_curve_start(
@@ -1089,11 +1106,12 @@ static bool groom_guide_curve_start(
 	iter->numsteps = numsteps;
 	iter->stepsize = 1.0 / (double)numsteps;
 	
-	groom_guide_curve_section_init(iter, region, scalp, -2, iter->co1);
-	groom_guide_curve_section_init(iter, region, scalp, -1, iter->co2);
-	groom_guide_curve_section_init(iter, region, scalp,  0, iter->co3);
-	
 	iter->section_idx = 0;
+	groom_guide_curve_get_section(iter, region, scalp, -1, iter->co1);
+	groom_guide_curve_get_section(iter, region, scalp, 0, iter->co2);
+	groom_guide_curve_get_section(iter, region, scalp, 1, iter->co3);
+	
+	groom_guide_curve_section_init(iter, region, scalp);
 	
 	return true;
 }
@@ -1119,10 +1137,7 @@ BLI_INLINE void groom_guide_curve_next(
 		
 		if (iter->section_idx < iter->totsections - 1)
 		{
-			copy_v3_v3(iter->co0, iter->co1);
-			copy_v3_v3(iter->co1, iter->co2);
-			copy_v3_v3(iter->co2, iter->co3);
-			groom_guide_curve_section_init(iter, region, scalp, iter->section_idx, iter->co3);
+			groom_guide_curve_section_init(iter, region, scalp);
 		}
 	}
 }



More information about the Bf-blender-cvs mailing list