controllers done i guess

This commit is contained in:
2026-06-15 16:11:55 +03:00
parent c51080a903
commit 900b12a6a6
14 changed files with 206 additions and 48 deletions

View File

@@ -51,6 +51,7 @@ struct OpenXRAction
XrAction m_action;
XrActionType m_eType;
XrSpace m_space;
EXRInputType_t m_eUserInputType;
};
class COpenXRController: public IXRController
@@ -68,7 +69,7 @@ public:
EXRControllerType_t m_type;
EXRControllerSide_t m_side;
CUtlVector<OpenXRAction> m_actions;
XrActionSet m_actionSet;
XrActionSet m_actionSet = XR_NULL_HANDLE;
XRInputCallbackFn m_callback = NULL;
};
@@ -97,9 +98,9 @@ public:
XrSession m_session;
XrSpace m_space;
CUtlVector<EyeSwapchain_t> m_eyeSwapchains;
CUtlVector<XrCompositionLayerProjectionView> m_projviews;
CUtlVector<XrView> m_views;
CUtlVector<EyeSwapchain_t> m_eyeSwapchains = {};
CUtlVector<XrCompositionLayerProjectionView> m_projviews = {};
CUtlVector<XrView> m_views = {};
float m_fPredictedTime;
COpenXRController *m_pLeftHand;
@@ -177,7 +178,11 @@ void COpenXRController::Frame()
XrActionStateBoolean b = {};
b.type = XR_TYPE_ACTION_STATE_BOOLEAN;
xrGetActionStateBoolean(m_pHeadset->m_session, &gi, &b);
V_printf("%s %b\n", a.m_szName.GetString(), b.currentState);
EXRInputValue_t v;
v.type = k_EXRValue_Bool;
v.b.value = b.currentState;
if (m_callback)
m_callback( this, a.m_eUserInputType, NULL, k_EXRInputAction_Value, v );
break;
}
case XR_ACTION_TYPE_FLOAT_INPUT:
@@ -188,7 +193,11 @@ void COpenXRController::Frame()
XrActionStateFloat f32 = {};
f32.type = XR_TYPE_ACTION_STATE_FLOAT;
xrGetActionStateFloat(m_pHeadset->m_session, &gi, &f32);
V_printf("%s %f\n", a.m_szName.GetString(), f32.currentState);
EXRInputValue_t v;
v.type = k_EXRValue_Float;
v.f32.value = f32.currentState;
if (m_callback)
m_callback( this, a.m_eUserInputType, NULL, k_EXRInputAction_Value, v );
break;
}
case XR_ACTION_TYPE_POSE_INPUT:
@@ -208,8 +217,9 @@ void COpenXRController::Frame()
EXRInputValue_t v;
v.type = k_EXRValue_Pose;
v.pose.pos = {s.pose.position.x, s.pose.position.y, s.pose.position.z};
v.pose.rot = {s.pose.orientation.x, s.pose.orientation.y, s.pose.orientation.z, s.pose.orientation.w};
if (m_callback)
m_callback( this, k_EXRInput_Grip, NULL, k_EXRInputAction_Pose, v );
m_callback( this, a.m_eUserInputType, NULL, k_EXRInputAction_Pose, v );
}
break;
}
@@ -247,6 +257,82 @@ void COpenXRController::ConfigureActionSets( const char *szDevice, const char *s
{
IJSONValue *pInput = (*pInputs)[i];
CUtlString szInputName = (*pInput)["name"]->GetStringValue();
EXRInputType_t eInputType = k_EXRInput_FromString;
if (szInputName == "trackpad")
eInputType = k_EXRInput_Trackpad;
if (szInputName == "thumbstick")
eInputType = k_EXRInput_Thumbstick;
if (szInputName == "joystick")
eInputType = k_EXRInput_Joystick;
if (szInputName == "trigger")
eInputType = k_EXRInput_Trigger;
if (szInputName == "throttle")
eInputType = k_EXRInput_Throttle;
if (szInputName == "trackball")
eInputType = k_EXRInput_Trackball;
if (szInputName == "pedal")
eInputType = k_EXRInput_Pedal;
if (szInputName == "system")
eInputType = k_EXRInput_System;
if (szInputName == "dpad_up")
eInputType = k_EXRInput_Dpad_Up;
if (szInputName == "dpad_down")
eInputType = k_EXRInput_Dpad_Down;
if (szInputName == "dpad_left")
eInputType = k_EXRInput_Dpad_Left;
if (szInputName == "dpad_right")
eInputType = k_EXRInput_Dpad_Right;
if (szInputName == "diamond_up")
eInputType = k_EXRInput_Diamond_Up;
if (szInputName == "diamond_down")
eInputType = k_EXRInput_Diamond_Down;
if (szInputName == "diamond_left")
eInputType = k_EXRInput_Diamond_Left;
if (szInputName == "diamond_right")
eInputType = k_EXRInput_Diamond_Right;
if (szInputName == "a")
eInputType = k_EXRInput_A;
if (szInputName == "b")
eInputType = k_EXRInput_B;
if (szInputName == "x")
eInputType = k_EXRInput_X;
if (szInputName == "y")
eInputType = k_EXRInput_Y;
if (szInputName == "start")
eInputType = k_EXRInput_Start;
if (szInputName == "home")
eInputType = k_EXRInput_Home;
if (szInputName == "end")
eInputType = k_EXRInput_End;
if (szInputName == "select")
eInputType = k_EXRInput_Select;
if (szInputName == "volume_up")
eInputType = k_EXRInput_Volume_Up;
if (szInputName == "volume_down")
eInputType = k_EXRInput_Volume_Down;
if (szInputName == "mute_mic")
eInputType = k_EXRInput_Mute_Mic;
if (szInputName == "play_pause")
eInputType = k_EXRInput_Play_Pause;
if (szInputName == "menu")
eInputType = k_EXRInput_Menu;
if (szInputName == "view")
eInputType = k_EXRInput_View;
if (szInputName == "back")
eInputType = k_EXRInput_Back;
if (szInputName == "thumbrest")
eInputType = k_EXRInput_ThumbRest;
if (szInputName == "shoulder")
eInputType = k_EXRInput_Shoulder;
if (szInputName == "squeeze")
eInputType = k_EXRInput_Squeeze;
if (szInputName == "wheel")
eInputType = k_EXRInput_Wheel;
if (szInputName == "grip")
eInputType = k_EXRInput_Grip;
if (szInputName == "aim")
eInputType = k_EXRInput_Aim;
IJSONValue *pActions = (*pInput)["actions"];
for (uint32_t y = 0; y < pActions->GetArray()->GetCount(); y++ )
@@ -284,6 +370,7 @@ void COpenXRController::ConfigureActionSets( const char *szDevice, const char *s
action.m_szName = szName;
action.m_action = a;
action.m_eType = eType;
action.m_eUserInputType = eInputType;
if (eType == XR_ACTION_TYPE_POSE_INPUT)
{
XrActionSpaceCreateInfo asci = {};
@@ -666,7 +753,7 @@ formatPicked:
if (!V_strcmp(c, "/user/hand/right"))
{
m_pRightHand = new COpenXRController;
m_pRightHand->m_side = k_EXRController_Left;
m_pRightHand->m_side = k_EXRController_Right;
m_pRightHand->m_pHeadset = this;
for ( auto &p: s_interactionProfiles )
if (s == p.m_szName)