"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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user