[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