mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Bug 1419344 - Adjust OpenVR input mapping for Microsoft Mixed Reality controllers. r=kip
MozReview-Commit-ID: 2NzaDM9iXrB
This commit is contained in:
parent
0a14f7c86b
commit
87c982950e
@ -597,6 +597,7 @@ VRControllerOpenVR::StopVibrateHaptic()
|
||||
|
||||
VRSystemManagerOpenVR::VRSystemManagerOpenVR()
|
||||
: mVRSystem(nullptr)
|
||||
, mIsWindowsMR(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -698,6 +699,9 @@ VRSystemManagerOpenVR::HandleInput()
|
||||
}
|
||||
|
||||
RefPtr<impl::VRControllerOpenVR> controller;
|
||||
// Compare with Edge, we have a wrong implementation for the vertical axis value.
|
||||
// In order to not affect the current VR content, we add a workaround for yAxis.
|
||||
const float yAxisInvert = (mIsWindowsMR) ? -1.0f : 1.0f;
|
||||
::vr::VRControllerState_t state;
|
||||
::vr::TrackedDevicePose_t poses[::vr::k_unMaxTrackedDeviceCount];
|
||||
mVRSystem->GetDeviceToAbsoluteTrackingPose(::vr::TrackingUniverseSeated, 0.0f,
|
||||
@ -737,17 +741,29 @@ VRSystemManagerOpenVR::HandleInput()
|
||||
switch (axisType) {
|
||||
case ::vr::EVRControllerAxisType::k_eControllerAxis_Joystick:
|
||||
case ::vr::EVRControllerAxisType::k_eControllerAxis_TrackPad:
|
||||
if (mIsWindowsMR) {
|
||||
// Adjust the input mapping for Windows MR which has
|
||||
// different order.
|
||||
axisIdx = (axisIdx == 0) ? 2 : 0;
|
||||
buttonIdx = (buttonIdx == 0) ? 4 : 0;
|
||||
}
|
||||
|
||||
HandleAxisMove(i, axisIdx,
|
||||
state.rAxis[j].x);
|
||||
++axisIdx;
|
||||
HandleAxisMove(i, axisIdx,
|
||||
state.rAxis[j].y);
|
||||
state.rAxis[j].y * yAxisInvert);
|
||||
++axisIdx;
|
||||
HandleButtonPress(i, buttonIdx,
|
||||
::vr::ButtonMaskFromId(
|
||||
static_cast<::vr::EVRButtonId>(::vr::k_EButton_Axis0 + j)),
|
||||
state.ulButtonPressed, state.ulButtonTouched);
|
||||
++buttonIdx;
|
||||
|
||||
if (mIsWindowsMR) {
|
||||
axisIdx = (axisIdx == 4) ? 2 : 4;
|
||||
buttonIdx = (buttonIdx == 5) ? 1 : 2;
|
||||
}
|
||||
break;
|
||||
case vr::EVRControllerAxisType::k_eControllerAxis_Trigger:
|
||||
if (j <= 2) {
|
||||
@ -755,6 +771,7 @@ VRSystemManagerOpenVR::HandleInput()
|
||||
++buttonIdx;
|
||||
++triggerIdx;
|
||||
} else {
|
||||
// For SteamVR Knuckles.
|
||||
HandleTriggerPress(i, buttonIdx, triggerIdx, state.rAxis[j].x);
|
||||
++buttonIdx;
|
||||
++triggerIdx;
|
||||
@ -791,6 +808,11 @@ VRSystemManagerOpenVR::HandleInput()
|
||||
state.ulButtonPressed, state.ulButtonTouched);
|
||||
++buttonIdx;
|
||||
}
|
||||
if (mIsWindowsMR) {
|
||||
// button 4 in Windows MR has already been assigned
|
||||
// to k_eControllerAxis_TrackPad.
|
||||
++buttonIdx;
|
||||
}
|
||||
if (supportedButtons &
|
||||
BTN_MASK_FROM_ID(k_EButton_DPad_Left)) {
|
||||
HandleButtonPress(i, buttonIdx,
|
||||
@ -1160,6 +1182,7 @@ VRSystemManagerOpenVR::GetControllerDeviceId(::vr::ETrackedDeviceClass aDeviceTy
|
||||
{
|
||||
::vr::ETrackedPropertyError err;
|
||||
uint32_t requiredBufferLen;
|
||||
bool founded = false;
|
||||
char charBuf[128];
|
||||
requiredBufferLen = mVRSystem->GetStringTrackedDeviceProperty(aDeviceIndex,
|
||||
::vr::Prop_RenderModelName_String, charBuf, 128, &err);
|
||||
@ -1170,7 +1193,21 @@ VRSystemManagerOpenVR::GetControllerDeviceId(::vr::ETrackedDeviceClass aDeviceTy
|
||||
nsCString deviceId(charBuf);
|
||||
if (deviceId.Find("knuckles") != kNotFound) {
|
||||
aId.AssignLiteral("OpenVR Knuckles");
|
||||
} else {
|
||||
founded = true;
|
||||
}
|
||||
requiredBufferLen = mVRSystem->GetStringTrackedDeviceProperty(aDeviceIndex,
|
||||
::vr::Prop_SerialNumber_String, charBuf, 128, &err);
|
||||
if (requiredBufferLen > 128) {
|
||||
MOZ_CRASH("Larger than the buffer size.");
|
||||
}
|
||||
MOZ_ASSERT(requiredBufferLen && err == ::vr::TrackedProp_Success);
|
||||
deviceId.Assign(charBuf);
|
||||
if (deviceId.Find("MRSOURCE") != kNotFound) {
|
||||
aId.AssignLiteral("Spatial Controller (Spatial Interaction Source) ");
|
||||
mIsWindowsMR = true;
|
||||
founded = true;
|
||||
}
|
||||
if (!founded) {
|
||||
aId.AssignLiteral("OpenVR Gamepad");
|
||||
}
|
||||
break;
|
||||
|
@ -169,6 +169,7 @@ private:
|
||||
RefPtr<impl::VRDisplayOpenVR> mOpenVRHMD;
|
||||
nsTArray<RefPtr<impl::VRControllerOpenVR>> mOpenVRController;
|
||||
::vr::IVRSystem *mVRSystem;
|
||||
bool mIsWindowsMR;
|
||||
};
|
||||
|
||||
} // namespace gfx
|
||||
|
Loading…
Reference in New Issue
Block a user