Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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;
            }
        }
Beispiel #5
0
 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);
Beispiel #6
0
 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;
 }