Commit: 40794110d4374c5e7ec4dafff5162f8558a68191
Author: Martin Felke
Date:   Sun Dec 2 13:38:27 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB40794110d4374c5e7ec4dafff5162f8558a68191

fix for external constraints (centroid)

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/fracture_constraints.c
M       source/blender/blenkernel/intern/fracture_prefractured.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h 
b/source/blender/blenkernel/BKE_fracture.h
index 7e6074b6f92..5d793f25753 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -186,4 +186,7 @@ bool BKE_fracture_handle_initial_shards(struct 
FractureModifierData* fmd, struct
                                         struct Depsgraph *depsgraph, struct 
Main* bmain,
                                         struct Scene* scene, int frame);
 
+void BKE_fracture_meshislands_connect(struct Scene* scene, struct 
FractureModifierData* fmd,
+                                      struct Shard* mi, struct Shard* mi2, 
short con_type, float thresh);
+
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 70e14288914..ab76b03a687 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1320,7 +1320,7 @@ Mesh* 
BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Object*
                }
 
                if (dupli) {
-                       if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, 
mi->id))
+                       if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, 
POINTER_FROM_INT(mi->id)))
                        {
                                continue;
                        }
@@ -1894,7 +1894,8 @@ void BKE_fracture_meshislands_free(FractureModifierData* 
fmd, Scene* scene)
 
 void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
 {
-       BKE_fracture_constraints_free(fmd, scene);
+       if (scene && scene->rigidbody_world)
+               BKE_fracture_constraints_free(fmd, scene->rigidbody_world);
        BKE_fracture_meshislands_free(fmd, scene);
 
        if (fmd->shared->material_index_map)
@@ -3325,7 +3326,7 @@ void 
BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
                                FractureModifierData *fmdi = 
(FractureModifierData*)modifiers_findByType(obj, eModifierType_Fracture);
                                if (fmdi && fmdi->pack_group && (fmdi->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
                                {
-                                       
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmd->pack_group, obb)
+                                       
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmdi->pack_group, obb)
                                        {
                                                if (obb == ob)
                                                {
@@ -3349,8 +3350,11 @@ void 
BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
                if (fmd->pack_group && (fmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
                {       //disable the carrier object, it would interfere (it 
should have 1 island only)
                        Shard *mi = fmd->shared->shards.first;
-                       mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
-                       mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+                       if (mi && mi->rigidbody)
+                       {
+                               mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+                               mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+                       }
 
                        ob->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
                        ob->rigidbody_object->flag |= RBO_FLAG_IS_GHOST;
@@ -3369,7 +3373,7 @@ void 
BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
 void BKE_fracture_meshislands_pack(FractureModifierData *fmd, Object* obj, 
Main* bmain, Scene* scene)
 {
        int i = 0;
-       if (fmd->pack_group)
+       if (fmd->pack_group && !(fmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
        {
                BKE_fracture_mesh_island_remove_all(fmd, scene);
 
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c 
b/source/blender/blenkernel/intern/fracture_constraints.c
index 8c56c36fd1e..ec707eb086c 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -173,7 +173,19 @@ static int prepareConstraintSearch(FractureModifierData 
*rmd, Shard ***mesh_isla
                *combined_tree = BLI_kdtree_new(islands);
                for (i = 0; i < islands; i++) {
                        float obj_centr[3];
-                       mul_v3_m4v3(obj_centr, obj->obmat, 
(*mesh_islands)[i]->loc);
+                       if (!(rmd->pack_group && (rmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+                       {
+                               mul_v3_m4v3(obj_centr, obj->obmat, 
(*mesh_islands)[i]->loc);
+                       }
+                       else {
+                               //TODO, take care of recursive collections here 
!!!!
+                               CollectionObject *go = 
BLI_findlink(&scene->rigidbody_world->group->gobject,
+                                                                   
(*mesh_islands)[i]->object_index);
+
+                               mul_v3_m4v3(obj_centr, go->ob->obmat, 
(*mesh_islands)[i]->loc);
+                               //copy_v3_v3(obj_centr, 
(*mesh_islands)[i]->loc);
+                       }
+
                        BLI_kdtree_insert(*combined_tree, i, obj_centr);
                }
 
@@ -224,7 +236,6 @@ static int prepareConstraintSearch(FractureModifierData 
*rmd, Shard ***mesh_isla
 
                if (totvert > 0)
                {
-
                        *combined_tree = BLI_kdtree_new(totvert);
                        for (i = 0, mv = mvert; i < totvert; i++, mv++) {
                                float co[3];
@@ -267,7 +278,17 @@ static void create_constraints(FractureModifierData *rmd, 
Object *ob, Scene *sce
 
        for (i = 0; i < count; i++) {
                if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
-                       search_tree_based(rmd, mesh_islands[i], mesh_islands, 
&coord_tree, NULL, ob, scene);
+                       float co[3];
+                       if (rmd->pack_group && (rmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
+                       {
+                               CollectionObject *go = 
BLI_findlink(&scene->rigidbody_world->group->gobject, 
mesh_islands[i]->object_index);
+                               mul_v3_m4v3(co, go->ob->obmat, 
mesh_islands[i]->loc);
+                       }
+                       else {
+                               copy_v3_v3(co, mesh_islands[i]->loc);
+                       }
+
+                       search_tree_based(rmd, mesh_islands[i], mesh_islands, 
&coord_tree, co, ob, scene);
                }
                else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) {
                        Shard *mii = NULL;
@@ -298,19 +319,13 @@ static void search_tree_based(FractureModifierData *rmd, 
Shard *mi, Shard **mesh
 
        limit = rmd->constraint_limit;
        dist = rmd->contact_dist;
-       //factor = rmd->mass_threshold_factor;
 
-       if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
-               mul_v3_m4v3(obj_centr, ob->obmat, mi->loc);
+       if (!(rmd->pack_group && (rmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+       {
+               mul_v3_m4v3(obj_centr, ob->obmat, co);
        }
-       else if (rmd->constraint_target == MOD_FRACTURE_VERTEX){
-               if (!(rmd->pack_group && (rmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
-               {
-                       mul_v3_m4v3(obj_centr, ob->obmat, co);
-               }
-               else {
-                       copy_v3_v3(obj_centr, co);
-               }
+       else {
+               copy_v3_v3(obj_centr, co);
        }
 
        r = BLI_kdtree_range_search(*combined_tree, obj_centr, &n3, dist);
@@ -362,7 +377,8 @@ static void search_tree_based(FractureModifierData *rmd, 
Shard *mi, Shard **mesh
                                }
                        }
 
-                       BKE_fracture_constraint_create(scene, rmd, mi, mi2, 
con_type, thresh);
+                       /* does some more checks */
+                       BKE_fracture_meshislands_connect(scene, rmd, mi, mi2, 
con_type, thresh);
                }
        }
 
@@ -373,7 +389,7 @@ static void search_tree_based(FractureModifierData *rmd, 
Shard *mi, Shard **mesh
 }
 
 void BKE_fracture_meshislands_connect(Scene* sc, FractureModifierData *fmd, 
Shard *mi1, Shard *mi2,
-                                                                               
         int con_type, float thresh)
+                                                                               
         short con_type, float thresh)
 {
        int con_found = false;
        RigidBodyShardCon *con;
@@ -407,7 +423,7 @@ void BKE_fracture_meshislands_connect(Scene* sc, 
FractureModifierData *fmd, Shar
        }
 
        if (!con_found && ok) {
-               BKE_fracture_meshislands_connect(sc, fmd, mi1, mi2, con_type, 
thresh);
+               BKE_fracture_constraint_create(sc, fmd, mi1, mi2, con_type, 
thresh);
        }
 }
 
@@ -658,6 +674,7 @@ static void do_clusters(FractureModifierData *fmd, Object* 
obj)
        do_cluster_count(fmd, obj);
 }
 
+/* used for external python api */
 RigidBodyShardCon *BKE_fracture_mesh_constraint_create(Scene *scene, 
FractureModifierData *fmd,
                                                                                
                         Shard *mi1, Shard *mi2, short con_type)
 {
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c 
b/source/blender/blenkernel/intern/fracture_prefractured.c
index 67aa21e57fe..5fde2845dd8 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -228,12 +228,15 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, 
Object *ob, Mesh *me_orig, D
                /*keep shards at packing and at dynamic refresh */
                if (fmd->pack_group)
                {
-                       /* keep re-packing, too */
-                       BKE_fracture_meshislands_pack(fmd, ob, bmain, scene);
-
-                       if (!BKE_fracture_handle_initial_shards(fmd, ob, 
depsgraph, bmain, scene, frame))
+                       if (!(fmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
                        {
-                               do_initial_prefracture(fmd, ob, depsgraph, 
bmain, scene, frame, me);
+                               /* keep re-packing, too */
+                               BKE_fracture_meshislands_pack(fmd, ob, bmain, 
scene);
+
+                               if (!BKE_fracture_handle_initial_shards(fmd, 
ob, depsgraph, bmain, scene, frame))
+                               {
+                                       do_initial_prefracture(fmd, ob, 
depsgraph, bmain, scene, frame, me);
+                               }
                        }
                }
                else {
@@ -267,7 +270,7 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object 
*ob, Mesh *me_orig, D
        }
 
        /* assemble mesh from transformed meshislands */
-       if (fmd->shared->shards.first) {
+       if (fmd->shared->shards.first && !(fmd->flag & 
MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)) {
                me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, ob, 
ctime);
        }
        else {

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

Reply via email to