From 3283e8525cfae180b84ee127e025f91669581b8f Mon Sep 17 00:00:00 2001 From: Grant Bagwell Date: Mon, 25 Jan 2021 21:09:55 +0100 Subject: [PATCH] CyberShoes Support --- .../jni/Doom3Quest/Doom3Quest_SurfaceView.c | 13 ++++-- Projects/Android/jni/Doom3Quest/VrInput.h | 5 ++- .../Android/jni/Doom3Quest/VrInputCommon.c | 42 +++++++++++++------ .../Android/jni/Doom3Quest/VrInputDefault.c | 9 ++-- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/Projects/Android/jni/Doom3Quest/Doom3Quest_SurfaceView.c b/Projects/Android/jni/Doom3Quest/Doom3Quest_SurfaceView.c index d59d6c4..224b6ed 100644 --- a/Projects/Android/jni/Doom3Quest/Doom3Quest_SurfaceView.c +++ b/Projects/Android/jni/Doom3Quest/Doom3Quest_SurfaceView.c @@ -1544,6 +1544,9 @@ void * AppThreadFunction(void * parm ) { ovrApp_Clear(&gAppState); gAppState.Java = java; + // This app will handle android gamepad events itself. + vrapi_SetPropertyInt(&gAppState.Java, VRAPI_EAT_NATIVE_GAMEPAD_EVENTS, 0); + gAppState.CpuLevel = CPU_LEVEL; gAppState.GpuLevel = GPU_LEVEL; gAppState.MainThreadTid = gettid(); @@ -1773,14 +1776,18 @@ void Doom3Quest_getTrackedRemotesOrientation(int controlscheme, int switch_stick //Call additional control schemes here if (controlscheme == RIGHT_HANDED_DEFAULT) { - HandleInput_Default(controlscheme, switch_sticks, &rightTrackedRemoteState_new, - &rightTrackedRemoteState_old, &rightRemoteTracking_new, + HandleInput_Default(controlscheme, switch_sticks, + &footTrackedRemoteState_new, &footTrackedRemoteState_old, + &rightTrackedRemoteState_new, &rightTrackedRemoteState_old, + &rightRemoteTracking_new, &leftTrackedRemoteState_new, &leftTrackedRemoteState_old, &leftRemoteTracking_new, ovrButton_A, ovrButton_B, ovrButton_X, ovrButton_Y); } else { //Left handed - HandleInput_Default(controlscheme, switch_sticks, &leftTrackedRemoteState_new, &leftTrackedRemoteState_old, + HandleInput_Default(controlscheme, switch_sticks, + &footTrackedRemoteState_new, &footTrackedRemoteState_old, + &leftTrackedRemoteState_new, &leftTrackedRemoteState_old, &leftRemoteTracking_new, &rightTrackedRemoteState_new, &rightTrackedRemoteState_old, &rightRemoteTracking_new, diff --git a/Projects/Android/jni/Doom3Quest/VrInput.h b/Projects/Android/jni/Doom3Quest/VrInput.h index 20f98c7..691fd38 100644 --- a/Projects/Android/jni/Doom3Quest/VrInput.h +++ b/Projects/Android/jni/Doom3Quest/VrInput.h @@ -19,6 +19,9 @@ ovrInputStateTrackedRemote rightTrackedRemoteState_old; ovrInputStateTrackedRemote rightTrackedRemoteState_new; ovrTracking rightRemoteTracking_new; +ovrInputStateGamepad footTrackedRemoteState_old; +ovrInputStateGamepad footTrackedRemoteState_new; + ovrDeviceID controllerIDs[2]; float remote_movementSideways; @@ -33,7 +36,7 @@ void sendButtonActionSimple(const char* action); void acquireTrackedRemotesData(ovrMobile *Ovr, double displayTime); -void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, +void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateGamepad *pFootTrackingNew, ovrInputStateGamepad *pFootTrackingOld, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, ovrInputStateTrackedRemote *pOffTrackedRemoteNew, ovrInputStateTrackedRemote *pOffTrackedRemoteOld, ovrTracking* pOffTracking, int domButton1, int domButton2, int offButton1, int offButton2 ); diff --git a/Projects/Android/jni/Doom3Quest/VrInputCommon.c b/Projects/Android/jni/Doom3Quest/VrInputCommon.c index 2a7b175..1c8ef53 100644 --- a/Projects/Android/jni/Doom3Quest/VrInputCommon.c +++ b/Projects/Android/jni/Doom3Quest/VrInputCommon.c @@ -105,7 +105,22 @@ void acquireTrackedRemotesData(ovrMobile *Ovr, double displayTime) {//The amount break; } - if (capsHeader.Type == ovrControllerType_TrackedRemote) { + if (capsHeader.Type == ovrControllerType_Gamepad) { + + ovrInputGamepadCapabilities remoteCaps; + remoteCaps.Header = capsHeader; + if (vrapi_GetInputDeviceCapabilities(Ovr, &remoteCaps.Header) >= 0) { + // remote is connected + ovrInputStateGamepad remoteState; + remoteState.Header.ControllerType = ovrControllerType_Gamepad; + if ( vrapi_GetCurrentInputState( Ovr, capsHeader.DeviceID, &remoteState.Header ) >= 0 ) + { + // act on device state returned in remoteState + footTrackedRemoteState_new = remoteState; + } + } + } + else if (capsHeader.Type == ovrControllerType_TrackedRemote) { ovrTracking remoteTracking; ovrInputTrackedRemoteCapabilities remoteCaps; remoteCaps.Header = capsHeader; @@ -114,17 +129,20 @@ void acquireTrackedRemotesData(ovrMobile *Ovr, double displayTime) {//The amount // remote is connected ovrInputStateTrackedRemote remoteState; remoteState.Header.ControllerType = ovrControllerType_TrackedRemote; - if ( vrapi_GetInputTrackingState( Ovr, capsHeader.DeviceID, displayTime, &remoteTracking ) >= 0 ) - { - // act on device state returned in remoteState - if (remoteCaps.ControllerCapabilities & ovrControllerCaps_RightHand) { - rightTrackedRemoteState_new = remoteState; - rightRemoteTracking_new = remoteTracking; - controllerIDs[1] = capsHeader.DeviceID; - } else{ - leftTrackedRemoteState_new = remoteState; - leftRemoteTracking_new = remoteTracking; - controllerIDs[0] = capsHeader.DeviceID; + + if(vrapi_GetCurrentInputState(Ovr, capsHeader.DeviceID, &remoteState.Header) >= 0) { + if (vrapi_GetInputTrackingState(Ovr, capsHeader.DeviceID, displayTime, + &remoteTracking) >= 0) { + // act on device state returned in remoteState + if (remoteCaps.ControllerCapabilities & ovrControllerCaps_RightHand) { + rightTrackedRemoteState_new = remoteState; + rightRemoteTracking_new = remoteTracking; + controllerIDs[1] = capsHeader.DeviceID; + } else { + leftTrackedRemoteState_new = remoteState; + leftRemoteTracking_new = remoteTracking; + controllerIDs[0] = capsHeader.DeviceID; + } } } } diff --git a/Projects/Android/jni/Doom3Quest/VrInputDefault.c b/Projects/Android/jni/Doom3Quest/VrInputDefault.c index 79ac300..d25f3e4 100644 --- a/Projects/Android/jni/Doom3Quest/VrInputDefault.c +++ b/Projects/Android/jni/Doom3Quest/VrInputDefault.c @@ -62,7 +62,8 @@ extern bool objectiveSystemActive; extern bool inCinematic; -void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, + +void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateGamepad *pFootTrackingNew, ovrInputStateGamepad *pFootTrackingOld, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, ovrInputStateTrackedRemote *pOffTrackedRemoteNew, ovrInputStateTrackedRemote *pOffTrackedRemoteOld, ovrTracking* pOffTracking, int domButton1, int domButton2, int offButton1, int offButton2 ) @@ -458,10 +459,10 @@ void HandleInput_Default( int controlscheme, int switchsticks, ovrInputStateTrac { //Apply a filter and quadratic scaler so small movements are easier to make - float dist = length(pSecondaryJoystick->x, pSecondaryJoystick->y); + float dist = length(pSecondaryJoystick->x - (pFootTrackingNew->LeftJoystick.x * 2), pSecondaryJoystick->y - (pFootTrackingNew->LeftJoystick.y * 2)); float nlf = nonLinearFilter(dist); - float x = nlf * pSecondaryJoystick->x; - float y = nlf * pSecondaryJoystick->y; + float x = nlf * (pSecondaryJoystick->x - (pFootTrackingNew->LeftJoystick.x * 2)); + float y = nlf * (pSecondaryJoystick->y - (pFootTrackingNew->LeftJoystick.y * 2)); pVRClientInfo->player_moving = (fabs(x) + fabs(y)) > 0.05f;