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

Mouse emulation with touch, point size and smoothness settings in SceneMeshes, fix for Tweens not updating correctly, memory leak fixes, misc tweaks

Ivan Safrin 12 лет назад
Родитель
Сommit
4bf7ff7347

+ 3 - 0
Core/Contents/Include/PolyCoreInput.h

@@ -164,6 +164,9 @@ namespace Polycode {
 		* If set to true, will fire touch events on mouse input.
 		* If set to true, will fire touch events on mouse input.
 		*/
 		*/
 		bool simulateTouchWithMouse;
 		bool simulateTouchWithMouse;
+		bool simulateMouseWithTouch;
+		
+		bool ignoreOffScreenTouch;
 		
 		
 		void clearInput();
 		void clearInput();
 		
 		

+ 3 - 1
Core/Contents/Include/PolyGLRenderer.h

@@ -158,7 +158,9 @@ namespace Polycode {
 
 
 		
 		
 		void setLineSize(Number lineSize);
 		void setLineSize(Number lineSize);
-		
+		void setPointSize(Number pointSize);
+		void setPointSmooth(bool val);
+				
 		void setVertexColor(Number r, Number g, Number b, Number a);
 		void setVertexColor(Number r, Number g, Number b, Number a);
 		
 		
 		void setBlendingMode(int blendingMode);
 		void setBlendingMode(int blendingMode);

+ 3 - 3
Core/Contents/Include/PolyRenderer.h

@@ -152,7 +152,9 @@ namespace Polycode {
 		
 		
 		virtual void setLineSmooth(bool val) = 0;
 		virtual void setLineSmooth(bool val) = 0;
 		virtual void setLineSize(Number lineSize) = 0;
 		virtual void setLineSize(Number lineSize) = 0;
-		
+		virtual void setPointSize(Number pointSize) = 0;
+		virtual void setPointSmooth(bool val) = 0;
+				
 		virtual void enableLighting(bool enable) = 0;
 		virtual void enableLighting(bool enable) = 0;
 			
 			
 		virtual void enableFog(bool enable) = 0;
 		virtual void enableFog(bool enable) = 0;
@@ -277,8 +279,6 @@ namespace Polycode {
 		static const int TEX_FILTERING_NEAREST = 0;
 		static const int TEX_FILTERING_NEAREST = 0;
 		static const int TEX_FILTERING_LINEAR = 1;
 		static const int TEX_FILTERING_LINEAR = 1;
 		
 		
-//		void addShadowMap(Texture *texture);
-//		vector<Texture*> getShadowMapTextures(){ return shadowMapTextures; };
 		
 		
 		virtual Vector3 Unproject(Number x, Number y) = 0;
 		virtual Vector3 Unproject(Number x, Number y) = 0;
 		
 		

+ 3 - 0
Core/Contents/Include/PolySceneMesh.h

@@ -159,6 +159,9 @@ namespace Polycode {
 			Number lineWidth;
 			Number lineWidth;
 			bool lineSmooth;
 			bool lineSmooth;
 			
 			
+			Number pointSize;
+			bool pointSmooth;
+			
 			/**
 			/**
 			* If true, will delete its Mesh upon destruction. (defaults to true)
 			* If true, will delete its Mesh upon destruction. (defaults to true)
 			*/ 
 			*/ 

+ 2 - 2
Core/Contents/Include/PolyTween.h

@@ -50,7 +50,7 @@ namespace Polycode {
 		Tween(Number *target, int easeType, Number startVal, Number endVal, Number time, bool repeat=false, bool deleteOnComplete=false, Number waitTime = 0.0);
 		Tween(Number *target, int easeType, Number startVal, Number endVal, Number time, bool repeat=false, bool deleteOnComplete=false, Number waitTime = 0.0);
 		virtual ~Tween();
 		virtual ~Tween();
 		
 		
-		void handleEvent(Event *event);
+		void updateTween(Number elapsed);
 		Number interpolateTween();
 		Number interpolateTween();
 		virtual void updateCustomTween() {}
 		virtual void updateCustomTween() {}
 		void doOnComplete();
 		void doOnComplete();
@@ -102,6 +102,7 @@ namespace Polycode {
 		*/
 		*/
 		void setSpeed(Number speed);
 		void setSpeed(Number speed);
 		
 		
+		bool paused;
 
 
 	protected:
 	protected:
 	
 	
@@ -116,7 +117,6 @@ namespace Polycode {
 		Number *targetVal;
 		Number *targetVal;
 		Number localTargetVal;
 		Number localTargetVal;
 		Number tweenTime;
 		Number tweenTime;
-		Timer *tweenTimer;
 	};
 	};
 	
 	
 	/**
 	/**

+ 4 - 2
Core/Contents/Include/PolyTweenManager.h

@@ -23,6 +23,7 @@ THE SOFTWARE.
 #pragma once
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
 #include <vector>
 #include <vector>
+#include "PolyCore.h"
 
 
 namespace Polycode {
 namespace Polycode {
 
 
@@ -33,10 +34,11 @@ namespace Polycode {
 			TweenManager();
 			TweenManager();
 			~TweenManager();
 			~TweenManager();
 			void addTween(Tween *tween);
 			void addTween(Tween *tween);
-			void removeTween(Tween *tween);	
-			void Update();
+			void Update(Number elapsed);
 		
 		
 		private:
 		private:
+			std::vector<Tween*> tweensToAdd;
 			std::vector <Tween*> tweens;
 			std::vector <Tween*> tweens;
+			
 	};
 	};
 }
 }

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

@@ -54,7 +54,7 @@ namespace Polycode {
 			* Default constructor.
 			* Default constructor.
 			*/ 
 			*/ 
 			Vector3();
 			Vector3();
-			~Vector3();
+			virtual ~Vector3();
 
 
 			/**
 			/**
 			* Sets the vector from x,y,z coordinates.
 			* Sets the vector from x,y,z coordinates.

+ 36 - 3
Core/Contents/Source/PolyCoreInput.cpp

@@ -22,6 +22,8 @@
 
 
 #include "PolyCoreInput.h"
 #include "PolyCoreInput.h"
 #include "PolyInputEvent.h"
 #include "PolyInputEvent.h"
+#include "PolyCoreServices.h"
+#include "PolyCore.h"
 
 
 namespace Polycode {
 namespace Polycode {
 	
 	
@@ -38,6 +40,8 @@ namespace Polycode {
 	CoreInput::CoreInput() : EventDispatcher() {
 	CoreInput::CoreInput() : EventDispatcher() {
 		clearInput();
 		clearInput();
 		simulateTouchWithMouse = false;
 		simulateTouchWithMouse = false;
+		simulateMouseWithTouch = false;
+		ignoreOffScreenTouch = false;
 	}
 	}
 	
 	
 	void CoreInput::clearInput() {
 	void CoreInput::clearInput() {
@@ -237,27 +241,56 @@ namespace Polycode {
 	}
 	}
 	
 	
 	void CoreInput::touchesBegan(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
 	void CoreInput::touchesBegan(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
+		if(ignoreOffScreenTouch) {
+			Core *core = CoreServices::getInstance()->getCore();
+			if(touch.position.x < 0 || touch.position.x > core->getXRes() || touch.position.y < 0 || touch.position.y > core->getYRes()) {
+				return;
+			}
+		}
 		InputEvent *evt = new InputEvent();
 		InputEvent *evt = new InputEvent();
 		evt->touch = touch;		
 		evt->touch = touch;		
 		evt->touches = touches;
 		evt->touches = touches;
 		evt->timestamp = ticks;
 		evt->timestamp = ticks;
 		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_BEGAN);
 		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_BEGAN);
+		if(simulateMouseWithTouch) {
+			mousePosition = touch.position;
+			setMouseButtonState(MOUSE_BUTTON1, true, ticks);
+		}
 	}
 	}
 	
 	
 	void CoreInput::touchesMoved(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
 	void CoreInput::touchesMoved(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
+		if(ignoreOffScreenTouch) {
+			Core *core = CoreServices::getInstance()->getCore();
+			if(touch.position.x < 0 || touch.position.x > core->getXRes() || touch.position.y < 0 || touch.position.y > core->getYRes()) {
+				return;
+			}
+		}	
 		InputEvent *evt = new InputEvent();
 		InputEvent *evt = new InputEvent();
 		evt->touch = touch;
 		evt->touch = touch;
 		evt->touches = touches;
 		evt->touches = touches;
 		evt->timestamp = ticks;		
 		evt->timestamp = ticks;		
-		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_MOVED);	
+		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_MOVED);
+		if(simulateMouseWithTouch) {
+			setMousePosition(touch.position.x, touch.position.y, ticks);
+		}
 	}
 	}
 	
 	
 	void CoreInput::touchesEnded(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
 	void CoreInput::touchesEnded(TouchInfo touch, std::vector<TouchInfo> touches, int ticks) {
+		if(ignoreOffScreenTouch) {
+			Core *core = CoreServices::getInstance()->getCore();
+			if(touch.position.x < 0 || touch.position.x > core->getXRes() || touch.position.y < 0 || touch.position.y > core->getYRes()) {
+				return;
+			}
+		}	
 		InputEvent *evt = new InputEvent();
 		InputEvent *evt = new InputEvent();
 		evt->touch = touch;		
 		evt->touch = touch;		
 		evt->touches = touches;
 		evt->touches = touches;
-		evt->timestamp = ticks;		
-		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_ENDED);	
+		evt->timestamp = ticks;	
+		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_ENDED);
+		if(simulateMouseWithTouch) {
+			mousePosition = touch.position;				
+			setMouseButtonState(MOUSE_BUTTON1, false, ticks);
+		}		
 	}
 	}
 	
 	
 }
 }

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

@@ -183,7 +183,7 @@ void CoreServices::Update(int elapsed) {
 	}
 	}
 	resourceManager->Update(elapsed);
 	resourceManager->Update(elapsed);
 	timerManager->Update();	
 	timerManager->Update();	
-	tweenManager->Update();	
+	tweenManager->Update(elapsed);	
 	materialManager->Update(elapsed);		
 	materialManager->Update(elapsed);		
 	sceneManager->Update();
 	sceneManager->Update();
 }
 }

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

@@ -182,6 +182,7 @@ void OpenGLRenderer::Resize(int xRes, int yRes) {
 	
 	
 	glLineWidth(1.0f);
 	glLineWidth(1.0f);
 	
 	
+	glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
 //	glEnable(GL_LINE_SMOOTH);
 //	glEnable(GL_LINE_SMOOTH);
 	
 	
 	GLint numBuffers;
 	GLint numBuffers;
@@ -210,6 +211,14 @@ void OpenGLRenderer::enableAlphaTest(bool val) {
 	}
 	}
 }
 }
 
 
+void OpenGLRenderer::setPointSmooth(bool val) {
+	if(val)
+		glEnable( GL_POINT_SMOOTH );
+	else
+		glDisable( GL_POINT_SMOOTH );
+
+}
+
 void OpenGLRenderer::setLineSmooth(bool val) {
 void OpenGLRenderer::setLineSmooth(bool val) {
 	if(val)
 	if(val)
 		glEnable(GL_LINE_SMOOTH);
 		glEnable(GL_LINE_SMOOTH);
@@ -303,7 +312,7 @@ Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, Matrix4 c
 	GLdouble _sceneProjectionMatrix[16];
 	GLdouble _sceneProjectionMatrix[16];
 	for(int i=0; i < 16; i++) {
 	for(int i=0; i < 16; i++) {
 		_sceneProjectionMatrix[i] = projectionMatrix.ml[i];
 		_sceneProjectionMatrix[i] = projectionMatrix.ml[i];
-	}	
+	}
 
 
 	gluUnProject(x, yRes - y, 0.0, mv, _sceneProjectionMatrix, vp, &nearPlane[0], &nearPlane[1], &nearPlane[2]);
 	gluUnProject(x, yRes - y, 0.0, mv, _sceneProjectionMatrix, vp, &nearPlane[0], &nearPlane[1], &nearPlane[2]);
 	gluUnProject(x, yRes - y, 1.0, mv, _sceneProjectionMatrix, vp, &farPlane[0], &farPlane[1], &farPlane[2]);
 	gluUnProject(x, yRes - y, 1.0, mv, _sceneProjectionMatrix, vp, &farPlane[0], &farPlane[1], &farPlane[2]);
@@ -348,6 +357,10 @@ void OpenGLRenderer::setLineSize(Number lineSize) {
 	glLineWidth(lineSize);
 	glLineWidth(lineSize);
 }
 }
 
 
+void OpenGLRenderer::setPointSize(Number pointSize) {
+	glPointSize(pointSize);
+}
+
 void OpenGLRenderer::createVertexBufferForMesh(Mesh *mesh) {
 void OpenGLRenderer::createVertexBufferForMesh(Mesh *mesh) {
 	OpenGLVertexBuffer *buffer = new OpenGLVertexBuffer(mesh);
 	OpenGLVertexBuffer *buffer = new OpenGLVertexBuffer(mesh);
 	mesh->setVertexBuffer(buffer);
 	mesh->setVertexBuffer(buffer);
@@ -846,7 +859,7 @@ void OpenGLRenderer::pushRenderDataArray(RenderDataArray *array) {
 	
 	
 	switch(array->arrayType) {
 	switch(array->arrayType) {
 		case RenderDataArray::VERTEX_DATA_ARRAY:
 		case RenderDataArray::VERTEX_DATA_ARRAY:
-			glEnableClientState(GL_VERTEX_ARRAY);			
+			glEnableClientState(GL_VERTEX_ARRAY);
 			glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0);
 			glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0);
 			glVertexPointer(array->size, GL_FLOAT, 0, array->arrayPtr);
 			glVertexPointer(array->size, GL_FLOAT, 0, array->arrayPtr);
 			verticesToDraw = array->count;
 			verticesToDraw = array->count;

+ 10 - 4
Core/Contents/Source/PolySceneMesh.cpp

@@ -55,6 +55,8 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), texture(NULL), material
 	ownsMesh = true;
 	ownsMesh = true;
 	ownsSkeleton = true;
 	ownsSkeleton = true;
 	lineWidth = 1.0;
 	lineWidth = 1.0;
+	pointSize = 1.0;
+	pointSmooth = false;
 }
 }
 
 
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
@@ -68,6 +70,8 @@ SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skel
 	ownsMesh = true;
 	ownsMesh = true;
 	ownsSkeleton = true;	
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	lineWidth = 1.0;
+	pointSize = 1.0;
+	pointSmooth = false;	
 		
 		
 }
 }
 
 
@@ -251,14 +255,14 @@ void SceneMesh::renderMeshLocally() {
 		mesh->arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;				
 		mesh->arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;				
 	}
 	}
 
 
-	if(mesh->useVertexColors) {
-		renderer->pushDataArrayForMesh(mesh, RenderDataArray::COLOR_DATA_ARRAY);
-	}
-	 
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::VERTEX_DATA_ARRAY);
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::VERTEX_DATA_ARRAY);
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::NORMAL_DATA_ARRAY);		
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::NORMAL_DATA_ARRAY);		
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TANGENT_DATA_ARRAY);			
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TANGENT_DATA_ARRAY);			
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TEXCOORD_DATA_ARRAY);	
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TEXCOORD_DATA_ARRAY);	
+
+	if(mesh->useVertexColors) {
+		renderer->pushDataArrayForMesh(mesh, RenderDataArray::COLOR_DATA_ARRAY);
+	}
 	
 	
 	renderer->drawArrays(mesh->getMeshType());
 	renderer->drawArrays(mesh->getMeshType());
 }
 }
@@ -277,6 +281,8 @@ void SceneMesh::Render() {
 	
 	
 	renderer->setLineSize(lineWidth);
 	renderer->setLineSize(lineWidth);
 	renderer->setLineSmooth(lineSmooth);
 	renderer->setLineSmooth(lineSmooth);
+	renderer->setPointSize(pointSize);
+	renderer->setPointSmooth(pointSmooth);
 	
 	
 	if(material) {
 	if(material) {
 		renderer->applyMaterial(material, localShaderOptions,0);
 		renderer->applyMaterial(material, localShaderOptions,0);

+ 8 - 11
Core/Contents/Source/PolyTween.cpp

@@ -45,16 +45,15 @@ Tween::	Tween(Number *target, int easeType, Number startVal, Number endVal, Numb
 	tweenTime = 0;
 	tweenTime = 0;
 	if(waitTime == 0.0)
 	if(waitTime == 0.0)
 		*targetVal = startVal;
 		*targetVal = startVal;
-	tweenTimer = new Timer(true, 1);
-	tweenTimer->addEventListener(this, 0);
 	complete = false;
 	complete = false;
-
+	paused = false;
+	
 	actEndTime = time;
 	actEndTime = time;
 	CoreServices::getInstance()->getTweenManager()->addTween(this);
 	CoreServices::getInstance()->getTweenManager()->addTween(this);
 }
 }
 
 
 void Tween::Pause(bool pauseVal) {
 void Tween::Pause(bool pauseVal) {
-	tweenTimer->Pause(pauseVal);
+	paused = true;
 }
 }
 
 
 void Tween::setSpeed(Number speed) {
 void Tween::setSpeed(Number speed) {
@@ -65,11 +64,6 @@ void Tween::setSpeed(Number speed) {
 }
 }
 
 
 Tween::~Tween() {
 Tween::~Tween() {
-	tweenTimer->removeEventListener(this, 0);
-	delete tweenTimer;
-	
-	deleteOnComplete = false; // Prevent loop when we removeTween in next line.
-	CoreServices::getInstance()->getTweenManager()->removeTween(this);
 }
 }
 
 
 bool Tween::isComplete() {
 bool Tween::isComplete() {
@@ -80,7 +74,10 @@ void Tween::doOnComplete() {
 	dispatchEvent(new Event(), Event::COMPLETE_EVENT);
 	dispatchEvent(new Event(), Event::COMPLETE_EVENT);
 }
 }
 
 
-void Tween::handleEvent(Event *event) {
+void Tween::updateTween(Number elapsed) {
+
+	tweenTime += elapsed;
+	
 	if(tweenTime >= endTime+waitTime) {
 	if(tweenTime >= endTime+waitTime) {
 		if(repeat){
 		if(repeat){
 			Reset();
 			Reset();
@@ -96,7 +93,6 @@ void Tween::handleEvent(Event *event) {
 		localTargetVal = interpolateTween();
 		localTargetVal = interpolateTween();
 		*targetVal = localTargetVal;
 		*targetVal = localTargetVal;
 	}
 	}
-	tweenTime += tweenTimer->getElapsedf();
 	updateCustomTween();
 	updateCustomTween();
 }
 }
 
 
@@ -229,6 +225,7 @@ BezierPathTween::BezierPathTween(Vector3 *target, BezierCurve *curve, int easeTy
 	this->curve = curve;
 	this->curve = curve;
 	this->target = target;
 	this->target = target;
 	pathValue = 0;
 	pathValue = 0;
+	updateCustomTween();
 }
 }
 
 
 void BezierPathTween::updateCustomTween() {
 void BezierPathTween::updateCustomTween() {

+ 30 - 25
Core/Contents/Source/PolyTweenManager.cpp

@@ -22,11 +22,11 @@
 
 
 #include "PolyTweenManager.h"
 #include "PolyTweenManager.h"
 #include "PolyTween.h"
 #include "PolyTween.h"
+#include "PolyCore.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
 TweenManager::TweenManager() {
 TweenManager::TweenManager() {
-
 }
 }
 
 
 TweenManager::~TweenManager() {
 TweenManager::~TweenManager() {
@@ -34,35 +34,40 @@ TweenManager::~TweenManager() {
 }
 }
 
 
 void TweenManager::addTween(Tween *tween) {
 void TweenManager::addTween(Tween *tween) {
-	tweens.push_back(tween);
+	tweensToAdd.push_back(tween);
 }
 }
 
 
-void TweenManager::removeTween(Tween *tween) {
-	for(int i=0;i<tweens.size();i++) {
-		if(tweens[i] == tween) {
-			tweens.erase(tweens.begin()+i);
-			if(tween->deleteOnComplete)
-				delete tween;
-			
-		}
-	}
-}
-
-void TweenManager::Update() {
-	Tween *tween;
-	for(int i=0;i<tweens.size();i++) {
-		if(tweens[i]->isComplete()) {
-			if(tweens[i]->repeat) {
-				tweens[i]->Reset();
-				return;
+void TweenManager::Update(Number elapsed) {
+	std::vector<Tween*>::iterator iter = tweens.begin();
+	while (iter != tweens.end()) {	
+		bool mustRemove = false;
+		
+		(*iter)->updateTween(elapsed/1000.0);
+		
+		if((*iter)->isComplete()) {
+			if((*iter)->repeat) {
+				(*iter)->Reset();
 			} else {
 			} else {
-				tween = tweens[i];
-				tweens.erase(tweens.begin()+i);
-				tween->doOnComplete();
-				if(tween->deleteOnComplete)
+				mustRemove = true;
+				(*iter)->doOnComplete();
+				
+				if((*iter)->deleteOnComplete) {
+					Tween *tween = (*iter);
 					delete tween;
 					delete tween;
-				return;
+				}
 			}
 			}
 		}
 		}
+		
+		if(mustRemove) {
+			iter = tweens.erase(iter);
+		} else {	
+			++iter;						
+		}
+	}
+	
+	for(int i=0; i < tweensToAdd.size(); i++) {
+		tweens.push_back(tweensToAdd[i]);
 	}
 	}
+	tweensToAdd.clear();
+	
 }
 }

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

@@ -48,7 +48,9 @@ namespace Polycode {
 			*  Public methods
 			*  Public methods
 			*/
 			*/
 			//@{			
 			//@{			
-				
+		
+		void wakeUp();		
+								
 		void setFriction(Number friction);		
 		void setFriction(Number friction);		
 		int getType() { return type; }	
 		int getType() { return type; }	
 		
 		

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

@@ -119,8 +119,8 @@ void PhysicsScene::processWorldCollisions() {
 		for (int j=0;j<numContacts;j++)
 		for (int j=0;j<numContacts;j++)
 		{
 		{
 			btManifoldPoint& pt = contactManifold->getContactPoint(j);
 			btManifoldPoint& pt = contactManifold->getContactPoint(j);
-			if (pt.getDistance()<0.f)
-			{
+		//	if (pt.getDistance()<0.f)
+		//	{
 				const btVector3& ptA = pt.getPositionWorldOnA();
 				const btVector3& ptA = pt.getPositionWorldOnA();
 				const btVector3& ptB = pt.getPositionWorldOnB();
 				const btVector3& ptB = pt.getPositionWorldOnB();
 				const btVector3& normalOnB = pt.m_normalWorldOnB;
 				const btVector3& normalOnB = pt.m_normalWorldOnB;
@@ -136,7 +136,7 @@ void PhysicsScene::processWorldCollisions() {
 				event->entityB = getPhysicsEntityByCollisionObject(obB);
 				event->entityB = getPhysicsEntityByCollisionObject(obB);
 												
 												
 				dispatchEvent(event, PhysicsSceneEvent::COLLISION_EVENT);
 				dispatchEvent(event, PhysicsSceneEvent::COLLISION_EVENT);
-			}
+		//	}
 		}
 		}
 	}
 	}
 
 

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

@@ -263,6 +263,10 @@ Vector3 PhysicsEntity::getSpin() {
 	return Vector3(retVec.getX(), retVec.getY(), retVec.getZ());
 	return Vector3(retVec.getX(), retVec.getY(), retVec.getZ());
 }
 }
 
 
+void PhysicsEntity::wakeUp() {
+	rigidBody->setActivationState(DISABLE_DEACTIVATION);
+}
+
 void PhysicsEntity::applyImpulse(Vector3 direction, Vector3 point) {
 void PhysicsEntity::applyImpulse(Vector3 direction, Vector3 point) {
 	btVector3 imp = btVector3(direction.x, direction.y, direction.z);
 	btVector3 imp = btVector3(direction.x, direction.y, direction.z);
 	btVector3 pos = btVector3(point.x, point.y, point.z);
 	btVector3 pos = btVector3(point.x, point.y, point.z);

+ 2 - 1
Modules/Contents/UI/Include/PolyUIElement.h

@@ -53,7 +53,8 @@ namespace Polycode {
 			void focusChild(UIElement *child);
 			void focusChild(UIElement *child);
 			void focusNextChild();
 			void focusNextChild();
 			bool isFocusable();
 			bool isFocusable();
-			
+			void focusSelf();
+									
 			virtual void onLoseFocus() {}
 			virtual void onLoseFocus() {}
 			virtual void onGainFocus() {}
 			virtual void onGainFocus() {}
 			
 			

+ 12 - 0
Modules/Contents/UI/Source/PolyUIElement.cpp

@@ -162,6 +162,18 @@ void UIElement::focusNextChild() {
 	}
 	}
 }
 }
 
 
+void UIElement::focusSelf() {
+	if(UIElement::globalFocusedChild) {
+		UIElement::globalFocusedChild->onLoseFocus();
+		UIElement::globalFocusedChild->hasFocus = false;
+	}
+
+	UIElement::globalFocusedChild = this;
+	
+	onGainFocus();
+	hasFocus = true;
+}
+
 void UIElement::focusChild(UIElement *child) {
 void UIElement::focusChild(UIElement *child) {
 
 
 	if(UIElement::globalFocusedChild) {
 	if(UIElement::globalFocusedChild) {

+ 1 - 5
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -2523,11 +2523,7 @@ void UITextInput::handleEvent(Event *event) {
 						return;						
 						return;						
 					}
 					}
 				} else {
 				} else {
-					if(focusParent) {
-						focusParent->focusChild(this);
-					} else {
-						hasFocus = true;
-					}
+					focusSelf();
 					setCaretToMouse(((InputEvent*)event)->mousePosition.x, ((InputEvent*)event)->mousePosition.y - linesContainer->getPosition().y);
 					setCaretToMouse(((InputEvent*)event)->mousePosition.x, ((InputEvent*)event)->mousePosition.y - linesContainer->getPosition().y);
 					selectionDragMouse = ((InputEvent*)event)->mousePosition;				
 					selectionDragMouse = ((InputEvent*)event)->mousePosition;				
 					dragMouseStart = ((InputEvent*)event)->mousePosition;
 					dragMouseStart = ((InputEvent*)event)->mousePosition;