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 +++++++++++++++++++++++++ source/blender/editors/object/object_modifier.c | 15 ++++++++++++ source/blender/editors/physics/particle_edit.c | 7 ++++++ 4 files changed, 54 insertions(+) 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 diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 286e953a69a..5cc6cb9107d 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -453,6 +453,21 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type"); return 0; } + + /* lattice modifier can be applied to particle system too */ + if(ob->particlesystem.first) { + + ParticleSystem *psys = ob->particlesystem.first; + + for(; psys; psys=psys->next) { + + if(psys->part->type != PART_HAIR) + continue; + + psys_apply_hair_lattice(scene, ob, psys); + } + } + return 1; } diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index d491b1a9731..87b20ab1c41 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -4151,6 +4151,13 @@ static int clear_edited_exec(bContext *C, wmOperator *op) DAG_id_flush_update(&ob->id, OB_RECALC_DATA); } } + else { /* some operation might have protected hair from editing so let's clear the flag */ + psys->recalc |= PSYS_RECALC_RESET; + psys->flag &= ~PSYS_GLOBAL_HAIR; + psys->flag &= ~PSYS_EDITED; + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob); + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + } return OPERATOR_FINISHED; } -- cgit v1.2.3