Commit: 66affa5cf39e577ea98e30d0a0b26a24341db792 Author: Martin Felke Date: Wed Feb 18 11:57:24 2015 +0100 Branches: fracture_modifier https://developer.blender.org/rB66affa5cf39e577ea98e30d0a0b26a24341db792
fix: cutter groups should work mostly now =================================================================== M source/blender/blenkernel/intern/fracture.c M source/blender/blenkernel/intern/fracture_util.c =================================================================== diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c index 97cb54b..1b0be06 100644 --- a/source/blender/blenkernel/intern/fracture.c +++ b/source/blender/blenkernel/intern/fracture.c @@ -836,16 +836,17 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short Shard *t = NULL; Shard *s = NULL; + printf("Cutting with %s ...\n", ob->id.name); /*simple case....one cutter object per object*/ - if (ob->type == OB_MESH) - { - int i = 0, j = 0, k = 0, count = 0; + if (ob->type == OB_MESH) { + int i = 0, k = 0, count = 0; DerivedMesh *d; MVert *mv; + int *shard_counts = NULL; + bool is_zero = false; d = ob->derivedFinal; - if (d == NULL) - { + if (d == NULL) { d = CDDM_from_mesh(ob->data); } @@ -862,11 +863,10 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short } count = fmd->frac_mesh->shard_count; + //printf("Count: %d\n", count); - if (count == 0) - { - if (obj->derivedFinal != NULL) - { + if (count == 0) { + if (obj->derivedFinal != NULL) { dm_parent = CDDM_copy(obj->derivedFinal); } @@ -875,23 +875,22 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short } count = 1; + is_zero = true; } - for (k = 0; k < count; k++) - { - /*just keep appending items at the end here */ + shard_counts = MEM_mallocN(sizeof(int) * count, "shard_counts"); + for (k = 0; k < count; k++) { + /*just keep appending items at the end here */ MPoly *mpoly, *mp; - int totpoly, totvert; + int totpoly; Shard *parent = NULL; - if (count > 1) - { + if (is_zero == false) { parent = BLI_findlink(&fmd->frac_mesh->shard_map, k); dm_parent = BKE_shard_create_dm(parent, true); } - totvert = dm_parent->getNumVerts(dm_parent); mpoly = dm_parent->getPolyArray(dm_parent); totpoly = dm_parent->getNumPolys(dm_parent); for (i = 0, mp = mpoly; i < totpoly; i++, mp++) { @@ -899,24 +898,20 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short } s = BKE_fracture_shard_boolean(obj, dm_parent, t, inner_material_index, 0, 0.0f, &s2, NULL, 0.0f, false, 0); - if (s != NULL) - { + if (s != NULL) { add_shard(fmd->frac_mesh, s, mat); shards++; s = NULL; } - if (s2 != NULL) - { + if (s2 != NULL) { add_shard(fmd->frac_mesh, s2, mat); shards++; s2 = NULL; } - if ((count == 1 && ob->derivedFinal == NULL) || (count > 1)) - { - if (count == 1) - { + if ((is_zero && ob->derivedFinal == NULL) || !is_zero) { + if (is_zero) { count = 0; } @@ -925,23 +920,34 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short dm_parent = NULL; } - //shards--; - } + if (is_zero) { + shards = 0; + } - count = fmd->frac_mesh->shard_count; + shard_counts[k] = shards; + //printf("k, shards: %d %d \n", k, shards); + shards = 0; + } - /*new count - shards = shards to remove*/ - for (k = 0; k < count-shards; k++) + for (k = 0; k < count; k++) { - /*clean up old entries here to avoid unnecessary shards*/ - Shard *first = fmd->frac_mesh->shard_map.first; - BLI_remlink_safe(&fmd->frac_mesh->shard_map,first); - BKE_shard_free(first, true); - first = NULL; - fmd->frac_mesh->shard_count--; + int cnt = shard_counts[k]; + + if (cnt > 0) + { + /*clean up old entries here to avoid unnecessary shards*/ + Shard *first = fmd->frac_mesh->shard_map.first; + BLI_remlink_safe(&fmd->frac_mesh->shard_map,first); + BKE_shard_free(first, true); + first = NULL; + fmd->frac_mesh->shard_count--; + + printf("Removed first...\n"); + } } - shards = 0; + MEM_freeN(shard_counts); + shard_counts = NULL; BKE_shard_free(t, true); if (ob->derivedFinal == NULL) @@ -950,8 +956,6 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short d->release(d); d = NULL; } - - j++; } } } diff --git a/source/blender/blenkernel/intern/fracture_util.c b/source/blender/blenkernel/intern/fracture_util.c index f638ec4..7ff0ad9 100644 --- a/source/blender/blenkernel/intern/fracture_util.c +++ b/source/blender/blenkernel/intern/fracture_util.c @@ -393,6 +393,8 @@ Shard *BKE_fracture_shard_boolean(Object *obj, DerivedMesh *dm_parent, Shard *ch if (other != NULL) { + +#if 0 if (bm == NULL) { bm = DM_to_bmesh(left_dm, true); @@ -406,9 +408,11 @@ Shard *BKE_fracture_shard_boolean(Object *obj, DerivedMesh *dm_parent, Shard *ch left_dm = NULL; left_dm = CDDM_from_bmesh(bm, true); - BM_mesh_free(bm); +#endif + if (bm != NULL) + BM_mesh_free(bm); - other_dm = NewBooleanDerivedMesh(right_dm, obj, left_dm, obj, 1); + other_dm = NewBooleanDerivedMesh(left_dm, obj, right_dm, obj, 3); /*check for watertightness again*/ if (!other_dm || check_non_manifold(other_dm) || !compare_dm_size(right_dm, other_dm)) { _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs