[Bf-blender-cvs] [eca6264] master: Fix T38928 Particle add brush would generate trash on meshes with use_modifier_stack enabled

Antony Riakiotakis noreply at git.blender.org
Thu Mar 27 11:17:15 CET 2014


Commit: eca6264ab07d63b0875c019d83a2feb48df34fd8
Author: Antony Riakiotakis
Date:   Wed Mar 26 22:24:36 2014 +0200
https://developer.blender.org/rBeca6264ab07d63b0875c019d83a2feb48df34fd8

Fix T38928 Particle add brush would generate trash on meshes with use_modifier_stack enabled

Issue here is complex (Of course, this is particles!)

First issue is that use_modifier_stack will use the num parameter of the
particles instead of num_dmcache, something the brush code did not
account for at all. Now correctly set DMCACHE_ISCHILD in that case.

Second issue is that make_derived_deform will return a mesh with less
indices than the particle system derived mesh. This would mean that
subsequent sampling of the particle derived mesh to initialize the
particles woould also produce garbage. This was being done for
optimization but in that case it broke the system.

Reviewers: lukastoenne

Differential Revision: https://developer.blender.org/D429

===================================================================

M	source/blender/editors/physics/particle_edit.c

===================================================================

diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index aa1d017..5a43ca1 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;




More information about the Bf-blender-cvs mailing list