diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/physics/particle_edit.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index aa1d01775f5..5a43ca110fe 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -2788,6 +2788,11 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged) newpa->num= mirrorfaces[pa->num*2]; newpa->num_dmcache= psys_particle_dm_face_lookup(ob, psmd->dm, newpa->num, newpa->fuv, NULL); + if ((newpa->num_dmcache != DMCACHE_NOTFOUND) && psys->part->use_modifier_stack && !psmd->dm->deformedOnly) { + newpa->num = newpa->num_dmcache; + newpa->num_dmcache = DMCACHE_ISCHILD; + } + /* update edit key pointers */ key= newpoint->keys; for (k=0, hkey=newpa->hair; k<newpa->totkey; k++, hkey++, key++) { @@ -3351,6 +3356,10 @@ static int brush_add(PEData *data, short number) short size2= size*size; DerivedMesh *dm=0; RNG *rng; + int *index_mf_to_mpoly; + int *index_mp_to_orig; + bool release_dm = false; + invert_m4_m4(imat, ob->obmat); if (psys->flag & PSYS_GLOBAL_HAIR) @@ -3367,11 +3376,15 @@ static int brush_add(PEData *data, short number) timestep= psys_get_timestep(&sim); - /* painting onto the deformed mesh, could be an option? */ - if (psmd->dm->deformedOnly) - dm= psmd->dm; - else - dm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); + if (psmd->dm->deformedOnly || psys->part->use_modifier_stack) + dm = psmd->dm; + else { + dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); + release_dm = true; + } + + index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX); + index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX); for (i=0; i<number; i++) { if (number>1) { @@ -3398,9 +3411,19 @@ static int brush_add(PEData *data, short number) min_d=2.0; /* warning, returns the derived mesh face */ - if (particle_intersect_dm(scene, ob, dm, 0, co1, co2, &min_d, &add_pars[n].num, add_pars[n].fuv, 0, 0, 0, 0)) { - add_pars[n].num_dmcache= psys_particle_dm_face_lookup(ob, psmd->dm, add_pars[n].num, add_pars[n].fuv, NULL); - n++; + if (particle_intersect_dm(scene, ob, dm, 0, co1, co2, &min_d, &add_pars[n].num_dmcache, add_pars[n].fuv, 0, 0, 0, 0)) { + if (index_mf_to_mpoly && index_mp_to_orig) + add_pars[n].num = DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, add_pars[n].num_dmcache); + else + add_pars[n].num = add_pars[n].num_dmcache; + + if (psys_particle_dm_face_lookup(ob, psmd->dm, add_pars[n].num_dmcache, add_pars[n].fuv, NULL) != DMCACHE_NOTFOUND) { + if (psys->part->use_modifier_stack && !psmd->dm->deformedOnly) { + add_pars[n].num = add_pars[n].num_dmcache; + add_pars[n].num_dmcache = DMCACHE_ISCHILD; + } + n++; + } } } if (n) { @@ -3553,10 +3576,10 @@ static int brush_add(PEData *data, short number) } MEM_freeN(add_pars); - - if (!psmd->dm->deformedOnly) + + if (release_dm) dm->release(dm); - + BLI_rng_free(rng); return n; |