Commit: b85da312f0776a613e4855a1f40df151d65ffc14
Author: Martin Felke
Date:   Sat Jan 30 15:57:56 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb85da312f0776a613e4855a1f40df151d65ffc14

fixes for dynamic and external mode, in external mode each simulation run 
should be consistent with the prior ones now

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/rigidbody.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 b0b3fbf..0a975ca 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1659,7 +1659,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, 
int num_verts, int num_
                        s = (Shard *)fmd->frac_mesh->shard_map.first;
                }
 
-               if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
+               if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
                {
                        /*keep old behavior for now for older modes */
                        CustomData_merge(&s->vertData, &result->vertData, 
CD_MASK_MDEFORMVERT, CD_CALLOC, num_verts);
@@ -1833,29 +1833,35 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool 
doCustomData)
 void BKE_get_next_entries(FractureModifierData *fmd)
 {
        /*meshislands and shards SHOULD be synchronized !!!!*/
-       if (fmd->current_mi_entry->next != NULL) { // && 
fmd->current_mi_entry->next->is_new == false) {
-
+       if (fmd->current_mi_entry && fmd->current_mi_entry->next)
+       { // && fmd->current_mi_entry->next->is_new == false) {
                fmd->current_mi_entry = fmd->current_mi_entry->next;
-               fmd->current_shard_entry = fmd->current_shard_entry->next;
-
                fmd->meshIslands = fmd->current_mi_entry->meshIslands;
-               fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
                fmd->visible_mesh_cached = fmd->current_mi_entry->visible_dm;
        }
+
+       if (fmd->current_shard_entry && fmd->current_shard_entry->next)
+       {
+               fmd->current_shard_entry = fmd->current_shard_entry->next;
+               fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
+       }
 }
 
 void BKE_get_prev_entries(FractureModifierData *fmd)
 {
        /*meshislands and shards SHOULD be synchronized !!!!*/
-       if (fmd->current_mi_entry && fmd->current_mi_entry->prev) {
-
+       if (fmd->current_mi_entry && fmd->current_mi_entry->prev)
+       {
                fmd->current_mi_entry = fmd->current_mi_entry->prev;
-               fmd->current_shard_entry = fmd->current_shard_entry->prev;
-
                fmd->meshIslands = fmd->current_mi_entry->meshIslands;
-               fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
                fmd->visible_mesh_cached = fmd->current_mi_entry->visible_dm;
        }
+
+       if (fmd->current_shard_entry && fmd->current_shard_entry->prev)
+       {
+               fmd->current_shard_entry = fmd->current_shard_entry->prev;
+               fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
+       }
 }
 
 bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
@@ -1866,14 +1872,14 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, 
int frame, int do_lookup)
 
        backward = ((fmd->last_frame > frame) && fmd->current_mi_entry && 
fmd->current_mi_entry->prev);
        forward = ((fmd->last_frame < frame) && (fmd->current_mi_entry) && 
(fmd->current_mi_entry->next != NULL) &&
-                  (fmd->current_mi_entry->next->is_new == false));
+                  (fmd->current_mi_entry->is_new == false));
 
        if (backward)
        {
                if (do_lookup)
                {
                        while (fmd->current_mi_entry && 
fmd->current_mi_entry->prev &&
-                                  frame < fmd->current_mi_entry->prev->frame)
+                                  frame <= fmd->current_mi_entry->prev->frame)
                        {
                                printf("Jumping backward because %d is smaller 
than %d\n", frame, fmd->current_mi_entry->prev->frame);
                                changed = true;
@@ -1887,7 +1893,7 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int 
frame, int do_lookup)
                if (do_lookup)
                {
                        while ((fmd->current_mi_entry) && 
(fmd->current_mi_entry->next != NULL) &&
-                                  (fmd->current_mi_entry->next->is_new == 
false) &&
+                                  (fmd->current_mi_entry->is_new == false) &&
                                   frame > fmd->current_mi_entry->frame)
                        {
                                printf("Jumping forward because %d is greater 
than %d\n", frame, fmd->current_mi_entry->frame);
@@ -2530,8 +2536,7 @@ MeshIsland* 
BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
        //hrm need to rebuild ALL islands since vertex refs are bonkers now 
after mesh has changed
        mi = fracture_shard_to_island(fmd, s, vertstart);
 
-       mat4_to_loc_quat(loc, rot, target->obmat);
-       copy_qt_qt(mi->rot, rot);
+       //mat4_to_loc_quat(loc, rot, target->obmat);
 
        //lets see whether we need to add loc here too XXX TODO
 
@@ -2539,7 +2544,8 @@ MeshIsland* 
BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
        if (mi->rigidbody)
        {
                mi->rigidbody->meshisland_index = mi->id;
-               copy_qt_qt(mi->rigidbody->orn, rot);
+               copy_qt_qt(mi->rot, mi->rigidbody->orn);
+               copy_v3_v3(mi->centroid, mi->rigidbody->pos);
        }
 
        BLI_strncpy(mi->name, target->id.name + 2, MAX_ID_NAME - 2);
diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index f141d7e..dbbebeb 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1007,6 +1007,9 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
        Object* ob = NULL;
        FractureModifierData *fmd = NULL;
 
+       //if (!rbw->cache_index_map || !rbw->cache_offset_map)
+       //      return 1;
+
        rbo = rbw->cache_index_map[index];
        
        if (rbo == NULL) {
@@ -1039,8 +1042,8 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                        MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
                        int frame = (int)floor(cfra);
 
-                       if (!mi)
-                               return 0;
+//                     if (!mi)
+//                             return 0;
 
                        rbo = mi->rigidbody;
 
@@ -1052,6 +1055,8 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                        frame =  frame - mi->start_frame;
 
                        //printf("Writing frame %d %d %d %d\n", (int)cfra, 
mi->start_frame, frame, fmd->last_frame);
+//                     if (frame < 0) // GAAAAH!
+//                             frame = 0;
 
                        mi->locs[3*frame] = rbo->pos[0];
                        mi->locs[3*frame+1] = rbo->pos[1];
@@ -1114,15 +1119,15 @@ static void ptcache_rigidbody_read(int index, void 
*rb_v, void **data, float cfr
 
                        mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
 
-                       if (!mi)
-                               return;
+//                     if (!mi)
+//                             return;
 
                        frame = frame - mi->start_frame;
 
-                       if (frame < 0)
-                       {
-                               frame = 0; //grrr, why does this happen ?!
-                       }
+                       //if (frame < 0)
+                       //{
+                       //      frame = 0; //grrr, why does this happen ?!
+                       //}
 
                        //printf("Reading frame %d %d %d %d\n", (int)cfra, 
mi->start_frame, frame, fmd->last_frame);
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index cb6e6a5..936d430 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,7 +78,7 @@
 
 #ifdef WITH_BULLET
 
-static void resetDynamic(RigidBodyWorld *rbw);
+static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int 
rebuild, int transfer_speed);
 static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object 
*ob, RigidBodyOb *rbo);
 static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, 
Object* ob);
@@ -1395,13 +1395,13 @@ static void 
rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
                {
                        if ((len_squared_v3(rbo->lin_vel) > 
(rbo->lin_sleep_thresh * rbo->lin_sleep_thresh)))
                        {
-                               //printf("Setting linear velocity (%f, %f, 
%f)\n", rbo->lin_vel[0], rbo->lin_vel[1], rbo->lin_vel[2]);
+                               printf("Setting linear velocity (%f, %f, 
%f)\n", rbo->lin_vel[0], rbo->lin_vel[1], rbo->lin_vel[2]);
                                
RB_body_set_linear_velocity(rbo->physics_object, rbo->lin_vel);
                        }
 
                        if ((len_squared_v3(rbo->ang_vel) > 
(rbo->ang_sleep_thresh * rbo->ang_sleep_thresh)))
                        {
-                               //printf("Setting angular velocity (%f, %f, 
%f)\n", rbo->ang_vel[0], rbo->ang_vel[1], rbo->ang_vel[2]);
+                               printf("Setting angular velocity (%f, %f, 
%f)\n", rbo->ang_vel[0], rbo->ang_vel[1], rbo->ang_vel[2]);
                                
RB_body_set_angular_velocity(rbo->physics_object, rbo->ang_vel);
                        }
                }
@@ -1732,7 +1732,7 @@ static void 
rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
                                                else
                                                {
                                                        rbc->flag &= 
~RBC_FLAG_PLASTIC_ACTIVE;
-                                                       
rigidbody_set_springs_active(rbc, false);
+                                                       
//rigidbody_set_springs_active(rbc, false);
                                                }
                                        }
                                }
@@ -1929,16 +1929,15 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        MeshIsland* mi1, *mi2;
        RigidBodyWorld *rbw = (RigidBodyWorld*)world;
        Object* ob1, *ob2;
-       int ob_index1, ob_index2;
+       int ob_index1 = -1, ob_index2 = -1;
        bool validOb = true;
 
-       mi1 = (MeshIsland*)island1;
-       mi2 = (MeshIsland*)island2;
-
-#if 0
        FractureModifierData *fmd1 = 
(FractureModifierData*)modifiers_findByType((Object*)blenderOb1, 
eModifierType_Fracture);
        FractureModifierData *fmd2 = 
(FractureModifierData*)modifiers_findByType((Object*)blenderOb2, 
eModifierType_Fracture);
 
+       mi1 = (MeshIsland*)island1;
+       mi2 = (MeshIsland*)island2;
+
        if ((fmd1 && fmd1->fracture_mode == MOD_FRACTURE_DYNAMIC) ||
           (fmd2 && fmd2->fracture_mode == MOD_FRACTURE_DYNAMIC))
        {
@@ -1948,7 +1947,6 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
                ob2 = blenderOb2;
                return check_colgroup_ghost(ob1, ob2);
        }
-#endif
 
        if (rbw == NULL)
        {
@@ -1959,7 +1957,7 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        }
 
        /* cache offset map is a dull name for that... */
-       if (mi1 != NULL)
+       if (mi1 != NULL && rbw->cache_offset_map)
        {
                ob_index1 = rbw->cache_offset_map[mi1->linear_index];
                ob1 = rbw->objects[ob_index1];
@@ -1967,9 +1965,10 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        else
        {
                ob1 = blenderOb1;
+               ob_index1 = -1;
        }
 
-       if (mi2 != NULL)
+       if (mi2 != NULL && rbw->cache_offset_map)
        {
                ob_index2 = rbw->cache_offset_map[mi2->linear_index];
                ob2 = rbw->objects[ob_index2];
@@ -1977,9 +1976,10 @@ static int filterCallback(void* world, void* island1, 
void* island2, void *blend
        else
        {
                ob2 = blenderOb2;
+               ob_index2 = -1;
        }
 
-       if ((mi1 != NULL) && (mi2 != NULL)) {
+       if ((mi1 != NULL) && (mi2 != NULL) && ob_index1 != -1 && ob_index2 != 
-1) {
                validOb = (ob_index1 != ob_index2 && 
colgroup_check(ob1->rigidbody_object->col_groups, 
ob2->rigidbody_object->col_groups) &&
                                  ((mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) 
|| (mi2->rigidbody->flag & RBO_FLAG_KINEMATIC))

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to