diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_particleinstance.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_particleinstance.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c index 56197bfcca8..557d136965b 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.c +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -43,6 +43,8 @@ #include "BLI_utildefines.h" #include "BKE_cdderivedmesh.h" +#include "BKE_effect.h" +#include "BKE_global.h" #include "BKE_lattice.h" #include "BKE_modifier.h" #include "BKE_particle.h" @@ -183,7 +185,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, int maxvert, maxpoly, maxloop, totpart = 0, first_particle = 0; int k, p, p_skip; short track = ob->trackflag % 3, trackneg, axis = pimd->axis; - float max_co = 0.0, min_co = 0.0, temp_co[3], cross[3]; + float max_co = 0.0, min_co = 0.0, temp_co[3]; float *size = NULL; trackneg = ((ob->trackflag > 2) ? 1 : 0); @@ -276,6 +278,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, orig_mloop = dm->getLoopArray(dm); for (p = 0, p_skip = 0; p < totpart; p++) { + float prev_dir[3]; + float frame[4]; /* frame orientation quaternion */ + /* skip particle? */ if (particle_skip(pimd, psys, p)) continue; @@ -321,19 +326,55 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, normalize_v3(state.vel); - /* TODO: incremental rotations somehow */ + /* Incrementally Rotating Frame (Bishop Frame) */ + if (k == 0) { + float hairmat[4][4]; + float mat[3][3]; + + if (first_particle + p < psys->totpart) + pa = psys->particles + first_particle + p; + else { + ChildParticle *cpa = psys->child + (p - psys->totpart); + pa = psys->particles + cpa->parent; + } + psys_mat_hair_to_global(sim.ob, sim.psmd->dm, sim.psys->part->from, pa, hairmat); + copy_m3_m4(mat, hairmat); + /* to quaternion */ + mat3_to_quat(frame, mat); + + /* note: direction is same as normal vector currently, + * but best to keep this separate so the frame can be + * rotated later if necessary + */ + copy_v3_v3(prev_dir, state.vel); + } + else { + float rot[4]; + + /* incrementally rotate along bend direction */ + rotation_between_vecs_to_quat(rot, prev_dir, state.vel); + mul_qt_qtqt(frame, rot, frame); + + copy_v3_v3(prev_dir, state.vel); + } + + copy_qt_qt(state.rot, frame); +#if 0 + /* Absolute Frame (Frenet Frame) */ if (state.vel[axis] < -0.9999f || state.vel[axis] > 0.9999f) { unit_qt(state.rot); } else { + float cross[3]; float temp[3] = {0.0f, 0.0f, 0.0f}; temp[axis] = 1.0f; - + cross_v3_v3v3(cross, temp, state.vel); - + /* state.vel[axis] is the only component surviving from a dot product with the axis */ axis_angle_to_quat(state.rot, cross, saacos(state.vel[axis])); } +#endif } else { state.time = -1.0; |