[Bf-blender-cvs] [4843d144a5e] hair_guides_grooming: Move calculation of section rotations out of curve caching and into constraints function.
Lukas Tönne
noreply at git.blender.org
Sun Jun 10 10:31:50 CEST 2018
Commit: 4843d144a5ed91432850ddf33f144ec8550b4ac7
Author: Lukas Tönne
Date: Sun Jun 10 09:31:12 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB4843d144a5ed91432850ddf33f144ec8550b4ac7
Move calculation of section rotations out of curve caching and into constraints 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 58020eaf682..f3e1f1263fa 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -628,6 +628,20 @@ void BKE_groom_region_unbind(GroomRegion *region)
/* === Constraints === */
+static void groom_eval_curve_step(float mat[3][3], const float mat_prev[3][3], const float co0[3], const float co1[3])
+{
+ float dir[3];
+ sub_v3_v3v3(dir, co1, co0);
+ normalize_v3(dir);
+
+ float dir_prev[3];
+ normalize_v3_v3(dir_prev, mat_prev[2]);
+ float rot[3][3];
+ rotation_between_vecs_to_mat3(rot, dir_prev, dir);
+
+ mul_m3_m3m3(mat, rot, mat_prev);
+}
+
/* Apply constraints on groom geometry */
void BKE_groom_apply_constraints(const Depsgraph *depsgraph, Groom *groom)
{
@@ -642,6 +656,7 @@ void BKE_groom_apply_constraints(const Depsgraph *depsgraph, Groom *groom)
{
GroomSection *section = &bundle->sections[0];
+ /* Calculate orientation of the first section */
if (scalp)
{
/* For bound regions the bundle should be attached to the scalp */
@@ -664,6 +679,18 @@ void BKE_groom_apply_constraints(const Depsgraph *depsgraph, Groom *groom)
unit_m3(section->mat);
}
}
+ ++section;
+
+ /* Calculate orientation for remaining sections */
+ for (int i = 1; i < bundle->totsections - 1; ++i)
+ {
+ /* Align interior points to average of prev and next segment */
+ groom_eval_curve_step(section->mat, section[-1].mat, section[-1].center, section[+1].center);
+ ++section;
+ }
+
+ /* align to last segment */
+ groom_eval_curve_step(section->mat, section[-1].mat, section[-1].center, section[0].center);
}
}
}
@@ -1038,56 +1065,6 @@ static void groom_eval_shape_curves(
}
}
-static void groom_eval_curve_step(float mat[3][3], const float mat_prev[3][3], const float co0[3], const float co1[3])
-{
- float dir[3];
- sub_v3_v3v3(dir, co1, co0);
- normalize_v3(dir);
-
- float dir_prev[3];
- normalize_v3_v3(dir_prev, mat_prev[2]);
- float rot[3][3];
- rotation_between_vecs_to_mat3(rot, dir_prev, dir);
-
- mul_m3_m3m3(mat, rot, mat_prev);
-}
-
-/* Computes rotation matrices for all but the first segment of a bundle */
-static void groom_eval_section_mats(GroomRegion *region, int curve_res)
-{
- GroomBundle *bundle = ®ion->bundle;
- const int curvesize = bundle->curvesize;
- const int numshapeverts = region->numverts;
-
- GroomSection *section = bundle->sections;
- /* last curve cache is center curve */
- const GroomCurveCache *cache = bundle->curvecache + bundle->curvesize * numshapeverts;
-
- float mat[3][3];
- /* initialize matrix */
- copy_m3_m3(mat, section->mat);
- ++cache;
- ++section;
-
- for (int i = 1; i < curvesize - 1; ++i, ++cache)
- {
- /* align interior points to average of prev and next segment */
- groom_eval_curve_step(mat, mat, cache[-1].co, cache[+1].co);
-
- if (i % curve_res == 0)
- {
- /* set section matrix */
- copy_m3_m3(section->mat, mat);
- ++section;
- }
- }
-
- /* align to last segment */
- groom_eval_curve_step(mat, mat, cache[-1].co, cache[0].co);
- /* last section is not handled in the loop */
- copy_m3_m3(section->mat, mat);
-}
-
void BKE_groom_curve_cache_update(const Depsgraph *depsgraph, Groom *groom)
{
const Mesh *scalp = BKE_groom_get_scalp(depsgraph, groom);
@@ -1128,9 +1105,6 @@ void BKE_groom_curve_cache_update(const Depsgraph *depsgraph, Groom *groom)
/* Calculate center curve */
groom_eval_center_curve_section(region, curve_res);
- /* Calculate coordinate frames for sections */
- groom_eval_section_mats(region, curve_res);
-
/* Calculate shape curves */
groom_eval_shape_curves(region, scalp, curve_res);
}
More information about the Bf-blender-cvs
mailing list