Просмотр исходного кода

Added comparison operator overloaders to Color, added remove methods to 3D Physics scenes

Ivan Safrin 14 лет назад
Родитель
Сommit
146e89033a

+ 5 - 0
Core/Contents/Include/PolyColor.h

@@ -87,6 +87,11 @@ namespace Polycode {
 				return (((int)255.0*r) == ((int)255.0*c2.r) && ((int)255.0*g) == ((int)255.0*c2.g) && ((int)255.0*b) == ((int)255.0*c2.b) && ((int)255.0*a) == ((int)255.0*c2.a));
 			}
 			
+			bool operator != (const Color& c2) {
+				return (((int)255.0*r) != ((int)255.0*c2.r) && ((int)255.0*g) != ((int)255.0*c2.g) && ((int)255.0*b) != ((int)255.0*c2.b) && ((int)255.0*a) != ((int)255.0*c2.a));
+			}
+			
+
 			/** 
 			* Sets the color using an integer color value
 			* @param hex 32-bit integer with color values.

+ 4 - 0
Modules/Bindings/3DPhysics/API/Physics3D/CollisionScene.lua

@@ -140,6 +140,10 @@ function CollisionScene:trackCollision(newEntity, type, group)
 	end
 end
 
+function CollisionScene:removeCollision(entity)
+	local retVal = Physics3D.CollisionScene_removeCollision(self.__ptr, entity.__ptr)
+end
+
 function CollisionScene:adjustForCollision(collisionEntity)
 	local retVal = Physics3D.CollisionScene_adjustForCollision(self.__ptr, collisionEntity.__ptr)
 end

+ 16 - 0
Modules/Bindings/3DPhysics/API/Physics3D/PhysicsScene.lua

@@ -32,6 +32,22 @@ function PhysicsScene:Update()
 	local retVal =  Physics3D.PhysicsScene_Update(self.__ptr)
 end
 
+function PhysicsScene:removePhysicsChild(entity)
+	local retVal = Physics3D.PhysicsScene_removePhysicsChild(self.__ptr, entity.__ptr)
+end
+
+function PhysicsScene:getPhysicsEntityBySceneEntity(entity)
+	local retVal = Physics3D.PhysicsScene_getPhysicsEntityBySceneEntity(self.__ptr, entity.__ptr)
+	if retVal == nil then return nil end
+	if Polycore.__ptr_lookup[retVal] ~= nil then
+		return Polycore.__ptr_lookup[retVal]
+	else
+		Polycore.__ptr_lookup[retVal] = PhysicsSceneEntity("__skip_ptr__")
+		Polycore.__ptr_lookup[retVal].__ptr = retVal
+		return Polycore.__ptr_lookup[retVal]
+	end
+end
+
 function PhysicsScene:addPhysicsChild(newEntity, type, mass, friction, restitution, group)
 	local retVal = Physics3D.PhysicsScene_addPhysicsChild(self.__ptr, newEntity.__ptr, type, mass, friction, restitution, group)
 	if retVal == nil then return nil end

+ 32 - 0
Modules/Bindings/3DPhysics/Include/Physics3DLUAWrappers.h

@@ -181,6 +181,15 @@ static int Physics3D_CollisionScene_trackCollision(lua_State *L) {
 	return 1;
 }
 
+static int Physics3D_CollisionScene_removeCollision(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	CollisionScene *inst = (CollisionScene*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	SceneEntity * entity = (SceneEntity *)lua_topointer(L, 2);
+	inst->removeCollision(entity);
+	return 0;
+}
+
 static int Physics3D_CollisionScene_adjustForCollision(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	CollisionScene *inst = (CollisionScene*)lua_topointer(L, 1);
@@ -303,6 +312,29 @@ static int Physics3D_PhysicsScene_Update(lua_State *L) {
 	return 0;
 }
 
+static int Physics3D_PhysicsScene_removePhysicsChild(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	PhysicsScene *inst = (PhysicsScene*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	SceneEntity * entity = (SceneEntity *)lua_topointer(L, 2);
+	inst->removePhysicsChild(entity);
+	return 0;
+}
+
+static int Physics3D_PhysicsScene_getPhysicsEntityBySceneEntity(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	PhysicsScene *inst = (PhysicsScene*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	SceneEntity * entity = (SceneEntity *)lua_topointer(L, 2);
+	void *ptrRetVal = (void*)inst->getPhysicsEntityBySceneEntity(entity);
+	if(ptrRetVal == NULL) {
+		lua_pushnil(L);
+	} else {
+		lua_pushlightuserdata(L, ptrRetVal);
+	}
+	return 1;
+}
+
 static int Physics3D_PhysicsScene_addPhysicsChild(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	PhysicsScene *inst = (PhysicsScene*)lua_topointer(L, 1);

+ 3 - 0
Modules/Bindings/3DPhysics/Source/Physics3DLUA.cpp

@@ -17,6 +17,7 @@ CoreServices::setInstance(inst);
 		{"CollisionScene_stopTrackingCollision", Physics3D_CollisionScene_stopTrackingCollision},
 		{"CollisionScene_addCollisionChild", Physics3D_CollisionScene_addCollisionChild},
 		{"CollisionScene_trackCollision", Physics3D_CollisionScene_trackCollision},
+		{"CollisionScene_removeCollision", Physics3D_CollisionScene_removeCollision},
 		{"CollisionScene_adjustForCollision", Physics3D_CollisionScene_adjustForCollision},
 		{"delete_CollisionScene", Physics3D_delete_CollisionScene},
 		{"CollisionSceneEntity_get_lastPosition", Physics3D_CollisionSceneEntity_get_lastPosition},
@@ -31,6 +32,8 @@ CoreServices::setInstance(inst);
 		{"delete_CollisionSceneEntity", Physics3D_delete_CollisionSceneEntity},
 		{"PhysicsScene", Physics3D_PhysicsScene},
 		{"PhysicsScene_Update", Physics3D_PhysicsScene_Update},
+		{"PhysicsScene_removePhysicsChild", Physics3D_PhysicsScene_removePhysicsChild},
+		{"PhysicsScene_getPhysicsEntityBySceneEntity", Physics3D_PhysicsScene_getPhysicsEntityBySceneEntity},
 		{"PhysicsScene_addPhysicsChild", Physics3D_PhysicsScene_addPhysicsChild},
 		{"PhysicsScene_trackPhysicsChild", Physics3D_PhysicsScene_trackPhysicsChild},
 		{"PhysicsScene_addCharacterChild", Physics3D_PhysicsScene_addCharacterChild},

+ 1 - 0
Modules/Contents/3DPhysics/Include/PolyCollisionScene.h

@@ -111,6 +111,7 @@ struct CollisionResult {
 		
 			virtual CollisionSceneEntity *addCollisionChild(SceneEntity *newEntity, int type=0, int group=1);
 			CollisionSceneEntity *trackCollision(SceneEntity *newEntity, int type=0, int group=1);
+			void removeCollision(SceneEntity *entity);
 			void adjustForCollision(CollisionSceneEntity *collisionEntity);
 			
 			//@}

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

@@ -52,6 +52,8 @@ namespace Polycode {
 			*/
 			//@{			
 		
+		void removePhysicsChild(SceneEntity *entity);
+		PhysicsSceneEntity *getPhysicsEntityBySceneEntity(SceneEntity *entity);
 		
 		PhysicsSceneEntity *addPhysicsChild(SceneEntity *newEntity, int type=0, Number mass = 0.0f, Number friction=1, Number restitution=0, int group=1);		
 		PhysicsSceneEntity *trackPhysicsChild(SceneEntity *newEntity, int type=0, Number mass = 0.0f, Number friction=1, Number restitution=0, int group=1);		

+ 14 - 0
Modules/Contents/3DPhysics/Source/PolyCollisionScene.cpp

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

+ 27 - 0
Modules/Contents/3DPhysics/Source/PolyPhysicsScene.cpp

@@ -118,6 +118,33 @@ PhysicsVehicle *PhysicsScene::addVehicleChild(SceneEntity *newEntity, Number mas
 	return newPhysicsEntity;
 }
 
+void PhysicsScene::removePhysicsChild(SceneEntity *entity) {
+	PhysicsSceneEntity *ent = getPhysicsEntityBySceneEntity(entity);
+	if(ent) {
+		physicsWorld->removeRigidBody(ent->rigidBody);
+		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);
+			}
+		}		
+	}
+	delete ent;
+}
+
+PhysicsSceneEntity *PhysicsScene::getPhysicsEntityBySceneEntity(SceneEntity *entity) {
+	PhysicsSceneEntity *retEntity = NULL;
+	for(int i=0; i < physicsChildren.size(); i++) {
+		if(physicsChildren[i]->getSceneEntity() == entity) {
+			retEntity = physicsChildren[i];
+		}	
+	}
+	return retEntity;
+}
 
 PhysicsSceneEntity *PhysicsScene::trackPhysicsChild(SceneEntity *newEntity, int type, Number mass, Number friction, Number restitution, int group) {
 	PhysicsSceneEntity *newPhysicsEntity = new PhysicsSceneEntity(newEntity, type, mass, friction,restitution);

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

@@ -140,6 +140,7 @@ void PhysicsCharacter::jump() {
 
 void PhysicsCharacter::warpCharacter(Vector3 position) {
 	character->warp(btVector3(position.x, position.y, position.z));
+	Update();
 }
 
 void PhysicsCharacter::setJumpSpeed(Number jumpSpeed) {
@@ -162,7 +163,7 @@ bool PhysicsCharacter::onGround() {
 void PhysicsCharacter::Update() {
 	btVector3 pos = ghostObject->getWorldTransform().getOrigin();
 	sceneEntity->setPosition(pos.x(), pos.y(), pos.z());
-//	sceneEntity->rebuildTransformMatrix();
+	sceneEntity->rebuildTransformMatrix();
 	sceneEntity->dirtyMatrix(true);
 }