Fix bug with pointers' Touched detection on Android, simplify code a bit.

http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=49410
master
Ilya Zhuravlev 2014-02-11 19:33:50 +04:00
parent 04acf72c50
commit 9acf0ae1ad
1 changed files with 10 additions and 5 deletions

View File

@ -278,21 +278,21 @@ s32 CIrrDeviceAndroid::handleInput(android_app* app, AInputEvent* androidEvent)
s32 PointerCount = AMotionEvent_getPointerCount(androidEvent);
s32 AndroidEventAction = AMotionEvent_getAction(androidEvent);
s32 EventAction = AndroidEventAction & AMOTION_EVENT_ACTION_MASK;
s32 ChangedPointerID = (AndroidEventAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
s32 ChangedPointerIdx = (AndroidEventAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
bool MultiTouchEvent = true;
bool Touched = false;
bool EventTouched = false;
switch (EventAction)
{
case AMOTION_EVENT_ACTION_DOWN:
case AMOTION_EVENT_ACTION_POINTER_DOWN:
Event.MultiTouchInput.Event = EMTIE_PRESSED_DOWN;
Touched = true;
EventTouched = true;
break;
case AMOTION_EVENT_ACTION_MOVE:
Event.MultiTouchInput.Event = EMTIE_MOVED;
Touched = true;
EventTouched = true;
break;
case AMOTION_EVENT_ACTION_UP:
case AMOTION_EVENT_ACTION_POINTER_UP:
@ -333,7 +333,12 @@ s32 CIrrDeviceAndroid::handleInput(android_app* app, AInputEvent* androidEvent)
Event.MultiTouchInput.PrevY[i] = y;
}
if ((Event.MultiTouchInput.Touched[i] = Touched || (ChangedPointerID != id)))
// we assume that pointer is down when one of following is met:
// 1) we're processing pointer with index ChangedPointerIdx and EventAction says it's down
// 2) we're processing some other pointer (it's still here so it's down for sure)
bool Touched = EventTouched || (ChangedPointerIdx != i);
Event.MultiTouchInput.Touched[i] = Touched;
if (Touched)
(*newMotionData)[id] = core::vector2d<s32>(x, y);
}
delete Device->previousMotionData;