[Bf-blender-cvs] [b85da31] fracture_modifier: fixes for dynamic and external mode, in external mode each simulation run should be consistent with the prior ones now
Martin Felke
noreply at git.blender.org
Sat Jan 30 16:03:55 CET 2016
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. @@
More information about the Bf-blender-cvs
mailing list