CPhysicsEnvironment::~CPhysicsEnvironment() { #if DEBUG_DRAW delete m_debugdraw; #endif SetQuickDelete(true); for (int i = m_objects.Count() - 1; i >= 0; --i) { delete m_objects[i]; } for (int i = m_softBodies.Count() - 1; i >= 0; --i) { delete m_softBodies[i]; } m_objects.RemoveAll(); m_softBodies.RemoveAll(); CleanupDeleteList(); delete m_pDeleteQueue; delete m_pPhysicsDragController; delete m_pBulletEnvironment; delete m_pBulletSolver; delete m_pBulletBroadphase; delete m_pBulletDispatcher; delete m_pBulletConfiguration; delete m_pBulletGhostCallback; #ifdef MULTITHREADED m_pSharedThreadPool->stopThreads(); delete m_pSharedThreadPool; #endif delete m_pCollisionListener; delete m_pCollisionSolver; delete m_pObjectTracker; }
CPhysicsEnvironment::~CPhysicsEnvironment( void ) { // no callbacks during shutdown SetCollisionSolver( NULL ); m_pPhysEnv->remove_listener_object_global( m_pSleepEvents ); // don't bother waking up other objects as we clear them out SetQuickDelete( true ); // delete/remove the listeners m_pPhysEnv->remove_listener_collision_global( m_pCollisionListener ); delete m_pCollisionListener; m_pPhysEnv->remove_listener_constraint_global( m_pConstraintListener ); delete m_pConstraintListener; // Clean out the list of physics objects for ( int i = m_objects.Count()-1; i >= 0; --i ) { CPhysicsObject *pObject = static_cast<CPhysicsObject *>(m_objects[i]); PhantomRemove( pObject ); delete pObject; } m_objects.RemoveAll(); ClearDeadObjects(); // Clean out the list of fluids m_fluids.PurgeAndDeleteElements(); delete m_pSleepEvents; delete m_pDragController; delete m_pPhysEnv; delete m_pDeleteQueue; // must be deleted after the environment (calls back in destructor) delete m_pCollisionSolver; }