From 5db18d474fa2c8b7176806368e5bc0aa68fef325 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Thu, 2 Sep 2010 08:06:53 +0000 Subject: "Fix" for [#23621] lattice modifier on particle hair when applied doesn't apply it to the hair * Although not strictly a bug it is the expected behavior and won't mess anything else up. * Note: the lattice is applied to the actual hair keys instead of the calculated strands so the applied result will differ a bit from the original. --- source/blender/blenkernel/BKE_particle.h | 1 + source/blender/blenkernel/intern/particle.c | 31 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index fcef00ae9b3..f357e77f84e 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -253,6 +253,7 @@ ParticleThread *psys_threads_create(struct ParticleSimulationData *sim); void psys_threads_free(ParticleThread *threads); void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]); +void psys_apply_hair_lattice(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys); /* particle_system.c */ struct ParticleSystem *psys_get_target_system(struct Object *ob, struct ParticleTarget *pt); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 9c3a1597dd9..45662bfbd42 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -4431,3 +4431,34 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3] VECADDFAC(center, center, yvec, bb->offset[1]); } + +void psys_apply_hair_lattice(Scene *scene, Object *ob, ParticleSystem *psys) { + ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys)}; + + psys->lattice = psys_get_lattice(&sim); + + if(psys->lattice) { + ParticleData *pa = psys->particles; + HairKey *hkey; + int p, h; + float hairmat[4][4], imat[4][4]; + + for(p=0; ptotpart; p++, pa++) { + psys_mat_hair_to_global(sim.ob, sim.psmd->dm, psys->part->from, pa, hairmat); + invert_m4_m4(imat, hairmat); + + hkey = pa->hair; + for(h=0; htotkey; h++, hkey++) { + mul_m4_v3(hairmat, hkey->co); + calc_latt_deform(psys->lattice, hkey->co, 1.0f); + mul_m4_v3(imat, hkey->co); + } + } + + end_latt_deform(psys->lattice); + psys->lattice= NULL; + + /* protect the applied shape */ + psys->flag |= PSYS_EDITED; + } +} \ No newline at end of file -- cgit v1.2.3