[Bf-blender-cvs] [e8f02289770] fracture_modifier: fix attempt for numerical instabilty with cuttergroups + a couple of minor fixes
Martin Felke
noreply at git.blender.org
Tue Mar 28 17:42:10 CEST 2017
Commit: e8f022897705d34b7d42a81ef6fe4d83da8225ad
Author: Martin Felke
Date: Tue Mar 28 17:41:49 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBe8f022897705d34b7d42a81ef6fe4d83da8225ad
fix attempt for numerical instabilty with cuttergroups + a couple of minor fixes
as workaround you could use particlehelper and uniform together with cuttergroups
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_util.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index f2268103f1c..7f6a6ae8595 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -50,6 +50,7 @@ struct BoundBox;
struct MVert;
struct MPoly;
struct MLoop;
+struct MEdge;
struct BMesh;
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 5ac7530d96b..0e304019f8d 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -837,6 +837,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
if (!t)
continue;
+ //seems this override count was a totally wrong thought, just passing -1 or 0 here... hmm
if ((override_count == -1) || ((override_count > 0) && (i < override_count+1)))
{
printf("Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id);
@@ -854,9 +855,11 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
if (override_count > -1) {
printf("Deleting island shards!\n");
while (fmd->islandShards.first) {
- Shard *s = fmd->islandShards.first;
- BLI_remlink_safe(&fmd->islandShards, s);
- BKE_shard_free(s, false);
+ Shard *sh = fmd->islandShards.first;
+ if (sh) {
+ BLI_remlink_safe(&fmd->islandShards, sh);
+ BKE_shard_free(sh, false);
+ }
}
}
//BLI_unlock_thread(LOCK_CUSTOM1);
@@ -920,12 +923,13 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
if (mode == MOD_FRACTURE_PREFRACTURED && !reset)
{
+ count = BLI_listbase_count(&fm->shard_map)-1;
//rebuild tree
- if (!fm->last_shard_tree /*&& (fm->shard_count > 0)*/ && mode == MOD_FRACTURE_PREFRACTURED)
+ if (!fm->last_shard_tree && (count > 0) && mode == MOD_FRACTURE_PREFRACTURED)
{
Shard *t;
int ti = 0;
- count = BLI_listbase_count(&fm->shard_map);
+ //count = BLI_listbase_count(&fm->shard_map);
fm->shard_count = count;
if (do_tree)
{
@@ -939,12 +943,15 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
{
t->flag &=~ (SHARD_SKIP | SHARD_DELETE);
- if (do_tree)
+ if (do_tree && t != p)
{
BLI_kdtree_insert(fm->last_shard_tree, ti, t->raw_centroid);
}
- fm->last_shards[ti] = t;
- ti++;
+
+ if (t != p) {
+ fm->last_shards[ti] = t;
+ ti++;
+ }
}
if (do_tree)
@@ -1006,7 +1013,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
if ((algorithm == MOD_FRACTURE_BOOLEAN) && !threaded)
{
- #pragma omp parallel for
+ #pragma omp parallel for schedule(static)
for (i = 0; i < expected_shards; i++) {
handle_boolean_bisect(fm, obj, expected_shards, algorithm, parent_id, tempshards, dm_parent,
bm_parent, obmat, inner_material_index, num_cuts, num_levels, fractal,
@@ -1056,7 +1063,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
dm_p = NULL;
}
- if (p && (parent_id == -2))// || p->shard_id == -2))
+ if (p) // && (parent_id == -2))// || p->shard_id == -2))
{
BLI_remlink_safe(&fm->shard_map, p);
BKE_shard_free(p, true);
@@ -1365,7 +1372,7 @@ static void do_intersect(FractureModifierData *fmd, Object* ob, Shard *t, short
Shard *s = NULL, *s2 = NULL;
int shards = 0, j = 0;
- if (is_zero == false) {
+ if (is_zero == false && *dm_parent == NULL) {
parent = BLI_findlink(&fmd->frac_mesh->shard_map, k);
*dm_parent = BKE_shard_create_dm(parent, true);
}
@@ -1408,7 +1415,8 @@ static void do_intersect(FractureModifierData *fmd, Object* ob, Shard *t, short
}
}
- if ((is_zero && ob->derivedFinal == NULL) || !is_zero) {
+ //if ((is_zero && ob->derivedFinal == NULL) || !is_zero) {
+ {
if (is_zero) {
*count = 0;
}
@@ -1568,7 +1576,7 @@ void BKE_fracture_shard_by_greasepencil(FractureModifierData *fmd, Object *obj,
void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short inner_material_index, float mat[4][4])
{
- if (/*fmd->frac_algorithm == MOD_FRACTURE_BOOLEAN && */fmd->cutter_group != NULL && obj->type == OB_MESH)
+ if (fmd->cutter_group != NULL && obj->type == OB_MESH)
{
GroupObject* go;
float imat[4][4];
@@ -1628,14 +1636,18 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short
{
DerivedMesh *d;
- d = ob->derivedFinal;
- if (d == NULL) {
+ bool copied = false;
+ if (ob->derivedFinal == NULL) {
d = CDDM_from_mesh(ob->data);
+ copied = true;
+ }
+ else {
+ d = ob->derivedFinal;
}
intersect_shards_by_dm(fmd, d, obj, ob, inner_material_index, mat, true, fmd->boolean_solver, fmd->boolean_double_threshold);
- if (ob->derivedFinal == NULL)
+ if (copied)
{ /*was copied before */
d->needsFree = 1;
d->release(d);
@@ -1829,9 +1841,10 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p
MEM_freeN(fdata);
}
else {
- /*Evaluate result*/
- parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, obj, dm, inner_material_index, mat,
- num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer, false, solver, thresh, override_count);
+ /*Evaluate result*/
+ parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, obj, dm, inner_material_index, mat,
+ num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings, uv_layer,
+ false, solver, thresh, override_count);
}
/*Free structs in C++ area of memory */
diff --git a/source/blender/blenkernel/intern/fracture_util.c b/source/blender/blenkernel/intern/fracture_util.c
index bf2974686b4..bef8afd2fde 100644
--- a/source/blender/blenkernel/intern/fracture_util.c
+++ b/source/blender/blenkernel/intern/fracture_util.c
@@ -546,7 +546,7 @@ static void do_set_inner_material(Shard **other, float mat[4][4], DerivedMesh* l
int totpoly, i = 0;
MDeformVert *dvert;
int totvert = left_dm->getNumVerts(left_dm);
- FractureModifierData *fmd = modifiers_findByType(ob, eModifierType_Fracture);
+ FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
/* set inner material on child shard */
if (other == NULL || mat == NULL)
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c6fbd288ddc..ff6fb824d55 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2220,7 +2220,7 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
fake_dynamic_collide(ob1, ob2, mi1, mi2, rbw);
fake_dynamic_collide(ob2, ob1, mi2, mi1, rbw);
- return check_colgroup_ghost(ob1, ob2) && (check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, mi1) || (ob1 != ob2));
+ return check_colgroup_ghost(ob1, ob2) && ((check_constraint_island(fmd1, mi1, mi2) && check_constraint_island(fmd2, mi2, mi1)) || (ob1 != ob2));
}
static bool can_break(Object* collider, Object* ob, bool limit)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 83442f0c89e..52f642799aa 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1656,7 +1656,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
short mat_index = 0;
ShardID* ids = NULL;
- if (/*fmd->frac_algorithm == MOD_FRACTURE_BOOLEAN && */fmd->cutter_group != NULL) {
+ if (fmd->cutter_group != NULL) {
//attempt to combine fracture by cutter group with regular fracture
float mat[4][4];
Shard* s = NULL;
@@ -1667,7 +1667,6 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
//mat_index = do_materials(fmd, obj);
//mat_index = mat_index > 0 ? mat_index - 1 : mat_index;
-
BKE_fracture_shard_by_planes(fmd, obj, mat_index, mat);
ids = (ShardID*)MEM_callocN(sizeof(ShardID), "iDs");
@@ -1688,7 +1687,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
{
//int cnt = BLI_listbase_count(&fmd->frac_mesh->shard_map);
printf("Fracturing Shard ID: %d %d\n", i, ids[i]);
- do_fracture_points(fmd, obj, dm, ids[i], count == 1 ? -1 : i);
+ do_fracture_points(fmd, obj, dm, ids[i], 0); //(count == 1) ? 0 : i);
}
fmd->reset_shards = reset;
More information about the Bf-blender-cvs
mailing list