Commit: d4fce19d4f83ee1a5e702262b9f7059ba33be9d8
Author: Martin Felke
Date:   Fri Feb 6 16:26:21 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd4fce19d4f83ee1a5e702262b9f7059ba33be9d8

added a cluster group setting, where helper objects can define locations of 
cluster cores (shards will be added to its clostest core always), converted 
objects belong to a group now also

===================================================================

M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/editors/object/object_modifier.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 1ab195e..a69b705 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -75,6 +75,7 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
         col.prop(md, "shard_count")
         col.prop(md, "cluster_count")
         col.prop(md, "point_seed")
+        layout.prop(md, "cluster_group")
         if md.frac_algorithm == 'BOOLEAN' or md.frac_algorithm == 
'BISECT_FILL' or md.frac_algorithm == 'BISECT_FAST_FILL':
             layout.prop(md, "inner_material")
         if md.frac_algorithm == 'BOOLEAN_FRACTAL':
diff --git a/source/blender/editors/object/object_modifier.c 
b/source/blender/editors/object/object_modifier.c
index 25814a1..feb9950 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2534,12 +2534,17 @@ static void convert_modifier_to_objects(ReportList 
*reports, Scene* scene, Objec
        int i = 0;
        RigidBodyWorld *rbw = scene->rigidbody_world;
 
+       const char *name = BLI_strdupcat(ob->id.name, "_conv");
+       Group *g = BKE_group_add(G.main, name);
+
        int count = BLI_listbase_count(&rmd->meshIslands);
        KDTree* objtree = BLI_kdtree_new(count);
        Object** objs = MEM_callocN(sizeof(Object*) * count, "convert_objs");
        float max_con_mass = 0;
        rmd->refresh = false;
 
+       MEM_freeN((void*)name);
+
        if (rbw)
                rbw->pointcache->flag |= PTCACHE_OUTDATED;
 
@@ -2556,7 +2561,6 @@ static void convert_modifier_to_objects(ReportList 
*reports, Scene* scene, Objec
                }
                else {
 
-
                        ob_new = BKE_object_add(G.main, scene, OB_MESH);
 
                        if (rbw) {
@@ -2575,6 +2579,8 @@ static void convert_modifier_to_objects(ReportList 
*reports, Scene* scene, Objec
                        }
                }
 
+               BKE_group_object_add(g, ob_new, scene, NULL);
+
                /* throw away all modifiers before fracture, result is stored 
inside it */
                while (ob_new->modifiers.first != NULL) {
                        md = ob_new->modifiers.first;
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 01e9295..0c9fa6b 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1431,6 +1431,7 @@ typedef struct FractureModifierData {
        struct DerivedMesh *dm;
        struct Group *extra_group;
        struct Group *dm_group;
+       struct Group *cluster_group;
        struct BMesh *visible_mesh;
        struct DerivedMesh *visible_mesh_cached;
        ListBase meshIslands, meshConstraints;
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index 5040f20..f482d3d 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -4171,6 +4171,11 @@ static void rna_def_modifier_fracture(BlenderRNA *brna)
        RNA_def_property_range(prop, 1, 10);
        RNA_def_property_ui_text(prop, "Fractal Iterations", "Number of times 
the number of cuts will be made to the grid, with the given fractal amount");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "cluster_group", PROP_POINTER, PROP_NONE);
+       RNA_def_property_ui_text(prop, "Cluster Group", "");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 void RNA_def_modifier(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 807d1a0..5cec596 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -146,6 +146,8 @@ static void initData(ModifierData *md)
        fmd->fractal_amount = 1.0f;
        fmd->physics_mesh_scale = 0.75f;
        fmd->fractal_iterations = 5;
+
+       fmd->cluster_group = NULL;
 }
 
 static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool 
remove_rigidbody)
@@ -416,38 +418,69 @@ static void doClusters(FractureModifierData *fmd)
                }
        }
 
-       /* zero clusters or one mean no clusters, all shards keep free */
-       if (fmd->cluster_count < 2) {
-               return;
-       }
+       if (fmd->cluster_group)
+       {
+               seed_count = BLI_listbase_count(&fmd->cluster_group->gobject);
+               if (seed_count > 0)
+               {
+                       GroupObject* go;
+                       int i = 0;
+                       tree = BLI_kdtree_new(seed_count);
+                       for (i = 0, go = fmd->cluster_group->gobject.first; go; 
i++, go = go->next)
+                       {
+                               BLI_kdtree_insert(tree, i, go->ob->loc);
+                       }
+
+                       BLI_kdtree_balance(tree);
+
+                       /* assign each shard to its closest center */
+                       for (s = shardlist.first; s; s = s->next ) {
+                               KDTreeNearest n;
+                               int index;
 
-       seed_count = (fmd->cluster_count > fmd->frac_mesh->shard_count ? 
fmd->frac_mesh->shard_count : fmd->cluster_count);
-       seeds = MEM_mallocN(sizeof(Shard *) * seed_count, "seeds");
-       tree = BLI_kdtree_new(seed_count);
+                               index = BLI_kdtree_find_nearest(tree, 
s->centroid, &n);
+                               s->cluster_colors[0] = index;
+                       }
 
-       /* pick n seed locations, randomly scattered over the object */
-       for (k = 0; k < seed_count; k++) {
-               int color = k;
-               int which_index = k * (int)(fmd->frac_mesh->shard_count / 
seed_count);
-               Shard *which = (Shard *)BLI_findlink(&shardlist, which_index);
-               which->cluster_colors[0] = color;
-               BLI_kdtree_insert(tree, k, which->centroid);
-               seeds[k] = which;
+                       BLI_kdtree_free(tree);
+               }
        }
+       else
+       {
+               /* zero clusters or one mean no clusters, all shards keep free 
*/
+               if (fmd->cluster_count < 2) {
+                       return;
+               }
 
-       BLI_kdtree_balance(tree);
+               seed_count = (fmd->cluster_count > fmd->frac_mesh->shard_count 
? fmd->frac_mesh->shard_count : fmd->cluster_count);
+               seeds = MEM_mallocN(sizeof(Shard *) * seed_count, "seeds");
+               tree = BLI_kdtree_new(seed_count);
 
-       /* assign each shard to its closest center */
-       for (s = shardlist.first; s; s = s->next ) {
-               KDTreeNearest n;
-               int index;
+               /* pick n seed locations, randomly scattered over the object */
+               for (k = 0; k < seed_count; k++) {
+                       int color = k;
+                       int which_index = k * (int)(fmd->frac_mesh->shard_count 
/ seed_count);
+                       Shard *which = (Shard *)BLI_findlink(&shardlist, 
which_index);
+                       which->cluster_colors[0] = color;
+                       BLI_kdtree_insert(tree, k, which->centroid);
+                       seeds[k] = which;
+               }
 
-               index = BLI_kdtree_find_nearest(tree, s->centroid, &n);
-               s->cluster_colors[0] = seeds[index]->cluster_colors[0];
-       }
+               BLI_kdtree_balance(tree);
 
-       BLI_kdtree_free(tree);
-       MEM_freeN(seeds);
+
+               /* assign each shard to its closest center */
+               for (s = shardlist.first; s; s = s->next ) {
+                       KDTreeNearest n;
+                       int index;
+
+                       index = BLI_kdtree_find_nearest(tree, s->centroid, &n);
+                       s->cluster_colors[0] = seeds[index]->cluster_colors[0];
+               }
+
+               BLI_kdtree_free(tree);
+               MEM_freeN(seeds);
+       }
 }
 
 static KDTree *build_nor_tree(DerivedMesh *dm)
@@ -1106,6 +1139,8 @@ static void copyData(ModifierData *md, ModifierData 
*target)
        /* sub object group  XXX Do we keep this ?*/
        trmd->dm_group = rmd->dm_group;
 
+       trmd->cluster_group = rmd->cluster_group;
+
        trmd->use_particle_birth_coordinates = 
rmd->use_particle_birth_coordinates;
        trmd->splinter_length = rmd->splinter_length;
        trmd->cluster_solver_iterations_override = 
rmd->cluster_solver_iterations_override;
@@ -2664,6 +2699,7 @@ static void foreachIDLink(ModifierData *md, Object *ob,
        walk(userData, ob, (ID **)&fmd->inner_material);
        walk(userData, ob, (ID **)&fmd->extra_group);
        walk(userData, ob, (ID **)&fmd->dm_group);
+       walk(userData, ob, (ID **)&fmd->cluster_group);
 }
 
 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData 
*UNUSED(md))

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to