summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerwincoumans <erwincoumans@google.com>2021-11-12 05:29:27 +0000
committerGitHub <noreply@github.com>2021-11-12 05:29:27 +0000
commit40aeecb72eabfbaae2b91ef6a1e56037b95e7e0f (patch)
tree98593c0408db127f8e4d209fceec5cf7bbd8de60
parent88c04a8eaec4d8846a9e21e329a378801aef7753 (diff)
parenta672536f43ae241ab9b0324da4e8888fae31ad7e (diff)
downloadbullet3-40aeecb72eabfbaae2b91ef6a1e56037b95e7e0f.tar.gz
Merge pull request #4020 from QiaodongCui/master
Fix btCollisionDispatcherMt compound compound bugs
-rw-r--r--src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp19
-rw-r--r--src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h1
2 files changed, 19 insertions, 1 deletions
diff --git a/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp b/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
index b067903dd..9b38f5c7a 100644
--- a/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
+++ b/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
@@ -29,6 +29,8 @@ btCollisionDispatcherMt::btCollisionDispatcherMt(btCollisionConfiguration* confi
: btCollisionDispatcher(config)
{
m_batchManifoldsPtr.resize(btGetTaskScheduler()->getNumThreads());
+ m_batchReleasePtr.resize(btGetTaskScheduler()->getNumThreads());
+
m_batchUpdating = false;
m_grainSize = grainSize; // iterations per task
}
@@ -76,10 +78,11 @@ btPersistentManifold* btCollisionDispatcherMt::getNewManifold(const btCollisionO
void btCollisionDispatcherMt::releaseManifold(btPersistentManifold* manifold)
{
- clearManifold(manifold);
//btAssert( !btThreadsAreRunning() );
+
if (!m_batchUpdating)
{
+ clearManifold(manifold);
// batch updater will update manifold pointers array after finishing, so
// only need to update array when not batch-updating
int findIndex = manifold->m_index1a;
@@ -87,6 +90,9 @@ void btCollisionDispatcherMt::releaseManifold(btPersistentManifold* manifold)
m_manifoldsPtr.swap(findIndex, m_manifoldsPtr.size() - 1);
m_manifoldsPtr[findIndex]->m_index1a = findIndex;
m_manifoldsPtr.pop_back();
+ } else {
+ m_batchReleasePtr[btGetCurrentThreadIndex()].push_back(manifold);
+ return;
}
manifold->~btPersistentManifold();
@@ -154,6 +160,17 @@ void btCollisionDispatcherMt::dispatchAllCollisionPairs(btOverlappingPairCache*
batchManifoldsPtr.resizeNoInitialize(0);
}
+ // remove batched remove manifolds.
+ for (int i = 0; i < m_batchReleasePtr.size(); ++i)
+ {
+ btAlignedObjectArray<btPersistentManifold*>& batchManifoldsPtr = m_batchReleasePtr[i];
+ for (int j = 0; j < batchManifoldsPtr.size(); ++j)
+ {
+ releaseManifold(batchManifoldsPtr[j]);
+ }
+ batchManifoldsPtr.resizeNoInitialize(0);
+ }
+
// update the indices (used when releasing manifolds)
for (int i = 0; i < m_manifoldsPtr.size(); ++i)
{
diff --git a/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h b/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
index e6c67aeca..094e928bf 100644
--- a/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
+++ b/src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
@@ -31,6 +31,7 @@ public:
protected:
btAlignedObjectArray<btAlignedObjectArray<btPersistentManifold*> > m_batchManifoldsPtr;
+ btAlignedObjectArray<btAlignedObjectArray<btPersistentManifold*> > m_batchReleasePtr;
bool m_batchUpdating;
int m_grainSize;
};