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

Reply via email to