[Bf-blender-cvs] [b472f86] fracture_modifier: bugfix / performance fix and new option "constrained collison"

Martin Felke noreply at git.blender.org
Sun Nov 20 16:35:47 CET 2016


Commit: b472f86804b828a93144a6f6bf190258b7eb12b0
Author: Martin Felke
Date:   Sun Nov 20 16:35:24 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb472f86804b828a93144a6f6bf190258b7eb12b0

bugfix / performance fix and new option "constrained collison"

bugfix: switching from kinematic to simulated should work now, performance improvements with dynamic fracture,
new option just exposes the disable collision flag to FM (works inverted here, enable it to let constrained objects collide, disable for default behavior)

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

M	release/scripts/startup/bl_operators/presets.py
M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/physics/rigidbody_constraint.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index cd6d123..95edcef 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -682,7 +682,8 @@ class AddPresetFracture(AddPresetBase, Operator):
         "fracture.boolean_double_threshold",
         "fracture.dynamic_percentage",
         "fracture.dynamic_new_constraints",
-        "fracture.dynamic_min_size"
+        "fracture.dynamic_min_size",
+        "fracture.use_constraint_collision"
     ]
 
     preset_subdir = "fracture"
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index ce01175..b2c47d5 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -183,6 +183,8 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
         row = layout.row()
         row.prop(md, "use_constraints")
         row.prop(md, "use_breaking")
+        row = layout.row();
+        row.prop(md, "use_constraint_collision")
         row.prop(md, "use_compounds")
         layout.prop(md, "constraint_target")
         col = layout.column(align=True)
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 80882ea..4fd4e90 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -84,7 +84,7 @@ void BKE_rigidbody_validate_sim_constraint(struct RigidBodyWorld *rbw, struct Ob
 void BKE_rigidbody_validate_sim_shard_constraint(struct RigidBodyWorld *rbw, struct FractureModifierData* fmd, struct Object*,
                                                  struct RigidBodyShardCon *rbsc, short rebuild);
 
-void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct MeshIsland *mi, struct Object *ob, short rebuild, int transfer_speeds);
+void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct MeshIsland *mi, struct Object *ob, short rebuild, int transfer_speeds, float size[3]);
 void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct Object *ob, short rebuild);
 
 /* move the islands of the visible mesh according to shard rigidbody movement */
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 07b245e..d0494d7 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -79,8 +79,8 @@
 #ifdef WITH_BULLET
 
 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 validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed, float size[3]);
+static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo, float imat[4][4]);
 static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
 
 
@@ -476,7 +476,7 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
 		return;
 	}
 
-	invert_m4_m4(ob->imat, ob->obmat);
+	//invert_m4_m4(ob->imat, ob->obmat);
 	mat4_to_size(size, ob->obmat);
 
 	if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
@@ -1190,7 +1190,7 @@ void BKE_rigidbody_validate_sim_shard_shape(MeshIsland *mi, Object *ob, short re
 /* Create physics sim representation of shard given RigidBody settings
  * < rebuild: even if an instance already exists, replace it
  */
-void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, short rebuild, int transfer_speeds)
+void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, short rebuild, int transfer_speeds, float isize[3])
 {
 	FractureModifierData *fmd = NULL;
 	RigidBodyOb *rbo = (mi) ? mi->rigidbody : NULL;
@@ -1220,7 +1220,7 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
 			RB_dworld_remove_body(rbw->physics_world, rbo->physics_object);
 	}
 	if (!rbo->physics_object || rebuild) {
-		float locbb[3], size[3];
+		float size[3];
 
 		/* remove rigid body if it already exists before creating a new one */
 		if (rbo->physics_object) {
@@ -1240,15 +1240,16 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
 		}
 #endif
 
-		if (ob->derivedFinal)
+		/*if (ob->derivedFinal)
 		{
 			DM_mesh_boundbox(ob->derivedFinal, locbb, size);
 		}
 		else
 		{
 			BKE_mesh_boundbox_calc((Mesh*)ob->data, locbb, size);
-		}
+		}*/
 
+		copy_v3_v3(size, isize);
 		mul_v3_v3(size, ob->size);
 		rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot, fmd->use_compounds, fmd->impulse_dampening,
 		                                  fmd->directional_factor, fmd->minimum_impulse, fmd->mass_threshold_factor, size);
@@ -3108,7 +3109,7 @@ void BKE_rigidbody_update_ob_array(RigidBodyWorld *rbw)
 	}
 }
 
-static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
+static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw, bool rebuild)
 {
 	float adj_gravity[3];
 
@@ -3125,7 +3126,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 */
-	if (!(rbw->flag & RBW_FLAG_REFRESH_MODIFIERS))
+	//if (!(rbw->flag & RBW_FLAG_REFRESH_MODIFIERS))
+	if (rebuild)
 	{
 		BKE_rigidbody_update_ob_array(rbw);
 	}
@@ -3204,7 +3206,7 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o
 					{
 						//fracture modifier case TODO, update mi->physicsmesh somehow and redraw
 						rbo->flag |= RBO_FLAG_NEEDS_RESHAPE;
-						validateShard(rbw, mi, ob, false, false);
+						validateShard(rbw, mi, ob, false, false, size);
 					}
 				}
 				else
@@ -3313,7 +3315,7 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o
 	 */
 }
 
-static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed)
+static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed, float size[3])
 {
 	if (mi == NULL || mi->rigidbody == NULL) {
 		return;
@@ -3321,10 +3323,10 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int r
 
 	if (rebuild || (mi->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD)) {
 		/* World has been rebuilt so rebuild object */
-		BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true, transfer_speed);
+		BKE_rigidbody_validate_sim_shard(rbw, mi, ob, true, transfer_speed, size);
 	}
 	else if (mi->rigidbody->flag & RBO_FLAG_NEEDS_VALIDATE) {
-		BKE_rigidbody_validate_sim_shard(rbw, mi, ob, false, transfer_speed);
+		BKE_rigidbody_validate_sim_shard(rbw, mi, ob, false, transfer_speed, size);
 	}
 	/* refresh shape... */
 	if (mi->rigidbody->physics_object && (mi->rigidbody->flag & RBO_FLAG_NEEDS_RESHAPE)) {
@@ -3663,6 +3665,18 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 		int count = 0, brokencount = 0, plastic = 0;
 		float frame = 0;
 		float size[3] = {1.0f, 1.0f, 1.0f};
+		float bbsize[3];
+		float locbb[3];
+
+		if (ob->derivedFinal)
+		{
+			DM_mesh_boundbox(ob->derivedFinal, locbb, bbsize);
+		}
+		else
+		{
+			BKE_mesh_boundbox_calc((Mesh*)ob->data, locbb, bbsize);
+		}
+
 
 		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
@@ -3716,7 +3730,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 					}
 				}
 
-				validateShard(rbw, is_empty ? NULL : mi, ob, do_rebuild, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
+				validateShard(rbw, is_empty ? NULL : mi, ob, do_rebuild, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC, bbsize);
 			}
 
 			/* update simulation object... */
@@ -3846,7 +3860,7 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 		BKE_rigidbody_validate_sim_world(scene, rbw, true);
 	}
 
-	rigidbody_update_sim_world(scene, rbw);
+	rigidbody_update_sim_world(scene, rbw, rebuild);
 
 	/* update objects */
 	for (go = rbw->group->gobject.first; go; go = go->next) {
@@ -4092,6 +4106,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 	RigidBodyOb *rbo;
 	float size[3] = {1, 1, 1};
 	float centr[3];
+	float imat[4][4];
 	
 
 	if (md->type == eModifierType_Fracture) {
@@ -4113,6 +4128,9 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 				}
 			}
 
+			invert_m4_m4(imat, fmd->passive_parent_mat);
+			invert_m4_m4(ob->imat, ob->obmat);
+
 			for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
 
 				rbo = mi->rigidbody;
@@ -4120,7 +4138,9 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					continue;
 				}
 
-				rigidbody_passive_fake_parenting(fmd, ob, rbo);
+				if (ob->rigidbody_object->type == RBO_TYPE_ACTIVE) {
+					rigidbody_passive_fake_parenting(fmd, ob, rbo, imat);
+				}
 
 				/* use rigid body transform after cache start frame if objects is not being transformed */
 				if (BKE_rigidbody_check_sim_running(rbw, ctime) && !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
@@ -4155,7 +4175,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
 				}
 #endif
-				if (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC) {
+				if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {
 					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
 				}
 			}
@@ -4187,6 +4207,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 				if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
 				{
 					copy_m4_m4(ob->obmat, fmd->origmat);
+					zero_m4(fmd->origmat);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list