Bug 1299929 - Part 3: Handle VRController button inputs; r?kip
MozReview-Commit-ID: DxI0dcc4uET
--- a/gfx/vr/VRManager.cpp
+++ b/gfx/vr/VRManager.cpp
@@ -171,16 +171,19 @@ VRManager::NotifyVsync(const TimeStamp&
}
for (auto iter = mVRDisplays.Iter(); !iter.Done(); iter.Next()) {
gfx::VRDisplayHost* display = iter.UserData();
display->NotifyVSync();
}
if (bHaveEventListener) {
+ for (uint32_t i = 0; i < mControllerManagers.Length(); ++i) {
+ mControllerManagers[i]->HandleInput();
+ }
// If content has set an EventHandler to be notified of VR display events
// we must continually refresh the VR display enumeration to check
// for events that we must fire such as Window.onvrdisplayconnect
// Note that enumeration itself may activate display hardware, such
// as Oculus, so we only do this when we know we are displaying content
// that is looking for VR displays.
if (mLastRefreshTime.IsNull()) {
// This is the first vsync, must refresh VR displays
@@ -354,20 +357,16 @@ VRManager::RefreshVRControllers()
if (controllerInfoChanged) {
mVRControllers.Clear();
for (const auto& controller : controllers) {
mVRControllers.Put(controller->GetControllerInfo().GetControllerID(),
controller);
}
}
-
- for (uint32_t i = 0; i < mControllerManagers.Length(); ++i) {
- mControllerManagers[i]->HandleInput();
- }
}
void
VRManager::ScanForDevices()
{
for (uint32_t i = 0; i < mControllerManagers.Length(); ++i) {
mControllerManagers[i]->ScanForDevices();
}
--- a/gfx/vr/gfxVR.h
+++ b/gfx/vr/gfxVR.h
@@ -257,14 +257,18 @@ public:
protected:
VRControllerManager() : mInstalled(false), mControllerCount(0) {}
virtual ~VRControllerManager() {}
bool mInstalled;
uint32_t mControllerCount;
static Atomic<uint32_t> sControllerBase;
+
+private:
+ virtual void HandleButtonPress(uint32_t aControllerIdx,
+ uint64_t aButtonPressed) = 0;
};
} // namespace gfx
} // namespace mozilla
#endif /* GFX_VR_H */
--- a/gfx/vr/gfxVROpenVR.cpp
+++ b/gfx/vr/gfxVROpenVR.cpp
@@ -49,16 +49,45 @@ typedef void * (VR_CALLTYPE * pfn_VR_Get
static pfn_VR_InitInternal vr_InitInternal = nullptr;
static pfn_VR_ShutdownInternal vr_ShutdownInternal = nullptr;
static pfn_VR_IsHmdPresent vr_IsHmdPresent = nullptr;
static pfn_VR_IsRuntimeInstalled vr_IsRuntimeInstalled = nullptr;
static pfn_VR_GetStringForHmdError vr_GetStringForHmdError = nullptr;
static pfn_VR_GetGenericInterface vr_GetGenericInterface = nullptr;
+// EButton_System, EButton_DPad_xx, and EButton_A
+// can not be triggered in Steam Vive in OpenVR SDK 1.0.3.
+const uint64_t gOpenVRButtonMask[] = {
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_System),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_ApplicationMenu),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Grip),
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_DPad_Left),
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_DPad_Up),
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_DPad_Right),
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_DPad_Down),
+ // vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_A),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_SteamVR_Touchpad),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_SteamVR_Trigger)
+};
+
+const uint32_t gNumOpenVRButtonMask = sizeof(gOpenVRButtonMask) /
+ sizeof(uint64_t);
+
+const uint64_t gOpenVRAxisMask[] = {
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Axis0),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Axis1),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Axis2),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Axis3),
+ vr::ButtonMaskFromId(vr::EVRButtonId::k_EButton_Axis4)
+};
+
+const uint32_t gNumOpenVRAxisMask = sizeof(gOpenVRAxisMask) /
+ sizeof(uint64_t);
+
bool
LoadOpenVRRuntime()
{
static PRLibrary *openvrLib = nullptr;
nsAdoptingCString openvrPath = Preferences::GetCString("gfx.vr.openvr-runtime");
if (!openvrPath)
return false;
@@ -443,16 +472,19 @@ VRDisplayManagerOpenVR::GetHMDs(nsTArray
}
}
VRControllerOpenVR::VRControllerOpenVR()
: VRControllerHost(VRDeviceType::OpenVR)
{
MOZ_COUNT_CTOR_INHERITED(VRControllerOpenVR, VRControllerHost);
mControllerInfo.mControllerName.AssignLiteral("OpenVR HMD");
+ mControllerInfo.mMappingType = dom::GamepadMappingType::_empty;
+ mControllerInfo.mNumButtons = gNumOpenVRButtonMask;
+ mControllerInfo.mNumAxes = gNumOpenVRAxisMask;
}
VRControllerOpenVR::~VRControllerOpenVR()
{
MOZ_COUNT_DTOR_INHERITED(VRControllerOpenVR, VRControllerHost);
}
void
@@ -520,40 +552,48 @@ VRControllerManagerOpenVR::Destroy()
{
mOpenVRController.Clear();
mOpenVRInstalled = false;
}
void
VRControllerManagerOpenVR::HandleInput()
{
+ RefPtr<impl::VRControllerOpenVR> controller;
+ vr::VRControllerState_t state;
+
MOZ_ASSERT(mVRSystem);
// Process OpenVR controller state
- for (vr::TrackedDeviceIndex_t trackedDevice = 0;
- trackedDevice < vr::k_unMaxTrackedDeviceCount; trackedDevice++ ) {
- vr::VRControllerState_t state;
+ for (uint32_t i = 0; i < mOpenVRController.Length(); ++i) {
+ controller = mOpenVRController[i];
- if (mVRSystem->GetTrackedDeviceClass(trackedDevice)
- != vr::TrackedDeviceClass_Controller) {
- continue;
- }
+ MOZ_ASSERT(mVRSystem->GetTrackedDeviceClass(controller->GetTrackedIndex())
+ == vr::TrackedDeviceClass_Controller);
- if (mVRSystem->GetControllerState(trackedDevice, &state)) {
+ if (mVRSystem->GetControllerState(controller->GetTrackedIndex(), &state)) {
if (state.ulButtonPressed) {
- // TODO: For Bug 1299929 after landing, convert the button mask to an ID button
- // NewButtonEvent(1,
- // 0,
- // 0,
- // true);
+ HandleButtonPress(controller->GetIndex(), state.ulButtonPressed);
}
+
+ // Handle Axis support in Bug 1299930
}
}
+}
- return;
+void
+VRControllerManagerOpenVR::HandleButtonPress(uint32_t aControllerIdx,
+ uint64_t aButtonPressed)
+{
+ uint64_t buttonMask = 0;
+
+ for (uint32_t i = 0; i < gNumOpenVRButtonMask; ++i) {
+ buttonMask = gOpenVRButtonMask[i];
+ NewButtonEvent(aControllerIdx, i, aButtonPressed & buttonMask);
+ }
}
void
VRControllerManagerOpenVR::GetControllers(nsTArray<RefPtr<VRControllerHost>>& aControllerResult)
{
if (!mOpenVRInstalled) {
return;
}
@@ -586,12 +626,12 @@ VRControllerManagerOpenVR::ScanForDevice
RefPtr<VRControllerOpenVR> openVRController = new VRControllerOpenVR();
openVRController->SetIndex(mControllerCount);
openVRController->SetTrackedIndex(trackedDevice);
mOpenVRController.AppendElement(openVRController);
// Not already present, add it.
AddGamepad("OpenVR Gamepad", GamepadMappingType::_empty,
- kOpenVRControllerAxes, kOpenVRControllerButtons);
+ gNumOpenVRButtonMask, gNumOpenVRAxisMask);
++mControllerCount;
}
}
\ No newline at end of file
--- a/gfx/vr/gfxVROpenVR.h
+++ b/gfx/vr/gfxVROpenVR.h
@@ -115,21 +115,21 @@ public:
virtual void GetControllers(nsTArray<RefPtr<VRControllerHost>>&
aControllerResult) override;
virtual void ScanForDevices() override;
private:
VRControllerManagerOpenVR();
~VRControllerManagerOpenVR();
+ virtual void HandleButtonPress(uint32_t aControllerIdx,
+ uint64_t aButtonPressed) override;
+
bool mOpenVRInstalled;
nsTArray<RefPtr<impl::VRControllerOpenVR>> mOpenVRController;
vr::IVRSystem *mVRSystem;
-
- const uint32_t kOpenVRControllerButtons = 8;
- const uint32_t kOpenVRControllerAxes = 5;
};
} // namespace gfx
} // namespace mozilla
#endif /* GFX_VR_OPENVR_H */