Commit: a5047171b9e3720bdb29caac87c911f900cd7287
Author: Martin Felke
Date:   Thu Dec 15 18:34:50 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBa5047171b9e3720bdb29caac87c911f900cd7287

inter-objects constraint objects can now determine which shards (closest) will 
be connected to the other object

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.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 a359df7..53d5fdb 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -121,5 +121,6 @@ int BKE_fracture_update_visual_mesh(struct 
FractureModifierData *fmd, struct Obj
 short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, 
short matstart, struct GHash** mat_index_map);
 
 void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
+void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct 
MeshIsland *mi1, struct MeshIsland *mi2, int 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 1024a8b..8ef6bca 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -3151,3 +3151,69 @@ void BKE_bm_mesh_hflag_flush_vert(BMesh *bm, const char 
hflag)
                BM_elem_flag_set(f, hflag, ok);
        }
 }
+
+void BKE_meshisland_constraint_create(FractureModifierData* fmd, MeshIsland 
*mi1, MeshIsland *mi2, int con_type, float thresh)
+{
+       RigidBodyShardCon *rbsc;
+       rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, 
con_type, fmd->fracture_mode != MOD_FRACTURE_DYNAMIC);
+       rbsc->mi1 = mi1;
+       rbsc->mi2 = mi2;
+
+       BLI_snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
+
+       if (thresh == 0 || fmd->use_breaking == false) {
+               rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
+       }
+
+       if (!fmd->use_constraint_collision) {
+               rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
+       }
+       else {
+               rbsc->flag &= ~RBC_FLAG_DISABLE_COLLISIONS;
+       }
+
+       if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
+               (mi1->particle_index == mi2->particle_index))
+       {
+               if (fmd->cluster_count > 1) {
+                       rbsc->breaking_threshold = 
fmd->cluster_breaking_threshold;
+               }
+               else {
+                       rbsc->breaking_threshold = thresh;
+               }
+       }
+       else
+       {
+               if ((mi1->particle_index != -1) && (mi2->particle_index != -1) 
&&
+                       (mi1->particle_index != mi2->particle_index))
+               {
+                       /* set a different type of constraint between clusters 
*/
+                       rbsc->type = fmd->cluster_constraint_type;
+               }
+               rbsc->breaking_threshold = thresh;
+       }
+
+       if (fmd->thresh_defgrp_name[0]) {
+               /* modify maximum threshold by minimum weight */
+               rbsc->breaking_threshold = thresh * MIN2(mi1->thresh_weight, 
mi2->thresh_weight);
+       }
+
+       BLI_addtail(&fmd->meshConstraints, rbsc);
+
+       /* store constraints per meshisland too, to allow breaking percentage */
+       if (mi1->participating_constraints == NULL) {
+               mi1->participating_constraints = 
MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi1");
+               mi1->participating_constraint_count = 0;
+       }
+       mi1->participating_constraints = 
MEM_reallocN(mi1->participating_constraints, sizeof(RigidBodyShardCon *) * 
(mi1->participating_constraint_count + 1));
+       mi1->participating_constraints[mi1->participating_constraint_count] = 
rbsc;
+       mi1->participating_constraint_count++;
+
+       if (mi2->participating_constraints == NULL) {
+               mi2->participating_constraints = 
MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi2");
+               mi2->participating_constraint_count = 0;
+       }
+       mi2->participating_constraints = 
MEM_reallocN(mi2->participating_constraints, sizeof(RigidBodyShardCon *) * 
(mi2->participating_constraint_count + 1));
+       mi2->participating_constraints[mi2->participating_constraint_count] = 
rbsc;
+       mi2->participating_constraint_count++;
+}
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 4be148e..43c2aa5 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1414,44 +1414,15 @@ static void 
rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 
 /* --------------------- */
 
-static int connected_island_cons(RigidBodyWorld *rbw, Object* ob, 
RigidBodyCon*** cons)
-{
-       GroupObject* go;
-       int count = 0, i = 0;
-
-       for (go = rbw->constraints->gobject.first; go; go = go->next ) {
-               RigidBodyCon *con = go->ob->rigidbody_constraint;
-               if ((con->ob1 == ob) || (con->ob2 == ob))
-               {
-                       count++;
-               }
-       }
-
-       *cons = MEM_mallocN(sizeof(RigidBodyCon*) * count, 
"connected_island_cons");
-
-       for (go = rbw->constraints->gobject.first; go; go = go->next ) {
-               RigidBodyCon *con = go->ob->rigidbody_constraint;
-               if ((con->ob1 == ob) || (con->ob2 == ob))
-               {
-                       (*cons)[i] = con;
-                       i++;
-               }
-       }
-
-       return count;
-}
-
 static MeshIsland* find_closest_meshisland_to_point(FractureModifierData* fmd, 
Object *ob, Object *ob2, RigidBodyWorld* rbw, RigidBodyCon *con) {
 
        MeshIsland *mi, **mi_array = NULL;
        KDTree *tree;
-       KDTreeNearest *n;
+       KDTreeNearest *n = NULL;
        int count = 0;
-       int con_count = 0;
        int index = 0;
-       float loc[3];
-       int i = 0, j = 0;
-       RigidBodyCon **cons = NULL;
+       float loc[3], min[3], max[3], vec[3] = {1, 1, 1};
+       int i = 0, r = 0;
 
        count = BLI_listbase_count(&fmd->meshIslands);
        tree = BLI_kdtree_new(count);
@@ -1466,22 +1437,15 @@ static MeshIsland* 
find_closest_meshisland_to_point(FractureModifierData* fmd, O
 
        BLI_kdtree_balance(tree);
 
-       con_count = connected_island_cons(rbw, ob, &cons);
-       n = MEM_mallocN(sizeof(KDTreeNearest) * con_count, "n nearest 
find_closest_meshisland");
-
-       BLI_kdtree_find_nearest_n(tree, ob2->loc, n, con_count);
+       index = BLI_kdtree_find_nearest(tree, ob2->loc, n);
 
-       for (j = 0; j < con_count; j++) {
-               if (cons[j] == con) {
-                       index = n[j].index;
-                       break;
-               }
-       }
+       //create "aabb"
+       mul_v3_v3(vec, ob2->size);
+       sub_v3_v3v3(min, ob2->loc, vec);
+       add_v3_v3v3(max, ob2->loc, vec);
 
        if (index == -1) {
                MEM_freeN(mi_array);
-               MEM_freeN(n);
-               MEM_freeN(cons);
                BLI_kdtree_free(tree);
                return NULL;
        }
@@ -1492,9 +1456,36 @@ static MeshIsland* 
find_closest_meshisland_to_point(FractureModifierData* fmd, O
 
        mi = mi_array[index];
 
+       //do a range search and clip against "aabb" of empty scale for 
additional inner constraint
+       r = BLI_kdtree_range_search(tree, ob2->loc, &n, 
max_fff(UNPACK3(ob2->size)));
+       for (i = 0; i < r; i++)
+       {
+               float co[3];
+               copy_v3_v3(co, n[i].co);
+
+               if ((co[0] > min[0] && co[0] < max[0]) &&
+                   (co[1] > min[1] && co[1] < max[1]) &&
+                   (co[2] > min[2] && co[2] < max[2]))
+               {
+                       MeshIsland* mi2;
+                       int ind = n[i].index;
+
+                       if (ind >= count) {
+                               ind = count-1;
+                       }
+
+                       mi2 = mi_array[ind];
+
+                       //connect ?
+                       BKE_meshisland_constraint_create(fmd, mi, mi2, 
RBC_TYPE_FIXED, fmd->breaking_threshold);
+               }
+       }
+
+       if (n) {
+               MEM_freeN(n);
+       }
+
        MEM_freeN(mi_array);
-       MEM_freeN(n);
-       MEM_freeN(cons);
        BLI_kdtree_free(tree);
 
        return mi;
@@ -1546,8 +1537,8 @@ static void 
rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
                fmd2 = (FractureModifierData*)modifiers_findByType(rbc->ob2, 
eModifierType_Fracture);
 
                if (fmd1 && fmd2) {
-                       mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, 
rbc->ob2, rbw, rbc);
-                       mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, 
rbc->ob1, rbw, rbc);
+                       mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, 
ob, rbw, rbc);
+                       mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, 
ob, rbw, rbc);
 
                        if (mi1 && mi2) {
                                rb1 = mi1->rigidbody->physics_object;
@@ -1555,14 +1546,14 @@ static void 
rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
                        }
                }
                else if (fmd1) {
-                       mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, 
rbc->ob2, rbw, rbc);
+                       mi1 = find_closest_meshisland_to_point(fmd1, rbc->ob1, 
ob, rbw, rbc);
                        if (mi1) {
                                rb1 = mi1->rigidbody->physics_object;
                                rb2 = 
rbc->ob2->rigidbody_object->physics_object;
                        }
                }
                else if (fmd2) {
-                       mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, 
rbc->ob1, rbw, rbc);
+                       mi2 = find_closest_meshisland_to_point(fmd2, rbc->ob2, 
ob, rbw, rbc);
                        if (mi2)
                        {
                                rb2 = mi2->rigidbody->physics_object;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 35e2fcb..c48b280 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2456,72 +2456,6 @@ static void mesh_separate_loose(FractureModifierData 
*rmd, Object *ob, DerivedMe
 
 }
 
-static void do_constraint(FractureModifierData* fmd, MeshIsland *mi1, 
MeshIsland *mi2, int con_type, float thresh)
-{
-       RigidBodyShardCon *rbsc;
-       rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, 
con_type, fmd->fracture_mode != MOD_FRACTURE_DYNAMIC);
-       rbsc->mi1 = mi1;
-       rbsc->mi2 = mi2;
-
-       BLI_snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
-
-       if (thresh == 0 || fmd->use_breaking == false) {
-               rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
-       }
-
-       if (!fmd->use_constraint_collision) {
-               rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
-       }
-       else {
-               rbsc->flag &= ~RBC_FLAG_DISABLE_COLLISIONS;
-       }
-
-       if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
-               (mi1->particle_index == mi2->particle_index))
-       {
-               if (fmd->cluster_count > 1) {
-                       rbsc->breaking_threshold = 
fmd->cluster_breaking_threshold;
-               }
-               else {
-                       rbsc->breaking_threshold = thresh;
-               }
-       }
-       else
-       {
-               if ((mi1->particle_index != -1) && (mi2->particle_index != -1) 
&&
-                       (mi1->particle_index != mi2->particle_index))
-               {
-                       /* set a different type of constraint between clusters 
*/
-                       rbsc->type = fmd->cluster_constraint_type;
-               }
-               rbsc->breaking_threshold = thresh;
-       }
-
-       if (fmd->thresh_defgrp_name[0]) {
-               /* modify maximum threshold by minimum weight */
-               rbsc->breaking_threshold = thresh * MIN2(mi1->thresh_weight, 
mi2->thresh_weight);
-       }
-
-       BLI_addtail(&fmd->meshConstraints, rbsc);
-
-       /* store constraints per meshisland too, to allow breaking percentage */
-       if (mi1->participating_constraints == NULL) {
-               mi1->participating_constraints = 
MEM_callocN(sizeof(RigidBodyShardCon *), "part_constraints_mi1");
-               mi1->participating_constraint_count = 0;
-       }
-       mi1->participating_constraints = 
MEM_reallocN(mi1->participating_constraints, sizeof(RigidBodyShardCon *) * 
(mi1->participating_constraint_count + 1));
-       mi1->participating_constraints[mi1->participating_cons

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to