Skip to content

Commit f41433f

Browse files
committed
- physics: change broadphase box checks to improve colldet performance
1 parent d9981eb commit f41433f

3 files changed

Lines changed: 26 additions & 15 deletions

File tree

shared/physics/eqPhysics.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -960,16 +960,19 @@ void CEqPhysicsWorld::DetectCollisionsSingle(CEqRigidBody* body)
960960
body->UpdateBoundingBoxTransform();
961961
const BoundingBox aabb = body->m_aabb_transformed;
962962

963+
const bool disabledCollisionChecks = (body->m_flags & COLLOBJ_DISABLE_COLLISION_CHECK);
964+
int objectTypeTesting = EQPHYS_FILTER_FLAG_STATICOBJECTS | EQPHYS_FILTER_FLAG_DYNAMICOBJECTS;
965+
if(disabledCollisionChecks)
966+
objectTypeTesting = EQPHYS_FILTER_FLAG_STATICOBJECTS;
967+
968+
// TODO: optimize broadphase with pairs
969+
// right now it is O^2
963970
auto broadphaseCb = [this, body](CEqCollisionObject* collObj) {
964971
if (collObj == body)
965972
return;
966973

967-
const bool disabledCollisionChecks = (body->m_flags & COLLOBJ_DISABLE_COLLISION_CHECK);
968974
if (collObj->IsDynamic())
969975
{
970-
if (disabledCollisionChecks)
971-
return;
972-
973976
DetectBodyCollisions(body, static_cast<CEqRigidBody*>(collObj), body->GetLastFrameTime());
974977
}
975978
else // purpose for triggers
@@ -980,7 +983,7 @@ void CEqPhysicsWorld::DetectCollisionsSingle(CEqRigidBody* body)
980983

981984
{
982985
Threading::CScopedReadLocker m(s_eqPhysDynamicRWLock);
983-
m_broadphase->BoxTest(aabb, broadphaseCb);
986+
m_broadphase->BoxTest(aabb, broadphaseCb, objectTypeTesting);
984987
}
985988
}
986989

@@ -1171,8 +1174,9 @@ void CEqPhysicsWorld::SimulateStep(float deltaTime, int iteration, FNSIMULATECAL
11711174
}
11721175
}
11731176

1174-
Array<CEqRigidBody*> movingMoveables{ PP_SL };
1175-
movingMoveables.resize(m_moveable.numElem());
1177+
static Array<CEqRigidBody*> simMovingMoveables{ PP_SL };
1178+
simMovingMoveables.clear();
1179+
simMovingMoveables.reserve(m_moveable.numElem());
11761180

11771181
{
11781182
PROF_EVENT("Moving Bodies PreSim");
@@ -1198,7 +1202,7 @@ void CEqPhysicsWorld::SimulateStep(float deltaTime, int iteration, FNSIMULATECAL
11981202
IntegrateSingle(body);
11991203

12001204
if (!body->IsFrozen())
1201-
movingMoveables.append(body);
1205+
simMovingMoveables.append(body);
12021206
}
12031207
}
12041208

@@ -1209,23 +1213,24 @@ void CEqPhysicsWorld::SimulateStep(float deltaTime, int iteration, FNSIMULATECAL
12091213

12101214
{
12111215
PROF_EVENT("Moving Bodies CollDet");
1216+
12121217
// calculate collisions
1213-
for (CEqRigidBody* body : movingMoveables)
1218+
for (CEqRigidBody* body : simMovingMoveables)
12141219
DetectCollisionsSingle(body);
12151220
}
12161221

12171222
{
12181223
PROF_EVENT("Moving Bodies Update");
12191224
// solve positions
1220-
for (CEqRigidBody* body : movingMoveables)
1225+
for (CEqRigidBody* body : simMovingMoveables)
12211226
body->Update(m_fDt);
12221227
}
12231228

12241229
{
12251230
PROF_EVENT("Moving Bodies Process Contact Pairs");
12261231

12271232
// process generated contact pairs
1228-
for (CEqRigidBody* body : movingMoveables)
1233+
for (CEqRigidBody* body : simMovingMoveables)
12291234
{
12301235
for (eqContactPair& pair : body->m_contactPairs)
12311236
ProcessContactPair(pair);

shared/physics/eqPhysics_Broadphase.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,23 @@ void CEqPhysicsBroadphase::RayTest(const Vector3D& rayFrom, const Vector3D& rayT
158158
}
159159
}
160160

161-
void CEqPhysicsBroadphase::BoxTest(const BoundingBox& bbox, const EqFunction<void(CEqCollisionObject* collObj)>& processFunc)
161+
void CEqPhysicsBroadphase::BoxTest(const BoundingBox& bbox, const EqFunction<void(CEqCollisionObject* collObj)>& processFunc, int physFilterFlags)
162162
{
163163
using namespace EqBulletUtils;
164164

165+
if(!physFilterFlags)
166+
return;
167+
165168
btDbvtVolume dbvtBox;
166169
ConvertDKToBulletVectors(dbvtBox.tMins(), bbox.minPoint);
167170
ConvertDKToBulletVectors(dbvtBox.tMaxs(), bbox.maxPoint);
168171

169172
AABBTester aabbTester(processFunc);
170173

171174
// process all children, that overlap with the given AABB bounds
172-
m_sets[FIXED_SET].collideTV(m_sets[1].m_root, dbvtBox, aabbTester);
173-
m_sets[DYNAMIC_SET].collideTV(m_sets[0].m_root, dbvtBox, aabbTester);
175+
if (physFilterFlags & EQPHYS_FILTER_FLAG_STATICOBJECTS)
176+
m_sets[FIXED_SET].collideTV(m_sets[1].m_root, dbvtBox, aabbTester);
177+
178+
if (physFilterFlags & EQPHYS_FILTER_FLAG_DYNAMICOBJECTS)
179+
m_sets[DYNAMIC_SET].collideTV(m_sets[0].m_root, dbvtBox, aabbTester);
174180
}

shared/physics/eqPhysics_Broadphase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class CEqPhysicsBroadphase
2828
void SetAabb(eqPhysBroadphaseUnit* unit, const BoundingBox& bbox);
2929

3030
void RayTest(const Vector3D& rayFrom, const Vector3D& rayTo, const ProcessObjectFunc& processFunc, int physFilterFlags, const BoundingBox& shapeBox = BoundingBox(0, 0));
31-
void BoxTest(const BoundingBox& bbox, const ProcessObjectFunc& processFunc);
31+
void BoxTest(const BoundingBox& bbox, const ProcessObjectFunc& processFunc, int physFilterFlags);
3232

3333
private:
3434
enum

0 commit comments

Comments
 (0)