Avoid crash in btCompoundCompoundCollisionAlgorithm if there is no tree for one of the btCompoundShapes
Update the revision, to avoid clearing the child cache each frame
This commit is contained in:
@@ -229,6 +229,7 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
|
|||||||
removeChildAlgorithms();
|
removeChildAlgorithms();
|
||||||
|
|
||||||
preallocateChildAlgorithms(body0Wrap,body1Wrap);
|
preallocateChildAlgorithms(body0Wrap,body1Wrap);
|
||||||
|
m_compoundShapeRevision = compoundShape->getUpdateRevision();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ extern btShapePairCallback gCompoundChildShapePairCallback;
|
|||||||
/// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes
|
/// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes
|
||||||
class btCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm
|
class btCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithms;
|
btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithms;
|
||||||
bool m_isSwapped;
|
bool m_isSwapped;
|
||||||
|
|
||||||
|
|||||||
@@ -27,10 +27,8 @@ subject to the following restrictions:
|
|||||||
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
|
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
|
||||||
|
|
||||||
btCompoundCompoundCollisionAlgorithm::btCompoundCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
|
btCompoundCompoundCollisionAlgorithm::btCompoundCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
|
||||||
:btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
|
:btCompoundCollisionAlgorithm(ci,body0Wrap,body1Wrap,isSwapped)
|
||||||
m_sharedManifold(ci.m_manifold)
|
|
||||||
{
|
{
|
||||||
m_ownsManifold = false;
|
|
||||||
|
|
||||||
void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache),16);
|
void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache),16);
|
||||||
m_childCollisionAlgorithmCache= new(ptr) btHashedSimplePairCache();
|
m_childCollisionAlgorithmCache= new(ptr) btHashedSimplePairCache();
|
||||||
@@ -292,12 +290,21 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
|
|||||||
const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
|
const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
|
||||||
const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
|
const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
|
||||||
|
|
||||||
|
const btDbvt* tree0 = compoundShape0->getDynamicAabbTree();
|
||||||
|
const btDbvt* tree1 = compoundShape1->getDynamicAabbTree();
|
||||||
|
if (!tree0 || !tree1)
|
||||||
|
{
|
||||||
|
return btCompoundCollisionAlgorithm::processCollision(body0Wrap,body1Wrap,dispatchInfo,resultOut);
|
||||||
|
}
|
||||||
///btCompoundShape might have changed:
|
///btCompoundShape might have changed:
|
||||||
////make sure the internal child collision algorithm caches are still valid
|
////make sure the internal child collision algorithm caches are still valid
|
||||||
if ((compoundShape0->getUpdateRevision() != m_compoundShapeRevision0) || (compoundShape1->getUpdateRevision() != m_compoundShapeRevision1))
|
if ((compoundShape0->getUpdateRevision() != m_compoundShapeRevision0) || (compoundShape1->getUpdateRevision() != m_compoundShapeRevision1))
|
||||||
{
|
{
|
||||||
///clear all
|
///clear all
|
||||||
removeChildAlgorithms();
|
removeChildAlgorithms();
|
||||||
|
m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
|
||||||
|
m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -329,8 +336,7 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const btDbvt* tree0 = compoundShape0->getDynamicAabbTree();
|
|
||||||
const btDbvt* tree1 = compoundShape1->getDynamicAabbTree();
|
|
||||||
|
|
||||||
btCompoundCompoundLeafCallback callback(col0ObjWrap,col1ObjWrap,this->m_dispatcher,dispatchInfo,resultOut,this->m_childCollisionAlgorithmCache,m_sharedManifold);
|
btCompoundCompoundLeafCallback callback(col0ObjWrap,col1ObjWrap,this->m_dispatcher,dispatchInfo,resultOut,this->m_childCollisionAlgorithmCache,m_sharedManifold);
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ subject to the following restrictions:
|
|||||||
#ifndef BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
|
#ifndef BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
|
||||||
#define BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
|
#define BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
|
||||||
|
|
||||||
|
#include "btCompoundCollisionAlgorithm.h"
|
||||||
|
|
||||||
#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
|
#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
|
||||||
#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
|
#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
|
||||||
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
|
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
|
||||||
@@ -35,15 +37,12 @@ typedef bool (*btShapePairCallback)(const btCollisionShape* pShape0, const btCol
|
|||||||
extern btShapePairCallback gCompoundCompoundChildShapePairCallback;
|
extern btShapePairCallback gCompoundCompoundChildShapePairCallback;
|
||||||
|
|
||||||
/// btCompoundCompoundCollisionAlgorithm supports collision between two btCompoundCollisionShape shapes
|
/// btCompoundCompoundCollisionAlgorithm supports collision between two btCompoundCollisionShape shapes
|
||||||
class btCompoundCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm
|
class btCompoundCompoundCollisionAlgorithm : public btCompoundCollisionAlgorithm
|
||||||
{
|
{
|
||||||
|
|
||||||
class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
|
class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
|
||||||
btSimplePairArray m_removePairs;
|
btSimplePairArray m_removePairs;
|
||||||
|
|
||||||
class btPersistentManifold* m_sharedManifold;
|
|
||||||
bool m_ownsManifold;
|
|
||||||
|
|
||||||
|
|
||||||
int m_compoundShapeRevision0;//to keep track of changes, so that childAlgorithm array can be updated
|
int m_compoundShapeRevision0;//to keep track of changes, so that childAlgorithm array can be updated
|
||||||
int m_compoundShapeRevision1;
|
int m_compoundShapeRevision1;
|
||||||
|
|||||||
Reference in New Issue
Block a user