Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-01-14 19:14:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-01-14 19:14:24 +0300
commit6d4d43c85ec2708ab470d35770257ca12fb79827 (patch)
treeca4267d57d3f2b11bfd892dd2ca09635db5b91eb /source/blender/editors/physics
parent672aede6a0a6200a928a4f2c57612444f3d541f4 (diff)
improve volume preserving puff to shape the end strands of the hair in relation to the underlying form of the head.
Diffstat (limited to 'source/blender/editors/physics')
-rw-r--r--source/blender/editors/physics/particle_edit.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index f9c786b29b0..fe38d71dc92 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -2923,9 +2923,13 @@ static void brush_puff(PEData *data, int point_index)
#else
/* translate (not rotate) the rest of the hair if its not selected */
if(ofs[0] || ofs[1] || ofs[2]) {
+#if 0 /* kindof works but looks worse then whats below */
+
+ /* Move the unselected point on a vector based on the
+ * hair direction and the offset */
float c1[3], c2[3];
VECSUB(dco, lastco, co);
- mul_m4_v3(imat, dco); /* into particle space */
+ mul_mat3_m4_v3(imat, dco); /* into particle space */
/* move the point allong a vector perpendicular to the
* hairs direction, reduces odd kinks, */
@@ -2934,6 +2938,26 @@ static void brush_puff(PEData *data, int point_index)
normalize_v3(c2);
mul_v3_fl(c2, len_v3(ofs));
add_v3_v3(key->co, c2);
+#else
+ /* Move the unselected point on a vector based on the
+ * the normal of the closest geometry */
+ float oco[3], onor[3];
+ VECCOPY(oco, key->co);
+ mul_m4_v3(mat, oco);
+ mul_v3_m4v3(kco, data->ob->imat, oco); /* use 'kco' as the object space version of worldspace 'co', ob->imat is set before calling */
+
+ point_index= BLI_kdtree_find_nearest(edit->emitter_field, kco, NULL, NULL);
+ if(point_index != -1) {
+ copy_v3_v3(onor, &edit->emitter_cosnos[point_index*6+3]);
+ mul_mat3_m4_v3(data->ob->obmat, onor); /* normal into worldspace */
+ mul_mat3_m4_v3(imat, onor); /* worldspace into particle space */
+ normalize_v3(onor);
+
+
+ mul_v3_fl(onor, len_v3(ofs));
+ add_v3_v3(key->co, onor);
+ }
+#endif
}
#endif
}