@@ -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);
0 commit comments