[Bf-blender-cvs] [d64c367] fracture_modifier: some enhancement attempts for compounding, supposed to be better controllable in some cases, but still odd behavior with multiple compound objects

Martin Felke noreply at git.blender.org
Sat Oct 24 13:01:18 CEST 2015


Commit: d64c36756060a6deb8a2e43404826b77b82f1add
Author: Martin Felke
Date:   Sat Oct 24 13:01:03 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd64c36756060a6deb8a2e43404826b77b82f1add

some enhancement attempts for compounding, supposed to be better controllable in some cases, but still odd behavior with multiple compound objects

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

M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
M	extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.h
M	intern/rigidbody/rb_bullet_api.cpp

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

diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
index eebd79e..db89898 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureBody.cpp
@@ -87,8 +87,8 @@ void btFractureBody::recomputeConnectivityByConstraints(btCollisionWorld *world1
 					world->m_idCallback(obA->getUserPointer(), &obIdA, &shardIdA);
 					world->m_idCallback(obB->getUserPointer(), &obIdB, &shardIdB);
 
-					index0 = world->m_childIndexHash->find(shardIdA);
-					index1 = world->m_childIndexHash->find(shardIdB);
+					index0 = world->m_childIndexHash->find(to_str(obIdA, shardIdA));
+					index1 = world->m_childIndexHash->find(to_str(obIdB, shardIdB));
 
 					if ((obIdA == obIdB) && (shardIdA != shardIdB) &&
 					    index0 && index1 && *index0 > -1 && *index1 > -1)
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
index e8789b2..1788392 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btFractureDynamicsWorld.cpp
@@ -13,7 +13,14 @@ m_idCallback(callback),
 m_shapeBodyCallback(shapebodycallback),
 m_addBroadPhaseHandle(false)
 {
-	m_childIndexHash = new btHashMap<btHashInt, int>();
+	m_childIndexHash = new btHashMap<btHashString, int>();
+}
+
+char* to_str(int objectId, int shardId)
+{
+	std::ostringstream oss;
+	oss << objectId << shardId;
+	return strdup(oss.str().c_str());
 }
 
 btFractureDynamicsWorld::~btFractureDynamicsWorld()
@@ -76,11 +83,12 @@ void btFractureDynamicsWorld::updateBodies()
 					int objectIndexA, shardIndexA; //, objectIndexB, shardIndexB;
 					m_idCallback(cshape->getUserPointer(), &objectIndexA, &shardIndexA);
 					//m_idCallback(body->getUserPointer(), &objectIndexB, &shardIndexB );
-					m_childIndexHash->insert(shardIndexA, j);
+
+					m_childIndexHash->insert(to_str(objectIndexA, shardIndexA), j);
 
 					//if ((objectIndexA == objectIndexB) && (shardIndexA != shardIndexB))
 					btTransform trans;
-					btFractureBody *fbody = m_shapeBodyCallback(cshape->getUserPointer());
+					btRigidBody *fbody = m_shapeBodyCallback(cshape->getUserPointer());
 
 					trans = body->getWorldTransform()*shape->getChildTransform(j);
 					fbody->setWorldTransform(trans);
@@ -93,7 +101,7 @@ void btFractureDynamicsWorld::updateBodies()
 				//non compounds have a child index of -1, (and will have a broadphase handle)
 				int objectIndexA, shardIndexA;
 				m_idCallback(cshape->getUserPointer(), &objectIndexA, &shardIndexA);
-				m_childIndexHash->insert(shardIndexA, -1);
+				m_childIndexHash->insert(to_str(objectIndexA, shardIndexA), -1);
 			}
 		}
 	}
@@ -120,13 +128,13 @@ void	btFractureDynamicsWorld::updateAabbs()
 void btFractureDynamicsWorld::glueCallback()
 {
 
-	//int numManifolds = getDispatcher()->getNumManifolds();
+	int numManifolds = getDispatcher()->getNumManifolds();
 
 	///first build the islands based on axis aligned bounding box overlap
 
 
-	btAlignedObjectArray<int> objectIds;
-	btHashMap<btHashInt, btAlignedObjectArray<btCollisionObject*> >objectMap;
+	//btAlignedObjectArray<int> objectIds;
+	//btHashMap<btHashInt, btAlignedObjectArray<int> >objectMap;
 
 	int index = 0;
 	{
@@ -140,25 +148,25 @@ void btFractureDynamicsWorld::glueCallback()
 //			if (!collisionObject->isStaticOrKinematicObject())
 			if (collisionObject->getInternalType() & CUSTOM_FRACTURE_TYPE)
 			{
-				int objectId, shardId;
+				//int objectId, shardId;
 				collisionObject->setIslandTag(index++);
-				btFractureBody *body = (btFractureBody*)collisionObject;
+				/*btFractureBody *body = (btFractureBody*)collisionObject;
 				m_idCallback(body->getUserPointer(),&objectId, &shardId);
 				if (objectId > -1)
 				{
-					btAlignedObjectArray<btCollisionObject*> *objects = objectMap.find(objectId);
+					btAlignedObjectArray<int> *objects = objectMap.find(objectId);
 					if (!objects)
 					{
-						btAlignedObjectArray<btCollisionObject*> obj;
-						obj.push_back(collisionObject);
+						btAlignedObjectArray<int> obj;
+						obj.push_back(i);
 						objectMap.insert(objectId, obj);
 						objectIds.push_back(objectId);
 					}
 					else
 					{
-						objects->push_back(collisionObject);
+						objects->push_back(i);
 					}
-				}
+				}*/
 			}
 			else
 			{
@@ -170,40 +178,47 @@ void btFractureDynamicsWorld::glueCallback()
 #endif
 		}
 	}
+	btUnionFind unionFind;
+	unionFind.reset(index);
 
-/*	unionFind.reset(index);
-
-	int numElem = unionFind.getNumElements();*/
+	//int numElem = unionFind.getNumElements();
 
-#if 0
+	printf("Manifolds: %d\n", numManifolds);
 	for (int i=0;i<numManifolds;i++)
 	{
 		btPersistentManifold* manifold = getDispatcher()->getManifoldByIndexInternal(i);
-		if (!manifold->getNumContacts())
+		/*if (!manifold->getNumContacts())
+		{
+			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.)
-			continue;
+		if (minDist>0.5)
+			continue;*/
 		
 		btCollisionObject* colObj0 = (btCollisionObject*)manifold->getBody0();
 		btCollisionObject* colObj1 = (btCollisionObject*)manifold->getBody1();
 		int tag0 = (colObj0)->getIslandTag();
 		int tag1 = (colObj1)->getIslandTag();
-		//btRigidBody* body0 = btRigidBody::upcast(colObj0);
-		//btRigidBody* body1 = btRigidBody::upcast(colObj1);
 
+		btRigidBody* body0 = btRigidBody::upcast(colObj0);
+		btRigidBody* body1 = btRigidBody::upcast(colObj1);
 
-		if (!colObj0->isStaticOrKinematicObject() && !colObj1->isStaticOrKinematicObject())
+		int objectId0, objectId1, shardId0, shardId1;
+		m_idCallback(body0->getUserPointer(),&objectId0, &shardId0);
+		m_idCallback(body1->getUserPointer(),&objectId1, &shardId1);
+
+		//if (!colObj0->isStaticOrKinematicObject() && !colObj1->isStaticOrKinematicObject())
+		if (objectId0 == objectId1 && objectId0 > -1 && tag0 > -1 && tag1 > -1)
 		{
 			unionFind.unite(tag0, tag1);
 		}
 	}
-#endif
 
 #if 0
 	int numConstraints = m_compoundConstraints.size();
@@ -230,15 +245,16 @@ void btFractureDynamicsWorld::glueCallback()
 	}
 #endif
 
+#if 0
 	for (int ai=0;ai<objectIds.size();ai++)
 	{
 		btUnionFind unionFind;
-		btAlignedObjectArray<btCollisionObject*> *objects = objectMap.find(objectIds[ai]);
-		unionFind.reset(objects->size());
+		btAlignedObjectArray<int> *objects = objectMap.find(objectIds[ai]);
+		unionFind.reset(index);
 
 		for (int j=0;j<objects->size();j++)
 		{
-			btCollisionObject* collisionObject = objects->at(j);
+			btCollisionObject* collisionObject = getCollisionObjectArray()[objects->at(j)];
 			if (collisionObject->getInternalType() & CUSTOM_FRACTURE_TYPE)
 			{
 				//ensure 1 compound per object, so shard id 0 becomes parent always.... sure that it is first ?
@@ -246,278 +262,283 @@ void btFractureDynamicsWorld::glueCallback()
 				islandTag = collisionObject->getIslandTag();
 				btFractureBody *body = (btFractureBody*)collisionObject;
 				m_idCallback(body->getUserPointer(),&objectId, &shardId);
-				if (objectId > -1 && islandTag < objects->size())
+				if (objectId > -1 /*&& islandTag < objects->size()*/)
 				{
 					unionFind.unite(objectId, islandTag);
 				}
 			}
 		}
+#endif
 
-		int numElem = unionFind.getNumElements();
-
+	int numElem = unionFind.getNumElements();
 
-		index=0;
-		for (int ai=0;ai<objects->size();ai++)
+	index=0;
+	for (int ai=0;ai<getCollisionObjectArray().size();ai++)
+	{
+		btCollisionObject* collisionObject=  getCollisionObjectArray()[ai];
+		//if (!collisionObject->isStaticOrKinematicObject())
+		if (collisionObject->getInternalType() & CUSTOM_FRACTURE_TYPE)
 		{
-			btCollisionObject* collisionObject= objects->at(ai);
-			//if (!collisionObject->isStaticOrKinematicObject())
-			if (collisionObject->getInternalType() & CUSTOM_FRACTURE_TYPE)
-			{
-				int tag = unionFind.find(index);
+			int tag = unionFind.find(index);
 
-				collisionObject->setIslandTag( tag);
+			collisionObject->setIslandTag( tag);
 
-				//Set the correct object offset in Collision Object Array
+			//Set the correct object offset in Collision Object Array
 #if STATIC_SIMULATION_ISLAND_OPTIMIZATION
-				unionFind.getElement(index).m_sz = ai;
+			unionFind.getElement(index).m_sz = ai;
 #endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
 
-				index++;
-			}
+			index++;
 		}
-		unionFind.sortIslands();
+	}
+	unionFind.sortIslands();
 
 
 
-		int endIslandIndex=1;
-		int startIslandIndex;
+	int endIslandIndex=1;
+	int startIslandIndex;
 
-		btAlignedObjectArray<btCollisionObject*> removedObjects;
-		btAlignedObjectArray<btCollisionObject*> newObjects;
+	btAlignedObjectArray<btCollisionObject*> removedObjects;
+	btAlignedObjectArray<btCollisionObject*> newObjects;
 
-		///iterate over all islands
-		for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+	///iterate over all islands
+	for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+	{
+		int islandId = unionFind.getElement(startIslandIndex).m_id;
+		for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (unionFind.getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
 		{
-			int islandId = unionFind.getElement(startIslandIndex).m_id;
-			for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (unionFind.getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
-			{
-			}
+		}
 
-			int fractureObjectIndex = -1;
+		int fractureObjectIndex = -1;
 
-			int numObjects=0;
+		int numObjects=0;
 
-			int idx;
-			for (idx=startIslandIndex;idx<endIslandIndex;idx++)
-			{
-				int i = unionFind.getElement(idx).m_sz;
-
-				if (i >= getCollisionObjectArray().size())
-				{
-					fractureObjectIndex = -1;
-					continue;
-				}
+		int idx;
+		for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+		{
+			int i = unionFind.getElement(idx).m_sz;
 
+			/*if (i >= getCollisionObjectArray().size())
+			{
+				fractureObjec

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list