Commit: 6f71cb361ed4bce1c09bc085aba7ba3af2a3886a
Author: Martin Felke
Date:   Wed Jun 3 11:01:32 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB6f71cb361ed4bce1c09bc085aba7ba3af2a3886a

dynamic fracture: cache works much better now

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

M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index 56cde57..5c08901 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1015,7 +1015,7 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
        }
 
        ob = rbw->objects[rbw->cache_offset_map[index]];
-       fmd = modifiers_findByType(ob, eModifierType_Fracture);
+       fmd = (FractureModifierData*)modifiers_findByType(ob, 
eModifierType_Fracture);
 
        if (rbo && rbo->type == RBO_TYPE_ACTIVE && rbo->physics_object &&
            (!(rbo->flag & RBO_FLAG_NEEDS_VALIDATE)))
@@ -1032,7 +1032,10 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                else if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
                {
                        MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
-                       int frame = (int)cfra - mi->start_frame;
+                       int frame = (int)floor(cfra);
+                       frame =  frame - mi->start_frame;
+
+                       //printf("Writing frame %d %d %d %d\n", (int)cfra, 
mi->start_frame, frame, fmd->last_frame);
 
                        mi->locs[3*frame] = rbo->pos[0];
                        mi->locs[3*frame+1] = rbo->pos[1];
@@ -1042,6 +1045,10 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                        mi->rots[4*frame+1] = rbo->orn[1];
                        mi->rots[4*frame+2] = rbo->orn[2];
                        mi->rots[4*frame+3] = rbo->orn[3];
+
+                       //dummy data
+                       PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, rbo->pos);
+                       PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, rbo->orn);
                }
        }
 
@@ -1063,7 +1070,7 @@ static void ptcache_rigidbody_read(int index, void *rb_v, 
void **data, float cfr
        }
 
        ob = rbw->objects[rbw->cache_offset_map[index]];
-       fmd = modifiers_findByType(ob, eModifierType_Fracture);
+       fmd = (FractureModifierData*)modifiers_findByType(ob, 
eModifierType_Fracture);
        if (!fmd || fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
        {
                if (rbo && rbo->type == RBO_TYPE_ACTIVE) {
@@ -1086,7 +1093,10 @@ static void ptcache_rigidbody_read(int index, void 
*rb_v, void **data, float cfr
 
                        //modifier should have "switched" this to current set 
of meshislands already.... so access it
                        MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
-                       int frame = (int)cfra - mi->start_frame;
+                       int frame = (int)floor(cfra);
+                       frame = frame - mi->start_frame;
+
+                       //printf("Reading frame %d %d %d %d\n", (int)cfra, 
mi->start_frame, frame, fmd->last_frame);
 
                        rbo->pos[0] = mi->locs[3*frame];
                        rbo->pos[1] = mi->locs[3*frame+1];
@@ -1114,7 +1124,7 @@ static void ptcache_rigidbody_interpolate(int index, void 
*rb_v, void **data, fl
        }
 
        ob = rbw->objects[rbw->cache_offset_map[index]];
-       fmd = modifiers_findByType(ob, eModifierType_Fracture);
+       fmd = (FractureModifierData*)modifiers_findByType(ob, 
eModifierType_Fracture);
 
        if (rbo->type == RBO_TYPE_ACTIVE) {
 
@@ -1136,7 +1146,8 @@ static void ptcache_rigidbody_interpolate(int index, void 
*rb_v, void **data, fl
                        float loc[3], rot[4];
 
                        MeshIsland *mi = BLI_findlink(&fmd->meshIslands, 
rbo->meshisland_index);
-                       int frame = (int)cfra2 - mi->start_frame;
+                       int frame = (int)floor(cfra);
+                       frame = frame - mi->start_frame;
 
                        loc[0] = mi->locs[3*frame];
                        loc[1] = mi->locs[3*frame+1];
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index f095349..3c73073 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2664,7 +2664,8 @@ static void rigidbody_update_sim_world(Scene *scene, 
RigidBodyWorld *rbw)
        RB_dworld_set_gravity(rbw->physics_world, adj_gravity);
 
        /* update object array in case there are changes */
-       rigidbody_update_ob_array(rbw);
+       if (!rbw->refresh_modifiers)
+               rigidbody_update_ob_array(rbw);
 }
 
 static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object 
*ob, RigidBodyOb *rbo, float centroid[3])
@@ -2953,7 +2954,18 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
 
        if (isModifierActive(fmd)) {
                float max_con_mass = 0;
-               int count = BLI_listbase_count(&fmd->meshIslands);
+               int count = 0;//BLI_listbase_count(&fmd->meshIslands);
+
+               if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+               {
+                       int frame = (int)BKE_scene_frame_get(scene);
+                       if (fmd->lookup_mesh_state(fmd, frame, true))
+                       {
+                               rigidbody_update_ob_array(rbw);
+                       }
+               }
+
+               count = BLI_listbase_count(&fmd->meshIslands);
 
                for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
                        if (mi->rigidbody == NULL) {
@@ -2963,6 +2975,13 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                /* perform simulation data updates as tagged */
                                /* refresh object... */
                                int do_rebuild = rebuild;
+
+                               if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC 
&& mi->rigidbody->physics_object) {
+                                       //printf("Velocities...\n");
+                                       
RB_body_get_linear_velocity(mi->rigidbody->physics_object, mi->lin_vel);
+                                       
RB_body_get_angular_velocity(mi->rigidbody->physics_object, mi->ang_vel);
+                               }
+
                                if (fmd->use_breaking)
                                {
                                        float weight = mi->thresh_weight;
@@ -3253,6 +3272,15 @@ static bool do_sync_modifier(ModifierData *md, Object 
*ob, RigidBodyWorld *rbw,
                                copy_m4_m4(ob->obmat, fmd->origmat);
                        }
 
+                       if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+                       {
+                               int frame = (int)ctime;
+                               if (fmd->lookup_mesh_state(fmd, frame, true))
+                               {
+                                       rigidbody_update_ob_array(rbw);
+                               }
+                       }
+
                        for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 
                                rbo = mi->rigidbody;
@@ -3496,10 +3524,10 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
 
        /*trigger dynamic update*/
        if ((rbw->object_changed))
-       {   /* flag modifier refresh at their next execution XXX TODO -> still 
used ? */
-               //rbw->refresh_modifiers = true;
+       {
                rbw->object_changed = false;
                rigidbody_update_simulation(scene, rbw, true);
+               rbw->refresh_modifiers = false;
        }
 
        if (ctime <= startframe) {
@@ -3507,7 +3535,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
                rbw->rebuild_comp_con = true;
 
                rbw->ltime = startframe;
-               if ((rbw->object_changed))
+               if (rbw->object_changed)
                {       /* flag modifier refresh at their next execution XXX 
TODO -> still used ? */
                        rbw->refresh_modifiers = true;
                        rbw->object_changed = false;
@@ -3529,6 +3557,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
        /* try to read from cache */
        // RB_TODO deal with interpolated, old and baked results
        if (BKE_ptcache_read(&pid, ctime)) {
+               printf("Cache read:  %d\n", (int)ctime);
                BKE_ptcache_validate(cache, (int)ctime);
 
                rbw->ltime = ctime;
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 43291ea..7682dfa 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4760,49 +4760,24 @@ static void read_meshIsland(FileData *fd, MeshIsland 
**address)
 }
 
 /*inlined from MOD_fracture.c*/
-static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object 
*ob, int frame)
+static MeshIsland* find_meshisland(ListBase* meshIslands, int id)
 {
-       float loc[3] = {0.0f, 0.0f, 0.0f};
-       float rot[4] = {0.0f, 0.0f, 0.0f, 1.0f};
-       int j = 0;
-       float irot[4];
-       invert_m4_m4(ob->imat, ob->obmat);
-
-       loc[0] = par->locs[3*frame];
-       loc[1] = par->locs[3*frame+1];
-       loc[2] = par->locs[3*frame+2];
-
-       rot[0] = par->rots[4*frame];
-       rot[1] = par->rots[4*frame+1];
-       rot[2] = par->rots[4*frame+2];
-       rot[3] = par->rots[4*frame+3];
-
-       mul_m4_v3(ob->imat, loc);
-       mat4_to_quat(irot, ob->imat);
-       mul_qt_qtqt(rot, rot, irot);
-
-       //match vertices and vertco, perhaps vertno too, yuck...
-       for (j = 0; j < mi->vertex_count; j++)
+       MeshIsland* mi = meshIslands->first;
+       while (mi)
        {
-               float co[3];
-
-               //mul_qt_v3(rot, mi->vertices_cached[j]->co);
-               add_v3_v3(mi->vertices_cached[j]->co, loc);
-
-               co[0] = mi->vertco[3*j];
-               co[1] = mi->vertco[3*j+1];
-               co[2] = mi->vertco[3*j+2];
-
-               //mul_qt_v3(rot, co);
-               add_v3_v3(co, loc);
+               if (mi->id == id)
+               {
+                       return mi;
+               }
 
-               mi->vertco[3*j]   = co[0];
-               mi->vertco[3*j+1] = co[1];
-               mi->vertco[3*j+2] = co[2];
+               mi = mi->next;
        }
+
+       return NULL;
 }
 
-static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, 
MVert* mverts, int vertstart, Object *ob, ShardID parent_id)
+static int initialize_meshisland(FractureModifierData* fmd, MeshIsland** mii, 
MVert* mverts, int vertstart,
+                                 Object *ob, ShardID parent_id, ShardID 
shard_id)
 {
        MVert *mv;
        int k = 0;
@@ -4844,12 +4819,21 @@ static int initialize_meshisland(FractureModifierData* 
fmd, MeshIsland** mii, MV
                {
                        MeshIsland *par = NULL;
                        int frame = prev->frame;
-                       par = BLI_findlink(&prev->meshIslands, parent_id);
-                       frame -= par->start_frame;
 
+                       par = find_meshisland(&prev->meshIslands, parent_id);
                        if (par)
                        {
-                               do_match_vertex_coords(mi, par, ob, frame);
+                               frame -= par->start_frame;
+                               fmd->do_match_vertex_coords(mi, par, ob, frame, 
true);
+                       }
+                       else
+                       {
+                               par = find_meshisland(&prev->meshIslands, 
shard_id);
+                               if (par)
+                               {
+                                       frame -= par->start_frame;
+                                       fmd->do_match_vertex_coords(mi, par, 
ob, frame, false);
+                               }
                        }
                }
        }
@@ -4873,7 +4857,7 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *fmd, Obje
 
        /*HARDCODING this for now, until we can version it properly, say with 
2.75 ? */
        if (fd->fileversion < 275) {
-               fmd->fracture_mode = MOD_FRACTURE_PREFRACTURED;
+               //fmd->fracture_mode = MOD_FRACTURE_PREFRACTURED;
        }
 
        if (fm == NULL || fmd->dm_group) {
@@ -4951,7 +4935,7 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *fmd, Obje
 
                        for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
                                read_meshIsland(fd, &mi);
-                               vertstart += initialize_meshisland(fmd, &mi, 
mverts, vertstart, ob, -1);
+                               vertstart += initialize_meshisland(fmd, &mi, 
mverts, vertstart, ob, -1, -1);
                        }
                }
                else if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
@@ -4992,7 +4976,7 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *f

@@ 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