Commit: f1714a370eecd71173e3c7f3466577abdcb4e88b
Author: Martin Felke
Date: Sat Feb 21 14:04:05 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rBf1714a370eecd71173e3c7f3466577abdcb4e88b
fix: skip invalid shards when doing voronoi+bisect+fill, (less than 3 verts),
this caused crashes when trying to load files with fracture results being
stored this way
===================================================================
M source/blender/blenkernel/intern/fracture_util.c
M source/blender/blenloader/intern/writefile.c
===================================================================
diff --git a/source/blender/blenkernel/intern/fracture_util.c
b/source/blender/blenkernel/intern/fracture_util.c
index d67e9aa..8e15f4f 100644
--- a/source/blender/blenkernel/intern/fracture_util.c
+++ b/source/blender/blenkernel/intern/fracture_util.c
@@ -664,21 +664,32 @@ Shard *BKE_fracture_shard_bisect(BMesh *bm_orig, Shard
*child, float obmat[4][4]
BMO_op_finish(bm_parent, &bmop);
}
- dm_out = CDDM_from_bmesh(bm_parent, true);
- output_s = BKE_create_fracture_shard(dm_out->getVertArray(dm_out),
- dm_out->getPolyArray(dm_out),
- dm_out->getLoopArray(dm_out),
- dm_out->getNumVerts(dm_out),
- dm_out->getNumPolys(dm_out),
- dm_out->getNumLoops(dm_out), true);
-
- output_s = BKE_custom_data_to_shard(output_s, dm_out);
-
- /*XXX TODO this might be wrong by now ... */
- output_s->neighbor_count = child->neighbor_count;
- output_s->neighbor_ids = MEM_mallocN(sizeof(int) *
child->neighbor_count, __func__);
- memcpy(output_s->neighbor_ids, child->neighbor_ids, sizeof(int) *
child->neighbor_count);
- BKE_fracture_shard_center_centroid(output_s, output_s->centroid);
+ if (bm_parent->totvert >= 3)
+ { /* atleast 3 verts form a face, so strip out invalid stuff */
+ dm_out = CDDM_from_bmesh(bm_parent, true);
+ output_s =
BKE_create_fracture_shard(dm_out->getVertArray(dm_out),
+
dm_out->getPolyArray(dm_out),
+
dm_out->getLoopArray(dm_out),
+
dm_out->getNumVerts(dm_out),
+
dm_out->getNumPolys(dm_out),
+
dm_out->getNumLoops(dm_out), true);
+
+ output_s = BKE_custom_data_to_shard(output_s, dm_out);
+
+ /*XXX TODO this might be wrong by now ... */
+ output_s->neighbor_count = child->neighbor_count;
+ output_s->neighbor_ids = MEM_mallocN(sizeof(int) *
child->neighbor_count, __func__);
+ memcpy(output_s->neighbor_ids, child->neighbor_ids, sizeof(int)
* child->neighbor_count);
+ BKE_fracture_shard_center_centroid(output_s,
output_s->centroid);
+
+ dm_out->needsFree = 1;
+ dm_out->release(dm_out);
+ dm_out = NULL;
+ }
+ else
+ {
+ output_s = NULL;
+ }
BM_mesh_free(bm_child);
BM_mesh_free(bm_parent);
@@ -687,9 +698,7 @@ Shard *BKE_fracture_shard_bisect(BMesh *bm_orig, Shard
*child, float obmat[4][4]
dm_child->release(dm_child);
dm_child = NULL;
- dm_out->needsFree = 1;
- dm_out->release(dm_out);
- dm_out = NULL;
+
return output_s;
}
diff --git a/source/blender/blenloader/intern/writefile.c
b/source/blender/blenloader/intern/writefile.c
index a781b44..cf20220 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1650,18 +1650,15 @@ static void write_modifiers(WriteData *wd, ListBase
*modbase)
writestruct(wd, DATA, "FracMesh", 1,
fm);
for (s = fm->shard_map.first; s; s =
s->next) {
- if (s->totvert > 1)
- write_shard(wd, s);
+ write_shard(wd, s);
}
for (s = fmd->islandShards.first; s; s
= s->next) {
- if (s->totvert > 1)
- write_shard(wd, s);
+ write_shard(wd, s);
}
for (mi = fmd->meshIslands.first; mi;
mi = mi->next) {
- if (mi->vertex_count > 1)
- write_meshIsland(wd,
mi);
+ write_meshIsland(wd, mi);
}
}
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs