[Bf-blender-cvs] [d72a489] fracture_modifier: exposed a couple of compound damage propagation parameters, need to test still to find good values

Martin Felke noreply at git.blender.org
Fri Oct 23 12:03:00 CEST 2015


Commit: d72a489ddb36bd256f9ed720d41b62e7466a5d3e
Author: Martin Felke
Date:   Fri Oct 23 12:02:41 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd72a489ddb36bd256f9ed720d41b62e7466a5d3e

exposed a couple of compound damage propagation parameters, need to test still to find good values

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

M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
M	release/scripts/startup/bl_operators/presets.py
M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/intern/rigidbody.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/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
index a46d975..ec9f364 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -15,6 +15,7 @@ class btManifoldPoint;
 #define CUSTOM_FRACTURE_TYPE (btRigidBody::CO_USER_TYPE+1)
 
 
+
 struct btConnection
 {
 	
@@ -25,6 +26,13 @@ struct btConnection
 	btScalar	m_strength;
 };
 
+struct btPropagationParameter
+{
+	btScalar m_impulse_dampening;
+	btScalar m_directional_factor;
+	btScalar m_minimum_impulse;
+};
+
 class btFractureBody : public btRigidBody
 {
 	//connections
@@ -34,13 +42,13 @@ public:
 	btAlignedObjectArray<btScalar>	m_masses;
 	btAlignedObjectArray<btConnection> m_connections;
 	btHashMap<btHashInt, btAlignedObjectArray<int> > *m_connection_map;
+	btPropagationParameter m_propagationParameter;
 
-
-
-	btFractureBody(	const btRigidBodyConstructionInfo& constructionInfo)
+	btFractureBody(	const btRigidBodyConstructionInfo& constructionInfo, btPropagationParameter parameter)
 		:btRigidBody(constructionInfo),
 		m_world(0),
-		m_connection_map(NULL)
+		m_connection_map(NULL),
+		m_propagationParameter(parameter)
 	{
 		m_masses.push_back(constructionInfo.m_mass);
 		m_internalType=CUSTOM_FRACTURE_TYPE+CO_RIGID_BODY;
@@ -50,9 +58,10 @@ public:
 
 	///btRigidBody constructor for backwards compatibility. 
 	///To specify friction (etc) during rigid body construction, please use the other constructor (using btRigidBodyConstructionInfo)
-	btFractureBody(	btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia, btScalar* masses, int numMasses, btDynamicsWorld*	world)
+	btFractureBody(	btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia, btScalar* masses, int numMasses, btDynamicsWorld*	world, btPropagationParameter parameter)
 		:btRigidBody(mass,motionState,collisionShape,localInertia),
-		m_world(world)
+		m_world(world),
+		m_propagationParameter(parameter)
 	{
 
 		for (int i=0;i<numMasses;i++)
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index 8a26ca4..10ebda7 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -341,6 +341,7 @@ void btFractureDynamicsWorld::glueCallback()
 			}
 
 
+			//btFractureBody* fracObj = (btFractureBody*)getCollisionObjectArray()[fractureObjectIndex];
 
 			btTransform shift;
 			shift.setIdentity();
@@ -350,7 +351,7 @@ void btFractureDynamicsWorld::glueCallback()
 
 			btVector3 localInertia;
 			newCompound->calculateLocalInertia(totalMass,localInertia);
-			btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, &massArray[0], numChildren,this);
+			btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, &massArray[0], numChildren,this, fracObj->m_propagationParameter);
 			//newBody->recomputeConnectivity(this);
 			//newBody->recomputeConnectivityByConstraints(this);
 			newBody->setWorldTransform(fracObj->getWorldTransform()*shift);
@@ -439,7 +440,7 @@ void btFractureDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
 	fractureCallback();
 }
 
-btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransform,btScalar* masses, btCompoundShape* oldCompound)
+btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransform,btScalar* masses, btCompoundShape* oldCompound, btPropagationParameter& param)
 {
 	int i;
 
@@ -452,7 +453,7 @@ btFractureBody* btFractureDynamicsWorld::addNewBody(const btTransform& oldTransf
 		totalMass += masses[i];
 	//newCompound->calculateLocalInertia(totalMass,localInertia);
 
-	btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, masses,newCompound->getNumChildShapes(), this);
+	btFractureBody* newBody = new btFractureBody(totalMass,0,newCompound,localInertia, masses,newCompound->getNumChildShapes(), this, param);
 	//newBody->recomputeConnectivity(this);
 	newBody->recomputeConnectivityByConstraints(this);
 
@@ -613,6 +614,8 @@ void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
 		{
 			int tag0 = tags[connection.m_childIndex0];
 			int tag1 = tags[connection.m_childIndex1];
+
+			//printf("Uniting: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
 			unionFind.unite(tag0, tag1);
 		}
 	}
@@ -666,7 +669,7 @@ void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
 		if (numShapes)
 		{
 			int objectIndex, shardIndex;
-			btFractureBody* newBody = addNewBody(fracObj->getWorldTransform(),&masses[0],newCompound);
+			btFractureBody* newBody = addNewBody(fracObj->getWorldTransform(),&masses[0],newCompound, fracObj->m_propagationParameter);
 			newBody->setLinearVelocity(fracObj->getLinearVelocity());
 			newBody->setAngularVelocity(fracObj->getAngularVelocity());
 
@@ -699,24 +702,41 @@ void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
 
 #include <stdio.h>
 
-void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index, bool* needsBreakingCheck)
+void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index,
+                                              bool* needsBreakingCheck, btVector3& direction)
 {
 	//min break impulse, todo expose
-	if (*impulse > 0.5f && body->m_connections.size() > connection_index)
+	if (*impulse > body->m_propagationParameter.m_minimum_impulse && body->m_connections.size() > connection_index)
 	{
 		btConnection& connection = body->m_connections[connection_index];
-		connection.m_strength -= *impulse;
-		//printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+		btCollisionShape* shape0 = connection.m_childShape0;
+		btCollisionShape* shape1 = connection.m_childShape1;
+
+		btFractureBody *fbody0 = m_shapeBodyCallback(shape0->getUserPointer());
+		btFractureBody *fbody1 = m_shapeBodyCallback(shape1->getUserPointer());
 
-		if (connection.m_strength<0)
+		//calculate dot product between body->fbody and direction, if > say 0.75 then roughly same direction ?
+
+		btScalar factor = body->m_propagationParameter.m_directional_factor;
+		btVector3 dir = fbody0->getWorldTransform().getOrigin() - fbody1->getWorldTransform().getOrigin();
+		if (dir.dot(direction) > factor)
 		{
-			//remove or set to zero
-			connection.m_strength=0.f;
-			*needsBreakingCheck = true;
+			//printf("FACTOR: %f\n", dir.dot(direction));
+
+			connection.m_strength -= *impulse;
+			//printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+
+			if (connection.m_strength<0)
+			{
+				//remove or set to zero
+				//printf("Breaking: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
+				connection.m_strength=0.f;
+				*needsBreakingCheck = true;
+			}
 		}
 
 		//impulse dampening, todo expose
-		*impulse *= 0.85f;
+		*impulse *= (1.0f - body->m_propagationParameter.m_impulse_dampening);
 
 		btAlignedObjectArray<int> *adjacents = body->m_connection_map->find(connection_index);
 		if (adjacents)
@@ -724,7 +744,8 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
 			int i, size = adjacents->size();
 			for (i=0;i<size;i++)
 			{
-				propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck);
+				if (size > 1)
+					propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction);
 			}
 		}
 	}
@@ -766,7 +787,7 @@ void btFractureDynamicsWorld::fractureCallback( )
 			maxImpact = totalImpact;
 
 		//some threshold otherwise resting contact would break objects after a while
-		if (totalImpact < 1.f) //40.f
+		if (totalImpact < 1.0f) //40.f
 			continue;
 
 		//		printf("strong impact\n");
@@ -921,10 +942,14 @@ void btFractureDynamicsWorld::fractureCallback( )
 									//propagated damage
 									if (pt.m_appliedImpulse > 0.f) {
 										btScalar impulse = pt.m_appliedImpulse;
-										propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex0, &needsBreakingCheck);
+										btVector3 direction = manifold->getBody0()->getWorldTransform().getOrigin()-
+										                      manifold->getBody1()->getWorldTransform().getOrigin();
+										propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex0,
+										                &needsBreakingCheck, direction);
 
 										impulse = pt.m_appliedImpulse;
-										propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex1, &needsBreakingCheck);
+										propagateDamage(sFracturePairs[i].m_fracObj,&impulse, connection.m_childIndex1,
+										                &needsBreakingCheck, direction);
 									}
 								}
 							} else
@@ -949,10 +974,14 @@ void btFractureDynamicsWorld::fractureCallback( )
 									//propagated damage
 									if (pt.m_appliedImpulse > 0.f) {
 										btScalar impulse = pt.m_appliedImpulse;
-										propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex0, &needsBreakingCheck);
+										btVector3 direction = manifold->getBody0()->getWorldTransform().getOrigin()-
+										                      manifold->getBody1()->getWorldTransform().getOrigin();
+										propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex0,
+										                &needsBreakingCheck, direction);
 
 										impulse = pt.m_appliedImpulse;
-										propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex1, &needsBreakingCheck);
+										propagateDamage(sFracturePairs[i].m_fracObj, &impulse, connection.m_childIndex1,
+										                &needsBreakingCheck, direction);
 									}
 								}
 							}
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
index 4343166..36e84f2 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFra

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list