Procházet zdrojové kódy

Made physics scene/screen remove physics info on removeChild/removeEntity, other physics tweaks

Ivan Safrin před 14 roky
rodič
revize
a9234322b9

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

@@ -65,7 +65,7 @@ namespace Polycode {
 		* Removes a SceneEntity from the scene
 		* @param entity New entity to remove.
 		*/		
-		void removeEntity(SceneEntity *entity);
+		virtual void removeEntity(SceneEntity *entity);
 		
 		/**
 		* Returns the scene's default camera.

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

@@ -60,7 +60,7 @@ namespace Polycode {
 		* @param entityToRemove Entity to remove.
 		* @return Returns the same entity for convenience.
 		*/				
-		ScreenEntity* removeChild(ScreenEntity *entityToRemove);
+		virtual ScreenEntity* removeChild(ScreenEntity *entityToRemove);
 		
 		/**
 		* Sets the screen's offset. You can also translate the root entity to do the same thing.

+ 5 - 1
Modules/Contents/2DPhysics/Include/PolyPhysicsScreen.h

@@ -175,7 +175,11 @@ public:
 	* Removes a physics child from the screen.
 	* @param entityToRemove Entity to remove from the screen.
 	*/
-	void removePhysicsChild(PhysicsScreenEntity *entityToRemove);
+	void removePhysicsChild(ScreenEntity *entityToRemove);
+	
+	
+	ScreenEntity* removeChild(ScreenEntity *entityToRemove);
+	
 	
 	/**
 	* Begins tracking collisions for a ScreenEntity.

+ 17 - 4
Modules/Contents/2DPhysics/Source/PolyPhysicsScreen.cpp

@@ -407,14 +407,27 @@ PhysicsScreenEntity *PhysicsScreen::addPhysicsChild(ScreenEntity *newEntity, int
 	return newPhysicsEntity;
 }
 
-void PhysicsScreen::removePhysicsChild(PhysicsScreenEntity *entityToRemove) {
-	world->DestroyBody(entityToRemove->body);
-	removeChild(entityToRemove->getScreenEntity());
+void PhysicsScreen::removePhysicsChild(ScreenEntity *entityToRemove) {
+	PhysicsScreenEntity *physicsEntityToRemove = getPhysicsByScreenEntity(entityToRemove);
+	if(!physicsEntityToRemove) {
+		return;
+	}
+	world->DestroyBody(physicsEntityToRemove->body);
 	for(int i=0;i<physicsChildren.size();i++) {
-		if(physicsChildren[i] == entityToRemove) {
+		if(physicsChildren[i] == physicsEntityToRemove) {
 			physicsChildren.erase(physicsChildren.begin()+i);
 		}
 	}
+	Screen::removeChild(entityToRemove);	
+}
+
+ScreenEntity* PhysicsScreen::removeChild(ScreenEntity *entityToRemove) {
+	if(getPhysicsByScreenEntity(entityToRemove)) {
+		removePhysicsChild(entityToRemove);
+	} else {
+		Screen::removeChild(entityToRemove);	
+	}
+	return entityToRemove;
 }
 
 

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

@@ -92,7 +92,9 @@ struct CollisionResult {
 		
 			void initCollisionScene();
 		
-			virtual void Update();		
+			virtual void Update();
+			
+			virtual void removeEntity(SceneEntity *entity);
 						
 			CollisionSceneEntity *getCollisionEntityByObject(btCollisionObject *collisionObject);		
 
@@ -108,7 +110,6 @@ struct CollisionResult {
 			CollisionResult testCollision(SceneEntity *ent1, SceneEntity *ent2);
 			CollisionResult testCollisionOnCollisionChild(CollisionSceneEntity *cEnt1, CollisionSceneEntity *cEnt2);				
 			CollisionResult testCollisionOnCollisionChild_Convex(CollisionSceneEntity *cEnt1, CollisionSceneEntity *cEnt2);	
-			void stopTrackingCollision(SceneEntity *entity);
 		
 			virtual CollisionSceneEntity *addCollisionChild(SceneEntity *newEntity, int type=0, int group=1);
 			CollisionSceneEntity *trackCollision(SceneEntity *newEntity, int type=0, int group=1);

+ 1 - 1
Modules/Contents/3DPhysics/Include/PolyCollisionSceneEntity.h

@@ -42,7 +42,7 @@ namespace Polycode {
 			* Main constructor.
 			*/ 
 			CollisionSceneEntity(SceneEntity *entity, int type);
-			~CollisionSceneEntity();
+			virtual ~CollisionSceneEntity();
 			
 			/** @name Collision scene entity
 			*  Public methods

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

@@ -47,6 +47,8 @@ namespace Polycode {
 		
 		void Update();		
 		
+		void removeEntity(SceneEntity *entity);
+		
 			/** @name Physics scene
 			*  Public methods
 			*/

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

@@ -199,19 +199,6 @@ CollisionScene::~CollisionScene() {
 
 }
 
-void CollisionScene::stopTrackingCollision(SceneEntity *entity) {
-	CollisionSceneEntity *cEnt = getCollisionByScreenEntity(entity);	
-	world->removeCollisionObject(cEnt->collisionObject);
-	for(int i=0; i < collisionChildren.size(); i++) {
-		if(collisionChildren[i] == cEnt) {
-			collisionChildren.erase(collisionChildren.begin() + i);
-			delete cEnt;
-			
-			return;
-		}
-	}
-}
-
 void CollisionScene::removeCollision(SceneEntity *entity) {
 	CollisionSceneEntity *cEnt = getCollisionByScreenEntity(entity);
 	if(cEnt) {
@@ -226,6 +213,13 @@ void CollisionScene::removeCollision(SceneEntity *entity) {
 
 }
 
+void CollisionScene::removeEntity(SceneEntity *entity) {
+	if(getCollisionByScreenEntity(entity)) {
+		removeCollision(entity);	
+	}
+	Scene::removeEntity(entity);
+}
+
 CollisionSceneEntity *CollisionScene::trackCollision(SceneEntity *newEntity, int type, int group) {
 	CollisionSceneEntity *newCollisionEntity = new CollisionSceneEntity(newEntity, type);
 

+ 26 - 10
Modules/Contents/3DPhysics/Source/PolyPhysicsScene.cpp

@@ -159,20 +159,36 @@ PhysicsVehicle *PhysicsScene::addVehicleChild(SceneEntity *newEntity, Number mas
 void PhysicsScene::removePhysicsChild(SceneEntity *entity) {
 	PhysicsSceneEntity *ent = getPhysicsEntityBySceneEntity(entity);
 	if(ent) {
-		physicsWorld->removeRigidBody(ent->rigidBody);
-		physicsWorld->removeCollisionObject(ent->collisionObject);
-		for(int i=0; i < physicsChildren.size(); i++) {
-			if(physicsChildren[i] == ent) {
-				physicsChildren.erase(physicsChildren.begin()+i);
+		if(ent->getType() == PhysicsSceneEntity::CHARACTER_CONTROLLER) {
+			removeCharacterChild((PhysicsCharacter *)ent);
+		} else {
+		
+			if(ent->rigidBody) 
+				physicsWorld->removeRigidBody(ent->rigidBody);
+			physicsWorld->removeCollisionObject(ent->collisionObject);
+			for(int i=0; i < physicsChildren.size(); i++) {
+				if(physicsChildren[i] == ent) {
+					physicsChildren.erase(physicsChildren.begin()+i);
+				}
 			}
-		}
-		for(int i=0; i < collisionChildren.size(); i++) {
-			if(collisionChildren[i] == ent) {
-				collisionChildren.erase(collisionChildren.begin()+i);
+			for(int i=0; i < collisionChildren.size(); i++) {
+				if(collisionChildren[i] == ent) {
+					collisionChildren.erase(collisionChildren.begin()+i);
+				}
 			}
-		}		
+		}
 	}
 	delete ent;
+	CollisionScene::removeEntity(entity);
+}
+
+void PhysicsScene::removeEntity(SceneEntity *entity) {
+	PhysicsSceneEntity *ent = getPhysicsEntityBySceneEntity(entity);
+	if(ent) {
+		removePhysicsChild(entity);
+	} else {
+		CollisionScene::removeEntity(entity);
+	}
 }
 
 PhysicsSceneEntity *PhysicsScene::getPhysicsEntityBySceneEntity(SceneEntity *entity) {

+ 2 - 1
Modules/Contents/3DPhysics/Source/PolyPhysicsSceneEntity.cpp

@@ -201,7 +201,7 @@ PhysicsSceneEntity::PhysicsSceneEntity(SceneEntity *entity, int type, Number mas
 	}	
 	
 	if(type == CHARACTER_CONTROLLER) {
-		
+		rigidBody = NULL;
 	} else {	
 		btDefaultMotionState* myMotionState = new btDefaultMotionState(transform);
 		btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
@@ -229,6 +229,7 @@ void PhysicsSceneEntity::Update() {
 	free(mat);
 		
 	sceneEntity->setTransformByMatrixPure(m);	
+	collisionObject->getWorldTransform().setFromOpenGLMatrix(mat);
 }
 
 SceneEntity *PhysicsSceneEntity::getSceneEntity() {