diff options
author | erwincoumans <erwincoumans@google.com> | 2021-11-12 05:29:27 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-12 05:29:27 +0000 |
commit | 40aeecb72eabfbaae2b91ef6a1e56037b95e7e0f (patch) | |
tree | 98593c0408db127f8e4d209fceec5cf7bbd8de60 | |
parent | 88c04a8eaec4d8846a9e21e329a378801aef7753 (diff) | |
parent | a672536f43ae241ab9b0324da4e8888fae31ad7e (diff) | |
download | bullet3-40aeecb72eabfbaae2b91ef6a1e56037b95e7e0f.tar.gz |
Merge pull request #4020 from QiaodongCui/master
Fix btCollisionDispatcherMt compound compound bugs
-rw-r--r-- | src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp | 19 | ||||
-rw-r--r-- | src/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h | 1 |
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; }; |