2020-09-08 22:10:45 +00:00
|
|
|
/************************************************************************************
|
|
|
|
|
|
|
|
Filename : VrInputRight.c
|
|
|
|
Content : Handles common controller input functionality
|
|
|
|
Created : September 2019
|
|
|
|
Authors : Simon Brown
|
|
|
|
|
|
|
|
*************************************************************************************/
|
|
|
|
|
|
|
|
#include <VrApi.h>
|
|
|
|
#include <VrApi_Helpers.h>
|
|
|
|
#include <VrApi_SystemUtils.h>
|
|
|
|
#include <VrApi_Input.h>
|
|
|
|
#include <VrApi_Types.h>
|
|
|
|
|
|
|
|
#include "VrInput.h"
|
|
|
|
|
|
|
|
void Sys_AddMouseMoveEvent(int dx, int dy);
|
|
|
|
void Sys_AddMouseButtonEvent(int button, bool pressed);
|
|
|
|
void Sys_AddKeyEvent(int key, bool pressed);
|
|
|
|
|
2020-09-11 21:41:18 +00:00
|
|
|
void Android_ButtonChange(int key, int state);
|
|
|
|
int Android_GetButton(int key);
|
|
|
|
|
|
|
|
void handleTrackedControllerButton_AsButton(ovrInputStateTrackedRemote * trackedRemoteState, ovrInputStateTrackedRemote * prevTrackedRemoteState, bool mouse, uint32_t button, int key)
|
2020-09-08 22:10:45 +00:00
|
|
|
{
|
|
|
|
if ((trackedRemoteState->Buttons & button) != (prevTrackedRemoteState->Buttons & button))
|
|
|
|
{
|
2020-09-11 21:41:18 +00:00
|
|
|
if (mouse)
|
|
|
|
{
|
2020-09-08 22:10:45 +00:00
|
|
|
Sys_AddMouseButtonEvent(key, (trackedRemoteState->Buttons & button) != 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-09-11 21:41:18 +00:00
|
|
|
Android_ButtonChange(key, ((trackedRemoteState->Buttons & button) != 0) ? 1 : 0);
|
2020-09-08 22:10:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-11 21:41:18 +00:00
|
|
|
void handleTrackedControllerButton_AsKey(ovrInputStateTrackedRemote * trackedRemoteState, ovrInputStateTrackedRemote * prevTrackedRemoteState, uint32_t button, int key)
|
|
|
|
{
|
|
|
|
if ((trackedRemoteState->Buttons & button) != (prevTrackedRemoteState->Buttons & button))
|
|
|
|
{
|
|
|
|
Sys_AddKeyEvent(key, (trackedRemoteState->Buttons & button) != 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleTrackedControllerButton_AsToggleButton(ovrInputStateTrackedRemote * trackedRemoteState, ovrInputStateTrackedRemote * prevTrackedRemoteState, uint32_t button, int key)
|
|
|
|
{
|
|
|
|
if ((trackedRemoteState->Buttons & button) != (prevTrackedRemoteState->Buttons & button))
|
|
|
|
{
|
|
|
|
Android_ButtonChange(key, Android_GetButton(key) ? 0 : 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-08 22:10:45 +00:00
|
|
|
void sendButtonAction(const char* action, long buttonDown) {}
|
|
|
|
void sendButtonActionSimple(const char* action) {}
|
|
|
|
|
|
|
|
void rotateAboutOrigin(float x, float y, float rotation, vec2_t out)
|
|
|
|
{
|
|
|
|
out[0] = cosf(DEG2RAD(-rotation)) * x + sinf(DEG2RAD(-rotation)) * y;
|
|
|
|
out[1] = cosf(DEG2RAD(-rotation)) * y - sinf(DEG2RAD(-rotation)) * x;
|
|
|
|
}
|
|
|
|
|
|
|
|
float length(float x, float y)
|
|
|
|
{
|
|
|
|
return sqrtf(powf(x, 2.0f) + powf(y, 2.0f));
|
|
|
|
}
|
|
|
|
|
|
|
|
#define NLF_DEADZONE 0.1
|
|
|
|
#define NLF_POWER 2.2
|
|
|
|
|
|
|
|
float nonLinearFilter(float in)
|
|
|
|
{
|
|
|
|
float val = 0.0f;
|
|
|
|
if (in > NLF_DEADZONE)
|
|
|
|
{
|
|
|
|
val = in;
|
|
|
|
val -= NLF_DEADZONE;
|
|
|
|
val /= (1.0f - NLF_DEADZONE);
|
|
|
|
val = powf(val, NLF_POWER);
|
|
|
|
}
|
|
|
|
else if (in < -NLF_DEADZONE)
|
|
|
|
{
|
|
|
|
val = in;
|
|
|
|
val += NLF_DEADZONE;
|
|
|
|
val /= (1.0f - NLF_DEADZONE);
|
|
|
|
val = -powf(fabsf(val), NLF_POWER);
|
|
|
|
}
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool between(float min, float val, float max)
|
|
|
|
{
|
|
|
|
return (min < val) && (val < max);
|
|
|
|
}
|
|
|
|
|
|
|
|
void acquireTrackedRemotesData(ovrMobile *Ovr, double displayTime) {//The amount of yaw changed by controller
|
|
|
|
for ( int i = 0; ; i++ ) {
|
|
|
|
ovrInputCapabilityHeader cap;
|
|
|
|
ovrResult result = vrapi_EnumerateInputDevices(Ovr, i, &cap);
|
|
|
|
if (result < 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cap.Type == ovrControllerType_TrackedRemote) {
|
|
|
|
ovrTracking remoteTracking;
|
|
|
|
ovrInputStateTrackedRemote trackedRemoteState;
|
|
|
|
trackedRemoteState.Header.ControllerType = ovrControllerType_TrackedRemote;
|
|
|
|
result = vrapi_GetCurrentInputState(Ovr, cap.DeviceID, &trackedRemoteState.Header);
|
|
|
|
|
|
|
|
if (result == ovrSuccess) {
|
|
|
|
ovrInputTrackedRemoteCapabilities remoteCapabilities;
|
|
|
|
remoteCapabilities.Header = cap;
|
|
|
|
result = vrapi_GetInputDeviceCapabilities(Ovr, &remoteCapabilities.Header);
|
|
|
|
|
|
|
|
result = vrapi_GetInputTrackingState(Ovr, cap.DeviceID, displayTime,
|
|
|
|
&remoteTracking);
|
|
|
|
|
|
|
|
if (remoteCapabilities.ControllerCapabilities & ovrControllerCaps_RightHand) {
|
|
|
|
rightTrackedRemoteState_new = trackedRemoteState;
|
|
|
|
rightRemoteTracking_new = remoteTracking;
|
|
|
|
controllerIDs[1] = cap.DeviceID;
|
|
|
|
} else{
|
|
|
|
leftTrackedRemoteState_new = trackedRemoteState;
|
|
|
|
leftRemoteTracking_new = remoteTracking;
|
|
|
|
controllerIDs[0] = cap.DeviceID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef max
|
|
|
|
#define max( x, y ) ( ( ( x ) > ( y ) ) ? ( x ) : ( y ) )
|
|
|
|
#define min( x, y ) ( ( ( x ) < ( y ) ) ? ( x ) : ( y ) )
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
float clamp(float _min, float _val, float _max)
|
|
|
|
{
|
|
|
|
return max(min(_val, _max), _min);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-09-16 21:41:35 +00:00
|
|
|
void controlMouse(ovrInputStateTrackedRemote *newState, ovrInputStateTrackedRemote *oldState) {
|
2020-09-08 22:10:45 +00:00
|
|
|
static int cursorX = 0;
|
|
|
|
static int cursorY = 0;
|
|
|
|
|
2020-09-19 21:30:26 +00:00
|
|
|
cursorX = (float)(pVRClientInfo->weaponangles_delta[YAW] * 18.0f);
|
|
|
|
cursorY = (float)(-pVRClientInfo->weaponangles_delta[PITCH] * 18.0f);
|
2020-09-08 22:10:45 +00:00
|
|
|
|
|
|
|
Sys_AddMouseMoveEvent(cursorX, cursorY);
|
|
|
|
}
|