[Bf-blender-cvs] [28da4a7] fracture_modifier: fix: loading for subobject groups partially fixed, needs manual refresh afterwards still, TODO, proper material handling ("merge" object materials)
Martin Felke
noreply at git.blender.org
Mon Feb 23 14:21:16 CET 2015
Commit: 28da4a786e38fa61e5294469f751585ea7f98160
Author: Martin Felke
Date: Mon Feb 23 14:20:56 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB28da4a786e38fa61e5294469f751585ea7f98160
fix: loading for subobject groups partially fixed, needs manual refresh afterwards still, TODO, proper material handling ("merge" object materials)
===================================================================
M source/blender/blenloader/intern/readfile.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index da58dc5..36c732c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -8063,6 +8063,133 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
return bhead;
}
+static void fix_fracture_image_hack(Main* main)
+{
+ if (!MAIN_VERSION_ATLEAST(main, 273, 1)) {
+ Object *ob;
+#if 0
+ /*fix modifier images on modifiers without dm_group in a first pass */
+ for (ob = main->object.first; ob; ob = ob->id.next) {
+ FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+ if (fmd && fmd->visible_mesh_cached && ob->type == OB_MESH) {
+ CustomData* pdata = &fmd->visible_mesh_cached->polyData;
+ int i = 0;
+ int totface = fmd->visible_mesh_cached->numPolyData;
+ Mesh* me = ob->data;
+ if (me && CustomData_has_layer(pdata, CD_MTEXPOLY)) {
+ for (i = 0; i < pdata->totlayer; i++) {
+ CustomDataLayer *layer = &pdata->layers[i];
+
+ if (layer->type == CD_MTEXPOLY) {
+ MTexPoly *tf = layer->data;
+ int j = 0;
+ for (j = 0; j < totface; j++, tf++) {
+ //simply use first image here...
+ tf->tpage = me->mtpoly->tpage;
+ tf->mode = me->mtpoly->mode;
+ tf->flag = me->mtpoly->flag;
+ tf->tile = me->mtpoly->tile;
+ tf->transp = me->mtpoly->transp;
+
+ if (tf->tpage && tf->tpage->id.us == 0) {
+ tf->tpage->id.us = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+ for (ob = main->object.first; ob; ob = ob->id.next) {
+ FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+ if (fmd && fmd->dm_group && fmd->visible_mesh_cached) {
+ GroupObject *go;
+// int polystart = 0;
+
+ for (go = fmd->dm_group->gobject.first; go; go = go->next)
+ {
+ if (go->ob && go->ob->type == OB_MESH)
+ {
+#if 0
+ FractureModifierData *fmd2 = (FractureModifierData*)modifiers_findByType(go->ob, eModifierType_Fracture);
+ if (fmd2 && !fmd2->dm_group && fmd2->visible_mesh_cached)
+ {
+ CustomData* pdata = &fmd->visible_mesh_cached->polyData;
+ CustomData* pdata2 = &fmd2->visible_mesh_cached->polyData;
+ int i;
+ int totface = fmd2->visible_mesh_cached->numPolyData;
+
+ /*assume same layer count !*/
+ if (pdata->totlayer == pdata2->totlayer)
+ {
+ for (i = 0; i < pdata->totlayer; i++) {
+ CustomDataLayer *layer = &pdata->layers[i];
+ CustomDataLayer *layer2 = &pdata2->layers[i];
+
+ if (layer->type == CD_MTEXPOLY && layer2->type == CD_MTEXPOLY) {
+ MTexPoly *tf = ((MTexPoly*)layer->data) + polystart;
+ MTexPoly *tf2 = layer2->data;
+ int j;
+
+ for (j = 0; j < totface; j++, tf++, tf2++) {
+ tf->tpage = tf2->tpage;
+ tf->mode = tf2->mode;
+ tf->flag = tf2->flag;
+ tf->tile = tf2->tile;
+ tf->transp = tf2->transp;
+
+ if (tf->tpage && tf->tpage->id.us == 0) {
+ tf->tpage->id.us = 1;
+ }
+ }
+ }
+ }
+ }
+ polystart += totface;
+ }
+ else if (!fmd2)/*fallback*/
+#endif
+ {
+ Mesh* me = go->ob->data;
+ CustomData* pdata = &fmd->visible_mesh_cached->polyData;
+
+ if (me && CustomData_has_layer(pdata, CD_MTEXPOLY)) {
+ /*argh, would need to know which images belong to which "part" of the mesh, but for now
+ just allow proper loading and fix manually afterwards */
+ int i;
+ int totface = fmd->visible_mesh_cached->numPolyData;
+
+ for (i = 0; i < pdata->totlayer; i++) {
+ CustomDataLayer *layer = &pdata->layers[i];
+
+ if (layer->type == CD_MTEXPOLY && me->mtpoly) {
+ MTexPoly *tf = layer->data;
+ int j;
+
+ for (j = 0; j < totface; j++, tf++) {
+ //simply use first image here...
+ tf->tpage = me->mtpoly->tpage;
+ tf->mode = me->mtpoly->mode;
+ tf->flag = me->mtpoly->flag;
+ tf->tile = me->mtpoly->tile;
+ tf->transp = me->mtpoly->transp;
+
+ if (tf->tpage && tf->tpage->id.us == 0) {
+ tf->tpage->id.us = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
{
BHead *bhead = blo_firstbhead(fd);
@@ -8139,6 +8266,9 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
blo_join_main(&mainlist);
lib_link_all(fd, bfd->main);
+
+ fix_fracture_image_hack(bfd->main);
+
//do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010)
lib_verify_nodetree(bfd->main, true);
fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 4f71b52..851eda8 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1336,7 +1336,7 @@ static float mesh_separate_tagged(FractureModifierData *rmd, Object *ob, BMVert
BM_calc_center_centroid(bm_new, centroid, false);
BM_mesh_elem_index_ensure(bm_new, BM_VERT | BM_EDGE | BM_FACE);
- if (rmd->shards_to_islands || rmd->frac_mesh->shard_count < 2) {
+ if ((rmd->shards_to_islands || rmd->frac_mesh->shard_count < 2) && (!rmd->dm_group)) {
/* store temporary shards for each island */
dmtemp = CDDM_from_bmesh(bm_new, true);
s = BKE_create_fracture_shard(dmtemp->getVertArray(dmtemp), dmtemp->getPolyArray(dmtemp), dmtemp->getLoopArray(dmtemp),
@@ -1544,7 +1544,8 @@ static void mesh_separate_loose_partition(FractureModifierData *rmd, Object *ob,
startno = MEM_reallocN(startno, (tag_counter + 1) * 3 * sizeof(short));
normal_float_to_short_v3(vno, v_seed->no);
- find_normal(dm, rmd->nor_tree, v_seed->co, vno, no, rmd->nor_range);
+ if (rmd->fix_normals)
+ find_normal(dm, rmd->nor_tree, v_seed->co, vno, no, rmd->nor_range);
startno[3 * tag_counter] = no[0];
startno[3 * tag_counter + 1] = no[1];
startno[3 * tag_counter + 2] = no[2];
@@ -1581,7 +1582,8 @@ static void mesh_separate_loose_partition(FractureModifierData *rmd, Object *ob,
startno = MEM_reallocN(startno, (tag_counter + 1) * 3 * sizeof(short));
normal_float_to_short_v3(vno, e->v1->no);
- find_normal(dm, rmd->nor_tree, e->v1->co, vno, no, rmd->nor_range);
+ if (rmd->fix_normals)
+ find_normal(dm, rmd->nor_tree, e->v1->co, vno, no, rmd->nor_range);
startno[3 * tag_counter] = no[0];
startno[3 * tag_counter + 1] = no[1];
startno[3 * tag_counter + 2] = no[2];
@@ -1607,7 +1609,8 @@ static void mesh_separate_loose_partition(FractureModifierData *rmd, Object *ob,
startno = MEM_reallocN(startno, (tag_counter + 1) * 3 * sizeof(short));
normal_float_to_short_v3(vno, e->v2->no);
- find_normal(dm, rmd->nor_tree, e->v2->co, vno, no, rmd->nor_range);
+ if (rmd->fix_normals)
+ find_normal(dm, rmd->nor_tree, e->v2->co, vno, no, rmd->nor_range);
startno[3 * tag_counter] = no[0];
startno[3 * tag_counter + 1] = no[1];
startno[3 * tag_counter + 2] = no[2];
More information about the Bf-blender-cvs
mailing list