mirror of
https://github.com/amwatson/CitraVR.git
synced 2024-09-20 03:11:40 +02:00
[vr_main] move input handling into separate method
This commit is contained in:
parent
b96a9fe6da
commit
1293dba146
1 changed files with 119 additions and 114 deletions
|
@ -308,120 +308,7 @@ private:
|
|||
.count());
|
||||
}
|
||||
|
||||
mInputStateFrame.SyncButtonsAndThumbSticks(gOpenXr->mSession, mInputStateStatic);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Forward VR input to Android gamepad emulation
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 96 /* BUTTON_A */,
|
||||
mInputStateFrame.mAButtonState, "a");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 97 /* BUTTON_B */,
|
||||
mInputStateFrame.mBButtonState, "b");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 99 /* BUTTON_X */,
|
||||
mInputStateFrame.mXButtonState, "x");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID,
|
||||
100 /* BUTTON_Y */, mInputStateFrame.mYButtonState, "y");
|
||||
ForwardButtonStateIfNeeded(
|
||||
jni, mActivityObject, mForwardVRInputMethodID, 102 /* BUTTON_L1 */,
|
||||
mInputStateFrame.mSqueezeTriggerState[InputStateFrame::LEFT_CONTROLLER], "l1");
|
||||
ForwardButtonStateIfNeeded(
|
||||
jni, mActivityObject, mForwardVRInputMethodID, 103 /* BUTTON_R1 */,
|
||||
mInputStateFrame.mSqueezeTriggerState[InputStateFrame::RIGHT_CONTROLLER], "r1");
|
||||
|
||||
{
|
||||
// Right is circlepad, left is leftstick/circlepad, dpad is whatever
|
||||
// has thumbstick pressed.
|
||||
const auto leftStickHand = InputStateFrame::LEFT_CONTROLLER;
|
||||
const auto cStickHand = InputStateFrame::RIGHT_CONTROLLER;
|
||||
|
||||
const auto& leftThumbrestTouchState =
|
||||
mInputStateFrame.mThumbrestTouchState[InputStateFrame::LEFT_CONTROLLER];
|
||||
const auto& rightThumbrestTouchState =
|
||||
mInputStateFrame.mThumbrestTouchState[InputStateFrame::RIGHT_CONTROLLER];
|
||||
const int dpadHand =
|
||||
leftThumbrestTouchState.currentState ? InputStateFrame::RIGHT_CONTROLLER
|
||||
: rightThumbrestTouchState.currentState ? InputStateFrame::LEFT_CONTROLLER
|
||||
: InputStateFrame::NUM_CONTROLLERS;
|
||||
|
||||
{
|
||||
static constexpr float kThumbStickDirectionThreshold = 0.5f;
|
||||
// Doing it this way helps ensure we don't leave the dpad
|
||||
// pressed if the thumbstick is released while still
|
||||
// pointing in the same direction.
|
||||
// I hope this is right, I didn't test it very much.
|
||||
static bool wasDpadLeft = false;
|
||||
static bool wasDpadRight = false;
|
||||
static bool wasDpadUp = false;
|
||||
static bool wasDpadDown = false;
|
||||
|
||||
const bool hasDpad = dpadHand != InputStateFrame::NUM_CONTROLLERS;
|
||||
const auto& dpadThumbstickState =
|
||||
mInputStateFrame.mThumbStickState[hasDpad ? dpadHand : leftStickHand];
|
||||
|
||||
if (hasDpad && dpadThumbstickState.currentState.y > kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID, 19 /* DPAD_UP */,
|
||||
1);
|
||||
wasDpadUp = true;
|
||||
} else if (wasDpadUp) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID, 19 /* DPAD_UP */,
|
||||
0);
|
||||
wasDpadUp = false;
|
||||
}
|
||||
if (hasDpad &&
|
||||
dpadThumbstickState.currentState.y < -kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
20 /* DPAD_DOWN */, 1);
|
||||
wasDpadDown = true;
|
||||
} else if (wasDpadDown) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
20 /* DPAD_DOWN */, 0);
|
||||
wasDpadDown = false;
|
||||
}
|
||||
if (hasDpad &&
|
||||
dpadThumbstickState.currentState.x < -kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
21 /* DPAD_LEFT */, 1);
|
||||
wasDpadLeft = true;
|
||||
} else if (wasDpadLeft) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
21 /* DPAD_LEFT */, 0);
|
||||
wasDpadLeft = false;
|
||||
}
|
||||
|
||||
if (hasDpad && dpadThumbstickState.currentState.x > kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
22 /* DPAD_RIGHT */, 1);
|
||||
wasDpadRight = true;
|
||||
} else if (wasDpadRight) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
22 /* DPAD_RIGHT */, 0);
|
||||
wasDpadRight = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpadHand != cStickHand) {
|
||||
const auto cStickThumbstickState = mInputStateFrame.mThumbStickState[cStickHand];
|
||||
if (cStickThumbstickState.currentState.y != 0 ||
|
||||
cStickThumbstickState.currentState.x != 0 ||
|
||||
cStickThumbstickState.changedSinceLastSync) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRJoystickMethodID,
|
||||
cStickThumbstickState.currentState.x,
|
||||
cStickThumbstickState.currentState.y, 0);
|
||||
}
|
||||
}
|
||||
if (dpadHand != leftStickHand) {
|
||||
const auto leftStickThumbstickState =
|
||||
mInputStateFrame.mThumbStickState[leftStickHand];
|
||||
if (leftStickThumbstickState.currentState.y != 0 ||
|
||||
leftStickThumbstickState.currentState.x != 0 ||
|
||||
leftStickThumbstickState.changedSinceLastSync) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRJoystickMethodID,
|
||||
leftStickThumbstickState.currentState.x,
|
||||
leftStickThumbstickState.currentState.y, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
UpdateAndSendControllerInput(jni);
|
||||
|
||||
////////////////////////////////
|
||||
// XrWaitFrame()
|
||||
|
@ -776,6 +663,124 @@ private:
|
|||
OXR(xrEndFrame(gOpenXr->mSession, &endFrameInfo));
|
||||
}
|
||||
|
||||
void UpdateAndSendControllerInput(JNIEnv* jni) {
|
||||
assert(gOpenXr != nullptr);
|
||||
mInputStateFrame.SyncButtonsAndThumbSticks(gOpenXr->mSession, mInputStateStatic);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Forward VR input to Android gamepad emulation
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 96 /* BUTTON_A */,
|
||||
mInputStateFrame.mAButtonState, "a");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 97 /* BUTTON_B */,
|
||||
mInputStateFrame.mBButtonState, "b");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID, 99 /* BUTTON_X */,
|
||||
mInputStateFrame.mXButtonState, "x");
|
||||
ForwardButtonStateIfNeeded(jni, mActivityObject, mForwardVRInputMethodID,
|
||||
100 /* BUTTON_Y */, mInputStateFrame.mYButtonState, "y");
|
||||
ForwardButtonStateIfNeeded(
|
||||
jni, mActivityObject, mForwardVRInputMethodID, 102 /* BUTTON_L1 */,
|
||||
mInputStateFrame.mSqueezeTriggerState[InputStateFrame::LEFT_CONTROLLER], "l1");
|
||||
ForwardButtonStateIfNeeded(
|
||||
jni, mActivityObject, mForwardVRInputMethodID, 103 /* BUTTON_R1 */,
|
||||
mInputStateFrame.mSqueezeTriggerState[InputStateFrame::RIGHT_CONTROLLER], "r1");
|
||||
|
||||
{
|
||||
// Right is circlepad, left is leftstick/circlepad, dpad is whatever
|
||||
// has thumbstick pressed.
|
||||
const auto leftStickHand = InputStateFrame::LEFT_CONTROLLER;
|
||||
const auto cStickHand = InputStateFrame::RIGHT_CONTROLLER;
|
||||
|
||||
const auto& leftThumbrestTouchState =
|
||||
mInputStateFrame.mThumbrestTouchState[InputStateFrame::LEFT_CONTROLLER];
|
||||
const auto& rightThumbrestTouchState =
|
||||
mInputStateFrame.mThumbrestTouchState[InputStateFrame::RIGHT_CONTROLLER];
|
||||
const int dpadHand =
|
||||
leftThumbrestTouchState.currentState ? InputStateFrame::RIGHT_CONTROLLER
|
||||
: rightThumbrestTouchState.currentState ? InputStateFrame::LEFT_CONTROLLER
|
||||
: InputStateFrame::NUM_CONTROLLERS;
|
||||
|
||||
{
|
||||
static constexpr float kThumbStickDirectionThreshold = 0.5f;
|
||||
// Doing it this way helps ensure we don't leave the dpad
|
||||
// pressed if the thumbstick is released while still
|
||||
// pointing in the same direction.
|
||||
// I hope this is right, I didn't test it very much.
|
||||
static bool wasDpadLeft = false;
|
||||
static bool wasDpadRight = false;
|
||||
static bool wasDpadUp = false;
|
||||
static bool wasDpadDown = false;
|
||||
|
||||
const bool hasDpad = dpadHand != InputStateFrame::NUM_CONTROLLERS;
|
||||
const auto& dpadThumbstickState =
|
||||
mInputStateFrame.mThumbStickState[hasDpad ? dpadHand : leftStickHand];
|
||||
|
||||
if (hasDpad && dpadThumbstickState.currentState.y > kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID, 19 /* DPAD_UP */,
|
||||
1);
|
||||
wasDpadUp = true;
|
||||
} else if (wasDpadUp) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID, 19 /* DPAD_UP */,
|
||||
0);
|
||||
wasDpadUp = false;
|
||||
}
|
||||
if (hasDpad &&
|
||||
dpadThumbstickState.currentState.y < -kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
20 /* DPAD_DOWN */, 1);
|
||||
wasDpadDown = true;
|
||||
} else if (wasDpadDown) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
20 /* DPAD_DOWN */, 0);
|
||||
wasDpadDown = false;
|
||||
}
|
||||
if (hasDpad &&
|
||||
dpadThumbstickState.currentState.x < -kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
21 /* DPAD_LEFT */, 1);
|
||||
wasDpadLeft = true;
|
||||
} else if (wasDpadLeft) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
21 /* DPAD_LEFT */, 0);
|
||||
wasDpadLeft = false;
|
||||
}
|
||||
|
||||
if (hasDpad && dpadThumbstickState.currentState.x > kThumbStickDirectionThreshold) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
22 /* DPAD_RIGHT */, 1);
|
||||
wasDpadRight = true;
|
||||
} else if (wasDpadRight) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRInputMethodID,
|
||||
22 /* DPAD_RIGHT */, 0);
|
||||
wasDpadRight = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpadHand != cStickHand) {
|
||||
const auto cStickThumbstickState = mInputStateFrame.mThumbStickState[cStickHand];
|
||||
if (cStickThumbstickState.currentState.y != 0 ||
|
||||
cStickThumbstickState.currentState.x != 0 ||
|
||||
cStickThumbstickState.changedSinceLastSync) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRJoystickMethodID,
|
||||
cStickThumbstickState.currentState.x,
|
||||
cStickThumbstickState.currentState.y, 0);
|
||||
}
|
||||
}
|
||||
if (dpadHand != leftStickHand) {
|
||||
const auto leftStickThumbstickState =
|
||||
mInputStateFrame.mThumbStickState[leftStickHand];
|
||||
if (leftStickThumbstickState.currentState.y != 0 ||
|
||||
leftStickThumbstickState.currentState.x != 0 ||
|
||||
leftStickThumbstickState.changedSinceLastSync) {
|
||||
jni->CallVoidMethod(mActivityObject, mForwardVRJoystickMethodID,
|
||||
leftStickThumbstickState.currentState.x,
|
||||
leftStickThumbstickState.currentState.y, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HandleSessionStateChanges(const XrSessionState state) {
|
||||
if (state == XR_SESSION_STATE_READY) {
|
||||
assert(mIsXrSessionActive == false);
|
||||
|
|
Loading…
Reference in a new issue