[Bf-blender-cvs] [151b6f2] fracture_modifier: added material handling for sub object groups, target object gets all materials of group (no duplicate slots, with proper index remapping)

Martin Felke noreply at git.blender.org
Thu Mar 12 19:44:05 CET 2015


Commit: 151b6f25dbaee249aa7c9a1a99f03f4442cbe6f8
Author: Martin Felke
Date:   Thu Mar 12 19:42:34 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB151b6f25dbaee249aa7c9a1a99f03f4442cbe6f8

added material handling for sub object groups, target object gets all materials of group (no duplicate slots, with proper index remapping)

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

M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index d09042b..d27229a 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -594,23 +594,25 @@ static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
 }
 
 
-static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
+static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm, Object* ob)
 {
 	/* combine derived meshes from group objects into 1, trigger submodifiers if ob->derivedFinal is empty */
 	int totgroup = 0, i = 0;
 	int num_verts = 0, num_polys = 0, num_loops = 0;
-	int vertstart = 0, polystart = 0, loopstart = 0;
+	int vertstart = 0, polystart = 0, loopstart = 0, matstart = 0;
 	DerivedMesh *result;
 	MVert *mverts;
 	MPoly *mpolys;
 	MLoop *mloops;
 
 	Object **go = MEM_mallocN(sizeof(Object *), "groupdmobjects");
+	GHash *mat_index_map = NULL;
 	totgroup = getGroupObjects(fmd->dm_group, &go, totgroup);
 
 	if (totgroup > 0 && (fmd->refresh == true || fmd->auto_execute == true))
 	{
 		DerivedMesh *dm_ob = NULL;
+		mat_index_map = BLI_ghash_int_new("mat_index_map");
 		if (fmd->vert_index_map != NULL) {
 			BLI_ghash_free(fmd->vert_index_map, NULL, NULL);
 			fmd->vert_index_map = NULL;
@@ -658,9 +660,11 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 		{
 			MPoly *mp;
 			MLoop *ml;
-			int j, v;
+			int j, v, k = 0;
 			MVert *mv;
 
+			short *totcolp = NULL;
+			Material ***matarar = NULL;
 			Object *o = go[i];
 
 			/*ensure o->derivedFinal*/
@@ -679,10 +683,28 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 				return dm;
 			}
 
+			/* append materials to target object, if not existing yet */
+			totcolp = give_totcolp(o);
+			matarar = give_matarar(o);
+
+			for (j = 0; j < *totcolp; j++)
+			{
+				int index = find_material_index(ob, (*matarar)[j]);
+				if (index == 0)
+				{
+					k++;
+					assign_material(ob, (*matarar)[j], matstart + k, BKE_MAT_ASSIGN_USERPREF);
+				}
+
+				BLI_ghash_insert(mat_index_map, SET_INT_IN_POINTER(matstart+j+1), SET_INT_IN_POINTER(index));
+			}
+
+			j = 0;
 			memcpy(mverts + vertstart, dm_ob->getVertArray(dm_ob), dm_ob->getNumVerts(dm_ob) * sizeof(MVert));
 			memcpy(mpolys + polystart, dm_ob->getPolyArray(dm_ob), dm_ob->getNumPolys(dm_ob) * sizeof(MPoly));
 
 			for (j = 0, mp = mpolys + polystart; j < dm_ob->getNumPolys(dm_ob); ++j, ++mp) {
+				int index = 0;
 				/* adjust loopstart index */
 				if (CustomData_has_layer(&dm_ob->polyData, CD_MTEXPOLY))
 				{
@@ -691,6 +713,18 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 						CustomData_set(&result->polyData, polystart + j, CD_MTEXPOLY, mtp);
 				}
 				mp->loopstart += loopstart;
+
+				/* material index lookup and correction, avoid having the same material in different slots */
+				index = GET_INT_FROM_POINTER(BLI_ghash_lookup(mat_index_map, SET_INT_IN_POINTER(mp->mat_nr+matstart)));
+
+				if (index == 0)
+				{
+					mp->mat_nr += matstart;
+				}
+				else
+				{
+					mp->mat_nr = index;
+				}
 			}
 
 			memcpy(mloops + loopstart, dm_ob->getLoopArray(dm_ob), dm_ob->getNumLoops(dm_ob) * sizeof(MLoop));
@@ -721,6 +755,7 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 			vertstart += dm_ob->getNumVerts(dm_ob);
 			polystart += dm_ob->getNumPolys(dm_ob);
 			loopstart += dm_ob->getNumLoops(dm_ob);
+			matstart += (*totcolp);
 		}
 
 		CDDM_calc_edges(result);
@@ -728,6 +763,9 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
 		result->dirty |= DM_DIRTY_NORMALS;
 		CDDM_calc_normals_mapping(result);
 		MEM_freeN(go);
+
+		BLI_ghash_free(mat_index_map, NULL, NULL);
+		mat_index_map = NULL;
 		return result;
 	}
 
@@ -2897,99 +2935,6 @@ static void foreachObjectLink(
 	}
 }
 
-static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
-                                    struct BMEditMesh *UNUSED(editData),
-                                    DerivedMesh *derivedData,
-                                    ModifierApplyFlag UNUSED(flag))
-{
-	FractureModifierData *fmd = (FractureModifierData *) md;
-	DerivedMesh *final_dm = derivedData;
-
-	DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
-	DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
-
-	if (BKE_rigidbody_check_sim_running(md->scene->rigidbody_world, BKE_scene_frame_get(md->scene))) {
-		fmd->auto_execute = false;
-	}
-
-	if (fmd->auto_execute) {
-		fmd->refresh = true;
-	}
-
-	if (fmd->frac_mesh != NULL && fmd->frac_mesh->running == 1 && fmd->execute_threaded)
-	{
-		/* skip modifier execution when fracture job is running */
-		return final_dm;
-	}
-
-	if (fmd->refresh) {
-		if (fmd->dm != NULL) {
-			fmd->dm->needsFree = 1;
-			fmd->dm->release(fmd->dm);
-			fmd->dm = NULL;
-		}
-
-		if (fmd->frac_mesh != NULL) {
-			BKE_fracmesh_free(fmd->frac_mesh, true /*fmd->frac_algorithm != MOD_FRACTURE_VORONOI*/);
-			MEM_freeN(fmd->frac_mesh);
-			fmd->frac_mesh = NULL;
-		}
-
-		if (fmd->frac_mesh == NULL) {
-			fmd->frac_mesh = BKE_create_fracture_container();
-			if (fmd->execute_threaded) {
-				fmd->frac_mesh->running = 1;
-			}
-		}
-	}
-
-	{
-		if (fmd->refresh) {
-			/* build normaltree from origdm */
-			if (fmd->nor_tree != NULL) {
-				BLI_kdtree_free(fmd->nor_tree);
-				fmd->nor_tree = NULL;
-			}
-
-			fmd->nor_tree = build_nor_tree(clean_dm);
-			if (fmd->face_pairs != NULL) {
-				BLI_ghash_free(fmd->face_pairs, NULL, NULL);
-				fmd->face_pairs = NULL;
-			}
-
-			fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-
-			do_fracture(fmd, -1, ob, clean_dm);
-
-			if (!fmd->refresh) { /*might have been changed from outside, job cancel*/
-				return derivedData;
-			}
-		}
-
-		if (fmd->dm && fmd->frac_mesh && (fmd->dm->getNumPolys(fmd->dm) > 0)) {
-			final_dm = doSimulate(fmd, ob, fmd->dm, clean_dm);
-		}
-		else {
-			final_dm = doSimulate(fmd, ob, clean_dm, clean_dm);
-		}
-	}
-
-	/* free newly created derivedmeshes only, but keep derivedData and final_dm*/
-	if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != final_dm))
-	{
-		clean_dm->needsFree = 1;
-		clean_dm->release(clean_dm);
-	}
-
-	if ((group_dm != derivedData) && (group_dm != final_dm))
-	{
-		group_dm->needsFree = 1;
-		group_dm->release(group_dm);
-	}
-
-	return final_dm;
-}
-
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                                   DerivedMesh *derivedData,
                                   ModifierApplyFlag UNUSED(flag))
@@ -2998,7 +2943,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	FractureModifierData *fmd = (FractureModifierData *) md;
 	DerivedMesh *final_dm = derivedData;
 
-	DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
+	DerivedMesh *group_dm = get_group_dm(fmd, derivedData, ob);
 	DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
 
 	/* disable that automatically if sim is started, but must be re-enabled manually */
@@ -3084,6 +3029,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	return final_dm;
 }
 
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+                                    struct BMEditMesh *UNUSED(editData),
+                                    DerivedMesh *derivedData,
+                                    ModifierApplyFlag flag)
+{
+	return applyModifier(md, ob, derivedData, flag);
+}
 
 ModifierTypeInfo modifierType_Fracture = {
 	/* name */ "Fracture",




More information about the Bf-blender-cvs mailing list