mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-10 07:06:52 +02:00
OpenVR simple input
This commit is contained in:
@@ -723,29 +723,6 @@ void vrInit() {
|
||||
LOG("! compositor initialization failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
//set manifest
|
||||
vr::VRInput()->SetActionManifestPath("C:/Users/Austin/Desktop/OpenLaraGitTest2/OpenLara/bin/TombRaidervr_actions.json"); // needs absolutepath
|
||||
// get action handles
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Left", &VRcLeft);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Right", &VRcRight);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Up", &VRcUp);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Down", &VRcDown);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Jump", &VRcJump);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Walk", &VRcWalk);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Action", &VRcAction);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Weapon", &VRcWeapon);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Roll", &VRcRoll);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Inventory", &VRcInventory);
|
||||
vr::VRInput()->GetActionHandle("/actions/demo/in/Start", &VRcStart);
|
||||
//get actionsethandle
|
||||
vr::VRInput()->GetActionSetHandle("/actions/demo", &m_actionsetDemo);
|
||||
//get input source handles
|
||||
vr::VRInput()->GetInputSourceHandle("/user/hand/left", &m_leftHand);
|
||||
vr::VRInput()->GetInputSourceHandle("/user/hand/right", &m_rightHand);
|
||||
// aren't using right now
|
||||
//vr::VRInput()->GetActionHandle("/actions/demo/in/TriggerHaptic", &m_actionTriggerHaptic);
|
||||
//vr::VRInput()->GetActionHandle("/actions/demo/in/AnalogInput", &m_actionAnalongInput);
|
||||
}
|
||||
|
||||
void vrInitTargets() {
|
||||
@@ -796,76 +773,92 @@ bool GetDigitalActionState(vr::VRActionHandle_t action, vr::VRInputValueHandle_t
|
||||
return actionData.bActive && actionData.bState;
|
||||
}
|
||||
|
||||
|
||||
void ProcessVREvent(const vr::VREvent_t &event) {
|
||||
char buffer[1024] = "test";
|
||||
switch (event.eventType) {
|
||||
case vr::VREvent_TrackedDeviceActivated:
|
||||
//SetupRenderModelForTrackedDevice( event.trackedDeviceIndex );
|
||||
//vr::RenderModel_t ** controllerRender;
|
||||
hmd->GetStringTrackedDeviceProperty(event.trackedDeviceIndex, vr::ETrackedDeviceProperty::Prop_RenderModelName_String, buffer, 1024); // can be filled with an error,but I can't find the right type
|
||||
//rm->LoadRenderModel_Async(buffer, controllerRender);
|
||||
// need to process render model?
|
||||
LOG("Device %u attached. Setting up render model\n", event.trackedDeviceIndex);
|
||||
break;
|
||||
case vr::VREvent_TrackedDeviceDeactivated:
|
||||
LOG("Device %u detached.\n", event.trackedDeviceIndex);
|
||||
Input::reset();
|
||||
break;
|
||||
case vr::VREvent_TrackedDeviceUpdated: //not sure what to do here
|
||||
LOG("Device %u updated.\n", event.trackedDeviceIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void vrUpdateInput() {
|
||||
void vrUpdate() {
|
||||
if (!hmd) return;
|
||||
|
||||
vr::VREvent_t event;
|
||||
|
||||
while (hmd->PollNextEvent(&event, sizeof(event))) {
|
||||
ProcessVREvent(event);
|
||||
switch (event.eventType) {
|
||||
case vr::VREvent_TrackedDeviceActivated:
|
||||
break;
|
||||
case vr::VREvent_TrackedDeviceDeactivated:
|
||||
Input::reset();
|
||||
break;
|
||||
case vr::VREvent_TrackedDeviceUpdated:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
vr::VRActiveActionSet_t actionSet = { 0 };
|
||||
actionSet.ulActionSet = m_actionsetDemo;
|
||||
vr::VRInput()->UpdateActionState(&actionSet, sizeof(actionSet), 1);
|
||||
|
||||
Input::hmd.state[cUp] = GetDigitalActionState(VRcUp);
|
||||
Input::hmd.state[cDown] = GetDigitalActionState(VRcDown);
|
||||
Input::hmd.state[cRight] = GetDigitalActionState(VRcRight);
|
||||
Input::hmd.state[cLeft] = GetDigitalActionState(VRcLeft);
|
||||
Input::hmd.state[cJump] = GetDigitalActionState(VRcJump);
|
||||
Input::hmd.state[cWalk] = GetDigitalActionState(VRcWalk);
|
||||
Input::hmd.state[cAction] = GetDigitalActionState(VRcAction);
|
||||
Input::hmd.state[cWeapon] = GetDigitalActionState(VRcWeapon);
|
||||
Input::hmd.state[cRoll] = GetDigitalActionState(VRcRoll);
|
||||
Input::hmd.state[cStart] = GetDigitalActionState(VRcStart);
|
||||
Input::hmd.state[cInventory] = GetDigitalActionState(VRcInventory);
|
||||
}
|
||||
|
||||
void vrUpdateView() {
|
||||
if (!hmd) return;
|
||||
vr::VRCompositor()->WaitGetPoses(tPose, vr::k_unMaxTrackedDeviceCount, NULL, 0);
|
||||
|
||||
if (!tPose[vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid)
|
||||
return;
|
||||
for (int id = 0; id < vr::k_unMaxTrackedDeviceCount; id++) {
|
||||
vr::TrackedDevicePose_t &pose = tPose[id];
|
||||
|
||||
mat4 pL = convToMat4(hmd->GetProjectionMatrix(vr::Eye_Left, 8.0f, 45.0f * 1024.0f));
|
||||
mat4 pR = convToMat4(hmd->GetProjectionMatrix(vr::Eye_Right, 8.0f, 45.0f * 1024.0f));
|
||||
if (!pose.bPoseIsValid) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mat4 head = convToMat4(tPose[vr::k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking);
|
||||
if (Input::hmd.zero.x == INF)
|
||||
Input::hmd.zero = head.getPos();
|
||||
head.setPos(head.getPos() - Input::hmd.zero);
|
||||
switch (hmd->GetTrackedDeviceClass(id)) {
|
||||
case vr::TrackedDeviceClass_HMD : {
|
||||
mat4 pL = convToMat4(hmd->GetProjectionMatrix(vr::Eye_Left, 8.0f, 45.0f * 1024.0f));
|
||||
mat4 pR = convToMat4(hmd->GetProjectionMatrix(vr::Eye_Right, 8.0f, 45.0f * 1024.0f));
|
||||
|
||||
mat4 vL = head * convToMat4(hmd->GetEyeToHeadTransform(vr::Eye_Left));
|
||||
mat4 vR = head * convToMat4(hmd->GetEyeToHeadTransform(vr::Eye_Right));
|
||||
mat4 head = convToMat4(pose.mDeviceToAbsoluteTracking);
|
||||
if (Input::hmd.zero.x == INF) {
|
||||
Input::hmd.zero = head.getPos();
|
||||
}
|
||||
head.setPos(head.getPos() - Input::hmd.zero);
|
||||
|
||||
vL.setPos(vL.getPos() * ONE_METER);
|
||||
vR.setPos(vR.getPos() * ONE_METER);
|
||||
Input::hmd.setView(pL, pR, vL, vR);
|
||||
mat4 vL = head * convToMat4(hmd->GetEyeToHeadTransform(vr::Eye_Left));
|
||||
mat4 vR = head * convToMat4(hmd->GetEyeToHeadTransform(vr::Eye_Right));
|
||||
|
||||
Input::hmd.head = head;
|
||||
vL.setPos(vL.getPos() * ONE_METER);
|
||||
vR.setPos(vR.getPos() * ONE_METER);
|
||||
Input::hmd.setView(pL, pR, vL, vR);
|
||||
|
||||
Input::hmd.head = head;
|
||||
break;
|
||||
}
|
||||
case vr::TrackedDeviceClass_Controller : {
|
||||
vr::VRControllerState_t state;
|
||||
hmd->GetControllerState(id, &state, sizeof(state));
|
||||
|
||||
#define IS_DOWN(btn) ((state.ulButtonPressed & vr::ButtonMaskFromId(btn)) != 0)
|
||||
|
||||
if (!state.ulButtonPressed) {
|
||||
// continue;
|
||||
}
|
||||
|
||||
Input::setJoyDown(0, jkLeft, IS_DOWN(vr::k_EButton_DPad_Left));
|
||||
Input::setJoyDown(0, jkUp, IS_DOWN(vr::k_EButton_DPad_Up));
|
||||
Input::setJoyDown(0, jkRight, IS_DOWN(vr::k_EButton_DPad_Right));
|
||||
Input::setJoyDown(0, jkDown, IS_DOWN(vr::k_EButton_DPad_Down));
|
||||
|
||||
if (IS_DOWN(vr::k_EButton_Axis0)) {
|
||||
Input::setJoyPos(0, jkL, vec2(state.rAxis[0].x, -state.rAxis[0].y));
|
||||
}
|
||||
|
||||
Input::setJoyDown(0, jkA, IS_DOWN(vr::k_EButton_Axis1) ? (state.rAxis[1].x > 0.5) : false);
|
||||
Input::setJoyDown(0, jkY, IS_DOWN(vr::k_EButton_Grip));
|
||||
Input::setJoyDown(0, jkX, IS_DOWN(vr::k_EButton_ApplicationMenu));
|
||||
|
||||
// TODO
|
||||
switch (hmd->GetControllerRoleForTrackedDeviceIndex(id)) {
|
||||
case vr::TrackedControllerRole_LeftHand :
|
||||
// TODO
|
||||
break;
|
||||
case vr::TrackedControllerRole_RightHand :
|
||||
// TODO
|
||||
break;
|
||||
default : ;
|
||||
}
|
||||
break;
|
||||
|
||||
#undef IS_DOWN
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vrCompose() {
|
||||
@@ -895,8 +888,7 @@ void osToggleVR(bool enable) {
|
||||
Core::settings.detail.stereo = Core::Settings::STEREO_OFF;
|
||||
}
|
||||
|
||||
void vrUpdateInput() {}
|
||||
void vrUpdateView() {}
|
||||
void vrUpdate() {}
|
||||
void vrCompose() {}
|
||||
|
||||
#endif // #ifdef VR_SUPPORT
|
||||
@@ -975,9 +967,8 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
|
||||
Core::quit();
|
||||
} else {
|
||||
joyUpdate();
|
||||
vrUpdateInput();
|
||||
vrUpdate();
|
||||
if (Game::update()) {
|
||||
vrUpdateView();
|
||||
Game::render();
|
||||
vrCompose();
|
||||
Core::waitVBlank();
|
||||
|
Reference in New Issue
Block a user