[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