Commit: 18675f77fcc97d9ab7c40bd60572cd859e965e74
Author: Martin Felke
Date: Thu Nov 6 15:47:53 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB18675f77fcc97d9ab7c40bd60572cd859e965e74
another crash fix if simulation was continued after cache end with trigger and
constraints, cache might behave incorrectly still if an object is refractured
for example, but the others are not
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/makesdna/DNA_rigidbody_types.h
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c
b/source/blender/blenkernel/intern/rigidbody.c
index 892caff..1ad29aa 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1455,10 +1455,13 @@ void
BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
if (rbc->physics_constraint) {
if (rebuild == false)
{
- RB_dworld_remove_constraint(rbw->physics_world,
rbc->physics_constraint);
+ if (!(rbc->flag & RBC_FLAG_USE_KINEMATIC_DEACTIVATION))
+ {
+ RB_dworld_remove_constraint(rbw->physics_world,
rbc->physics_constraint);
+ }
}
}
- if (rbc->physics_constraint == NULL || rebuild) {
+ if (rbc->physics_constraint == NULL || rebuild || rbc->flag &
RBC_FLAG_USE_KINEMATIC_DEACTIVATION) {
/* remove constraint if it already exists before creating a new
one */
if (rbc->physics_constraint) {
@@ -1590,9 +1593,11 @@ void
BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
RB_constraint_set_solver_iterations(rbc->physics_constraint, -1);
}
- if (rbw && rbw->physics_world && rbc->physics_constraint) {
+ if ((rbw && rbw->physics_world && rbc->physics_constraint)) {
RB_dworld_add_constraint(rbw->physics_world,
rbc->physics_constraint, rbc->flag & RBC_FLAG_DISABLE_COLLISIONS);
}
+
+ rbc->flag &= ~RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
}
//this allows partial object activation, only some shards will be activated,
called from bullet(!)
@@ -1643,9 +1648,10 @@ static int filterCallback(void* world, void* island1,
void* island2) {
for (con = fmd1->meshConstraints.first; con; con =
con->next)
{
RB_dworld_remove_constraint(rbw->physics_world,
con->physics_constraint);
- RB_constraint_delete(con->physics_constraint);
- con->physics_constraint = NULL;
+ /*RB_constraint_delete(con->physics_constraint);
+ con->physics_constraint = NULL;*/
con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+ con->flag |=
RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
}
}
@@ -1670,9 +1676,10 @@ static int filterCallback(void* world, void* island1,
void* island2) {
for (con = fmd2->meshConstraints.first; con; con =
con->next)
{
RB_dworld_remove_constraint(rbw->physics_world,
con->physics_constraint);
- RB_constraint_delete(con->physics_constraint);
- con->physics_constraint = NULL;
+ /*RB_constraint_delete(con->physics_constraint);
+ con->physics_constraint = NULL;*/
con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+ con->flag |=
RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
}
}
}
@@ -3020,22 +3027,14 @@ static void restoreKinematic(RigidBodyWorld *rbw)
if (fmd)
{
MeshIsland* mi;
+ RigidBodyShardCon* con;
for (mi = fmd->meshIslands.first; mi; mi =
mi->next)
{
- RigidBodyShardCon* con;
- int i = 0;
-
if (mi->rigidbody)
{
mi->rigidbody->flag |=
RBO_FLAG_KINEMATIC;
mi->rigidbody->flag |=
RBO_FLAG_NEEDS_VALIDATE;
}
-
- for (i = 0; i <
mi->participating_constraint_count; i++)
- {
- con =
mi->participating_constraints[i];
- con->flag |=
RBC_FLAG_NEEDS_VALIDATE;
- }
}
}
}
@@ -3099,7 +3098,6 @@ void BKE_rigidbody_do_simulation(Scene *scene, float
ctime)
if (ctime <= startframe) {
/* rebuild constraints */
rbw->rebuild_comp_con = true;
- restoreKinematic(rbw);
rbw->ltime = startframe;
if ((rbw->object_changed))
@@ -3128,6 +3126,10 @@ void BKE_rigidbody_do_simulation(Scene *scene, float
ctime)
rbw->ltime = ctime;
return;
}
+ else if (rbw->ltime == startframe)
+ {
+ restoreKinematic(rbw);
+ }
/* advance simulation, we can only step one frame forward */
if (ctime == rbw->ltime + 1 && !(cache->flag & PTCACHE_BAKED)) {
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h
b/source/blender/makesdna/DNA_rigidbody_types.h
index 38a6617..019f370 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -364,7 +364,9 @@ typedef enum eRigidBodyCon_Flag {
RBC_FLAG_USE_SPRING_Z = (1 << 13),
/* motors */
RBC_FLAG_USE_MOTOR_LIN = (1 << 14),
- RBC_FLAG_USE_MOTOR_ANG = (1 << 15)
+ RBC_FLAG_USE_MOTOR_ANG = (1 << 15),
+ /* prevent multiple removal and crash with kinematic deactivation */
+ RBC_FLAG_USE_KINEMATIC_DEACTIVATION = (1 << 16),
} eRigidBodyCon_Flag;
/* ******************************** */
diff --git a/source/blender/modifiers/intern/MOD_fracture.c
b/source/blender/modifiers/intern/MOD_fracture.c
index 7474a8f..45d6362 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -100,7 +100,7 @@ static void initData(ModifierData *md)
fmd->contact_dist = 1.0f;
fmd->use_mass_dependent_thresholds = false;
fmd->explo_shared = false;
- fmd->constraint_limit = 0;
+ fmd->constraint_limit = 50;
fmd->breaking_distance = 0;
fmd->breaking_angle = 0;
fmd->breaking_percentage = 0; /* disable by default*/
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs