Commit: cc00da895ecab3e280b0fe84c808d45daf0e9f48
Author: Martin Felke
Date:   Mon Oct 3 01:21:23 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBcc00da895ecab3e280b0fe84c808d45daf0e9f48

dynamic fracture: added back constraint support for it

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index ddb1f60..604c289 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2173,6 +2173,17 @@ void BKE_free_constraints(FractureModifierData *fmd)
        MeshIsland *mi = NULL;
        RigidBodyShardCon *rbsc = NULL;
 
+       //hmm after loading the pointers might be out of sync...
+       if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+               if (fmd->current_mi_entry) {
+                       fmd->meshIslands = fmd->current_mi_entry->meshIslands;
+               }
+               else {
+                       fmd->meshIslands.first = NULL;
+                       fmd->meshIslands.last = NULL;
+               }
+       }
+
        for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
                if (mi->participating_constraints != NULL && 
mi->participating_constraint_count > 0) {
                        MEM_freeN(mi->participating_constraints);
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 7b9a822..8234507 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2137,12 +2137,21 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                int id = 
rbw->cache_index_map[linear_index1]->meshisland_index;
                                Shard *s = findShard(fmd1, id);
 
-                               if (force > fmd1->dynamic_force || (/*force > 
fmd1->dynamic_force &&*/ s && ob2 && (fmd1->limit_impact &&
-                                  can_break(ob2, ob1, fmd1->limit_impact, s))))
+                               if ((force > fmd1->dynamic_force && 
(!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)) ||
+                                   (s && ob2 && (fmd1->limit_impact && 
can_break(ob2, ob1, fmd1->limit_impact, s))))))
                                {
                                        if (s) {
                                                float size[3];
-                                               BKE_object_dimensions_get(ob2, 
size);
+
+                                               if (ob1 == ob2 || (ob2 && 
ob2->rigidbody_object && ob2->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+                                                       size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
+                                                       size[1] = -1.0f;
+                                                       size[2] = -1.0f;
+                                               }
+                                               else {
+                                                       
BKE_object_dimensions_get(ob2, size);
+                                               }
+
                                                copy_v3_v3(s->impact_loc, 
cp->contact_pos_world_onA);
                                                copy_v3_v3(s->impact_size, 
size);
                                        }
@@ -2173,12 +2182,19 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                int id = 
rbw->cache_index_map[linear_index2]->meshisland_index;
                                Shard *s = findShard(fmd2, id);
 
-                               if (force > fmd2->dynamic_force || ( /*force > 
fmd2->dynamic_force &&*/ ob1 && s && (fmd2->limit_impact &&
-                                  can_break(ob1, ob2, fmd2->limit_impact, s))))
+                               if (force > fmd2->dynamic_force && 
(!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)) ||
+                                       (ob1 && s && (fmd2->limit_impact && 
can_break(ob1, ob2, fmd2->limit_impact, s)))))
                                {
                                        if (s) {
                                                float size[3];
-                                               BKE_object_dimensions_get(ob1, 
size);
+                                               if (ob1 == ob2 || (ob1 && 
ob1->rigidbody_object && ob1->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+                                                       size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
+                                                       size[1] = -1.0f;
+                                                       size[2] = -1.0f;
+                                               }
+                                               else {
+                                                       
BKE_object_dimensions_get(ob1, size);
+                                               }
                                                copy_v3_v3(s->impact_loc, 
cp->contact_pos_world_onB);
                                                copy_v3_v3(s->impact_size, 
size);
                                        }
@@ -3696,7 +3712,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                //TODO ensure evaluation on transform change too
                        }
 
-                       else if (rbsc->flag & RBC_FLAG_NEEDS_VALIDATE) {
+                       else if (rbsc->flag & RBC_FLAG_NEEDS_VALIDATE || 
fmd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
                                
BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, false);
                                //if (fmd->fracture_mode == 
MOD_FRACTURE_EXTERNAL)
                                //      BKE_rigidbody_start_dist_angle(rbsc, 
true);
@@ -4354,6 +4370,11 @@ static void resetDynamic(RigidBodyWorld *rbw, bool 
do_reset_always)
                                                if (mti->applyModifier)
                                                {
                                                        DerivedMesh *ndm;
+
+                                                       if (md == 
(ModifierData*)fmd) {
+                                                               
BLI_mutex_unlock(&reset_lock);
+                                                       }
+
                                                        ndm = 
mti->applyModifier(md, ob, dm, 0);
                                                        if (ndm != dm)
                                                        {
@@ -4370,7 +4391,7 @@ static void resetDynamic(RigidBodyWorld *rbw, bool 
do_reset_always)
                                                break;
                                        }
                                }
-                               BLI_mutex_unlock(&reset_lock);
+                               //BLI_mutex_unlock(&reset_lock);
 
                                //DAG_id_tag_update(go->ob, OB_RECALC_ALL);
                                //WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, 
go->ob);
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 817776b..688499c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5407,6 +5407,10 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *fmd)
                        Shard *s;
 
                        fmd->dm = NULL;
+                       fmd->refresh_constraints = true;
+                       fmd->meshConstraints.first = NULL;
+                       fmd->meshConstraints.last = NULL;
+
                        link_list(fd, &fmd->shard_sequence);
 
                        for (ssq = fmd->shard_sequence.first; ssq; ssq = 
ssq->next)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index c6c3281..d017f7a 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1180,7 +1180,7 @@ static FracPointCloud 
get_points_global(FractureModifierData *emd, Object *ob, D
                if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && 
emd->limit_impact) {
                        //shrink pointcloud container around impact point, to a 
size
                        s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
-                       if (s != NULL && (s->shard_id == 0 || s->parent_id == 
0)) {
+                       if (s != NULL && (s->shard_id == 0 || s->parent_id == 0 
|| s->impact_size[0] > 0.0f)) {
                                float size[3], nmin[3], nmax[3], loc[3], 
imat[4][4], tmin[3], tmax[3], quat[4];
                                print_v3("Impact Loc\n", s->impact_loc);
                                print_v3("Impact Size\n", s->impact_size);
@@ -2358,7 +2358,7 @@ 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, true);
+       rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, 
con_type, fmd->fracture_mode != MOD_FRACTURE_DYNAMIC);
        rbsc->mi1 = mi1;
        rbsc->mi2 = mi2;

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

Reply via email to