[Bf-blender-cvs] [d00f617] fracture_modifier: dynamic fracture: works a bit more stable now, but still lacks proper transformation calculation and speed takeover from parent to child rigidbodies
Martin Felke
noreply at git.blender.org
Mon Jun 1 21:29:19 CEST 2015
Commit: d00f6177ae86c1e3ee9d510c317f71445b898916
Author: Martin Felke
Date: Mon May 18 20:33:24 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd00f6177ae86c1e3ee9d510c317f71445b898916
dynamic fracture: works a bit more stable now, but still lacks proper transformation calculation and speed takeover from parent to child rigidbodies
===================================================================
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/editors/object/object_modifier.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 c02601d..f876b2a 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -301,11 +301,11 @@ void BKE_get_shard_minmax(FracMesh *mesh, ShardID id, float min_r[3], float max_
if (shard != NULL) {
copy_v3_v3(min_r, shard->min);
copy_v3_v3(max_r, shard->max);
- }
- if (shard->shard_id == -2)
- {
- BKE_shard_free(shard, true);
+ if (shard->shard_id == -2)
+ {
+ BKE_shard_free(shard, true);
+ }
}
}
@@ -703,6 +703,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
if (s != NULL) {
add_shard(fm, s, mat);
+ s->shard_id = i+1;
}
if (t != NULL) {
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index dfea905..18c16c4 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1853,6 +1853,7 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
fid1->shardID = rbw->cache_index_map[linear_index1]->meshisland_index;
BLI_addtail(&fmd1->fracture_ids, fid1);
//fmd1->refresh = true;
+ rbw->refresh_modifiers = true;
}
}
}
@@ -1872,6 +1873,7 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
fid2->shardID = rbw->cache_index_map[linear_index2]->meshisland_index;
BLI_addtail(&fmd2->fracture_ids, fid2);
//fmd2->refresh = true;
+ rbw->refresh_modifiers = true;
}
}
}
@@ -3421,7 +3423,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
else if (rbw->ltime == startframe)
{
restoreKinematic(rbw);
- //rigidbody_update_simulation(scene, rbw, true);
+ rigidbody_update_simulation(scene, rbw, true);
}
/* advance simulation, we can only step one frame forward */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index dc50231..633c06d 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2394,6 +2394,7 @@ static int fracture_refresh_exec(bContext *C, wmOperator *UNUSED(op))
copy_v3_v3(rmd->forward_vector, vec);
#endif
rmd->refresh = true;
+ rmd->last_frame = INT_MAX; // delete dynamic data as well
DAG_id_tag_update(&obact->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
}
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 4079c3f..3438f1a 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -338,7 +338,7 @@ static void free_simulation(FractureModifierData *fmd, bool do_free_seq)
while (fmd->meshIsland_sequence.first) {
msq = fmd->meshIsland_sequence.first;
BLI_remlink(&fmd->meshIsland_sequence, msq);
- //free_meshislands(fmd, &msq->meshIslands);
+ free_meshislands(fmd, &msq->meshIslands);
MEM_freeN(msq);
msq = NULL;
}
@@ -372,7 +372,7 @@ static void free_shards(FractureModifierData *fmd)
{
ShardSequence* ssq = (ShardSequence*)fmd->shard_sequence.first;
BLI_remlink(&fmd->shard_sequence, ssq);
- //BKE_fracmesh_free(ssq->frac_mesh, true);
+ BKE_fracmesh_free(ssq->frac_mesh, true);
MEM_freeN(ssq->frac_mesh);
MEM_freeN(ssq);
}
@@ -2775,6 +2775,7 @@ static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob,
float rot[4] = {0.0f, 0.0f, 0.0f, 1.0f};
int j = 0;
float irot[4];
+ //MVert *mvert = mi->physics_mesh->getVertArray(mi->physics_mesh);
invert_m4_m4(ob->imat, ob->obmat);
@@ -2789,7 +2790,7 @@ static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob,
mul_m4_v3(ob->imat, loc);
mat4_to_quat(irot, ob->imat);
- mul_qt_qtqt(rot, rot, irot);
+ mul_qt_qtqt(rot, irot, rot);
add_v3_v3(mi->centroid, loc);
mul_qt_qtqt(mi->rot, mi->rot, rot);
@@ -2802,6 +2803,8 @@ static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob,
mul_qt_v3(rot, mi->vertices_cached[j]->co);
add_v3_v3(mi->vertices_cached[j]->co, loc);
+ //sub_v3_v3(mi->vertices_cached[j]->co, mi->centroid);
+
co[0] = mi->vertco[3*j];
co[1] = mi->vertco[3*j+1];
co[2] = mi->vertco[3*j+2];
@@ -2812,6 +2815,9 @@ static void do_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob,
mi->vertco[3*j] = co[0];
mi->vertco[3*j+1] = co[1];
mi->vertco[3*j+2] = co[2];
+
+ //mul_qt_v3(rot, mvert[j].co);
+ //add_v3_v3(mvert[j].co, loc);
}
}
@@ -2821,6 +2827,7 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
MeshIsland *mi;
short rb_type = RBO_TYPE_ACTIVE;
float dummyloc[3], rot[4];
+ float linvel[3], angvel[3];
if (s->totvert == 0) {
return;
@@ -2904,6 +2911,13 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
{
frame -= par->start_frame;
do_match_vertex_coords(mi, par, ob, frame);
+
+ //RB_body_get_linear_velocity(par->rigidbody->physics_object, linvel);
+ //RB_body_get_angular_velocity(par->rigidbody->physics_object, angvel);
+
+ BKE_rigidbody_remove_shard(fmd->modifier.scene, par);
+ fmd->modifier.scene->rigidbody_world->object_changed = true;
+ par->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
}
}
}
@@ -2918,6 +2932,12 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
rb_type = do_vert_index_map(fmd, mi);
do_rigidbody(fmd, mi, ob, orig_dm, rb_type, i);
+
+ /*if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+ { //TODO doesnt work, need to store linvel, angvel in RboObject
+ RB_body_set_linear_velocity(mi->rigidbody->physics_object, linvel);
+ RB_body_set_angular_velocity(mi->rigidbody->physics_object, angvel);
+ }*/
}
static MDeformVert* do_islands_from_shards(FractureModifierData* fmd, Object* ob, DerivedMesh *orig_dm)
@@ -3044,7 +3064,7 @@ static void do_post_island_creation(FractureModifierData *fmd, Object *ob, Deriv
if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->refresh == true)
{
- if (fmd->modifier.scene->rigidbody_world->object_changed == false)
+ //if (fmd->modifier.scene->rigidbody_world->object_changed == false)
{
fmd->current_mi_entry->is_new = false;
fmd->current_shard_entry->is_new = false;
@@ -3367,10 +3387,11 @@ static ShardSequence* shard_sequence_add(FractureModifierData* fmd, float frame,
fmd->shards_to_islands = false;
BKE_fracture_create_dm(fmd, true);
fmd->shards_to_islands = temp;
- //ssq->is_new = false;
+ //ssq->is_new = true;
}
else {
ssq->frac_mesh = copy_fracmesh(fmd->frac_mesh);
+
}
ssq->is_new = true;
@@ -3384,7 +3405,7 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
{
MeshIslandSequence *msq = MEM_mallocN(sizeof(MeshIslandSequence), "meshisland_sequence_add");
msq->frame = frame;
- msq->is_new = true;
+ //msq->is_new = true;
if (BLI_listbase_is_empty(&fmd->meshIslands)) {
msq->meshIslands.first = NULL;
@@ -3394,13 +3415,13 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
msq->meshIslands = fmd->meshIslands;
msq->visible_dm = fmd->visible_mesh_cached;
fmd->refresh = false;
- //msq->is_new = false;
+ msq->is_new = false;
}
else {
msq->meshIslands.first = NULL;
msq->meshIslands.last = NULL;
msq->visible_dm = NULL;
- //msq->is_new = true;
+ msq->is_new = true;
}
BLI_addtail(&fmd->meshIsland_sequence, msq);
@@ -3416,7 +3437,7 @@ static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object*
if (fmd->current_shard_entry) {
- if (fmd->current_shard_entry->prev && fmd->current_shard_entry->prev->frame == frame)
+ if (0) //fmd->current_shard_entry->prev && fmd->current_shard_entry->prev->frame == frame)
{ //about to make a new state with same frame, reuse current one
fmd->current_shard_entry->is_new = true;
reuse = true;
@@ -3430,6 +3451,8 @@ static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object*
if (!reuse)
{
+ if (fmd->current_shard_entry)
+ fmd->current_shard_entry->is_new = false;
fmd->current_shard_entry = shard_sequence_add(fmd, end, dm);
fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
}
@@ -3484,8 +3507,14 @@ static void get_prev_entries(FractureModifierData *fmd)
static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
{
- if (fmd->refresh)
+ if (fmd->refresh || fmd->modifier.scene->rigidbody_world->refresh_modifiers)
{
+ fmd->modifier.scene->rigidbody_world->refresh_modifiers = false;
+ if (fmd->last_frame == INT_MAX)
+ {
+ //data purge hack
+ free_modifier(fmd, true);
+ }
if (fmd->dm != NULL) {
fmd->dm->needsFree = 1;
fmd->dm->release(fmd->dm);
@@ -3564,22 +3593,22 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
/*backward playback*/
/*is frame < current entry->frame ?
*then update*/
- if (frame < fmd->current_mi_entry->prev->frame)
+ if (frame < fmd->current_mi_entry->prev->frame + 1)
{
get_prev_entries(fmd);
fmd->modifier.scene->rigidbody_world->object_changed = true;
- fmd->last_frame = (int)frame;
+ //fmd->last_frame = (int)frame;
}
}
- else if ((fmd->last_frame < frame) && (fmd->current_mi_entry) &&(fmd->current_mi_entry->next != NULL)) //&&
- /*(fmd->current_mi_entry->next->is_new == false))*/
+ else if ((fmd->last_frame < frame) && (fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
+ (fmd->current_mi_entry->next->is_new == false))
{
/*forward playback*/
- //if (frame > fmd->current_mi_entry->frame) {
+ if (frame >= fmd->current_mi_entry->frame)
{
get_next_entries(fmd);
fmd->modifier.scene->rigidbody_world->object_changed = true;
- fmd->last_frame = (int)frame;
+ //fmd->last_frame = (int)frame;
}
}
else {
@@ -3601,12 +3630,16 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
{
fmd->modifier.scene->rigidbody
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list