Skip to content

Commit 1f826b5

Browse files
committed
Share the simulateMouse with android and iOS
1 parent f9c2e40 commit 1f826b5

File tree

5 files changed

+92
-47
lines changed

5 files changed

+92
-47
lines changed

lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param)
7070
AccelerometerActive(false),
7171
GyroscopeActive(false),
7272
HasTouchDevice(false),
73-
IsMousePressed(false),
7473
GamepadAxisX(0),
7574
GamepadAxisY(0),
7675
DefaultOrientation(ORIENTATION_UNKNOWN)
@@ -637,44 +636,8 @@ s32 CIrrDeviceAndroid::handleTouch(AInputEvent* androidEvent)
637636
// Simulate mouse event for first finger on multitouch device.
638637
// This allows to click on GUI elements.
639638
if (simulate_mouse)
640-
{
641-
CursorControl->setPosition(mouse_pos);
639+
simulateMouse(event, mouse_pos);
642640

643-
SEvent irrevent;
644-
bool send_event = true;
645-
646-
switch (event.TouchInput.Event)
647-
{
648-
case ETIE_PRESSED_DOWN:
649-
irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
650-
IsMousePressed = true;
651-
break;
652-
case ETIE_LEFT_UP:
653-
irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
654-
IsMousePressed = false;
655-
break;
656-
case ETIE_MOVED:
657-
irrevent.MouseInput.Event = EMIE_MOUSE_MOVED;
658-
break;
659-
default:
660-
send_event = false;
661-
break;
662-
}
663-
664-
if (send_event)
665-
{
666-
irrevent.MouseInput.Control = false;
667-
irrevent.MouseInput.Shift = false;
668-
irrevent.MouseInput.ButtonStates = IsMousePressed ?
669-
irr::EMBSM_LEFT : 0;
670-
irrevent.EventType = EET_MOUSE_INPUT_EVENT;
671-
irrevent.MouseInput.X = mouse_pos.X;
672-
irrevent.MouseInput.Y = mouse_pos.Y + adjusted_height;
673-
674-
postEventFromUser(irrevent);
675-
}
676-
}
677-
678641
return status;
679642
}
680643

lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ namespace irr
118118

119119
TouchEventData TouchEventsData[32];
120120
bool HasTouchDevice;
121-
bool IsMousePressed;
122121
float GamepadAxisX;
123122
float GamepadAxisY;
124123
DeviceOrientation DefaultOrientation;

lib/irrlicht/source/Irrlicht/CIrrDeviceStub.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ CIrrDeviceStub::CIrrDeviceStub(const SIrrlichtCreationParameters& params)
2121
: IrrlichtDevice(), VideoDriver(0), GUIEnvironment(0), SceneManager(0),
2222
Timer(0), CursorControl(0), UserReceiver(params.EventReceiver), Logger(0), Operator(0),
2323
Randomizer(0), FileSystem(0), InputReceivingSceneManager(0), CreationParams(params),
24-
Close(false)
24+
Close(false), IsMousePressed(false)
2525
{
2626
Timer = new CTimer(params.UsePerformanceTimer);
2727
if (os::Printer::Logger)
@@ -426,7 +426,43 @@ void CIrrDeviceStub::clearSystemMessages()
426426
{
427427
}
428428

429+
void CIrrDeviceStub::simulateMouse(const SEvent& event, core::position2d<s32>& mouse_pos)
430+
{
431+
if (!CursorControl) return;
432+
CursorControl->setPosition(mouse_pos);
433+
434+
SEvent irrevent;
435+
bool send_event = true;
436+
437+
switch (event.TouchInput.Event)
438+
{
439+
case ETIE_PRESSED_DOWN:
440+
irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
441+
IsMousePressed = true;
442+
break;
443+
case ETIE_LEFT_UP:
444+
irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
445+
IsMousePressed = false;
446+
break;
447+
case ETIE_MOVED:
448+
irrevent.MouseInput.Event = EMIE_MOUSE_MOVED;
449+
break;
450+
default:
451+
send_event = false;
452+
break;
453+
}
429454

455+
if (send_event)
456+
{
457+
irrevent.MouseInput.Control = false;
458+
irrevent.MouseInput.Shift = false;
459+
irrevent.MouseInput.ButtonStates = IsMousePressed ? irr::EMBSM_LEFT : 0;
460+
irrevent.EventType = EET_MOUSE_INPUT_EVENT;
461+
irrevent.MouseInput.X = mouse_pos.X;
462+
irrevent.MouseInput.Y = mouse_pos.Y + getMovedHeight();
463+
postEventFromUser(irrevent);
464+
}
465+
}
430466

431467
} // end namespace irr
432468

lib/irrlicht/source/Irrlicht/CIrrDeviceStub.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,8 @@ namespace irr
151151
//! Remove all messages pending in the system message loop
152152
virtual void clearSystemMessages();
153153

154-
154+
void simulateMouse(const SEvent& event, core::position2d<s32>& mouse_pos);
155155
protected:
156-
157156
void createGUIAndScene();
158157

159158
//! checks version of SDK and prints warning if there might be a problem
@@ -193,7 +192,7 @@ namespace irr
193192
SMouseMultiClicks MouseMultiClicks;
194193
video::CVideoModeList VideoModeList;
195194
SIrrlichtCreationParameters CreationParams;
196-
bool Close;
195+
bool Close, IsMousePressed;
197196
};
198197

199198
} // end namespace irr

lib/irrlicht/source/Irrlicht/CIrrDeviceiOS.mm

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,17 +206,29 @@ - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
206206
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
207207
ev.TouchInput.Event = irr::ETIE_PRESSED_DOWN;
208208

209+
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
210+
bool simulate_mouse = false;
211+
size_t id = 0;
212+
209213
for (UITouch* touch in touches)
210214
{
211-
ev.TouchInput.ID = (size_t)touch;
215+
ev.TouchInput.ID = id++;
212216

213217
CGPoint touchPoint = [touch locationInView:self];
214218

215219
ev.TouchInput.X = touchPoint.x*Scale;
216220
ev.TouchInput.Y = touchPoint.y*Scale;
217221

218222
Device->postEventFromUser(ev);
223+
if (ev.TouchInput.ID == 0)
224+
{
225+
simulate_mouse = true;
226+
mouse_pos.X = ev.TouchInput.X;
227+
mouse_pos.Y = ev.TouchInput.Y;
228+
}
219229
}
230+
if (simulate_mouse)
231+
Device->simulateMouse(ev, mouse_pos);
220232
}
221233

222234
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
@@ -225,17 +237,29 @@ - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
225237
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
226238
ev.TouchInput.Event = irr::ETIE_MOVED;
227239

240+
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
241+
bool simulate_mouse = false;
242+
size_t id = 0;
243+
228244
for (UITouch* touch in touches)
229245
{
230-
ev.TouchInput.ID = (size_t)touch;
246+
ev.TouchInput.ID = id++;
231247

232248
CGPoint touchPoint = [touch locationInView:self];
233249

234250
ev.TouchInput.X = touchPoint.x*Scale;
235251
ev.TouchInput.Y = touchPoint.y*Scale;
236252

237253
Device->postEventFromUser(ev);
254+
if (ev.TouchInput.ID == 0)
255+
{
256+
simulate_mouse = true;
257+
mouse_pos.X = ev.TouchInput.X;
258+
mouse_pos.Y = ev.TouchInput.Y;
259+
}
238260
}
261+
if (simulate_mouse)
262+
Device->simulateMouse(ev, mouse_pos);
239263
}
240264

241265
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
@@ -244,17 +268,29 @@ - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
244268
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
245269
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
246270

271+
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
272+
bool simulate_mouse = false;
273+
size_t id = 0;
274+
247275
for (UITouch* touch in touches)
248276
{
249-
ev.TouchInput.ID = (size_t)touch;
277+
ev.TouchInput.ID = id++;
250278

251279
CGPoint touchPoint = [touch locationInView:self];
252280

253281
ev.TouchInput.X = touchPoint.x*Scale;
254282
ev.TouchInput.Y = touchPoint.y*Scale;
255283

256284
Device->postEventFromUser(ev);
285+
if (ev.TouchInput.ID == 0)
286+
{
287+
simulate_mouse = true;
288+
mouse_pos.X = ev.TouchInput.X;
289+
mouse_pos.Y = ev.TouchInput.Y;
290+
}
257291
}
292+
if (simulate_mouse)
293+
Device->simulateMouse(ev, mouse_pos);
258294
}
259295

260296
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
@@ -263,17 +299,29 @@ - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
263299
ev.EventType = irr::EET_TOUCH_INPUT_EVENT;
264300
ev.TouchInput.Event = irr::ETIE_LEFT_UP;
265301

302+
irr::core::position2d<irr::s32> mouse_pos = irr::core::position2d<irr::s32>(0, 0);
303+
bool simulate_mouse = false;
304+
size_t id = 0;
305+
266306
for (UITouch* touch in touches)
267307
{
268-
ev.TouchInput.ID = (size_t)touch;
308+
ev.TouchInput.ID = id++;
269309

270310
CGPoint touchPoint = [touch locationInView:self];
271311

272312
ev.TouchInput.X = touchPoint.x*Scale;
273313
ev.TouchInput.Y = touchPoint.y*Scale;
274314

275315
Device->postEventFromUser(ev);
316+
if (ev.TouchInput.ID == 0)
317+
{
318+
simulate_mouse = true;
319+
mouse_pos.X = ev.TouchInput.X;
320+
mouse_pos.Y = ev.TouchInput.Y;
321+
}
276322
}
323+
if (simulate_mouse)
324+
Device->simulateMouse(ev, mouse_pos);
277325
}
278326

279327
@end

0 commit comments

Comments
 (0)