Kaynağa Gözat

Various bugfixes across the board

Ivan Safrin 14 yıl önce
ebeveyn
işleme
3f22489bf4

+ 2 - 2
Bindings/Contents/LUA/API/Polycode/BoneTrack.lua

@@ -125,8 +125,8 @@ function BoneTrack:BoneTrack(...)
 	end
 end
 
-function BoneTrack:Play()
-	local retVal =  Polycore.BoneTrack_Play(self.__ptr)
+function BoneTrack:Play(once)
+	local retVal = Polycore.BoneTrack_Play(self.__ptr, once)
 end
 
 function BoneTrack:Stop()

+ 4 - 0
Bindings/Contents/LUA/API/Polycode/ParticleEmitter.lua

@@ -159,6 +159,10 @@ function ParticleEmitter:enablePerlin(val)
 	local retVal = Polycore.ParticleEmitter_enablePerlin(self.__ptr, val)
 end
 
+function ParticleEmitter:setParticleVisibility(val)
+	local retVal = Polycore.ParticleEmitter_setParticleVisibility(self.__ptr, val)
+end
+
 function ParticleEmitter:setPerlinModSize(size)
 	local retVal = Polycore.ParticleEmitter_setPerlinModSize(self.__ptr, size)
 end

+ 4 - 0
Bindings/Contents/LUA/API/Polycode/SceneParticleEmitter.lua

@@ -40,6 +40,10 @@ function SceneParticleEmitter:getEmitter()
 	end
 end
 
+function SceneParticleEmitter:respawnSceneParticles()
+	local retVal =  Polycore.SceneParticleEmitter_respawnSceneParticles(self.__ptr)
+end
+
 function SceneParticleEmitter:addParticleBody(particleBody)
 	local retVal = Polycore.SceneParticleEmitter_addParticleBody(self.__ptr, particleBody.__ptr)
 end

+ 4 - 4
Bindings/Contents/LUA/API/Polycode/Skeleton.lua

@@ -32,12 +32,12 @@ function Skeleton:loadSkeleton(fileName)
 	local retVal = Polycore.Skeleton_loadSkeleton(self.__ptr, fileName)
 end
 
-function Skeleton:playAnimation(animName)
-	local retVal = Polycore.Skeleton_playAnimation(self.__ptr, animName)
+function Skeleton:playAnimation(animName, once)
+	local retVal = Polycore.Skeleton_playAnimation(self.__ptr, animName, once)
 end
 
-function Skeleton:playAnimationByIndex(index)
-	local retVal = Polycore.Skeleton_playAnimationByIndex(self.__ptr, index)
+function Skeleton:playAnimationByIndex(index, once)
+	local retVal = Polycore.Skeleton_playAnimationByIndex(self.__ptr, index, once)
 end
 
 function Skeleton:addAnimation(name, fileName)

+ 2 - 2
Bindings/Contents/LUA/API/Polycode/SkeletonAnimation.lua

@@ -29,8 +29,8 @@ function SkeletonAnimation:getName()
 	return retVal
 end
 
-function SkeletonAnimation:Play()
-	local retVal =  Polycore.SkeletonAnimation_Play(self.__ptr)
+function SkeletonAnimation:Play(once)
+	local retVal = Polycore.SkeletonAnimation_Play(self.__ptr, once)
 end
 
 function SkeletonAnimation:Stop()

+ 40 - 4
Bindings/Contents/LUA/Include/PolycodeLUAWrappers.h

@@ -4775,6 +4775,13 @@ static int Polycore_SceneParticleEmitter_getEmitter(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_SceneParticleEmitter_respawnSceneParticles(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	SceneParticleEmitter *inst = (SceneParticleEmitter*)lua_topointer(L, 1);
+	inst->respawnSceneParticles();
+	return 0;
+}
+
 static int Polycore_SceneParticleEmitter_addParticleBody(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	SceneParticleEmitter *inst = (SceneParticleEmitter*)lua_topointer(L, 1);
@@ -5038,6 +5045,15 @@ static int Polycore_ParticleEmitter_enablePerlin(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_ParticleEmitter_setParticleVisibility(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TBOOLEAN);
+	bool val = lua_toboolean(L, 2);
+	inst->setParticleVisibility(val);
+	return 0;
+}
+
 static int Polycore_ParticleEmitter_setPerlinModSize(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
@@ -9577,7 +9593,9 @@ static int Polycore_SkeletonAnimation_getName(lua_State *L) {
 static int Polycore_SkeletonAnimation_Play(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	SkeletonAnimation *inst = (SkeletonAnimation*)lua_topointer(L, 1);
-	inst->Play();
+	luaL_checktype(L, 2, LUA_TBOOLEAN);
+	bool once = lua_toboolean(L, 2);
+	inst->Play(once);
 	return 0;
 }
 
@@ -9701,7 +9719,13 @@ static int Polycore_BoneTrack(lua_State *L) {
 static int Polycore_BoneTrack_Play(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
-	inst->Play();
+	bool once;
+	if(lua_isboolean(L, 2)) {
+		once = lua_toboolean(L, 2);
+	} else {
+		once = false;
+	}
+	inst->Play(once);
 	return 0;
 }
 
@@ -9757,7 +9781,13 @@ static int Polycore_Skeleton_playAnimation(lua_State *L) {
 	Skeleton *inst = (Skeleton*)lua_topointer(L, 1);
 	luaL_checktype(L, 2, LUA_TSTRING);
 	String animName = String(lua_tostring(L, 2));
-	inst->playAnimation(animName);
+	bool once;
+	if(lua_isboolean(L, 3)) {
+		once = lua_toboolean(L, 3);
+	} else {
+		once = false;
+	}
+	inst->playAnimation(animName, once);
 	return 0;
 }
 
@@ -9766,7 +9796,13 @@ static int Polycore_Skeleton_playAnimationByIndex(lua_State *L) {
 	Skeleton *inst = (Skeleton*)lua_topointer(L, 1);
 	luaL_checktype(L, 2, LUA_TNUMBER);
 	int index = lua_tointeger(L, 2);
-	inst->playAnimationByIndex(index);
+	bool once;
+	if(lua_isboolean(L, 3)) {
+		once = lua_toboolean(L, 3);
+	} else {
+		once = false;
+	}
+	inst->playAnimationByIndex(index, once);
 	return 0;
 }
 

+ 2 - 0
Bindings/Contents/LUA/Source/PolycodeLUA.cpp

@@ -511,6 +511,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"delete_ScreenParticleEmitter", Polycore_delete_ScreenParticleEmitter},
 		{"SceneParticleEmitter", Polycore_SceneParticleEmitter},
 		{"SceneParticleEmitter_getEmitter", Polycore_SceneParticleEmitter_getEmitter},
+		{"SceneParticleEmitter_respawnSceneParticles", Polycore_SceneParticleEmitter_respawnSceneParticles},
 		{"SceneParticleEmitter_addParticleBody", Polycore_SceneParticleEmitter_addParticleBody},
 		{"SceneParticleEmitter_getBaseMatrix", Polycore_SceneParticleEmitter_getBaseMatrix},
 		{"SceneParticleEmitter_Update", Polycore_SceneParticleEmitter_Update},
@@ -543,6 +544,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"ParticleEmitter_setDepthTest", Polycore_ParticleEmitter_setDepthTest},
 		{"ParticleEmitter_setAlphaTest", Polycore_ParticleEmitter_setAlphaTest},
 		{"ParticleEmitter_enablePerlin", Polycore_ParticleEmitter_enablePerlin},
+		{"ParticleEmitter_setParticleVisibility", Polycore_ParticleEmitter_setParticleVisibility},
 		{"ParticleEmitter_setPerlinModSize", Polycore_ParticleEmitter_setPerlinModSize},
 		{"ParticleEmitter_setBillboardMode", Polycore_ParticleEmitter_setBillboardMode},
 		{"ParticleEmitter_enableEmitter", Polycore_ParticleEmitter_enableEmitter},

+ 6 - 0
Core/Contents/Include/PolyParticleEmitter.h

@@ -76,6 +76,11 @@ namespace Polycode {
 			*/ 														
 			void enablePerlin(bool val);
 			
+			/**
+			* Sets visibility of all particles in the system
+			*/
+			void setParticleVisibility(bool val);
+			
 			/**
 			* Enables perlin noise movement size.
 			*/ 														
@@ -254,6 +259,7 @@ namespace Polycode {
 		*/ 
 		ParticleEmitter *getEmitter() { return this; }
 		
+		void respawnSceneParticles();
 		void addParticleBody(Entity *particleBody);
 		Matrix4 getBaseMatrix();
 		void Update();

+ 5 - 4
Core/Contents/Include/PolySkeleton.h

@@ -42,7 +42,7 @@ namespace Polycode {
 		public:
 			BoneTrack(Bone *bone, Number length);
 			~BoneTrack();
-			void Play();
+			void Play(bool once=false);
 			void Stop();
 			void Update();
 		
@@ -111,7 +111,7 @@ namespace Polycode {
 			/**
 			* Plays the animation.
 			*/
-			void Play();			
+			void Play(bool once);			
 			/**
 			* Stops the animation.
 			*/			
@@ -155,10 +155,11 @@ namespace Polycode {
 			/**
 			* Play back a loaded animation.
 			* @param animName Name of animation to play.
+			* @param once If true, will only play the animation once.
 			*/
-			void playAnimation(String animName);
+			void playAnimation(String animName, bool once = false);
 						
-			void playAnimationByIndex(int index);		
+			void playAnimationByIndex(int index, bool once = false);		
 			
 			/**
 			* Loads in a new animation from a file and adds it to the skeleton.

+ 14 - 2
Core/Contents/Source/PolyGLRenderer.cpp

@@ -698,6 +698,7 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 		setTexture(NULL);
 		return;
 	}
+	
 
 	GLfloat data4[] = {material->diffuseColor.r, material->diffuseColor.g, material->diffuseColor.b, material->diffuseColor.a};					
 	glMaterialfv(GL_FRONT, GL_DIFFUSE, data4);
@@ -742,6 +743,16 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 }
 
 void OpenGLRenderer::clearShader() {
+
+	glDisable(GL_COLOR_MATERIAL);
+	glDisable(GL_LIGHTING);
+	glDisable(GL_FOG);
+	
+	for(int i=0; i < 4; i++)  {
+		glActiveTexture(GL_TEXTURE0+i);		
+		glDisable(GL_TEXTURE_2D);
+	}
+		
 	if(currentShaderModule) {
 		currentShaderModule->clearShader();
 		currentShaderModule = NULL;
@@ -750,6 +761,7 @@ void OpenGLRenderer::clearShader() {
 }
 
 void OpenGLRenderer::setTexture(Texture *texture) {
+
 	if(texture == NULL) {
 		glActiveTexture(GL_TEXTURE0);		
 		glDisable(GL_TEXTURE_2D);
@@ -757,9 +769,9 @@ void OpenGLRenderer::setTexture(Texture *texture) {
 	}
 	
 	if(renderMode == RENDER_MODE_NORMAL) {
-		glEnable (GL_TEXTURE_2D);
 		glActiveTexture(GL_TEXTURE0);	
-		
+		glEnable (GL_TEXTURE_2D);
+				
 		if(currentTexture != texture) {			
 			OpenGLTexture *glTexture = (OpenGLTexture*)texture;
 			glBindTexture (GL_TEXTURE_2D, glTexture->getTextureID());

+ 17 - 1
Core/Contents/Source/PolyParticleEmitter.cpp

@@ -38,6 +38,17 @@ SceneParticleEmitter::~SceneParticleEmitter() {
 	
 }
 
+void SceneParticleEmitter::respawnSceneParticles() {
+	for(int i=0; i < particles.size(); i++) {
+		Particle *particle = particles[i];
+		particleParentScene->removeEntity((SceneEntity*)particle->particleBody);
+		addParticleBody(particle->particleBody);
+		resetParticle(particle);				
+		particle->life = lifespan * ((Number)rand()/RAND_MAX);		
+	}
+	updateEmitter();
+}
+
 void SceneParticleEmitter::addParticleBody(Entity *particleBody) {
 	particleParentScene->addEntity((SceneEntity*)particleBody);	
 }
@@ -141,6 +152,11 @@ void ParticleEmitter::setRotationSpeed(Number speed) {
 	rotationSpeed = speed;
 }
 
+void ParticleEmitter::setParticleVisibility(bool val) {
+	for(int i=0;i < particles.size(); i++) {
+		particles[i]->particleBody->visible = val;
+	}
+}
 
 void ParticleEmitter::setParticleBlendingMode(int mode) {
 	for(int i=0;i < particles.size(); i++) {
@@ -233,7 +249,7 @@ bool ParticleEmitter::emitterEnabled() {
 }
 
 void ParticleEmitter::resetParticle(Particle *particle) {
-	particle->particleBody->visible = true;
+//	particle->particleBody->visible = true;
 	particle->lifespan  = lifespan;
 	Matrix4 concatMatrix = getBaseMatrix();
 	Vector3	startVector;

+ 5 - 0
Core/Contents/Source/PolySceneLabel.cpp

@@ -30,6 +30,11 @@ SceneLabel::SceneLabel(String fontName, String text, int size, Number scale, int
 	setText(text);
 	mesh = new Mesh(Mesh::QUAD_MESH);
 	mesh->createPlane(label->getWidth()*scale,label->getHeight()*scale);
+	
+	for(int i=0; i < mesh->getPolygonCount(); i++) {
+		mesh->getPolygon(i)->flipUVY();
+	}
+	mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
 }
 
 SceneLabel::~SceneLabel() {

+ 18 - 16
Core/Contents/Source/PolySkeleton.cpp

@@ -65,7 +65,7 @@ void Skeleton::enableBoneLabels(String labelFont, Number size, Number scale, Col
 	
 }
 
-void Skeleton::playAnimationByIndex(int index) {
+void Skeleton::playAnimationByIndex(int index, bool once) {
 	if(index > animations.size()-1)
 		return;
 		
@@ -73,29 +73,29 @@ void Skeleton::playAnimationByIndex(int index) {
 	if(!anim)
 		return;
 	
-	if(anim == currentAnimation)
+	if(anim == currentAnimation && !once)
 		return;
 	
 	if(currentAnimation)
 		currentAnimation->Stop();
 	
 	currentAnimation = anim;
-	anim->Play();	
+	anim->Play(once);	
 }
 
-void Skeleton::playAnimation(String animName) {
+void Skeleton::playAnimation(String animName, bool once) {
 	SkeletonAnimation *anim = getAnimation(animName);
 	if(!anim)
 		return;
 	
-	if(anim == currentAnimation)
+	if(anim == currentAnimation && !once)
 		return;
 	
 	if(currentAnimation)
 		currentAnimation->Stop();
 		
 	currentAnimation = anim;
-	anim->Play();
+	anim->Play(once);
 }
 
 SkeletonAnimation *Skeleton::getAnimation(String name) {
@@ -380,7 +380,7 @@ void BoneTrack::Stop() {
 	}
 }
 
-void BoneTrack::Play() {
+void BoneTrack::Play(bool once) {
 
 	if(!initialized ) {
 	// TODO: change it so that you can set the tweens to not manually restart so you can calculate the
@@ -390,34 +390,36 @@ void BoneTrack::Play() {
 					
 	BezierPathTween *testTween;		
 	if(LocX) {
-		testTween = new BezierPathTween(&LocXVec, LocX, Tween::EASE_NONE, durTime, true);
+		testTween = new BezierPathTween(&LocXVec, LocX, Tween::EASE_NONE, durTime, !once);
 		pathTweens.push_back(testTween);
 	}
 	if(LocY) {		
-		testTween = new BezierPathTween(&LocYVec, LocY, Tween::EASE_NONE, durTime, true);
+		testTween = new BezierPathTween(&LocYVec, LocY, Tween::EASE_NONE, durTime, !once);
 		pathTweens.push_back(testTween);
 	}
 		
 	if(LocZ) {
-		testTween = new BezierPathTween(&LocZVec, LocZ, Tween::EASE_NONE, durTime, true);
+		testTween = new BezierPathTween(&LocZVec, LocZ, Tween::EASE_NONE, durTime, !once);
 		pathTweens.push_back(testTween);
 	}
-	testTween = new BezierPathTween(&ScaleXVec, scaleX, Tween::EASE_NONE, durTime, true);
+	testTween = new BezierPathTween(&ScaleXVec, scaleX, Tween::EASE_NONE, durTime, !once);
 	pathTweens.push_back(testTween);
-	testTween = new BezierPathTween(&ScaleYVec, scaleY, Tween::EASE_NONE, durTime, true);
+	testTween = new BezierPathTween(&ScaleYVec, scaleY, Tween::EASE_NONE, durTime, !once);
 	pathTweens.push_back(testTween);
-	testTween = new BezierPathTween(&ScaleZVec, scaleZ, Tween::EASE_NONE, durTime, true);
+	testTween = new BezierPathTween(&ScaleZVec, scaleZ, Tween::EASE_NONE, durTime, !once);
 	pathTweens.push_back(testTween);
 		
 		
 	if(QuatW)
-		quatTween = new QuaternionTween(&boneQuat, QuatW, QuatX, QuatY, QuatZ, Tween::EASE_NONE, durTime, true);
+		quatTween = new QuaternionTween(&boneQuat, QuatW, QuatX, QuatY, QuatZ, Tween::EASE_NONE, durTime, !once);
 
 	initialized = true;
 	} else {
 		for(int i=0; i < pathTweens.size(); i++) {
+			pathTweens[i]->Reset();
 			pathTweens[i]->Pause(false);
 		}	
+		quatTween->Reset();
 		quatTween->Pause(false);
 	}
 /*
@@ -512,9 +514,9 @@ void SkeletonAnimation::Stop() {
 	}
 }
 
-void SkeletonAnimation::Play() {
+void SkeletonAnimation::Play(bool once) {
 	for(int i=0; i < boneTracks.size(); i++) {
-		boneTracks[i]->Play();
+		boneTracks[i]->Play(once);
 	}
 }
 

+ 1 - 1
Core/Contents/Source/PolyString.cpp

@@ -149,7 +149,7 @@ String String::toUpperCase() {
 
 String String::NumberToString(Number value) {
 	char temp[128];
-	sprintf(temp, "%f", value);
+	sprintf(temp, "%.2f", value);
 	return String(temp);
 }
 

+ 1 - 1
Core/Contents/Source/PolyTweenManager.cpp

@@ -47,7 +47,7 @@ void TweenManager::Update() {
 				tween = tweens[i];
 				tweens.erase(tweens.begin()+i);
 				tween->doOnComplete();
-				delete tween;
+//				delete tween;
 				return;
 			}
 		}

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

@@ -84,6 +84,10 @@ function PhysicsScene:addCharacterChild(newEntity, mass, friction, stepSize, gro
 	end
 end
 
+function PhysicsScene:removeCharacterChild(character)
+	local retVal = Physics3D.PhysicsScene_removeCharacterChild(self.__ptr, character.__ptr)
+end
+
 function PhysicsScene:addVehicleChild(newEntity, mass, friction, group)
 	local retVal = Physics3D.PhysicsScene_addVehicleChild(self.__ptr, newEntity.__ptr, mass, friction, group)
 	if retVal == nil then return nil end

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

@@ -449,6 +449,15 @@ static int Physics3D_PhysicsScene_addCharacterChild(lua_State *L) {
 	return 1;
 }
 
+static int Physics3D_PhysicsScene_removeCharacterChild(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	PhysicsScene *inst = (PhysicsScene*)lua_topointer(L, 1);
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	PhysicsCharacter * character = (PhysicsCharacter *)lua_topointer(L, 2);
+	inst->removeCharacterChild(character);
+	return 0;
+}
+
 static int Physics3D_PhysicsScene_addVehicleChild(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	PhysicsScene *inst = (PhysicsScene*)lua_topointer(L, 1);

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

@@ -37,6 +37,7 @@ CoreServices::setInstance(inst);
 		{"PhysicsScene_addPhysicsChild", Physics3D_PhysicsScene_addPhysicsChild},
 		{"PhysicsScene_trackPhysicsChild", Physics3D_PhysicsScene_trackPhysicsChild},
 		{"PhysicsScene_addCharacterChild", Physics3D_PhysicsScene_addCharacterChild},
+		{"PhysicsScene_removeCharacterChild", Physics3D_PhysicsScene_removeCharacterChild},
 		{"PhysicsScene_addVehicleChild", Physics3D_PhysicsScene_addVehicleChild},
 		{"delete_PhysicsScene", Physics3D_delete_PhysicsScene},
 		{"PhysicsSceneEntity_get_enabled", Physics3D_PhysicsSceneEntity_get_enabled},

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

@@ -58,7 +58,7 @@ namespace Polycode {
 		
 			btConvexShape *getConvexShape(){ return convexShape; }					
 			btCollisionShape *createCollisionShape(SceneEntity *entity, int type);		
-			btGhostObject *collisionObject;		
+			btCollisionObject *collisionObject;		
 			Vector3 lastPosition;
 		
 		/**

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

@@ -59,6 +59,7 @@ namespace Polycode {
 		PhysicsSceneEntity *trackPhysicsChild(SceneEntity *newEntity, int type=0, Number mass = 0.0f, Number friction=1, Number restitution=0, int group=1);		
 		
 		PhysicsCharacter *addCharacterChild(SceneEntity *newEntity, Number mass, Number friction, Number stepSize, int group  = 1);
+		void removeCharacterChild(PhysicsCharacter *character);
 		
 		PhysicsVehicle *addVehicleChild(SceneEntity *newEntity, Number mass, Number friction, int group  = 1);
 			//@}

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

@@ -154,6 +154,7 @@ RayTestResult CollisionScene::getFirstEntityInRay(const Vector3 &origin,  const
 	btCollisionWorld::ClosestRayResultCallback cb(fromVec, toVec);
 	world->rayTest (fromVec, toVec, cb);
 	
+	
 	if (cb.hasHit ()) {
 		CollisionSceneEntity *retEnt = getCollisionEntityByObject(cb.m_collisionObject);
 		if(retEnt) {
@@ -228,7 +229,7 @@ CollisionSceneEntity *CollisionScene::trackCollision(SceneEntity *newEntity, int
 //	if(type == CollisionSceneEntity::CHARACTER_CONTROLLER) {
 //		world->addCollisionObject(newCollisionEntity->collisionObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);		
 //	} else {
-		newCollisionEntity->collisionObject->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);
+//		newCollisionEntity->collisionObject->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);
 		world->addCollisionObject(newCollisionEntity->collisionObject, group);
 //	}
 	

+ 1 - 1
Modules/Contents/3DPhysics/Source/PolyCollisionSceneEntity.cpp

@@ -35,7 +35,7 @@ CollisionSceneEntity::CollisionSceneEntity(SceneEntity *entity, int type) {
 	btMatrix3x3 basisA;
 	basisA.setIdentity();
 	
-	collisionObject = new btGhostObject();
+	collisionObject = new btCollisionObject();
 	collisionObject->getWorldTransform().setBasis(basisA);
 	
 

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

@@ -44,9 +44,11 @@ void PhysicsScene::initPhysicsScene() {
 	btVector3 worldMax(100,100,100);
 	btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax);	
 	
-	physicsWorld = new btDiscreteDynamicsWorld(dispatcher,sweepBP,solver,collisionConfiguration);
+	btDbvtBroadphase *broadPhase = new btDbvtBroadphase();
 	
-	physicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
+	physicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadPhase,solver,collisionConfiguration);
+	
+//	physicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
 	physicsWorld->setGravity(btVector3(0,-10,0));
 	
 	
@@ -89,6 +91,26 @@ PhysicsCharacter *PhysicsScene::addCharacterChild(SceneEntity *newEntity,Number
 	
 }
 
+void PhysicsScene::removeCharacterChild(PhysicsCharacter *character) {
+	physicsWorld->removeAction(character->character);
+
+	physicsWorld->removeCollisionObject(character->ghostObject);
+
+
+		for(int i=0; i < physicsChildren.size(); i++) {
+			if(physicsChildren[i] == character) {
+				physicsChildren.erase(physicsChildren.begin()+i);
+			}
+		}
+		for(int i=0; i < collisionChildren.size(); i++) {
+			if(collisionChildren[i] == character) {
+				collisionChildren.erase(collisionChildren.begin()+i);
+			}
+		}		
+	
+}
+
+
 PhysicsVehicle *PhysicsScene::addVehicleChild(SceneEntity *newEntity, Number mass, Number friction, int group) {
 	addEntity(newEntity);		
 	
@@ -122,6 +144,7 @@ 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);
@@ -148,7 +171,8 @@ PhysicsSceneEntity *PhysicsScene::getPhysicsEntityBySceneEntity(SceneEntity *ent
 
 PhysicsSceneEntity *PhysicsScene::trackPhysicsChild(SceneEntity *newEntity, int type, Number mass, Number friction, Number restitution, int group) {
 	PhysicsSceneEntity *newPhysicsEntity = new PhysicsSceneEntity(newEntity, type, mass, friction,restitution);
-	physicsWorld->addRigidBody(newPhysicsEntity->rigidBody, group, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);	
+	physicsWorld->addRigidBody(newPhysicsEntity->rigidBody, group,  btBroadphaseProxy::AllFilter); //btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);	
+	world->addCollisionObject(newPhysicsEntity->collisionObject, group);	
 	//	newPhysicsEntity->rigidBody->setActivationState(ISLAND_SLEEPING);	
 	physicsChildren.push_back(newPhysicsEntity);
 	collisionChildren.push_back(newPhysicsEntity);	

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

@@ -224,7 +224,8 @@ void PhysicsSceneEntity::Update() {
 	
 	free(mat);
 		
-	sceneEntity->setTransformByMatrixPure(m);			
+	sceneEntity->setTransformByMatrixPure(m);	
+	CollisionSceneEntity::Update();		
 }
 
 SceneEntity *PhysicsSceneEntity::getSceneEntity() {