# UNDF: UNDF-2026-000000018 --- 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 m_objectsWithoutCollisionCheck; + btAlignedObjectArray m_objectsWithoutCollisionCheck; // for serialization + btHashMap 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)); }