Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/physics/particle_edit.c45
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;