From 77c3cf4e104a5bb1638c0c9c0486eb3b7923c2d4 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Sun, 8 May 2022 11:27:55 -0700 Subject: [PATCH] Further fixes for OpenXR --- src/client/entry.qc | 3 +++ src/client/view.qc | 4 ++-- src/shared/player.qc | 2 +- src/shared/player_pmove.qc | 10 ++++++--- src/xr/NSXRInput.qc | 43 ++++++++++++++++++++++++++------------ src/xr/xr.h | 5 ++++- src/xr/xr.qc | 19 ++++++++++++----- 7 files changed, 61 insertions(+), 25 deletions(-) diff --git a/src/client/entry.qc b/src/client/entry.qc index 1848b28b..94ccb01d 100644 --- a/src/client/entry.qc +++ b/src/client/entry.qc @@ -131,6 +131,9 @@ void CSQC_RenderScene(void) { renderscene(); + + if (XR_Available(pSeat->m_ePlayer)) + renderscene(); /* render it twice, for the normal window */ } /* diff --git a/src/client/view.qc b/src/client/view.qc index 31f86d75..7e8d3709 100644 --- a/src/client/view.qc +++ b/src/client/view.qc @@ -211,8 +211,8 @@ View_DrawViewModel(void) m_eViewModel.origin = pl.m_xrInputRight.GetOrigin(); if (XR_Available(pl)) { - m_eViewModel.angles = pl.m_xrInputLeft.GetAngles(); - m_eViewModelL.angles = pl.m_xrInputRight.GetAngles(); + m_eViewModel.angles = pl.m_xrInputRight.GetAngles(); + m_eViewModelL.angles = pl.m_xrInputLeft.GetAngles(); } else { /* we only calculate bob on the right model, to avoid double speed bobbing */ Viewmodel_CalcBob(); diff --git a/src/shared/player.qc b/src/shared/player.qc index 177ec292..9c431066 100644 --- a/src/shared/player.qc +++ b/src/shared/player.qc @@ -204,7 +204,7 @@ base_player::ClientInputFrame(void) /* some input overrides for XR */ if (XR_Available(this)) { if (pSeat->m_bMoveForward) { - input_movevalues[0] = cvar("cl_forwardspeed"); + input_movevalues[0] = 100; } if (pSeat->m_iInputAttack) { diff --git a/src/shared/player_pmove.qc b/src/shared/player_pmove.qc index 47721eca..ef19816f 100644 --- a/src/shared/player_pmove.qc +++ b/src/shared/player_pmove.qc @@ -350,8 +350,12 @@ base_player::Physics_Run(void) } } - - m_xrSpace.SetOrigin(origin + view_ofs); - m_xrSpace.SetAngles(angles); + if (XR_Available(this)) { + m_xrSpace.SetOrigin(origin); + m_xrSpace.SetAngles(input_angles); + } else { + m_xrSpace.SetOrigin(origin + view_ofs); + m_xrSpace.SetAngles(input_angles); + } #endif } diff --git a/src/xr/NSXRInput.qc b/src/xr/NSXRInput.qc index 600f4dd3..4df5b20e 100644 --- a/src/xr/NSXRInput.qc +++ b/src/xr/NSXRInput.qc @@ -33,7 +33,11 @@ NSXRInput::GetAngles(void) return [0,0,0]; } - return m_xrSpace.RoomToWorldAngles(m_vecAngles); + if (m_inputType != XR_INPUT_HEAD) + return m_xrSpace.RoomToWorldAngles(m_vecAngles); + + /* head only cares about reporting yaw right now */ + return m_xrSpace.RoomToWorldAngles([0, m_vecAngles[1], 0]); } vector @@ -71,27 +75,40 @@ NSXRInput::InputFrame(void) { switch (m_inputType) { case XR_INPUT_HEAD: - m_vecOrigin = input_head_origin; - m_vecAngles = input_head_angles; - m_vecVelocity = input_head_velocity; - m_vecAVelocity = input_head_avelocity; m_iStatus = input_head_status; + + if (m_iStatus & XR_STATUS_ORG) + m_vecOrigin = input_head_origin; + if (m_iStatus & XR_STATUS_ANG) + m_vecAngles = input_head_angles; + if (m_iStatus & XR_STATUS_VEL) + m_vecVelocity = input_head_velocity; + if (m_iStatus & XR_STATUS_AVEL) + m_vecAVelocity = input_head_avelocity; m_iWeapon = input_head_weapon; break; case XR_INPUT_LEFT: - m_vecOrigin = input_left_origin; - m_vecAngles = input_left_angles; - m_vecVelocity = input_left_velocity; - m_vecAVelocity = input_left_avelocity; m_iStatus = input_left_status; + if (m_iStatus & XR_STATUS_ORG) + m_vecOrigin = input_left_origin; + if (m_iStatus & XR_STATUS_ANG) + m_vecAngles = input_left_angles; + if (m_iStatus & XR_STATUS_VEL) + m_vecVelocity = input_left_velocity; + if (m_iStatus & XR_STATUS_AVEL) + m_vecAVelocity = input_left_avelocity; m_iWeapon = input_left_weapon; break; case XR_INPUT_RIGHT: - m_vecOrigin = input_right_origin; - m_vecAngles = input_right_angles; - m_vecVelocity = input_right_velocity; - m_vecAVelocity = input_right_avelocity; m_iStatus = input_right_status; + if (m_iStatus & XR_STATUS_ORG) + m_vecOrigin = input_right_origin; + if (m_iStatus & XR_STATUS_ANG) + m_vecAngles = input_right_angles; + if (m_iStatus & XR_STATUS_VEL) + m_vecVelocity = input_right_velocity; + if (m_iStatus & XR_STATUS_AVEL) + m_vecAVelocity = input_right_avelocity; m_iWeapon = input_right_weapon; break; default: diff --git a/src/xr/xr.h b/src/xr/xr.h index 0c3e26b6..6e981761 100644 --- a/src/xr/xr.h +++ b/src/xr/xr.h @@ -21,4 +21,7 @@ void XR_InputFrame(entity); #ifdef CLIENT void XR_UpdateView(entity); -#endif \ No newline at end of file +#endif + +var float autocvar_xr_roomscale = 1.0f; +var float autocvar_xr_viewheight = -48.0f; \ No newline at end of file diff --git a/src/xr/xr.qc b/src/xr/xr.qc index eaa72846..6f297608 100644 --- a/src/xr/xr.qc +++ b/src/xr/xr.qc @@ -68,12 +68,20 @@ XR_UpdateView(entity ePlayer) return; /* update our space */ - pl.m_xrSpace.SetOrigin(pSeat->m_vecPredictedOrigin + pSeat->m_ePlayer.view_ofs); - pl.m_xrSpace.SetAngles(input_angles); + if (XR_Available(ePlayer)) { + pl.m_xrSpace.SetOrigin(pSeat->m_vecPredictedOrigin); + pl.m_xrSpace.SetAngles(view_angles); - /* now we get the HMD's org/ang and send that off to the renderer */ - setviewprop(VF_ANGLES, pl.m_xrInputHead.GetAngles()); - setviewprop(VF_ORIGIN, pl.m_xrInputHead.GetOrigin()); + /* now we get the HMD's org/ang and send that off to the renderer */ + setviewprop(VF_ANGLES, pl.m_xrInputHead.GetAngles()); + setviewprop(VF_ORIGIN, pl.m_xrInputHead.GetOrigin() + [0,0,autocvar_xr_viewheight]); + } else { + pl.m_xrSpace.SetOrigin(pSeat->m_vecPredictedOrigin + pSeat->m_ePlayer.view_ofs); + pl.m_xrSpace.SetAngles(input_angles); + + setviewprop(VF_ANGLES, pl.m_xrInputHead.GetAngles()); + setviewprop(VF_ORIGIN, pl.m_xrInputHead.GetOrigin()); + } } #endif @@ -104,6 +112,7 @@ XR_InputFrame(entity ePlayer) pl.m_xrInputHead.InputFrame(); pl.m_xrInputLeft.InputFrame(); pl.m_xrInputRight.InputFrame(); + } bool