[Bf-blender-cvs] [8d58ffe] fracture_modifier: extended FM python API: constraints have now settable locations and rotations, additionally there is an highly experimental constraint breaking mode (for external fracture mode ONLY)

Martin Felke noreply at git.blender.org
Sun Jan 17 19:33:15 CET 2016


Commit: 8d58ffe0be5cbd1c73a07df62931ef0e0f06beab
Author: Martin Felke
Date:   Sun Jan 17 19:33:06 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB8d58ffe0be5cbd1c73a07df62931ef0e0f06beab

extended FM python API:  constraints have now settable locations and rotations, additionally there is an highly experimental constraint breaking mode (for external fracture mode ONLY)

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

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesdna/DNA_rigidbody_types.h
M	source/blender/makesrna/intern/rna_mesh.c
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 3ea1084..03084d3 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -87,6 +87,7 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
         row.prop(md, "fracture_mode")
 
         if md.fracture_mode == 'EXTERNAL':
+           layout.prop(md, "use_special_breaking")
            return
 
         if md.fracture_mode == 'DYNAMIC':
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 5c0d9a4..b1c023f 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2524,6 +2524,20 @@ RigidBodyShardCon *BKE_fracture_mesh_islands_connect(FractureModifierData *fmd,
 	rbsc->mi1 = mi1;
 	rbsc->mi2 = mi2;
 
+	/* moved default meshconstraint pos calculation here to creation, so you can override it later on*/
+	/* do this for all constraints */
+	/* location for fixed constraints doesnt matter, so keep old setting */
+	if (rbsc->type == RBC_TYPE_FIXED) {
+		copy_v3_v3(rbsc->pos, rbsc->mi1->rigidbody->pos);
+	}
+	else {
+		/* else set location to center */
+		add_v3_v3v3(rbsc->pos, rbsc->mi1->rigidbody->pos, rbsc->mi2->rigidbody->pos);
+		mul_v3_fl(rbsc->pos, 0.5f);
+	}
+
+	copy_qt_qt(rbsc->orn, rbsc->mi1->rigidbody->orn);
+
 	BLI_addtail(&fmd->meshConstraints, rbsc);
 
 	if (index > -1)
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 7661b0b..b948b5d 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1563,10 +1563,7 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
 	}
 }
 
-/* Create physics sim representation of constraint given rigid body constraint settings
- * < rebuild: even if an instance already exists, replace it
- */
-void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyShardCon *rbc, short rebuild)
+static void rigidbody_create_shard_physics_constraint(RigidBodyShardCon *rbc)
 {
 	float loc[3];
 	float rot[4];
@@ -1577,6 +1574,148 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
 	rbRigidBody *rb1;
 	rbRigidBody *rb2;
 
+
+	if (rbc && rbc->mi1 && rbc->mi2)
+	{
+		rb1 = rbc->mi1->rigidbody->physics_object;
+		rb2 = rbc->mi2->rigidbody->physics_object;
+	}
+	else
+	{
+		return;
+	}
+
+	copy_v3_v3(loc, rbc->pos);
+	copy_v3_v3(rot, rbc->orn);
+
+	if (rb1 && rb2) {
+		switch (rbc->type) {
+			case RBC_TYPE_POINT:
+				rbc->physics_constraint = RB_constraint_new_point(loc, rb1, rb2);
+				break;
+			case RBC_TYPE_FIXED:
+				rbc->physics_constraint = RB_constraint_new_fixed(loc, rot, rb1, rb2);
+				break;
+			case RBC_TYPE_HINGE:
+				rbc->physics_constraint = RB_constraint_new_hinge(loc, rot, rb1, rb2);
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_ANG_Z) {
+					RB_constraint_set_limits_hinge(rbc->physics_constraint, rbc->limit_ang_z_lower, rbc->limit_ang_z_upper);
+				}
+				else
+					RB_constraint_set_limits_hinge(rbc->physics_constraint, 0.0f, -1.0f);
+				break;
+			case RBC_TYPE_SLIDER:
+				rbc->physics_constraint = RB_constraint_new_slider(loc, rot, rb1, rb2);
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_X)
+					RB_constraint_set_limits_slider(rbc->physics_constraint, rbc->limit_lin_x_lower, rbc->limit_lin_x_upper);
+				else
+					RB_constraint_set_limits_slider(rbc->physics_constraint, 0.0f, -1.0f);
+				break;
+			case RBC_TYPE_PISTON:
+				rbc->physics_constraint = RB_constraint_new_piston(loc, rot, rb1, rb2);
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_X) {
+					lin_lower = rbc->limit_lin_x_lower;
+					lin_upper = rbc->limit_lin_x_upper;
+				}
+				else {
+					lin_lower = 0.0f;
+					lin_upper = -1.0f;
+				}
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_ANG_X) {
+					ang_lower = rbc->limit_ang_x_lower;
+					ang_upper = rbc->limit_ang_x_upper;
+				}
+				else {
+					ang_lower = 0.0f;
+					ang_upper = -1.0f;
+				}
+				RB_constraint_set_limits_piston(rbc->physics_constraint, lin_lower, lin_upper, ang_lower, ang_upper);
+				break;
+			case RBC_TYPE_6DOF_SPRING:
+				rbc->physics_constraint = RB_constraint_new_6dof_spring(loc, rot, rb1, rb2);
+
+				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & RBC_FLAG_USE_SPRING_X);
+				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_stiffness_x);
+				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_damping_x);
+
+				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->flag & RBC_FLAG_USE_SPRING_Y);
+				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_stiffness_y);
+				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_damping_y);
+
+				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->flag & RBC_FLAG_USE_SPRING_Z);
+				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_stiffness_z);
+				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_damping_z);
+
+				RB_constraint_set_equilibrium_6dof_spring(rbc->physics_constraint);
+			/* fall through */
+			case RBC_TYPE_6DOF:
+				if (rbc->type == RBC_TYPE_6DOF)     /* a litte awkward but avoids duplicate code for limits */
+					rbc->physics_constraint = RB_constraint_new_6dof(loc, rot, rb1, rb2);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_X)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->limit_lin_x_lower, rbc->limit_lin_x_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_X, 0.0f, -1.0f);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_Y)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->limit_lin_y_lower, rbc->limit_lin_y_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0.0f, -1.0f);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_LIN_Z)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->limit_lin_z_lower, rbc->limit_lin_z_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0.0f, -1.0f);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_ANG_X)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_X, rbc->limit_ang_x_lower, rbc->limit_ang_x_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_X, 0.0f, -1.0f);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_ANG_Y)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_Y, rbc->limit_ang_y_lower, rbc->limit_ang_y_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_Y, 0.0f, -1.0f);
+
+				if (rbc->flag & RBC_FLAG_USE_LIMIT_ANG_Z)
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_Z, rbc->limit_ang_z_lower, rbc->limit_ang_z_upper);
+				else
+					RB_constraint_set_limits_6dof(rbc->physics_constraint, RB_LIMIT_ANG_Z, 0.0f, -1.0f);
+				break;
+			case RBC_TYPE_MOTOR:
+				rbc->physics_constraint = RB_constraint_new_motor(loc, rot, rb1, rb2);
+
+				RB_constraint_set_enable_motor(rbc->physics_constraint, rbc->flag & RBC_FLAG_USE_MOTOR_LIN, rbc->flag & RBC_FLAG_USE_MOTOR_ANG);
+				RB_constraint_set_max_impulse_motor(rbc->physics_constraint, rbc->motor_lin_max_impulse, rbc->motor_ang_max_impulse);
+				RB_constraint_set_target_velocity_motor(rbc->physics_constraint, rbc->motor_lin_target_velocity, rbc->motor_ang_target_velocity);
+				break;
+			case RBC_TYPE_COMPOUND:
+				rbc->physics_constraint = RB_constraint_new_compound(rb1, rb2);
+				break;
+		}
+	}
+	else { /* can't create constraint without both rigid bodies */
+		return;
+	}
+
+	RB_constraint_set_enabled(rbc->physics_constraint, rbc->flag & RBC_FLAG_ENABLED);
+
+	if (rbc->flag & RBC_FLAG_USE_BREAKING)
+		RB_constraint_set_breaking_threshold(rbc->physics_constraint, rbc->breaking_threshold);
+	else
+		RB_constraint_set_breaking_threshold(rbc->physics_constraint, FLT_MAX);
+
+	if (rbc->flag & RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS)
+		RB_constraint_set_solver_iterations(rbc->physics_constraint, rbc->num_solver_iterations);
+	else
+		RB_constraint_set_solver_iterations(rbc->physics_constraint, -1);
+}
+
+/* Create physics sim representation of constraint given rigid body constraint settings
+ * < rebuild: even if an instance already exists, replace it
+ */
+void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyShardCon *rbc, short rebuild)
+{
 	/* sanity checks:
 	 *	- object should have a rigid body constraint
 	 *  - rigid body constraint should have at least one constrained object
@@ -1593,16 +1732,6 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
 		}
 		return;
 	}
-	
-	if (rbc->mi1->rigidbody)
-	{
-		rb1 = rbc->mi1->rigidbody->physics_object;
-	}
-	
-	if (rbc->mi2->rigidbody)
-	{
-		rb2 = rbc->mi2->rigidbody->physics_object;
-	}
 
 	if (rbc->physics_constraint) {
 		if (rebuild == false)
@@ -1621,140 +1750,7 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
 			rbc->physics_constraint = NULL;
 		}
 
-		/* do this for all constraints */
-		/* location for fixed constraints doesnt matter, so keep old setting */
-		if (rbc->type == RBC_TYPE_FIXED) {
-			copy_v3_v3(loc, rbc->mi1->rigidbody->pos);
-		}
-		else {
-			/* else set location to center */
-			add_v3_v3v3(loc, rbc->mi1->rigidbody->pos, rbc->mi2->rigidbody->pos);
-			mul_v3_fl(loc, 0.5f);
-		}
-
-		copy_v4_v4(rot, rbc->mi1->rigidbody->orn);
-
-		if (rb1 && rb2) {
-			switch (rbc->type) {
-				case RBC_TYPE_POINT:
-					rbc->physics_constraint = RB_constraint_new_point(loc, rb1, rb2);
-					break;
-				case RBC_TYPE_FIXED:
-					rbc->physics_constraint = RB_constraint_new_fixed(loc, rot, rb1, rb2);
-					break;
-				case RBC_TYPE_HINGE:
-					rbc->p

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list