Share the simulateMouse with android and iOS

This commit is contained in:
Benau 2019-07-14 00:43:38 +08:00
parent f9c2e40f13
commit 1f826b5ba7
5 changed files with 92 additions and 47 deletions

View File

@ -70,7 +70,6 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param)
AccelerometerActive(false),
GyroscopeActive(false),
HasTouchDevice(false),
IsMousePressed(false),
GamepadAxisX(0),
GamepadAxisY(0),
DefaultOrientation(ORIENTATION_UNKNOWN)
@ -637,44 +636,8 @@ s32 CIrrDeviceAndroid::handleTouch(AInputEvent* androidEvent)
// Simulate mouse event for first finger on multitouch device.
// This allows to click on GUI elements.
if (simulate_mouse)
{
CursorControl->setPosition(mouse_pos);
simulateMouse(event, mouse_pos);
SEvent irrevent;
bool send_event = true;
switch (event.TouchInput.Event)
{
case ETIE_PRESSED_DOWN:
irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
IsMousePressed = true;
break;
case ETIE_LEFT_UP:
irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
IsMousePressed = false;
break;
case ETIE_MOVED:
irrevent.MouseInput.Event = EMIE_MOUSE_MOVED;
break;
default:
send_event = false;
break;
}
if (send_event)
{
irrevent.MouseInput.Control = false;
irrevent.MouseInput.Shift = false;
irrevent.MouseInput.ButtonStates = IsMousePressed ?
irr::EMBSM_LEFT : 0;
irrevent.EventType = EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.X = mouse_pos.X;
irrevent.MouseInput.Y = mouse_pos.Y + adjusted_height;
postEventFromUser(irrevent);
}
}
return status;
}

View File

@ -118,7 +118,6 @@ namespace irr
TouchEventData TouchEventsData[32];
bool HasTouchDevice;
bool IsMousePressed;
float GamepadAxisX;
float GamepadAxisY;
DeviceOrientation DefaultOrientation;

View File

@ -21,7 +21,7 @@ CIrrDeviceStub::CIrrDeviceStub(const SIrrlichtCreationParameters& params)
: IrrlichtDevice(), VideoDriver(0), GUIEnvironment(0), SceneManager(0),
Timer(0), CursorControl(0), UserReceiver(params.EventReceiver), Logger(0), Operator(0),
Randomizer(0), FileSystem(0), InputReceivingSceneManager(0), CreationParams(params),
Close(false)
Close(false), IsMousePressed(false)
{
Timer = new CTimer(params.UsePerformanceTimer);
if (os::Printer::Logger)
@ -426,7 +426,43 @@ void CIrrDeviceStub::clearSystemMessages()
{
}
void CIrrDeviceStub::simulateMouse(const SEvent& event, core::position2d<s32>& mouse_pos)
{
if (!CursorControl) return;
CursorControl->setPosition(mouse_pos);
SEvent irrevent;
bool send_event = true;
switch (event.TouchInput.Event)
{
case ETIE_PRESSED_DOWN:
irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
IsMousePressed = true;
break;
case ETIE_LEFT_UP:
irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
IsMousePressed = false;
break;
case ETIE_MOVED:
irrevent.MouseInput.Event = EMIE_MOUSE_MOVED;
break;
default:
send_event = false;
break;
}
if (send_event)
{
irrevent.MouseInput.Control = false;
irrevent.MouseInput.Shift = false;
irrevent.MouseInput.ButtonStates = IsMousePressed ? irr::EMBSM_LEFT : 0;
irrevent.EventType = EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.X = mouse_pos.X;
irrevent.MouseInput.Y = mouse_pos.Y + getMovedHeight();
postEventFromUser(irrevent);
}
}
} // end namespace irr

View File

@ -151,9 +151,8 @@ namespace irr
//! Remove all messages pending in the system message loop
virtual void clearSystemMessages();
void simulateMouse(const SEvent& event, core::position2d<s32>& mouse_pos);
protected:
void createGUIAndScene();
//! checks version of SDK and prints warning if there might be a problem
@ -193,7 +192,7 @@ namespace irr
SMouseMultiClicks MouseMultiClicks;
video::CVideoModeList VideoModeList;
SIrrlichtCreationParameters CreationParams;
bool Close;
bool Close, IsMousePressed;
};
} // end namespace irr

View File

@ -206,9 +206,13 @@ namespace irr
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
ev.TouchInput.Event = irr::ETIE_PRESSED_DOWN;
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
bool simulate_mouse = false;
size_t id = 0;
for (UITouch* touch in touches)
{
ev.TouchInput.ID = (size_t)touch;
ev.TouchInput.ID = id++;
CGPoint touchPoint = [touch locationInView:self];
@ -216,7 +220,15 @@ namespace irr
ev.TouchInput.Y = touchPoint.y*Scale;
Device->postEventFromUser(ev);
if (ev.TouchInput.ID == 0)
{
simulate_mouse = true;
mouse_pos.X = ev.TouchInput.X;
mouse_pos.Y = ev.TouchInput.Y;
}
}
if (simulate_mouse)
Device->simulateMouse(ev, mouse_pos);
}
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
@ -225,9 +237,13 @@ namespace irr
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
ev.TouchInput.Event = irr::ETIE_MOVED;
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
bool simulate_mouse = false;
size_t id = 0;
for (UITouch* touch in touches)
{
ev.TouchInput.ID = (size_t)touch;
ev.TouchInput.ID = id++;
CGPoint touchPoint = [touch locationInView:self];
@ -235,7 +251,15 @@ namespace irr
ev.TouchInput.Y = touchPoint.y*Scale;
Device->postEventFromUser(ev);
if (ev.TouchInput.ID == 0)
{
simulate_mouse = true;
mouse_pos.X = ev.TouchInput.X;
mouse_pos.Y = ev.TouchInput.Y;
}
}
if (simulate_mouse)
Device->simulateMouse(ev, mouse_pos);
}
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
@ -244,9 +268,13 @@ namespace irr
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
bool simulate_mouse = false;
size_t id = 0;
for (UITouch* touch in touches)
{
ev.TouchInput.ID = (size_t)touch;
ev.TouchInput.ID = id++;
CGPoint touchPoint = [touch locationInView:self];
@ -254,7 +282,15 @@ namespace irr
ev.TouchInput.Y = touchPoint.y*Scale;
Device->postEventFromUser(ev);
if (ev.TouchInput.ID == 0)
{
simulate_mouse = true;
mouse_pos.X = ev.TouchInput.X;
mouse_pos.Y = ev.TouchInput.Y;
}
}
if (simulate_mouse)
Device->simulateMouse(ev, mouse_pos);
}
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
@ -263,9 +299,13 @@ namespace irr
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
bool simulate_mouse = false;
size_t id = 0;
for (UITouch* touch in touches)
{
ev.TouchInput.ID = (size_t)touch;
ev.TouchInput.ID = id++;
CGPoint touchPoint = [touch locationInView:self];
@ -273,7 +313,15 @@ namespace irr
ev.TouchInput.Y = touchPoint.y*Scale;
Device->postEventFromUser(ev);
if (ev.TouchInput.ID == 0)
{
simulate_mouse = true;
mouse_pos.X = ev.TouchInput.X;
mouse_pos.Y = ev.TouchInput.Y;
}
}
if (simulate_mouse)
Device->simulateMouse(ev, mouse_pos);
}
@end