[Bf-blender-cvs] [6f71cb3] fracture_modifier: dynamic fracture: cache works much better now
Martin Felke
noreply at git.blender.org
Wed Jun 3 11:26:16 CEST 2015
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. @@
More information about the Bf-blender-cvs
mailing list