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);
                }
        }
 }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to