2020-03-13 23:56:52 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#include "OpenVRControllerMapper.h"
|
|
|
|
#include "mozilla/StaticPrefs_dom.h"
|
|
|
|
|
|
|
|
#include "VRSession.h"
|
|
|
|
|
|
|
|
namespace mozilla::gfx {
|
|
|
|
|
|
|
|
OpenVRControllerMapper::OpenVRControllerMapper()
|
|
|
|
: mNumButtons(0), mNumAxes(0) {}
|
|
|
|
|
|
|
|
void OpenVRControllerMapper::GetButtonValueFromAction(
|
|
|
|
VRControllerState& aControllerState, const ControllerAction& aPressAction,
|
|
|
|
const ControllerAction& aTouchAction) {
|
|
|
|
vr::InputDigitalActionData_t actionData = {};
|
|
|
|
bool bPressed = false;
|
|
|
|
bool bTouched = false;
|
|
|
|
uint64_t mask = 0;
|
|
|
|
|
|
|
|
if (aPressAction.handle &&
|
|
|
|
vr::VRInput()->GetDigitalActionData(
|
|
|
|
aPressAction.handle, &actionData, sizeof(actionData),
|
|
|
|
vr::k_ulInvalidInputValueHandle) == vr::VRInputError_None &&
|
|
|
|
actionData.bActive) {
|
|
|
|
bPressed = actionData.bState;
|
|
|
|
mask = (1ULL << mNumButtons);
|
|
|
|
aControllerState.triggerValue[mNumButtons] = bPressed ? 1.0 : 0.0f;
|
|
|
|
if (bPressed) {
|
|
|
|
aControllerState.buttonPressed |= mask;
|
|
|
|
} else {
|
|
|
|
aControllerState.buttonPressed &= ~mask;
|
|
|
|
}
|
|
|
|
if (aTouchAction.handle &&
|
|
|
|
vr::VRInput()->GetDigitalActionData(
|
|
|
|
aTouchAction.handle, &actionData, sizeof(actionData),
|
|
|
|
vr::k_ulInvalidInputValueHandle) == vr::VRInputError_None) {
|
|
|
|
bTouched = actionData.bActive && actionData.bState;
|
|
|
|
mask = (1ULL << mNumButtons);
|
|
|
|
if (bTouched) {
|
|
|
|
aControllerState.buttonTouched |= mask;
|
|
|
|
} else {
|
|
|
|
aControllerState.buttonTouched &= ~mask;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
++mNumButtons;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void OpenVRControllerMapper::GetTriggerValueFromAction(
|
|
|
|
VRControllerState& aControllerState, const ControllerAction& aAction) {
|
|
|
|
vr::InputAnalogActionData_t analogData = {};
|
|
|
|
const float triggerThreshold =
|
|
|
|
StaticPrefs::dom_vr_controller_trigger_threshold();
|
|
|
|
|
|
|
|
if (aAction.handle &&
|
|
|
|
vr::VRInput()->GetAnalogActionData(
|
|
|
|
aAction.handle, &analogData, sizeof(analogData),
|
|
|
|
vr::k_ulInvalidInputValueHandle) == vr::VRInputError_None &&
|
|
|
|
analogData.bActive) {
|
|
|
|
VRSession::UpdateTrigger(aControllerState, mNumButtons, analogData.x,
|
|
|
|
triggerThreshold);
|
|
|
|
++mNumButtons;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void OpenVRControllerMapper::GetAxisValueFromAction(
|
|
|
|
VRControllerState& aControllerState, const ControllerAction& aAction,
|
|
|
|
bool aInvertAxis) {
|
|
|
|
vr::InputAnalogActionData_t analogData = {};
|
|
|
|
const float yAxisInvert = (aInvertAxis) ? -1.0f : 1.0f;
|
|
|
|
|
|
|
|
if (aAction.handle &&
|
|
|
|
vr::VRInput()->GetAnalogActionData(
|
|
|
|
aAction.handle, &analogData, sizeof(analogData),
|
|
|
|
vr::k_ulInvalidInputValueHandle) == vr::VRInputError_None &&
|
|
|
|
analogData.bActive) {
|
|
|
|
aControllerState.axisValue[mNumAxes] = analogData.x;
|
|
|
|
++mNumAxes;
|
|
|
|
aControllerState.axisValue[mNumAxes] = analogData.y * yAxisInvert;
|
|
|
|
++mNumAxes;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-07 11:53:08 +03:00
|
|
|
} // namespace mozilla::gfx
|