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

Timestamps for touch events and touch events for screen entities

Ivan Safrin 13 лет назад
Родитель
Сommit
49c310406f

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

@@ -108,9 +108,9 @@ namespace Polycode {
 		void setKeyState(PolyKEY keyCode, wchar_t code, bool newState, int ticks);
 		void setDeltaPosition(int x, int y);
 		
-		void touchesBegan(std::vector<TouchInfo> touches);
-		void touchesMoved(std::vector<TouchInfo> touches);
-		void touchesEnded(std::vector<TouchInfo> touches);
+		void touchesBegan(std::vector<TouchInfo> touches, int ticks);
+		void touchesMoved(std::vector<TouchInfo> touches, int ticks);
+		void touchesEnded(std::vector<TouchInfo> touches, int ticks);
 				
 		static InputEvent *createEvent(Event *event){ return (InputEvent*)event; }
 		

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

@@ -146,6 +146,11 @@ namespace Polycode {
 		*/					
 		Material *getScreenShaderMaterial() const { return filterShaderMaterial; }
 		
+		/**
+		* If set to true, will process touch events as mouse clicks. Defaults to false.
+		*/		
+		bool processTouchEventsAsMouse;
+		
 	protected:
 		
 		bool useNormalizedCoordinates;

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

@@ -183,21 +183,24 @@ namespace Polycode {
 		}
 	}
 	
-	void CoreInput::touchesBegan(std::vector<TouchInfo> touches) {
+	void CoreInput::touchesBegan(std::vector<TouchInfo> touches, int ticks) {
 		InputEvent *evt = new InputEvent();
 		evt->touches = touches;
+		evt->timestamp = ticks;
 		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_BEGAN);
 	}
 	
-	void CoreInput::touchesMoved(std::vector<TouchInfo> touches) {
+	void CoreInput::touchesMoved(std::vector<TouchInfo> touches, int ticks) {
 		InputEvent *evt = new InputEvent();
 		evt->touches = touches;
+		evt->timestamp = ticks;		
 		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_MOVED);	
 	}
 	
-	void CoreInput::touchesEnded(std::vector<TouchInfo> touches) {
+	void CoreInput::touchesEnded(std::vector<TouchInfo> touches, int ticks) {
 		InputEvent *evt = new InputEvent();
 		evt->touches = touches;
+		evt->timestamp = ticks;		
 		dispatchEvent(evt, InputEvent::EVENT_TOUCHES_ENDED);	
 	}
 	

+ 16 - 0
Core/Contents/Source/PolyCoreServices.cpp

@@ -124,6 +124,9 @@ CoreServices::CoreServices() : EventDispatcher() {
 	addEventListener(screenManager, InputEvent::EVENT_MOUSEWHEEL_DOWN);	
 	addEventListener(screenManager, InputEvent::EVENT_KEYDOWN);
 	addEventListener(screenManager, InputEvent::EVENT_KEYUP);	
+	addEventListener(screenManager, InputEvent::EVENT_TOUCHES_BEGAN);	
+	addEventListener(screenManager, InputEvent::EVENT_TOUCHES_ENDED);	
+	addEventListener(screenManager, InputEvent::EVENT_TOUCHES_MOVED);				
 	sceneManager = new SceneManager();
 	timerManager = new TimerManager();
 	tweenManager = new TweenManager();
@@ -154,6 +157,9 @@ void CoreServices::setCore(Core *core) {
 	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_UP);		
 	core->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
 	core->getInput()->addEventListener(this, InputEvent::EVENT_KEYUP);
+	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_BEGAN);
+	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_ENDED);
+	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_MOVED);		
 }
 
 void CoreServices::handleEvent(Event *event) {
@@ -164,6 +170,16 @@ void CoreServices::handleEvent(Event *event) {
 			case InputEvent::EVENT_KEYUP:
 				dispatchEvent(new InputEvent(inputEvent->key, inputEvent->charCode, inputEvent->timestamp), inputEvent->getEventCode());			
 			break;
+			case InputEvent::EVENT_TOUCHES_BEGAN:
+			case InputEvent::EVENT_TOUCHES_ENDED:
+			case InputEvent::EVENT_TOUCHES_MOVED:						
+			{
+				InputEvent *event = new InputEvent();
+				event->touches = inputEvent->touches;
+				event->timestamp = inputEvent->timestamp;
+				dispatchEvent(event, inputEvent->getEventCode());
+			}
+			break;
 			default:
 				InputEvent *_inputEvent = new InputEvent(inputEvent->mousePosition, inputEvent->timestamp);
 				_inputEvent->mouseButton = inputEvent->mouseButton;

+ 9 - 0
Core/Contents/Source/PolyScreen.cpp

@@ -46,6 +46,7 @@ Screen::Screen() : EventDispatcher() {
 	useNormalizedCoordinates = false;
 	rootEntity = new ScreenEntity();
 	addChild(rootEntity);
+	processTouchEventsAsMouse = false;
 }
 
 Screen::~Screen() {
@@ -64,6 +65,14 @@ void Screen::handleInputEvent(InputEvent *inputEvent) {
 	
 	for(int i=children.size()-1; i >= 0; i--) {
 		switch(inputEvent->getEventCode()) {
+		
+			case InputEvent::EVENT_TOUCHES_BEGAN:
+				if(processTouchEventsAsMouse) {
+					for(int j=0; j < inputEvent->touches.size(); j++) {
+						children[i]->_onMouseDown(inputEvent->touches[j].position.x-offset.x, inputEvent->touches[j].position.y-offset.y, CoreInput::MOUSE_BUTTON1, inputEvent->timestamp);
+					}
+				}
+			break;
 			case InputEvent::EVENT_MOUSEDOWN:
 				if(children[i]->_onMouseDown(inputEvent->mousePosition.x-offset.x, inputEvent->mousePosition.y-offset.y, inputEvent->mouseButton, inputEvent->timestamp) &&
 				children[i]->blockMouseInput)

+ 7 - 5
Modules/Contents/TUIO/Source/TUIOInputModule.cpp

@@ -100,21 +100,23 @@ void TUIOInputModule::refresh(TuioTime frameTime) {
 
 void TUIOInputModule::Update(Number elapsed) {
 
+	Core *core = CoreServices::getInstance()->getCore();
+
 	CoreServices::getInstance()->getCore()->lockMutex(eventMutex);
 	for(int i=0; i < events.size(); i++) {
 		for(int j=0; j < events[i].touches.size(); j++) {
-			events[i].touches[j].position.x = events[i].touches[j].position.x * CoreServices::getInstance()->getCore()->getXRes();
-			events[i].touches[j].position.y = events[i].touches[j].position.y * CoreServices::getInstance()->getCore()->getYRes();			
+			events[i].touches[j].position.x = events[i].touches[j].position.x * core->getXRes();
+			events[i].touches[j].position.y = events[i].touches[j].position.y * core->getYRes();			
 		}
 		switch(events[i].type) {
 			case InputEvent::EVENT_TOUCHES_BEGAN:
-				CoreServices::getInstance()->getCore()->getInput()->touchesBegan(events[i].touches);
+				CoreServices::getInstance()->getCore()->getInput()->touchesBegan(events[i].touches, core->getTicks());
 			break;
 			case InputEvent::EVENT_TOUCHES_MOVED:
-				CoreServices::getInstance()->getCore()->getInput()->touchesMoved(events[i].touches);
+				CoreServices::getInstance()->getCore()->getInput()->touchesMoved(events[i].touches, core->getTicks());
 			break;
 			case InputEvent::EVENT_TOUCHES_ENDED:
-				CoreServices::getInstance()->getCore()->getInput()->touchesEnded(events[i].touches);			
+				CoreServices::getInstance()->getCore()->getInput()->touchesEnded(events[i].touches, core->getTicks());			
 			break;			
 		}
 	}