diff options
Diffstat (limited to 'Runtime/Input/SimulateInputEvents.cpp')
| -rw-r--r-- | Runtime/Input/SimulateInputEvents.cpp | 222 | 
1 files changed, 222 insertions, 0 deletions
diff --git a/Runtime/Input/SimulateInputEvents.cpp b/Runtime/Input/SimulateInputEvents.cpp new file mode 100644 index 0000000..4802477 --- /dev/null +++ b/Runtime/Input/SimulateInputEvents.cpp @@ -0,0 +1,222 @@ +#include "UnityPrefix.h" +#include "SimulateInputEvents.h" +#include "GetInput.h" +#include "Runtime/Graphics/ScreenManager.h" +#include "InputManager.h" +#include "Runtime/IMGUI/GUIManager.h" +#include <math.h> + +#if UNITY_EDITOR && UNITY_OSX +#include "Editor/Src/RemoteInput/iPhoneRemoteImpl.h" +#endif + +#if UNITY_EDITOR +#include "Editor/Src/RemoteInput/AndroidRemote.h" +#endif + +#ifndef MAXFLOAT +	#define	MAXFLOAT	((float)3.40282346638528860e+38) +#endif + +void CaptureEventMousePosition (InputEvent& e) +{ +	e.Init(); + +	Vector2f p = GetInputManager().GetMousePosition(); + +#if ENABLE_NEW_EVENT_SYSTEM +	e.touch.pos = p; +	e.touch.pos.y = GetScreenManager().GetHeight() - p.y; +	e.touch.deltaPos = GetInputManager().GetMouseDelta(); +#else +	e.mousePosition = p; +	e.mousePosition.y = GetScreenManager().GetHeight() - e.mousePosition.y; +	Vector3f d = GetInputManager().GetMouseDelta(); +	e.delta = Vector2f(d.x, d.y); +#endif +	e.pressure = 1.0f; + +    e.clickCount = 1; + +    size_t touchCount = GetActiveTouchCount(); + +	for (int i = 0; i < touchCount; ++i) +	{ +#if ENABLE_NEW_EVENT_SYSTEM +		Touch* touch = GetTouch(i); + +		if (touch != NULL) +        { +			if (touch->tapCount > e.clickCount) +            { +                e.clickCount = touch->tapCount; +            } +        } +#else +		Touch touch; + +		if (GetTouch(i, touch)) +		{ +			if (touch.tapCount > e.clickCount) +			{ +				e.clickCount = touch.tapCount; +			} +		} +#endif +	} +} + +// send event on button down/up +void GenerateAndSendInputDownUpEvent( const InputEvent::MouseButton button, const bool isDown ) +{ +	InputEvent ie; +	CaptureEventMousePosition (ie); +	ie.button = button; +	ie.type = isDown ? InputEvent::kMouseDown : InputEvent::kMouseUp; +#if UNITY_METRO +	ie.touchType = InputEvent::kFingerTouch; +#endif +	GetGUIManager().QueueEvent (ie); +	// If the touch has ended we need to "disable" the mouse hover state, by moving the mouse pointer "away" +	if (!isDown) +	{ +		ie.Init(); +		ie.type = InputEvent::kMouseUp; +#if ENABLE_NEW_EVENT_SYSTEM +		ie.touch.pos = Vector2f(MAXFLOAT,MAXFLOAT); +#else +		ie.mousePosition = Vector2f(MAXFLOAT,MAXFLOAT); +#endif +		GetGUIManager().QueueEvent (ie); +	} +} + +void RestoreMouseState( const Vector2f& mousePosition ) +{ +	enum { MaxSimulatedMouseButtons = 3 }; +	GetInputManager().SetMousePosition(mousePosition); +	if (GetActiveTouchCount() > 0) +	{ +		for (int i = 0; i < MaxSimulatedMouseButtons; ++i) +			GetInputManager().SetMouseButton(i, false); +		GetInputManager().InputEndFrame(); +	} +} + +void SimulateMouseInput() +{ +	enum { MaxSimulatedMouseButtons = 3 }; +	static size_t prevTouchPointCount = 0; + +#if UNITY_WINRT +	Vector2f originalPos = GetInputManager().GetMousePosition(); +#endif + +	for (int i = 0; i < MaxSimulatedMouseButtons; ++i) +	{ +		if (i < GetActiveTouchCount()) +			GetInputManager().SetMouseButton(i, true); +		else if (i < prevTouchPointCount) +			GetInputManager().SetMouseButton(i, false); +	} + +	prevTouchPointCount = GetActiveTouchCount(); + +	size_t touchCount = GetTouchCount(); +	Vector2f pos(0.0f, 0.0f); +	static Vector2f prevPos(0.0f, 0.0f); + +	for (int i = 0; i < GetTouchCount(); ++i) +	{ +#if ENABLE_NEW_EVENT_SYSTEM +		Touch* touch = GetTouch(i); +		if (touch != NULL) +			pos += touch->pos; +#else +		Touch touch; +		if (GetTouch(i, touch)) +			pos += touch.pos; +#endif +	} + +	if (touchCount > 0) +	{ +		float invCount = 1.0f / (float)touchCount; +		pos.x *= invCount; +		pos.y *= invCount; + +		GetInputManager().SetMousePosition(pos); +#if ENABLE_NEW_EVENT_SYSTEM +		GetInputManager().SetMouseDelta(Vector2f(pos.x - prevPos.x, pos.y - prevPos.y)); +#else +		GetInputManager().SetMouseDelta(Vector3f(pos.x - prevPos.x, +		                                         pos.y - prevPos.y, 0.0f)); +#endif +		prevPos = pos; +	} +	 +#if UNITY_IPHONE || UNITY_ANDROID || UNITY_WINRT || UNITY_BB10 || UNITY_TIZEN +	SimulateInputEvents (); + +#elif UNITY_EDITOR +	if ( +#if UNITY_OSX +		iPhoneHasRemoteConnected () || +#endif +		AndroidHasRemoteConnected()) +	{ +		SimulateInputEvents(); +	} +#endif + +#if UNITY_WINRT +	if (!GetInputManager().GetSimulateMouseWithTouches()) +		RestoreMouseState(originalPos); +#endif +} + +void SimulateInputEvents() +{ +	InputEvent ie; + +	static bool lastMouseB0 = false; +	static bool lastMouseB1 = false; + +	if (SqrMagnitude(GetInputManager().GetMouseDelta()) > 1e-6) +	{ +		CaptureEventMousePosition (ie); +		ie.type = InputEvent::kMouseMove; +		ie.button = 0; +#if UNITY_METRO +		ie.touchType = InputEvent::kFingerTouch; +#endif + +		if (GetInputManager().GetMouseButton(0) && lastMouseB0) +		{ +			ie.type = InputEvent::kMouseDrag; +			ie.button |= InputEvent::kLeftButton; +		} +		if (GetInputManager().GetMouseButton(1) && lastMouseB1) +		{ +			ie.type = InputEvent::kMouseDrag; +			ie.button |= InputEvent::kRightButton; +		} + +		GetGUIManager().QueueEvent (ie); +	} + +	bool buttonDown = GetInputManager().GetMouseButton(0); +	if (buttonDown != lastMouseB0) +	{ +		GenerateAndSendInputDownUpEvent( InputEvent::kLeftButton, buttonDown ); +		lastMouseB0 = buttonDown; +	} + +	buttonDown = GetInputManager().GetMouseButton(1); +	if (buttonDown != lastMouseB1) +	{ +		GenerateAndSendInputDownUpEvent( InputEvent::kRightButton, buttonDown ); +		lastMouseB1 = buttonDown; +	} +} +  | 
