"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.
This commit is contained in:
Janne Karhu
2010-09-02 08:06:53 +00:00
parent 18954a711f
commit 5db18d474f
4 changed files with 54 additions and 0 deletions

View File

@@ -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);

View File

@@ -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; p<psys->totpart; 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; h<pa->totkey; 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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}