[Bf-blender-cvs] [12806f5] fracture_modifier: disabled damage propagation (and settings) in code and ui, was slow and not really necessary, also fixed a crash which happened when freed bullet manifolds were used again.

Martin Felke noreply at git.blender.org
Wed Oct 28 16:45:49 CET 2015


Commit: 12806f5ef8da54541c6897330b3cc59650c2edc2
Author: Martin Felke
Date:   Wed Oct 28 16:43:40 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB12806f5ef8da54541c6897330b3cc59650c2edc2

disabled damage propagation (and settings) in code and ui, was slow and not really necessary, also fixed a crash which happened when freed bullet manifolds were used again.

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

M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
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	release/scripts/startup/bl_ui/properties_physics_fracture.py

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

diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
index db89898..7eaf035 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -113,7 +113,7 @@ void btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld *world1
 		size = m_connections.size();
 		for (i=0; i < size; i++)
 		{
-			btConnection con = m_connections[i];
+			btConnection& con = m_connections[i];
 			btAlignedObjectArray<int> *adjacents = m_connection_map->find(con.m_childIndex0);
 			if (!adjacents) {
 				btAlignedObjectArray<int> adj;
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
index ec9f364..cd5dbc2 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.h
@@ -18,7 +18,15 @@ class btManifoldPoint;
 
 struct btConnection
 {
-	
+	bool operator==(const btConnection& con)
+	{
+		return this->m_childIndex0 == con.m_childIndex0 &&
+		       this->m_childIndex1 == con.m_childIndex1 &&
+		       this->m_childShape0 == con.m_childShape0 &&
+		       this->m_childShape1 == con.m_childShape1 &&
+		       this->m_strength == con.m_strength;
+	}
+
 	btCollisionShape*	m_childShape0;
 	btCollisionShape*	m_childShape1;
 	int	m_childIndex0;
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index ed914d9..775cedb 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -190,19 +190,21 @@ void btFractureDynamicsWorld::glueCallback()
 		for (int i=0;i<numManifolds;i++)
 		{
 			btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(i);
-			/*if (!manifold->getNumContacts())
+#if 0
+			if (!manifold->getNumContacts())
 			{
-				printf("Manifold %d has NO CONTACT POINT!!\n", i);
-				continue;
-			}*/
+				//printf("Manifold %d has NO CONTACT POINT!!\n", i);
+			//	continue;
+			}
 
-			/*btScalar minDist = 1e30f;
+			btScalar minDist = 1e30f;
 			for (int v=0;v<manifold->getNumContacts();v++)
 			{
 				minDist = btMin(minDist,manifold->getContactPoint(v).getDistance());
 			}
-			if (minDist>0.5)
-				continue;*/
+			if (minDist>0.f)
+				continue;
+#endif
 
 			btCollisionObject* colObj0 = (btCollisionObject*)manifold->getBody0();
 			btCollisionObject* colObj1 = (btCollisionObject*)manifold->getBody1();
@@ -223,9 +225,8 @@ void btFractureDynamicsWorld::glueCallback()
 			}
 		}
 	}
-
 #if 0
-	else //fallback if no manifolds are there (kinematic)
+	//else //fallback if no manifolds are there (kinematic)
 	{
 		int numConstraints = m_compoundConstraints.size();
 		for (int i=0;i<numConstraints;i++)
@@ -570,7 +571,7 @@ void btFractureDynamicsWorld::glueCallback()
 struct	btFracturePair
 {
 	btFractureBody* m_fracObj;
-	btAlignedObjectArray<btPersistentManifold*>	m_contactManifolds;
+	btAlignedObjectArray<int>	m_contactManifolds;
 };
 
 
@@ -720,9 +721,14 @@ void	btFractureDynamicsWorld::removeRigidBody(btRigidBody* body)
 			/*btDiscreteDynamicsWorld::*/removeConstraint(tmpConstraints[i]);
 
 		//m_fractureBodies.remove(fbody);
-	}
 
-	btDiscreteDynamicsWorld::removeRigidBody(body);
+		//m_nonStaticRigidBodies.remove(body);
+		//removeCollisionObject(body);
+	}
+	/*else
+	{*/
+		btDiscreteDynamicsWorld::removeRigidBody(body);
+	//}
 }
 
 void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
@@ -757,7 +763,7 @@ void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
 	int numElem = unionFind.getNumElements();
 	for (i=0;i<fracObj->m_connections.size();i++)
 	{
-		btConnection& connection = fracObj->m_connections[i];
+		btConnection connection = fracObj->m_connections[i];
 		if (connection.m_childIndex0 >= tags.size() ||
 		    connection.m_childIndex1 >= tags.size() )
 		{
@@ -859,16 +865,21 @@ void	btFractureDynamicsWorld::breakDisconnectedParts( btFractureBody* fracObj)
 #include <stdio.h>
 
 void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *impulse, int connection_index,
-                                              bool* needsBreakingCheck, const btVector3& direction)
+                                              bool* needsBreakingCheck, const btVector3& direction, int* depth)
 {
+	if (*depth == 0)
+		return;
+
+	(*depth)--;
+
 	//min break impulse, todo expose
-	if (body->m_propagationParameter.m_minimum_impulse > 0 &&
-	   (*impulse > body->m_propagationParameter.m_minimum_impulse) &&
+	if (/*body->m_propagationParameter.m_minimum_impulse > 0 &&
+	   (*impulse > body->m_propagationParameter.m_minimum_impulse) &&*/
 	   (body->m_connections.size() > connection_index))
 	{
-		btConnection* connection = &body->m_connections[connection_index];
-		btCollisionShape* shape0 = connection->m_childShape0;
-		btCollisionShape* shape1 = connection->m_childShape1;
+		btConnection& connection = body->m_connections[connection_index];
+		btCollisionShape* shape0 = connection.m_childShape0;
+		btCollisionShape* shape1 = connection.m_childShape1;
 
 		btRigidBody *fbody0 = m_shapeBodyCallback(shape0->getUserPointer());
 		btRigidBody *fbody1 = m_shapeBodyCallback(shape1->getUserPointer());
@@ -881,15 +892,17 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
 		{
 			//printf("FACTOR: %f\n", dir.dot(direction));
 
-			connection->m_strength -= *impulse;
-			//printf("strengthp=%f %f\n",connection.m_strength, *impulse);
+			connection.m_strength -= *impulse;
+			//printf("strengthp=%f %f\n",connection->m_strength, *impulse);
 
-			if (connection->m_strength<0)
+			if (connection.m_strength<0)
 			{
+				//printf("brokenp=%d %d\n",connection->m_childIndex0, connection->m_childIndex1);
 				//remove or set to zero
 				//printf("Breaking: %d %d\n",connection.m_childIndex0, connection.m_childIndex1);
-				connection->m_strength=0.f;
+				connection.m_strength=0.f;
 				*needsBreakingCheck = true;
+				body->m_connections.remove(connection);
 			}
 		}
 
@@ -906,7 +919,7 @@ void btFractureDynamicsWorld::propagateDamage(btFractureBody *body, btScalar *im
 				for (i=0;i<size;i++)
 				{
 					if(body->m_connections[adjacents->at(i)].m_strength > 0.f)
-						propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction);
+						propagateDamage(body, impulse, adjacents->at(i), needsBreakingCheck, direction, depth);
 				}
 			}
 		}
@@ -999,12 +1012,12 @@ void btFractureDynamicsWorld::fractureCallback( )
 			{
 				btFracturePair p;
 				p.m_fracObj = m_fractureBodies[j];
-				p.m_contactManifolds.push_back(manifold);
+				p.m_contactManifolds.push_back(manifold->m_index1a);
 				sFracturePairs.push_back(p);
 			} else
 			{
-				btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
-				sFracturePairs[pi].m_contactManifolds.push_back(manifold);
+				//btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
+				sFracturePairs[pi].m_contactManifolds.push_back(manifold->m_index1a);
 			}
 		}
 
@@ -1032,12 +1045,12 @@ void btFractureDynamicsWorld::fractureCallback( )
 				{
 					btFracturePair p;
 					p.m_fracObj = m_fractureBodies[j];
-					p.m_contactManifolds.push_back( manifold);
+					p.m_contactManifolds.push_back( manifold->m_index1a);
 					sFracturePairs.push_back(p);
 				} else
 				{
-					btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
-					sFracturePairs[pi].m_contactManifolds.push_back(manifold);
+					//btAssert(sFracturePairs[pi].m_contactManifolds.findLinearSearch(manifold)==sFracturePairs[pi].m_contactManifolds.size());
+					sFracturePairs[pi].m_contactManifolds.push_back(manifold->m_index1a);
 				}
 			}
 		}
@@ -1079,87 +1092,76 @@ void btFractureDynamicsWorld::fractureCallback( )
 
 					for (int j=0;j<sFracturePairs[i].m_contactManifolds.size();j++)
 					{
-						btPersistentManifold* manifold = sFracturePairs[i].m_contactManifolds[j];
-						for (int k=0;k<manifold->getNumContacts();k++)
+						if (getDispatcher()->getNumManifolds() > sFracturePairs[i].m_contactManifolds[j])
 						{
-							btManifoldPoint& pt = manifold->getContactPoint(k);
-							totalObjImpact += pt.m_appliedImpulse;
+							btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(sFracturePairs[i].m_contactManifolds[j]);
+							if (!manifold)
+								continue;
+
+							for (int k=0;k<manifold->getNumContacts();k++)
+							{
+								btManifoldPoint& pt = manifold->getContactPoint(k);
+								totalObjImpact += pt.m_appliedImpulse;
+							}
 						}
 					}
 
-					if (totalObjImpact < sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse)
+					if ((totalObjImpact < sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse) ||
+						(sFracturePairs[i].m_fracObj->m_propagationParameter.m_minimum_impulse == 0.0f))
 						continue;
 
 					for (int j=0;j<sFracturePairs[i].m_contactManifolds.size();j++)
 					{
-						btPersistentManifold* manifold = sFracturePairs[i].m_contactManifolds[j];
-						for (int k=0;k<manifold->getNumContacts();k++)
+						if (getDispatcher()->getNumManifolds() > sFracturePairs[i].m_contactManifolds[j])
 						{
-							btManifoldPoint& pt = manifold->getContactPoint(k);
-							if (manifold->getBody0()==sFracturePairs[i].m_fracObj)
+							btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(sFracturePairs[i].m_contactManifolds[j]);
+							if (!manifold)
+								continue;
+
+							for (int k=0;k<manifold->getNumContacts();k++)
 							{
-								for (int f=0;f<sFracturePairs[i].m_fracObj->m_connections.size();f++)
+								btManifoldPoint& pt = manifold->getContactPoint(k);
+								if (manifold->getBody0()==sFracturePairs[i].m_fracObj)
 								{
-									//direct damage
-									btConnectio

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list