Пример #1
0
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;
}