diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-09-26 11:26:08 +0400 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-01-20 11:30:03 +0300 |
commit | d613c381717d480d71259bcdab1db32c47f85778 (patch) | |
tree | 44776b1fcb2c63357e1a4f0164316e2dba592635 | |
parent | 577150c635f4f9339819b1ca9d3587d6809e01e9 (diff) |
Fix for hair chain testing in the cloth modifier.
Bending springs are en-bloc and not interleaved with other springs, so
this can't be used as a test for hair roots. Use consecutive indices
instead.
-rw-r--r-- | source/blender/blenkernel/intern/cloth.c | 24 | ||||
-rw-r--r-- | source/blender/physics/intern/BPH_mass_spring.cpp | 12 |
2 files changed, 19 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index 7768149bc12..297a0e462d0 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -1104,10 +1104,9 @@ static void cloth_free_errorsprings(Cloth *cloth, LinkNode **edgelist) static void cloth_update_bending_targets(ClothModifierData *clmd) { Cloth *cloth = clmd->clothObject; - ClothSpring *spring; LinkNode *search = NULL; float hair_frame[3][3], dir_old[3], dir_new[3]; - bool is_root; + int prev_mn; /* to find hair chains */ /* XXX Note: we need to propagate frames from the root up, * but structural hair springs are stored in reverse order. @@ -1117,13 +1116,13 @@ static void cloth_update_bending_targets(ClothModifierData *clmd) * generated directly from a dedicated hair system. */ - is_root = true; + prev_mn = -1; for (search = cloth->springs; search; search = search->next) { + ClothSpring *spring = search->link; ClothHairRoot *hair_ij, *hair_kl; + bool is_root = spring->kl != prev_mn; - spring = search->link; if (spring->type != CLOTH_SPRING_TYPE_BENDING_ANG) { - is_root = true; /* next bending spring connects to root */ continue; } @@ -1142,7 +1141,7 @@ static void cloth_update_bending_targets(ClothModifierData *clmd) sub_v3_v3v3(dir_new, cloth->verts[spring->mn].x, cloth->verts[spring->kl].x); normalize_v3(dir_new); -#if 1 +#if 0 if (clmd->debug_data && (spring->ij == 0 || spring->ij == 1)) { float a[3], b[3]; @@ -1170,17 +1169,16 @@ static void cloth_update_bending_targets(ClothModifierData *clmd) /* move frame to next hair segment */ cloth_parallel_transport_hair_frame(hair_frame, dir_old, dir_new); - is_root = false; /* next bending spring not connected to root */ + prev_mn = spring->mn; } } static void cloth_update_bending_rest_targets(ClothModifierData *clmd) { Cloth *cloth = clmd->clothObject; - ClothSpring *spring; LinkNode *search = NULL; float hair_frame[3][3], dir_old[3], dir_new[3]; - bool is_root; + int prev_mn; /* to find hair roots */ /* XXX Note: we need to propagate frames from the root up, * but structural hair springs are stored in reverse order. @@ -1190,13 +1188,13 @@ static void cloth_update_bending_rest_targets(ClothModifierData *clmd) * generated directly from a dedicated hair system. */ - is_root = true; + prev_mn = -1; for (search = cloth->springs; search; search = search->next) { + ClothSpring *spring = search->link; ClothHairRoot *hair_ij, *hair_kl; + bool is_root = spring->kl != prev_mn; - spring = search->link; if (spring->type != CLOTH_SPRING_TYPE_BENDING_ANG) { - is_root = true; /* next bending spring connects to root */ continue; } @@ -1222,7 +1220,7 @@ static void cloth_update_bending_rest_targets(ClothModifierData *clmd) /* move frame to next hair segment */ cloth_parallel_transport_hair_frame(hair_frame, dir_old, dir_new); - is_root = false; /* next bending spring not connected to root */ + prev_mn = spring->mn; } } diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp index 89e9447f345..0138178b722 100644 --- a/source/blender/physics/intern/BPH_mass_spring.cpp +++ b/source/blender/physics/intern/BPH_mass_spring.cpp @@ -428,12 +428,16 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, BPH_mass_spring_force_spring_bending_angular(data, s->ij, s->kl, s->mn, s->matrix_ij_kl, s->matrix_kl_mn, s->matrix_ij_mn, s->target, kb, cb); { - float x[3], v[3], d[3]; + float x_kl[3], x_mn[3], v[3], d[3]; - BPH_mass_spring_get_motion_state(data, s->kl, x, v); + BPH_mass_spring_get_motion_state(data, s->kl, x_kl, v); + BPH_mass_spring_get_motion_state(data, s->mn, x_mn, v); + + BKE_sim_debug_data_add_dot(clmd->debug_data, x_kl, 0.9, 0.9, 0.9, "target", hash_vertex(7980, s->kl)); + BKE_sim_debug_data_add_line(clmd->debug_data, x_kl, x_mn, 0.8, 0.8, 0.8, "target", hash_vertex(7981, s->kl)); copy_v3_v3(d, s->target); - BKE_sim_debug_data_add_vector(clmd->debug_data, x, d, 0.8, 0.8, 0.2, "target", hash_vertex(7982, s->kl)); + BKE_sim_debug_data_add_vector(clmd->debug_data, x_kl, d, 0.8, 0.8, 0.2, "target", hash_vertex(7982, s->kl)); // copy_v3_v3(d, s->target_ij); // BKE_sim_debug_data_add_vector(clmd->debug_data, x, d, 1, 0.4, 0.4, "target", hash_vertex(7983, s->kl)); @@ -644,7 +648,7 @@ int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase * if (clmd->debug_data) { for (i = 0; i < numverts; i++) { - BKE_sim_debug_data_add_dot(clmd->debug_data, verts[i].x, 1.0f, 0.1f, 1.0f, "points", hash_vertex(583, i)); +// BKE_sim_debug_data_add_dot(clmd->debug_data, verts[i].x, 1.0f, 0.1f, 1.0f, "points", hash_vertex(583, i)); } } |