public override bool GatherInput(XRControllerState[] state_controllers, out int controllerCount, out bool leftSet, out int leftSetIndex, out bool rightSet, out int rightSetIndex, out SideToSet sideToSet) { // defaults GatherInputDefaults(out controllerCount, out leftSet, out leftSetIndex, out rightSet, out rightSetIndex, out sideToSet); // reset controllers ResetControllers(state_controllers); // gather input foreach (var c in controllers) { if (!c.isValid || (c.characteristics & InputDeviceCharacteristics.Controller) == 0) { continue; } var controller = state_controllers[controllerCount]; controller.connected = true; // set type if (c.name.StartsWith("Oculus")) { controller.type = XRInputControllerType.Oculus; } else if (c.name.StartsWith("Spatial Controller")) { controller.type = XRInputControllerType.WMR; } else if (c.name.StartsWith("HP Reverb G2 Controller")) { controller.type = XRInputControllerType.WMR_G2; } else if (c.name.StartsWith("HTC Vive")) { controller.type = XRInputControllerType.HTCVive; } else if (c.name.StartsWith("Index Controller")) { controller.type = XRInputControllerType.ValveIndex; } else { controller.type = XRInputControllerType.Unknown; } bool simulateGripAnalog = controller.type != XRInputControllerType.Oculus && controller.type != XRInputControllerType.WMR_G2; // update buttons states bool triggerValueValid = c.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue); bool triggerButton = false; if (!c.TryGetFeatureValue(CommonUsages.triggerButton, out triggerButton)) { if (triggerValueValid) { if (triggerValue >= .75f) { triggerButton = true; // virtually simulate trigger button in case it doesn't exist } else { triggerButton = false; } } else { triggerButton = false; } } controller.buttonTrigger.Update(triggerButton); if (controller.type == XRInputControllerType.WMR) { if (c.TryGetFeatureValue(CommonUsages.secondary2DAxisClick, out bool joystickButton)) { controller.buttonJoystick.Update(joystickButton); } else { controller.buttonJoystick.Update(false); } if (c.TryGetFeatureValue(CommonUsages.primary2DAxisClick, out bool joystickButton2)) { controller.buttonJoystick2.Update(joystickButton2); } else { controller.buttonJoystick2.Update(false); } } else { if (c.TryGetFeatureValue(CommonUsages.primary2DAxisClick, out bool joystickButton)) { controller.buttonJoystick.Update(joystickButton); } else { controller.buttonJoystick.Update(false); } } if (c.TryGetFeatureValue(CommonUsages.gripButton, out bool gripButton)) { controller.buttonGrip.Update(gripButton); } else { controller.buttonGrip.Update(false); } if (c.TryGetFeatureValue(CommonUsages.menuButton, out bool menuButton)) { controller.buttonMenu.Update(menuButton); } else { controller.buttonMenu.Update(false); } if (c.TryGetFeatureValue(CommonUsages.primaryButton, out bool button1)) { controller.button1.Update(button1); } else { controller.button1.Update(false); } if (c.TryGetFeatureValue(CommonUsages.secondaryButton, out bool button2)) { controller.button2.Update(button2); } else { controller.button2.Update(false); } // update analog states if (triggerValueValid) { controller.trigger.Update(triggerValue); } else { controller.trigger.Update(0); } if (simulateGripAnalog && controller.buttonGrip.on) { controller.grip.Update(1); } else if (c.TryGetFeatureValue(CommonUsages.grip, out float gripValue)) { controller.grip.Update(gripValue); } else { controller.grip.Update(0); } // update joystick states if (controller.type == XRInputControllerType.WMR) { if (c.TryGetFeatureValue(CommonUsages.secondary2DAxis, out Vector2 joystick)) { controller.joystick.Update(joystick); } else { controller.joystick.Update(Vector2.zero); } if (c.TryGetFeatureValue(CommonUsages.primary2DAxis, out Vector2 joystick2)) { controller.joystick2.Update(joystick2); } else { controller.joystick2.Update(Vector2.zero); } } else { if (c.TryGetFeatureValue(CommonUsages.primary2DAxis, out Vector2 joystick)) { controller.joystick.Update(joystick); } else { controller.joystick.Update(Vector2.zero); } if (c.TryGetFeatureValue(CommonUsages.secondary2DAxis, out Vector2 joystick2)) { controller.joystick2.Update(joystick2); } else { controller.joystick2.Update(Vector2.zero); } } // update touch states if (controller.type == XRInputControllerType.WMR) { controller.touchJoystick.Update(false); controller.touchJoystick2.Update(controller.joystick2.value.magnitude >= XRControllerJoystick.tolerance); } else if (controller.type == XRInputControllerType.Oculus) { if (c.TryGetFeatureValue(OculusUsages.indexTouch, out bool triggerTouch)) { controller.touchTrigger.Update(triggerTouch); } else { controller.touchTrigger.Update(false); } if (c.TryGetFeatureValue(OculusUsages.thumbTouch, out bool joystickTouch)) { controller.touchJoystick.Update(joystickTouch); } else { controller.touchJoystick.Update(false); } } if (c.TryGetFeatureValue(CommonUsages.primaryTouch, out bool touch1)) { controller.touch1.Update(touch1); } else { controller.touch1.Update(false); } if (c.TryGetFeatureValue(CommonUsages.secondaryTouch, out bool touch2)) { controller.touch2.Update(touch2); } else { controller.touch2.Update(false); } // update controller side if ((c.characteristics & InputDeviceCharacteristics.Left) != 0) { if (leftSet)// if left already set, assume this is right { controller.side = XRControllerSide.Right; rightSet = true; rightSetIndex = controllerCount; handRight = c; } else { controller.side = XRControllerSide.Left; leftSet = true; leftSetIndex = controllerCount; handLeft = c; } } else if ((c.characteristics & InputDeviceCharacteristics.Right) != 0) { if (rightSet)// if right already set, assume this is left { controller.side = XRControllerSide.Left; leftSet = true; leftSetIndex = controllerCount; handLeft = c; } else { controller.side = XRControllerSide.Right; rightSet = true; rightSetIndex = controllerCount; handRight = c; } } else { controller.side = XRControllerSide.Unknown; } state_controllers[controllerCount] = controller; ++controllerCount; } // finish GatherInputFinish(state_controllers, controllerCount, ref leftSet, ref leftSetIndex, ref rightSet, ref rightSetIndex, ref sideToSet); if (sideToSet == SideToSet.Left || sideToSet == SideToSet.Both) { handLeft = controllers[leftSetIndex]; } if (sideToSet == SideToSet.Right || sideToSet == SideToSet.Both) { handRight = controllers[rightSetIndex]; } return(true); }
public unsafe override bool GatherInput(XRControllerState[] state_controllers, out int controllerCount, out bool leftSet, out int leftSetIndex, out bool rightSet, out int rightSetIndex, out SideToSet sideToSet) { // defaults GatherInputDefaults(out controllerCount, out leftSet, out leftSetIndex, out rightSet, out rightSetIndex, out sideToSet); // reset controllers ResetControllers(state_controllers); // validate OpenVR is avaliable if (!isInit) { return(false); } if (system == null || !system.IsInputAvailable() || input.IsUsingLegacyInput()) { return(false); } // get controller connection status and side for (uint i = 0; i != OpenVR.k_unMaxTrackedDeviceCount; ++i) { if (!system.IsTrackedDeviceConnected(i)) { continue; } if (system.GetTrackedDeviceClass(i) != ETrackedDeviceClass.Controller) { continue; } // get controller type ETrackedPropertyError e = ETrackedPropertyError.TrackedProp_Success; system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ControllerType_String, OpenVR_Shared.propertyText, (uint)OpenVR_Shared.propertyText.Capacity, ref e); if (e != ETrackedPropertyError.TrackedProp_Success) { continue; } // ignore gamepads if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_Gamepad)) { continue; } // get controller var controller = state_controllers[controllerCount]; controller.connected = true; // get controller type if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_ViveController)) { controller.type = XRInputControllerType.HTCVive; } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_ViveCosmosController)) { controller.type = XRInputControllerType.HTCViveCosmos; } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_IndexController)) { controller.type = XRInputControllerType.ValveIndex; } else if (OpenVR_Shared.propertyText.ToString().StartsWith(OpenVR_Shared.propertyText_Oculus.ToString())) { controller.type = XRInputControllerType.Oculus; } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_WMR)) { controller.type = XRInputControllerType.WMR; } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_WMR_G2)) { controller.type = XRInputControllerType.WMR_G2; } // update controller side var role = system.GetControllerRoleForTrackedDeviceIndex(i); switch (role) { case ETrackedControllerRole.LeftHand: controller.side = XRControllerSide.Left; leftSet = true; leftSetIndex = controllerCount; leftHand = (int)i; break; case ETrackedControllerRole.RightHand: controller.side = XRControllerSide.Right; rightSet = true; rightSetIndex = controllerCount; rightHand = (int)i; break; default: controller.side = XRControllerSide.Unknown; break; } state_controllers[controllerCount] = controller; ++controllerCount; } // pre-finish/pre-resolve unknown controller sides GatherInputFinish(state_controllers, controllerCount, ref leftSet, ref leftSetIndex, ref rightSet, ref rightSetIndex, ref sideToSet); // update inputs var error = input.UpdateActionState(actionSets, (uint)Marshal.SizeOf <VRActiveActionSet_t>()); if (error != EVRInputError.None) { Debug.LogError("UpdateActionState: " + error.ToString()); } // get hands var controllerRight = new XRControllerState(); var controllerLeft = new XRControllerState(); if (rightSet) { controllerRight = state_controllers[rightSetIndex]; } if (leftSet) { controllerLeft = state_controllers[leftSetIndex]; } // update bumper buttons/touch controllerRight.buttonBumper.Update(GetButtonState(viveAction_BumperButton, viveSource_RightHand)); controllerLeft.buttonBumper.Update(GetButtonState(viveAction_BumperButton, viveSource_LeftHand)); controllerRight.touchBumper.Update(GetButtonState(viveAction_BumperTouch, viveSource_RightHand)); controllerLeft.touchBumper.Update(GetButtonState(viveAction_BumperTouch, viveSource_LeftHand)); // update trigger buttons/touch controllerRight.buttonTrigger.Update(GetButtonState(viveAction_TriggerButton, viveSource_RightHand)); controllerLeft.buttonTrigger.Update(GetButtonState(viveAction_TriggerButton, viveSource_LeftHand)); controllerRight.touchTrigger.Update(GetButtonState(viveAction_TriggerTouch, viveSource_RightHand)); controllerLeft.touchTrigger.Update(GetButtonState(viveAction_TriggerTouch, viveSource_LeftHand)); // update grip buttons/touch controllerRight.buttonGrip.Update(GetButtonState(viveAction_GripButton, viveSource_RightHand)); controllerLeft.buttonGrip.Update(GetButtonState(viveAction_GripButton, viveSource_LeftHand)); controllerRight.touchGrip.Update(GetButtonState(viveAction_GripTouch, viveSource_RightHand)); controllerLeft.touchGrip.Update(GetButtonState(viveAction_GripTouch, viveSource_LeftHand)); // update menu buttons/touch controllerRight.buttonMenu.Update(GetButtonState(viveAction_MenuButton, viveSource_RightHand)); controllerLeft.buttonMenu.Update(GetButtonState(viveAction_MenuButton, viveSource_LeftHand)); controllerRight.touchMenu.Update(GetButtonState(viveAction_MenuTouch, viveSource_RightHand)); controllerLeft.touchMenu.Update(GetButtonState(viveAction_MenuTouch, viveSource_LeftHand)); // update button/touch 1 controllerRight.button1.Update(GetButtonState(viveAction_Button1, viveSource_RightHand)); controllerLeft.button1.Update(GetButtonState(viveAction_Button1, viveSource_LeftHand)); controllerRight.touch1.Update(GetButtonState(viveAction_Touch1, viveSource_RightHand)); controllerLeft.touch1.Update(GetButtonState(viveAction_Touch1, viveSource_LeftHand)); // update button/touch 2 controllerRight.button2.Update(GetButtonState(viveAction_Button2, viveSource_RightHand)); controllerLeft.button2.Update(GetButtonState(viveAction_Button2, viveSource_LeftHand)); controllerRight.touch2.Update(GetButtonState(viveAction_Touch2, viveSource_RightHand)); controllerLeft.touch2.Update(GetButtonState(viveAction_Touch2, viveSource_LeftHand)); // update grip if (controllerRight.type == XRInputControllerType.HTCVive || controllerRight.type == XRInputControllerType.WMR) { controllerRight.grip.Update(controllerRight.buttonGrip.on ? 1 : 0);// simulate analog state } else { controllerRight.grip.Update(GetAnalogState(viveAction_Grip, viveSource_RightHand).x); } if (controllerLeft.type == XRInputControllerType.HTCVive || controllerLeft.type == XRInputControllerType.WMR) { controllerLeft.grip.Update(controllerLeft.buttonGrip.on ? 1 : 0);// simulate analog state } else { controllerLeft.grip.Update(GetAnalogState(viveAction_Grip, viveSource_LeftHand).x); } // update triggers controllerRight.trigger.Update(GetAnalogState(viveAction_Trigger, viveSource_RightHand).x); controllerLeft.trigger.Update(GetAnalogState(viveAction_Trigger, viveSource_LeftHand).x); // update trackpads / touch / button if (controllerRight.type == XRInputControllerType.HTCVive) { controllerRight.joystick.Update(GetAnalogState(viveAction_Touchpad1, viveSource_RightHand)); controllerRight.buttonJoystick.Update(GetButtonState(viveAction_Touchpad1_Button, viveSource_RightHand)); } else { controllerRight.joystick2.Update(GetAnalogState(viveAction_Touchpad1, viveSource_RightHand)); controllerRight.buttonJoystick2.Update(GetButtonState(viveAction_Touchpad1_Button, viveSource_RightHand)); } if (controllerLeft.type == XRInputControllerType.HTCVive) { controllerLeft.joystick.Update(GetAnalogState(viveAction_Touchpad1, viveSource_LeftHand)); controllerLeft.buttonJoystick.Update(GetButtonState(viveAction_Touchpad1_Button, viveSource_LeftHand)); } else { controllerLeft.joystick2.Update(GetAnalogState(viveAction_Touchpad1, viveSource_LeftHand)); controllerLeft.buttonJoystick2.Update(GetButtonState(viveAction_Touchpad1_Button, viveSource_LeftHand)); } // update joysticks / touch / button if (controllerRight.type != XRInputControllerType.HTCVive) { controllerRight.joystick.Update(GetAnalogState(viveAction_Joystick1, viveSource_RightHand)); controllerRight.touchJoystick.Update(GetButtonState(viveAction_Joystick1_Touch, viveSource_RightHand)); controllerRight.buttonJoystick.Update(GetButtonState(viveAction_Joystick1_Button, viveSource_RightHand)); } if (controllerLeft.type != XRInputControllerType.HTCVive) { controllerLeft.joystick.Update(GetAnalogState(viveAction_Joystick1, viveSource_LeftHand)); controllerLeft.touchJoystick.Update(GetButtonState(viveAction_Joystick1_Touch, viveSource_LeftHand)); controllerLeft.buttonJoystick.Update(GetButtonState(viveAction_Joystick1_Button, viveSource_LeftHand)); } // copy back hand updates if (rightSet) { state_controllers[rightSetIndex] = controllerRight; } if (leftSet) { state_controllers[leftSetIndex] = controllerLeft; } return(true); }
public override bool GatherInput(XRControllerState[] state_controllers, out int controllerCount, out bool leftSet, out int leftSetIndex, out bool rightSet, out int rightSetIndex, out SideToSet sideToSet) { // defaults GatherInputDefaults(out controllerCount, out leftSet, out leftSetIndex, out rightSet, out rightSetIndex, out sideToSet); leftHand = -1; rightHand = -1; // reset controllers ResetControllers(state_controllers); // validate OpenVR is avaliable var system = OpenVR.System; if (system == null || !system.IsInputAvailable()) { return(false); } // gather input for (uint i = 0; i != OpenVR.k_unMaxTrackedDeviceCount; ++i) { if (!system.IsTrackedDeviceConnected(i)) { continue; } // update controller state if (system.GetTrackedDeviceClass(i) != ETrackedDeviceClass.Controller) { continue; } var state = new VRControllerState_t(); if (system.GetControllerState(i, ref state, (uint)Marshal.SizeOf <VRControllerState_t>())) { // get controller type ETrackedPropertyError e = ETrackedPropertyError.TrackedProp_Success; system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ControllerType_String, OpenVR_Shared.propertyText, (uint)OpenVR_Shared.propertyText.Capacity, ref e); if (e != ETrackedPropertyError.TrackedProp_Success) { continue; } // ignore gamepads if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_Gamepad)) { continue; } // get controller var controller = state_controllers[controllerCount]; controller.connected = true; // update button & touch states if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_ViveController))// specialize input for odd Vive button layout { controller.type = XRInputControllerType.HTCVive; // buttons controller.buttonTrigger.Update((state.ulButtonPressed & 8589934592) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 4) != 0); controller.buttonMenu.Update((state.ulButtonPressed & 2) != 0); controller.button1.Update((state.ulButtonPressed & 4294967296) != 0); // touch controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touch1.Update((state.ulButtonTouched & 4294967296) != 0); // update joystick states if (state.ulButtonTouched != 0) { controller.joystick.Update(new Vector2(state.rAxis0.x, state.rAxis0.y)); } else { controller.joystick.Update(Vector2.zero); } } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_ViveCosmosController)) { controller.type = XRInputControllerType.HTCViveCosmos; // buttons controller.buttonJoystick.Update((state.ulButtonPressed & 4294967296) != 0); controller.buttonBumper.Update((state.ulButtonPressed & 34359738368) != 0); controller.buttonTrigger.Update((state.ulButtonPressed & 8589934592) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 4) != 0); controller.button2.Update((state.ulButtonPressed & 2) != 0);// button 2 is the same as grip controller.button1.Update((state.ulButtonPressed & 128) != 0); // touch controller.touchJoystick.Update((state.ulButtonTouched & 4294967296) != 0); controller.touchBumper.Update((state.ulButtonTouched & 34359738368) != 0); controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touchGrip.Update((state.ulButtonTouched & 4) != 0); controller.touch2.Update((state.ulButtonTouched & 2) != 0);// button 2 is the same as grip controller.touch1.Update((state.ulButtonTouched & 128) != 0); // update joystick states controller.joystick.Update(new Vector2(state.rAxis0.x, state.rAxis0.y)); } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_IndexController))// specialize input for odd Vive button layout { controller.type = XRInputControllerType.ValveIndex; // buttons controller.buttonJoystick.Update((state.ulButtonPressed & 4294967296) != 0); controller.buttonTrigger.Update((state.ulButtonPressed & 8589934592) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 4) != 0); //controller.button2.Update((state.ulButtonPressed & 4) != 0);// button 2 is the same as grip controller.button1.Update((state.ulButtonPressed & 2) != 0); // touch controller.touchJoystick.Update((state.ulButtonTouched & 4294967296) != 0); controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touchGrip.Update((state.ulButtonTouched & 4) != 0); //controller.touch2.Update((state.ulButtonTouched & 4) != 0);// button 2 is the same as grip controller.touch1.Update((state.ulButtonTouched & 2) != 0); // update joystick states controller.joystick.Update(new Vector2(state.rAxis0.x, state.rAxis0.y)); } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_WMR))// specialize input for WMR button layout { controller.type = XRInputControllerType.WMR; // buttons bool triggerButton = (state.ulButtonPressed & 8589934592) != 0;// get normal trigger button state if avaliable if (state.rAxis1.x >= .75f) { triggerButton = true; // virtually simulate trigger button in case it doesn't exist } controller.buttonTrigger.Update(triggerButton); controller.buttonJoystick.Update((state.ulButtonPressed & 17179869184) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 34359738372) != 0); controller.button1.Update(state.ulButtonPressed == 4294967296); //controller.button2.Update(state.ulButtonPressed == 4294967296); controller.buttonMenu.Update(state.ulButtonPressed == 2); // touch controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touchJoystick.Update((state.ulButtonTouched & 17179869184) != 0); controller.touchGrip.Update((state.ulButtonTouched & 34359738372) != 0); controller.touch1.Update(state.ulButtonTouched == 4294967296); //controller.touch2.Update(state.ulButtonTouched == 4294967296); controller.touchMenu.Update(state.ulButtonTouched == 2); // update joystick states controller.joystick.Update(new Vector2(state.rAxis2.x, state.rAxis2.y)); controller.joystick2.Update(new Vector2(state.rAxis0.x, state.rAxis0.y)); } else if (OpenVR_Shared.propertyText.Equals(OpenVR_Shared.propertyText_WMR_G2))// specialize input for WMR_G2 button layout { controller.type = XRInputControllerType.WMR_G2; // buttons bool triggerButton = (state.ulButtonPressed & 8589934592) != 0;// get normal trigger button state if avaliable if (state.rAxis1.x >= .75f) { triggerButton = true; // virtually simulate trigger button in case it doesn't exist } controller.buttonTrigger.Update(triggerButton); controller.buttonJoystick.Update((state.ulButtonPressed & 17179869184) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 34359738372) != 0); controller.button1.Update(state.ulButtonPressed == 4294967424); controller.button2.Update(state.ulButtonPressed == 4294967296); // touch controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touchJoystick.Update((state.ulButtonTouched & 17179869184) != 0); controller.touchGrip.Update((state.ulButtonTouched & 34359738372) != 0); controller.touch1.Update(state.ulButtonTouched == 4294967424); controller.touch2.Update(state.ulButtonTouched == 4294967296); // update joystick states controller.joystick.Update(new Vector2(state.rAxis2.x, state.rAxis2.y)); } else// agnostic controller mappings (defaults to Oculus mappings) { controller.type = XRInputControllerType.Unknown; // buttons bool triggerButton = (state.ulButtonPressed & 8589934592) != 0;// get normal trigger button state if avaliable if (state.rAxis1.x >= .75f) { triggerButton = true; // virtually simulate trigger button in case it doesn't exist } controller.buttonTrigger.Update(triggerButton); controller.buttonJoystick.Update((state.ulButtonPressed & 4294967296) != 0); controller.buttonGrip.Update((state.ulButtonPressed & 17179869188) != 0); controller.button1.Update((state.ulButtonPressed & 128) != 0); controller.button2.Update((state.ulButtonPressed & 2) != 0); // touch controller.touchTrigger.Update((state.ulButtonTouched & 8589934592) != 0); controller.touchJoystick.Update((state.ulButtonTouched & 4294967296) != 0); controller.touchGrip.Update((state.ulButtonTouched & 17179869188) != 0); controller.touch1.Update((state.ulButtonTouched & 128) != 0); controller.touch2.Update((state.ulButtonTouched & 2) != 0); // update joystick states controller.joystick.Update(new Vector2(state.rAxis0.x, state.rAxis0.y)); } // update analog states controller.trigger.Update(state.rAxis1.x); // update controller side var role = system.GetControllerRoleForTrackedDeviceIndex(i); switch (role) { case ETrackedControllerRole.LeftHand: controller.side = XRControllerSide.Left; leftSet = true; leftSetIndex = controllerCount; leftHand = (int)i; break; case ETrackedControllerRole.RightHand: controller.side = XRControllerSide.Right; rightSet = true; rightSetIndex = controllerCount; rightHand = (int)i; break; default: controller.side = XRControllerSide.Unknown; break; } state_controllers[controllerCount] = controller; ++controllerCount; } } // finish GatherInputFinish(state_controllers, controllerCount, ref leftSet, ref leftSetIndex, ref rightSet, ref rightSetIndex, ref sideToSet); return(true); }
protected void GatherInputFinish(XRControllerState[] state_controllers, int controllerCount, ref bool leftSet, ref int leftSetIndex, ref bool rightSet, ref int rightSetIndex, ref SideToSet sideToSet) { // if left or right not known use controller index as side (also makes sure not to override used index) if (!leftSet || !rightSet) { if (controllerCount == 1) { if (!leftSet && !rightSet) { state_controllers[0].side = XRControllerSide.Right; rightSetIndex = 0; rightSet = true; sideToSet = SideToSet.Right; } else { sideToSet = leftSet ? SideToSet.Left : SideToSet.Right; } } else if (controllerCount >= 2) { int rightI = 0; int leftI = 1; if (!rightSet && !leftSet) { rightI = 0; leftI = 1; } else if (!rightSet) { leftI = leftSetIndex; rightI = leftI == 0 ? 1 : 0; } else if (!leftSet) { rightI = rightSetIndex; leftI = rightI == 0 ? 1 : 0; } state_controllers[rightI].side = XRControllerSide.Right; state_controllers[leftI].side = XRControllerSide.Left; leftSetIndex = leftI; rightSetIndex = rightI; rightSet = true; leftSet = true; sideToSet = SideToSet.Both; } } else { sideToSet = SideToSet.Both; } }
public abstract bool GatherInput(XRControllerState[] state_controllers, out int controllerCount, out bool leftSet, out int leftSetIndex, out bool rightSet, out int rightSetIndex, out SideToSet sideToSet);
protected void GatherInputDefaults(out int state_controllerCount, out bool leftSet, out int leftSetIndex, out bool rightSet, out int rightSetIndex, out SideToSet sideToSet) { state_controllerCount = 0; leftSet = false; leftSetIndex = -1; rightSet = false; rightSetIndex = -1; sideToSet = SideToSet.None; }