java-topology/defects/bullet/patch/bullet-0002-collisionobject-checkcollide-hashmap.patch

52 lines
1.9 KiB
Diff

--- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h
+++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h
@@ -23,6 +23,7 @@ subject to the following restrictions:
#include "LinearMath/btTransform.h"
#include "LinearMath/btMotionState.h"
+#include "LinearMath/btHashMap.h"
#include "LinearMath/btAlignedObjectArray.h"
@@ -115,7 +115,8 @@ class btCollisionObject
{
private:
- btAlignedObjectArray<const btCollisionObject*> m_objectsWithoutCollisionCheck;
+ btAlignedObjectArray<const btCollisionObject*> m_objectsWithoutCollisionCheck; // for serialization
+ btHashMap<btHashPtr, bool> m_ignoreSet; // O(1) membership index
public:
@@ -235,7 +237,7 @@ public:
void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
{
if (ignoreCollisionCheck)
{
- //int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
- //if (index == m_objectsWithoutCollisionCheck.size())
- //{
+ if (!m_ignoreSet.find(btHashPtr(co)))
+ {
m_objectsWithoutCollisionCheck.push_back(co);
- //}
+ m_ignoreSet.insert(btHashPtr(co), true);
+ }
}
else
{
m_objectsWithoutCollisionCheck.remove(co);
+ m_ignoreSet.remove(btHashPtr(co));
}
m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0;
}
@@ -266,10 +268,8 @@ public:
virtual bool checkCollideWithOverride(const btCollisionObject* co) const
{
- int index = m_objectsWithoutCollisionCheck.findLinearSearch(co); // O(N)
- if (index < m_objectsWithoutCollisionCheck.size())
- {
- return false;
- }
- return true;
+ // O(1) hash lookup — replaces O(N) findLinearSearch
+ return !m_ignoreSet.find(btHashPtr(co));
}