Cleaned code a little bit

This commit is contained in:
Ray 2016-02-02 17:59:13 +01:00
parent 728e1715cc
commit 65ecde1e75

View file

@ -65,20 +65,11 @@ typedef enum {
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Global Variables Definition // Global Variables Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Tap gesture variables
static Vector2 initialTapPosition = { 0, 0 };
// Double Tap gesture variables
static bool doubleTapping = false;
static bool untap = false; // Check if recently done a tap
// Drag gesture variables // Drag gesture variables
static Vector2 initialDragPosition = { 0, 0 };
static Vector2 endDragPosition = { 0, 0 };
static Vector2 lastDragPosition = { 0, 0 };
static Vector2 dragVector = { 0, 0 }; static Vector2 dragVector = { 0, 0 };
// Albert&Ian // Touch gesture variables
static Vector2 touchDownPosition = { 0, 0 }; static Vector2 touchDownPosition = { 0, 0 };
static Vector2 touchDownPosition2 = { 0, 0 }; static Vector2 touchDownPosition2 = { 0, 0 };
static Vector2 touchUpPosition = { 0, 0 }; static Vector2 touchUpPosition = { 0, 0 };
@ -87,7 +78,6 @@ static Vector2 moveDownPosition2 = { 0, 0 };
static int numTap = 0; static int numTap = 0;
static int numHold = 0; static int numHold = 0;
static int numPinch = 0;
static int pointCount = 0; static int pointCount = 0;
static int touchId = -1; static int touchId = -1;
@ -99,10 +89,6 @@ static float intensity = 0; // How fast we did the drag (pixels per
static int draggingTimeCounter = 0; // Time that have passed while dragging static int draggingTimeCounter = 0; // Time that have passed while dragging
// Pinch gesture variables // Pinch gesture variables
static Vector2 firstInitialPinchPosition = { 0, 0 };
static Vector2 secondInitialPinchPosition = { 0, 0 };
static Vector2 firstEndPinchPosition = { 0, 0 };
static Vector2 secondEndPinchPosition = { 0, 0 };
static float pinchDelta = 0; // Pinch delta displacement static float pinchDelta = 0; // Pinch delta displacement
// Detected gestures // Detected gestures
@ -115,12 +101,9 @@ static unsigned int enabledGestures = 0b0000001111111111;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module specific Functions Declaration // Module specific Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
static void InitPinchGesture(Vector2 posA, Vector2 posB);
static float CalculateAngle(Vector2 initialPosition, Vector2 actualPosition, float magnitude); static float CalculateAngle(Vector2 initialPosition, Vector2 actualPosition, float magnitude);
static float VectorDistance(Vector2 v1, Vector2 v2); static float Vector2Distance(Vector2 v1, Vector2 v2);
static float VectorDotProduct(Vector2 v1, Vector2 v2);
static double GetCurrentTime(); static double GetCurrentTime();
static float Vector2Distance();
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Definition // Module Functions Definition
@ -135,18 +118,18 @@ void ProcessGestureEvent(GestureEvent event)
previousGesture = currentGesture; previousGesture = currentGesture;
pointCount = event.pointCount; pointCount = event.pointCount; // Required on UpdateGestures()
// Albert&Ian
if (pointCount < 2) if (pointCount < 2)
{ {
touchId = event.pointerId[0]; touchId = event.pointerId[0];
if (event.touchAction == TOUCH_DOWN) if (event.touchAction == TOUCH_DOWN)
{ {
numTap++; // Tap counter numTap++; // Tap counter
// Detect GESTURE_DOUBLE_TAP // Detect GESTURE_DOUBLE_TAP
if ((currentGesture == GESTURE_NONE) && (numTap >= 2) && ((GetCurrentTime() - eventTime) < TAP_TIMEOUT) && (GetMagnitude(touchDownPosition, event.position[0]) < DOUBLETAP_RANGE)) if ((currentGesture == GESTURE_NONE) && (numTap >= 2) && ((GetCurrentTime() - eventTime) < TAP_TIMEOUT) && (Vector2Distance(touchDownPosition, event.position[0]) < DOUBLETAP_RANGE))
{ {
currentGesture = GESTURE_DOUBLETAP; currentGesture = GESTURE_DOUBLETAP;
numTap = 0; numTap = 0;
@ -164,19 +147,17 @@ void ProcessGestureEvent(GestureEvent event)
} }
else if (event.touchAction == TOUCH_UP) else if (event.touchAction == TOUCH_UP)
{ {
if (currentGesture = GESTURE_DRAG) if (currentGesture == GESTURE_DRAG) touchUpPosition = event.position[0];
{
touchUpPosition = event.position[0];
}
// Calculate for swipe // Calculate for swipe
magnitude = GetMagnitude(touchDownPosition, touchUpPosition); magnitude = Vector2Distance(touchDownPosition, touchUpPosition);
intensity = magnitude / (float)draggingTimeCounter; intensity = magnitude / (float)draggingTimeCounter;
// Detect GESTURE_SWIPE // Detect GESTURE_SWIPE
if ((intensity > FORCE_TO_SWIPE) && (touchId == 0)) if ((intensity > FORCE_TO_SWIPE) && (touchId == 0))
{ {
angle = CalculateAngle(touchDownPosition, touchUpPosition, magnitude); angle = CalculateAngle(touchDownPosition, touchUpPosition, magnitude);
if ((angle < 30) || (angle > 330)) currentGesture = GESTURE_SWIPE_RIGHT; // Right if ((angle < 30) || (angle > 330)) currentGesture = GESTURE_SWIPE_RIGHT; // Right
else if ((angle > 30) && (angle < 120)) currentGesture = GESTURE_SWIPE_UP; // Up else if ((angle > 30) && (angle < 120)) currentGesture = GESTURE_SWIPE_UP; // Up
else if ((angle > 120) && (angle < 210)) currentGesture = GESTURE_SWIPE_LEFT; // Left else if ((angle > 120) && (angle < 210)) currentGesture = GESTURE_SWIPE_LEFT; // Left
@ -196,7 +177,8 @@ void ProcessGestureEvent(GestureEvent event)
} }
else if (event.touchAction == TOUCH_MOVE) else if (event.touchAction == TOUCH_MOVE)
{ {
if (GetMagnitude(moveDownPosition, event.position[0]) > 5) eventTime = GetCurrentTime(); if (Vector2Distance(moveDownPosition, event.position[0]) > 5) eventTime = GetCurrentTime();
moveDownPosition = event.position[0]; moveDownPosition = event.position[0];
if (currentGesture == GESTURE_HOLD) if (currentGesture == GESTURE_HOLD)
@ -205,7 +187,7 @@ void ProcessGestureEvent(GestureEvent event)
numHold = 2; numHold = 2;
magnitude = GetMagnitude(touchDownPosition, moveDownPosition); magnitude = Vector2Distance(touchDownPosition, moveDownPosition);
// Detect GESTURE_DRAG // Detect GESTURE_DRAG
if (magnitude >= FORCE_TO_DRAG) currentGesture = GESTURE_DRAG; if (magnitude >= FORCE_TO_DRAG) currentGesture = GESTURE_DRAG;
@ -214,10 +196,8 @@ void ProcessGestureEvent(GestureEvent event)
draggingTimeCounter++; draggingTimeCounter++;
} }
} }
else else // Two touch points
{ {
// two fingers
if (event.touchAction == TOUCH_DOWN) if (event.touchAction == TOUCH_DOWN)
{ {
touchDownPosition = event.position[0]; touchDownPosition = event.position[0];
@ -227,7 +207,7 @@ void ProcessGestureEvent(GestureEvent event)
} }
else if (event.touchAction == TOUCH_MOVE) else if (event.touchAction == TOUCH_MOVE)
{ {
magnitude = GetMagnitude(moveDownPosition, moveDownPosition2); magnitude = Vector2Distance(moveDownPosition, moveDownPosition2);
touchDownPosition = moveDownPosition; touchDownPosition = moveDownPosition;
touchDownPosition2 = moveDownPosition2; touchDownPosition2 = moveDownPosition2;
@ -235,9 +215,9 @@ void ProcessGestureEvent(GestureEvent event)
moveDownPosition = event.position[0]; moveDownPosition = event.position[0];
moveDownPosition2 = event.position[1]; moveDownPosition2 = event.position[1];
if ( (GetMagnitude(touchDownPosition, moveDownPosition) > FORCE_TO_PINCH) || (GetMagnitude(touchDownPosition2, moveDownPosition2) > FORCE_TO_PINCH)) if ((Vector2Distance(touchDownPosition, moveDownPosition) > FORCE_TO_PINCH) || (Vector2Distance(touchDownPosition2, moveDownPosition2) > FORCE_TO_PINCH))
{ {
if ((GetMagnitude(moveDownPosition, moveDownPosition2) - magnitude) < 0) currentGesture = GESTURE_PINCH_IN; if ((Vector2Distance(moveDownPosition, moveDownPosition2) - magnitude) < 0) currentGesture = GESTURE_PINCH_IN;
else currentGesture = GESTURE_PINCH_OUT; else currentGesture = GESTURE_PINCH_OUT;
} }
else else
@ -259,6 +239,7 @@ void UpdateGestures(void)
// Detect GESTURE_HOLD // Detect GESTURE_HOLD
if (((currentGesture == GESTURE_TAP) || (currentGesture == GESTURE_DOUBLETAP)) && pointCount < 2) currentGesture = GESTURE_HOLD; if (((currentGesture == GESTURE_TAP) || (currentGesture == GESTURE_DOUBLETAP)) && pointCount < 2) currentGesture = GESTURE_HOLD;
if ((GetCurrentTime() - eventTime) > TAP_TIMEOUT && (currentGesture == GESTURE_DRAG) && pointCount < 2) if ((GetCurrentTime() - eventTime) > TAP_TIMEOUT && (currentGesture == GESTURE_DRAG) && pointCount < 2)
{ {
currentGesture = GESTURE_HOLD; currentGesture = GESTURE_HOLD;
@ -272,19 +253,6 @@ void UpdateGestures(void)
} }
} }
// Calculate distance between two vectors
float Vector2Distance(Vector2 v1, Vector3 v2)
{
float result;
float dx = v2.x - v1.x;
float dy = v2.y - v1.y;
result = sqrt(dx*dx + dy*dy);
return result;
}
// Check if a gesture have been detected // Check if a gesture have been detected
bool IsGestureDetected(void) bool IsGestureDetected(void)
{ {
@ -342,20 +310,6 @@ float GetGesturePinchAngle(void)
return 0; return 0;
} }
// Update gestures detected (must be called every frame)
void UpdateGestures(void)
{
// NOTE: Gestures are processed through system callbacks on touch events
// When screen is touched, in first frame GESTURE_TAP is called but in next frame touch event callback is not called (if touch position doesn't change),
// so we need to store previous frame gesture type manually in this update function to switch to HOLD if current gesture is
// GESTURE_TAP two frames in a row. Due to current gesture is set to HOLD, current gesture doesn't need to be reset to NONE every frame.
// It will be reset when UP is called.
if(currentGesture == GESTURE_TAP) previousGesture = currentGesture;
if(previousGesture == GESTURE_TAP && currentGesture == GESTURE_TAP) currentGesture = GESTURE_HOLD;
}
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module specific Functions Definition // Module specific Functions Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
@ -395,28 +349,7 @@ static float CalculateAngle(Vector2 initialPosition, Vector2 finalPosition, floa
return angle; return angle;
} }
static void InitPinchGesture(Vector2 posA, Vector2 posB) static float Vector2Distance(Vector2 v1, Vector2 v2)
{
initialDragPosition = (Vector2){ 0, 0 };
endDragPosition = (Vector2){ 0, 0 };
lastDragPosition = (Vector2){ 0, 0 };
// Initialize positions
firstInitialPinchPosition = posA;
secondInitialPinchPosition = posB;
firstEndPinchPosition = firstInitialPinchPosition;
secondEndPinchPosition = secondInitialPinchPosition;
// Resets
magnitude = 0;
angle = 0;
intensity = 0;
gestureType = TYPE_DUAL_INPUT;
}
static float VectorDistance(Vector2 v1, Vector2 v2)
{ {
float result; float result;
@ -428,21 +361,6 @@ static float VectorDistance(Vector2 v1, Vector2 v2)
return result; return result;
} }
static float VectorDotProduct(Vector2 v1, Vector2 v2)
{
float result;
float v1Module = sqrt(v1.x*v1.x + v1.y*v1.y);
float v2Module = sqrt(v2.x*v2.x + v2.y*v2.y);
Vector2 v1Normalized = { v1.x / v1Module, v1.y / v1Module };
Vector2 v2Normalized = { v2.x / v2Module, v2.y / v2Module };
result = v1Normalized.x*v2Normalized.x + v1Normalized.y*v2Normalized.y;
return result;
}
// Time measure returned are milliseconds // Time measure returned are milliseconds
static double GetCurrentTime() static double GetCurrentTime()
{ {