Commit: 3392741d1921e0b6c98b8819d0703ab356ff28b1
Author: Martin Felke
Date:   Wed May 27 18:29:25 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB3392741d1921e0b6c98b8819d0703ab356ff28b1

dynamic fracture: do reset after settings changes and clean up constraints now 
too in dynamic fracture events

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

M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index ecc9ba8..268d4a9 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -431,10 +431,16 @@ static void rna_Modifier_update(Main *UNUSED(bmain), 
Scene *UNUSED(scene), Point
        if (md && md->type == eModifierType_Fracture)
        {
                FractureModifierData *fmd = (FractureModifierData*)md;
-               if (fmd->refresh)
+               if (fmd->refresh && fmd->fracture_mode == 
MOD_FRACTURE_PREFRACTURED)
                {
                        return;
                }
+               else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+               {
+                       // do purge
+                       fmd->last_frame = INT_MAX;
+                       fmd->refresh = true;
+               }
        }
 
        DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 9e7afe5..4102815 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -292,6 +292,10 @@ static void free_constraints(FractureModifierData *fmd)
        while (fmd->meshConstraints.first) {
                rbsc = fmd->meshConstraints.first;
                BLI_remlink(&fmd->meshConstraints, rbsc);
+               if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+               {
+                       BKE_rigidbody_remove_shard_con(fmd->modifier.scene, 
rbsc);
+               }
                MEM_freeN(rbsc);
                rbsc = NULL;
        }
@@ -2825,7 +2829,7 @@ static void do_match_vertex_coords(MeshIsland* mi, 
MeshIsland *par, Object *ob,
        if (is_parent)
        {
                copy_v3_v3(centr, mi->centroid);
-               //mul_qt_v3(rot, centr);
+               mul_qt_v3(rot, centr);
                add_v3_v3(centr, loc);
        }
        else
@@ -2923,7 +2927,14 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
                mi->locs = MEM_mallocN(sizeof(float)*3, "mi->locs");
                mi->rots = MEM_mallocN(sizeof(float)*4, "mi->rots");
                mi->frame_count = 0;
-               mi->start_frame = 
fmd->modifier.scene->rigidbody_world->pointcache->startframe;
+               if (fmd->modifier.scene->rigidbody_world)
+               {
+                       mi->start_frame = 
fmd->modifier.scene->rigidbody_world->pointcache->startframe;
+               }
+               else
+               {
+                       mi->start_frame = 1;
+               }
        }
        else
        {
@@ -3675,6 +3686,7 @@ static void do_modifier(FractureModifierData *fmd, Object 
*ob, DerivedMesh *dm)
                         *then update*/
                        if (frame < fmd->current_mi_entry->prev->frame + 1)
                        {
+                               free_constraints(fmd);
                                get_prev_entries(fmd);
                                
fmd->modifier.scene->rigidbody_world->object_changed = true;
                        }
@@ -3685,6 +3697,7 @@ static void do_modifier(FractureModifierData *fmd, Object 
*ob, DerivedMesh *dm)
                        /*forward playback*/
                        if (frame >= fmd->current_mi_entry->frame)
                        {
+                               free_constraints(fmd);
                                get_next_entries(fmd);
                                
fmd->modifier.scene->rigidbody_world->object_changed = true;
                        }
@@ -3711,6 +3724,7 @@ static void do_modifier(FractureModifierData *fmd, Object 
*ob, DerivedMesh *dm)
 
                        if (count > 0)
                        {
+                               free_constraints(fmd);
                                printf("REFRESH: %s \n", ob->id.name);
                                
fmd->modifier.scene->rigidbody_world->object_changed = true;
                                fmd->refresh = true;
@@ -3719,6 +3733,7 @@ static void do_modifier(FractureModifierData *fmd, Object 
*ob, DerivedMesh *dm)
 
                        if (fmd->update_dynamic)
                        {
+                               free_constraints(fmd);
                                printf("ADD NEW 2: %s \n", ob->id.name);
                                fmd->update_dynamic = false;
                                add_new_entries(fmd, dm, ob);

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

Reply via email to