53 lines
1.9 KiB
Diff
53 lines
1.9 KiB
Diff
# 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<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));
|
|
}
|