Kaynağa Gözat

Second part of mcclure's leak fixes

Ivan Safrin 13 yıl önce
ebeveyn
işleme
3512d16811

+ 1 - 1
Core/Contents/Include/PolyScreenMesh.h

@@ -80,7 +80,7 @@ namespace Polycode {
 			
 			
 			/**
 			/**
 			* Applies a texture
 			* Applies a texture
-			* @param Texture to apply.
+			* @param texture to apply.
 			*/						
 			*/						
 			void setTexture(Texture *texture);
 			void setTexture(Texture *texture);
 			
 			

+ 5 - 2
Core/Contents/Source/PolyScene.cpp

@@ -40,7 +40,6 @@ using namespace Polycode;
 Scene::Scene() : EventDispatcher() {
 Scene::Scene() : EventDispatcher() {
 	defaultCamera = new Camera(this);
 	defaultCamera = new Camera(this);
 	activeCamera = defaultCamera;
 	activeCamera = defaultCamera;
-	CoreServices::getInstance()->getSceneManager()->addScene(this);
 	fogEnabled = false;
 	fogEnabled = false;
 	lightingEnabled = false;
 	lightingEnabled = false;
 	enabled = true;
 	enabled = true;
@@ -49,7 +48,8 @@ Scene::Scene() : EventDispatcher() {
 	clearColor.setColor(0.13f,0.13f,0.13f,1.0f); 
 	clearColor.setColor(0.13f,0.13f,0.13f,1.0f); 
 	ambientColor.setColor(0.0,0.0,0.0,1.0);
 	ambientColor.setColor(0.0,0.0,0.0,1.0);
 	useClearColor = false;
 	useClearColor = false;
-	ownsChildren = false;	
+	ownsChildren = false;
+	CoreServices::getInstance()->getSceneManager()->addScene(this);	
 }
 }
 
 
 Scene::Scene(bool virtualScene) : EventDispatcher() {
 Scene::Scene(bool virtualScene) : EventDispatcher() {
@@ -63,6 +63,9 @@ Scene::Scene(bool virtualScene) : EventDispatcher() {
 	clearColor.setColor(0.13f,0.13f,0.13f,1.0f); 
 	clearColor.setColor(0.13f,0.13f,0.13f,1.0f); 
 	useClearColor = false;
 	useClearColor = false;
 	ownsChildren = false;
 	ownsChildren = false;
+	if (!isSceneVirtual) {
+		CoreServices::getInstance()->getSceneManager()->addScene(this);
+	}
 }
 }
 
 
 void Scene::setActiveCamera(Camera *camera) {
 void Scene::setActiveCamera(Camera *camera) {

+ 2 - 3
Modules/Contents/3DPhysics/Include/PolyCollisionScene.h

@@ -87,8 +87,7 @@ struct CollisionResult {
 			/**
 			/**
 			* Creates a collision scene.
 			* Creates a collision scene.
 			*/
 			*/
-			CollisionScene(Vector3 size = Vector3(2000));
-			CollisionScene(bool virtualScene, Vector3 size = Vector3(2000));		
+			CollisionScene(Vector3 size = Vector3(2000), bool virtualScene = false, bool deferInitCollision = false);		
 			virtual ~CollisionScene();
 			virtual ~CollisionScene();
 		
 		
 			void initCollisionScene(Vector3 size);
 			void initCollisionScene(Vector3 size);
@@ -127,7 +126,7 @@ struct CollisionResult {
 			
 			
 			btDefaultCollisionConfiguration *collisionConfiguration;
 			btDefaultCollisionConfiguration *collisionConfiguration;
 			btCollisionDispatcher *dispatcher;
 			btCollisionDispatcher *dispatcher;
-			btAxisSweep3 *broadphase;
+			btAxisSweep3*  axisSweep;
 	};
 	};
 
 
 }
 }

+ 9 - 2
Modules/Contents/3DPhysics/Include/PolyPhysicsScene.h

@@ -26,6 +26,9 @@ THE SOFTWARE.
 #include <vector>
 #include <vector>
 
 
 class btDiscreteDynamicsWorld;
 class btDiscreteDynamicsWorld;
+class btDbvtBroadphase;
+class btSequentialImpulseConstraintSolver;
+class btGhostPairCallback;
 
 
 namespace Polycode {
 namespace Polycode {
 
 
@@ -59,7 +62,7 @@ namespace Polycode {
 		/**
 		/**
 		* Main constructor.
 		* Main constructor.
 		*/
 		*/
-		PhysicsScene(int maxSubSteps = 0);
+		PhysicsScene(int maxSubSteps = 0, Vector3 size = Vector3(200), bool virtualScene = false);
 		virtual ~PhysicsScene();	
 		virtual ~PhysicsScene();	
 		
 		
 		void Update();		
 		void Update();		
@@ -98,9 +101,13 @@ namespace Polycode {
 	protected:
 	protected:
 		
 		
 		int maxSubSteps;
 		int maxSubSteps;
-		void initPhysicsScene();		
+		void initPhysicsScene(Vector3 size);		
 		
 		
 		btDiscreteDynamicsWorld* physicsWorld;
 		btDiscreteDynamicsWorld* physicsWorld;
+		btSequentialImpulseConstraintSolver *solver;		
+		btDbvtBroadphase *broadphase;
+		btGhostPairCallback *ghostPairCallback;
+		
 		std::vector<PhysicsSceneEntity*> physicsChildren;
 		std::vector<PhysicsSceneEntity*> physicsChildren;
 		
 		
 	};
 	};

+ 2 - 0
Modules/Contents/3DPhysics/Include/PolyPhysicsSceneEntity.h

@@ -109,6 +109,8 @@ namespace Polycode {
 	protected:
 	protected:
 	
 	
 		Number mass;
 		Number mass;
+		
+		btDefaultMotionState* myMotionState;		
 	};
 	};
 	
 	
 	/**
 	/**

+ 7 - 9
Modules/Contents/3DPhysics/Source/PolyCollisionScene.cpp

@@ -26,12 +26,10 @@ THE SOFTWARE.
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
-CollisionScene::CollisionScene(Vector3 size) : Scene() {
-	initCollisionScene(size);
-}
-
-CollisionScene::CollisionScene(bool virtualScene, Vector3 size) : Scene(virtualScene) { 
-	initCollisionScene(size);
+CollisionScene::CollisionScene(Vector3 size, bool virtualScene, bool deferInitCollision) : Scene(virtualScene), world(NULL), axisSweep(NULL), dispatcher(NULL), collisionConfiguration(NULL){ 
+	if(!deferInitCollision) {
+		initCollisionScene(size);
+	}
 }
 }
 
 
 void CollisionScene::initCollisionScene(Vector3 size) {
 void CollisionScene::initCollisionScene(Vector3 size) {
@@ -42,8 +40,8 @@ void CollisionScene::initCollisionScene(Vector3 size) {
 	collisionConfiguration = new btDefaultCollisionConfiguration();
 	collisionConfiguration = new btDefaultCollisionConfiguration();
 	dispatcher = new btCollisionDispatcher(collisionConfiguration);
 	dispatcher = new btCollisionDispatcher(collisionConfiguration);
 	//	dispatcher->setNearCallback(customNearCallback);
 	//	dispatcher->setNearCallback(customNearCallback);
-	broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax);
-	world = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration);	
+	axisSweep = new btAxisSweep3(worldAabbMin,worldAabbMax);
+	world = new btCollisionWorld(dispatcher,axisSweep,collisionConfiguration);	
 }
 }
 
 
 void CollisionScene::Update() {
 void CollisionScene::Update() {
@@ -199,7 +197,7 @@ CollisionScene::~CollisionScene() {
 		delete collisionChildren[i];
 		delete collisionChildren[i];
 	}
 	}
 	delete world;
 	delete world;
-	delete broadphase;
+	delete axisSweep;
 	delete dispatcher;
 	delete dispatcher;
 	delete collisionConfiguration;
 	delete collisionConfiguration;
 }
 }

+ 22 - 17
Modules/Contents/3DPhysics/Source/PolyPhysicsScene.cpp

@@ -42,13 +42,24 @@ PhysicsSceneEvent::~PhysicsSceneEvent() {
 }
 }
 
 
 
 
-PhysicsScene::PhysicsScene(int maxSubSteps) : CollisionScene() {
+PhysicsScene::PhysicsScene(int maxSubSteps, Vector3 size, bool virtualScene) : CollisionScene(size, virtualScene, true), physicsWorld(NULL), solver(NULL), broadphase(NULL), ghostPairCallback(NULL) {
 	this->maxSubSteps = maxSubSteps;
 	this->maxSubSteps = maxSubSteps;
-	initPhysicsScene();	
+	initPhysicsScene(size);	
 }
 }
 
 
 PhysicsScene::~PhysicsScene() {
 PhysicsScene::~PhysicsScene() {
+	for(int i=0; i < collisionChildren.size(); i++) {
+		delete collisionChildren[i];
+	}	
+	delete physicsWorld;
 	
 	
+	// Prevent double free by ~CollisionScene
+	collisionChildren.clear();
+	world = NULL;
+	
+	delete solver;
+	delete broadphase;
+	delete ghostPairCallback;
 }
 }
 
 
 void worldTickCallback(btDynamicsWorld *world, btScalar timeStep) {
 void worldTickCallback(btDynamicsWorld *world, btScalar timeStep) {
@@ -56,29 +67,23 @@ void worldTickCallback(btDynamicsWorld *world, btScalar timeStep) {
 	physicsScene->processWorldCollisions();
 	physicsScene->processWorldCollisions();
 }
 }
 
 
-void PhysicsScene::initPhysicsScene() {
+void PhysicsScene::initPhysicsScene(Vector3 size) {
 		
 		
-	
- btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
-//	btDbvtBroadphase* broadphase = new btDbvtBroadphase();
-	
+	collisionConfiguration = new btDefaultCollisionConfiguration();	
 	btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);	
 	btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);	
 	
 	
-	btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver();
+	solver = new btSequentialImpulseConstraintSolver();
 	
 	
-	btVector3 worldMin(-100,-100,-100);
-	btVector3 worldMax(100,100,100);
-	btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax);	
+	btVector3 worldMin(-size.x * 0.5, -size.y * 0.5, -size.z * 0.5);
+	btVector3 worldMax(size.x * 0.5, size.y * 0.5, size.z * 0.5);
+	axisSweep = new btAxisSweep3(worldMin,worldMax);	
 	
 	
-	btDbvtBroadphase *broadPhase = new btDbvtBroadphase();
-	
-	physicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadPhase,solver,collisionConfiguration);
+	broadphase = new btDbvtBroadphase();	
+	physicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
 	
 	
 //	physicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
 //	physicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
 	physicsWorld->setGravity(btVector3(0,-10,0));
 	physicsWorld->setGravity(btVector3(0,-10,0));
-	
-	
-	sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
+	axisSweep->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
 	
 	
 	world = physicsWorld;
 	world = physicsWorld;
 	
 	

+ 12 - 4
Modules/Contents/3DPhysics/Source/PolyPhysicsSceneEntity.cpp

@@ -28,7 +28,7 @@ THE SOFTWARE.
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
-PhysicsVehicle::PhysicsVehicle(SceneEntity *entity, Number mass, Number friction,btDefaultVehicleRaycaster *rayCaster): PhysicsSceneEntity(entity, PhysicsSceneEntity::SHAPE_BOX, mass, friction, 1) {
+PhysicsVehicle::PhysicsVehicle(SceneEntity *entity, Number mass, Number friction,btDefaultVehicleRaycaster *_rayCaster): PhysicsSceneEntity(entity, PhysicsSceneEntity::SHAPE_BOX, mass, friction, 1), rayCaster(_rayCaster), vehicle(NULL) {
 	
 	
 }
 }
 
 
@@ -110,6 +110,11 @@ void PhysicsVehicle::Update() {
 }
 }
 
 
 PhysicsVehicle::~PhysicsVehicle() {
 PhysicsVehicle::~PhysicsVehicle() {
+	delete rayCaster;
+	delete vehicle;
+	for(int i = 0; i < wheels.size(); i++) {
+		delete wheels[i].wheelEntity;
+	}
 }
 }
 
 
 PhysicsCharacter::PhysicsCharacter(SceneEntity *entity, Number mass, Number friction, Number stepSize) : PhysicsSceneEntity(entity, PhysicsSceneEntity::CHARACTER_CONTROLLER, mass, friction, 1) {	
 PhysicsCharacter::PhysicsCharacter(SceneEntity *entity, Number mass, Number friction, Number stepSize) : PhysicsSceneEntity(entity, PhysicsSceneEntity::CHARACTER_CONTROLLER, mass, friction, 1) {	
@@ -172,7 +177,8 @@ void PhysicsCharacter::Update() {
 }
 }
 
 
 PhysicsCharacter::~PhysicsCharacter() {
 PhysicsCharacter::~PhysicsCharacter() {
-	
+	delete character;
+	delete ghostObject;	
 }
 }
 
 
 PhysicsSceneEntity::PhysicsSceneEntity(SceneEntity *entity, int type, Number mass, Number friction, Number restitution) : CollisionSceneEntity(entity, type) {
 PhysicsSceneEntity::PhysicsSceneEntity(SceneEntity *entity, int type, Number mass, Number friction, Number restitution) : CollisionSceneEntity(entity, type) {
@@ -202,8 +208,9 @@ PhysicsSceneEntity::PhysicsSceneEntity(SceneEntity *entity, int type, Number mas
 	
 	
 	if(type == CHARACTER_CONTROLLER) {
 	if(type == CHARACTER_CONTROLLER) {
 		rigidBody = NULL;
 		rigidBody = NULL;
+		myMotionState = NULL;
 	} else {	
 	} else {	
-		btDefaultMotionState* myMotionState = new btDefaultMotionState(transform);
+		myMotionState = new btDefaultMotionState(transform);
 		btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
 		btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
 		rigidBody = new btRigidBody(rbInfo);
 		rigidBody = new btRigidBody(rbInfo);
 //		rigidBody->setActivationState(ISLAND_SLEEPING);		
 //		rigidBody->setActivationState(ISLAND_SLEEPING);		
@@ -259,5 +266,6 @@ SceneEntity *PhysicsSceneEntity::getSceneEntity() {
 }
 }
 
 
 PhysicsSceneEntity::~PhysicsSceneEntity() {
 PhysicsSceneEntity::~PhysicsSceneEntity() {
-	
+	delete rigidBody;
+	delete myMotionState;	
 }
 }