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

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.
 		*/
 		bool simulateTouchWithMouse;
+		bool simulateMouseWithTouch;
+		
+		bool ignoreOffScreenTouch;
 		
 		void clearInput();
 		

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

@@ -158,7 +158,9 @@ namespace Polycode {
 
 		
 		void setLineSize(Number lineSize);
-		
+		void setPointSize(Number pointSize);
+		void setPointSmooth(bool val);
+				
 		void setVertexColor(Number r, Number g, Number b, Number a);
 		
 		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 setLineSize(Number lineSize) = 0;
-		
+		virtual void setPointSize(Number pointSize) = 0;
+		virtual void setPointSmooth(bool val) = 0;
+				
 		virtual void enableLighting(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_LINEAR = 1;
 		
-//		void addShadowMap(Texture *texture);
-//		vector<Texture*> getShadowMapTextures(){ return shadowMapTextures; };
 		
 		virtual Vector3 Unproject(Number x, Number y) = 0;
 		

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

@@ -159,6 +159,9 @@ namespace Polycode {
 			Number lineWidth;
 			bool lineSmooth;
 			
+			Number pointSize;
+			bool pointSmooth;
+			
 			/**
 			* 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);
 		virtual ~Tween();
 		
-		void handleEvent(Event *event);
+		void updateTween(Number elapsed);
 		Number interpolateTween();
 		virtual void updateCustomTween() {}
 		void doOnComplete();
@@ -102,6 +102,7 @@ namespace Polycode {
 		*/
 		void setSpeed(Number speed);
 		
+		bool paused;
 
 	protected:
 	
@@ -116,7 +117,6 @@ namespace Polycode {
 		Number *targetVal;
 		Number localTargetVal;
 		Number tweenTime;
-		Timer *tweenTimer;
 	};
 	
 	/**

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

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

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

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

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

@@ -22,6 +22,8 @@
 
 #include "PolyCoreInput.h"
 #include "PolyInputEvent.h"
+#include "PolyCoreServices.h"
+#include "PolyCore.h"
 
 namespace Polycode {
 	
@@ -38,6 +40,8 @@ namespace Polycode {
 	CoreInput::CoreInput() : EventDispatcher() {
 		clearInput();
 		simulateTouchWithMouse = false;
+		simulateMouseWithTouch = false;
+		ignoreOffScreenTouch = false;
 	}
 	
 	void CoreInput::clearInput() {
@@ -237,27 +241,56 @@ namespace Polycode {
 	}
 	
 	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();
 		evt->touch = touch;		
 		evt->touches = touches;
 		evt->timestamp = ticks;
 		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) {
+		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();
 		evt->touch = touch;
 		evt->touches = touches;
 		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) {
+		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();
 		evt->touch = touch;		
 		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);
 	timerManager->Update();	
-	tweenManager->Update();	
+	tweenManager->Update(elapsed);	
 	materialManager->Update(elapsed);		
 	sceneManager->Update();
 }

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

@@ -182,6 +182,7 @@ void OpenGLRenderer::Resize(int xRes, int yRes) {
 	
 	glLineWidth(1.0f);
 	
+	glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
 //	glEnable(GL_LINE_SMOOTH);
 	
 	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) {
 	if(val)
 		glEnable(GL_LINE_SMOOTH);
@@ -303,7 +312,7 @@ Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, Matrix4 c
 	GLdouble _sceneProjectionMatrix[16];
 	for(int i=0; i < 16; 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, 1.0, mv, _sceneProjectionMatrix, vp, &farPlane[0], &farPlane[1], &farPlane[2]);
@@ -348,6 +357,10 @@ void OpenGLRenderer::setLineSize(Number lineSize) {
 	glLineWidth(lineSize);
 }
 
+void OpenGLRenderer::setPointSize(Number pointSize) {
+	glPointSize(pointSize);
+}
+
 void OpenGLRenderer::createVertexBufferForMesh(Mesh *mesh) {
 	OpenGLVertexBuffer *buffer = new OpenGLVertexBuffer(mesh);
 	mesh->setVertexBuffer(buffer);
@@ -846,7 +859,7 @@ void OpenGLRenderer::pushRenderDataArray(RenderDataArray *array) {
 	
 	switch(array->arrayType) {
 		case RenderDataArray::VERTEX_DATA_ARRAY:
-			glEnableClientState(GL_VERTEX_ARRAY);			
+			glEnableClientState(GL_VERTEX_ARRAY);
 			glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0);
 			glVertexPointer(array->size, GL_FLOAT, 0, array->arrayPtr);
 			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;
 	ownsSkeleton = true;
 	lineWidth = 1.0;
+	pointSize = 1.0;
+	pointSmooth = false;
 }
 
 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;
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
+	pointSize = 1.0;
+	pointSmooth = false;	
 		
 }
 
@@ -251,14 +255,14 @@ void SceneMesh::renderMeshLocally() {
 		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::NORMAL_DATA_ARRAY);		
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TANGENT_DATA_ARRAY);			
 	renderer->pushDataArrayForMesh(mesh, RenderDataArray::TEXCOORD_DATA_ARRAY);	
+
+	if(mesh->useVertexColors) {
+		renderer->pushDataArrayForMesh(mesh, RenderDataArray::COLOR_DATA_ARRAY);
+	}
 	
 	renderer->drawArrays(mesh->getMeshType());
 }
@@ -277,6 +281,8 @@ void SceneMesh::Render() {
 	
 	renderer->setLineSize(lineWidth);
 	renderer->setLineSmooth(lineSmooth);
+	renderer->setPointSize(pointSize);
+	renderer->setPointSmooth(pointSmooth);
 	
 	if(material) {
 		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;
 	if(waitTime == 0.0)
 		*targetVal = startVal;
-	tweenTimer = new Timer(true, 1);
-	tweenTimer->addEventListener(this, 0);
 	complete = false;
-
+	paused = false;
+	
 	actEndTime = time;
 	CoreServices::getInstance()->getTweenManager()->addTween(this);
 }
 
 void Tween::Pause(bool pauseVal) {
-	tweenTimer->Pause(pauseVal);
+	paused = true;
 }
 
 void Tween::setSpeed(Number speed) {
@@ -65,11 +64,6 @@ void Tween::setSpeed(Number speed) {
 }
 
 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() {
@@ -80,7 +74,10 @@ void Tween::doOnComplete() {
 	dispatchEvent(new Event(), Event::COMPLETE_EVENT);
 }
 
-void Tween::handleEvent(Event *event) {
+void Tween::updateTween(Number elapsed) {
+
+	tweenTime += elapsed;
+	
 	if(tweenTime >= endTime+waitTime) {
 		if(repeat){
 			Reset();
@@ -96,7 +93,6 @@ void Tween::handleEvent(Event *event) {
 		localTargetVal = interpolateTween();
 		*targetVal = localTargetVal;
 	}
-	tweenTime += tweenTimer->getElapsedf();
 	updateCustomTween();
 }
 
@@ -229,6 +225,7 @@ BezierPathTween::BezierPathTween(Vector3 *target, BezierCurve *curve, int easeTy
 	this->curve = curve;
 	this->target = target;
 	pathValue = 0;
+	updateCustomTween();
 }
 
 void BezierPathTween::updateCustomTween() {

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

@@ -22,11 +22,11 @@
 
 #include "PolyTweenManager.h"
 #include "PolyTween.h"
+#include "PolyCore.h"
 
 using namespace Polycode;
 
 TweenManager::TweenManager() {
-
 }
 
 TweenManager::~TweenManager() {
@@ -34,35 +34,40 @@ TweenManager::~TweenManager() {
 }
 
 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 {
-				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;
-				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
 			*/
 			//@{			
-				
+		
+		void wakeUp();		
+								
 		void setFriction(Number friction);		
 		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++)
 		{
 			btManifoldPoint& pt = contactManifold->getContactPoint(j);
-			if (pt.getDistance()<0.f)
-			{
+		//	if (pt.getDistance()<0.f)
+		//	{
 				const btVector3& ptA = pt.getPositionWorldOnA();
 				const btVector3& ptB = pt.getPositionWorldOnB();
 				const btVector3& normalOnB = pt.m_normalWorldOnB;
@@ -136,7 +136,7 @@ void PhysicsScene::processWorldCollisions() {
 				event->entityB = getPhysicsEntityByCollisionObject(obB);
 												
 				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());
 }
 
+void PhysicsEntity::wakeUp() {
+	rigidBody->setActivationState(DISABLE_DEACTIVATION);
+}
+
 void PhysicsEntity::applyImpulse(Vector3 direction, Vector3 point) {
 	btVector3 imp = btVector3(direction.x, direction.y, direction.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 focusNextChild();
 			bool isFocusable();
-			
+			void focusSelf();
+									
 			virtual void onLoseFocus() {}
 			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) {
 
 	if(UIElement::globalFocusedChild) {

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

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