Exemplo n.º 1
0
            public static GameObject GetDefaultDeviceModelPrefab(VRModuleDeviceModel modelNum)
            {
                if (modelNum < s_defaultModels.Min || modelNum > s_defaultModels.Max)
                {
                    return(null);
                }

                var modelData = s_defaultModels[modelNum];

                if (!modelData.isLoaded)
                {
                    GameObject modelPrefab = null;
                    int        modelNameIndex;
                    var        info = EnumUtils.GetDisplayInfo(typeof(VRModuleDeviceModel));
                    if (info.value2displayedIndex.TryGetValue((int)modelNum, out modelNameIndex))
                    {
                        modelPrefab = Resources.Load <GameObject>("Models/VIUModel" + info.displayedNames[modelNameIndex]);
                    }
                    s_defaultModels[modelNum] = modelData = new DefaultModelData()
                    {
                        isLoaded = true,
                        model    = modelPrefab,
                    };
                }

                return(modelData.model);
            }
        public static void SetupDeviceIcon(Image image, VRModuleDeviceModel deviceModel, bool connected)
        {
            string spriteName;

            switch (deviceModel)
            {
            case VRModuleDeviceModel.KnucklesLeft:
                spriteName = MODEL_ICON_SPRITE_PREFIX + VRModuleDeviceModel.KnucklesRight;
                image.transform.localScale = new Vector3(-1f, 1f, 1f);
                break;

            case VRModuleDeviceModel.OculusTouchLeft:
                spriteName = MODEL_ICON_SPRITE_PREFIX + VRModuleDeviceModel.OculusTouchRight;
                image.transform.localScale = new Vector3(-1f, 1f, 1f);
                break;

            default:
                spriteName = MODEL_ICON_SPRITE_PREFIX + deviceModel.ToString();
                image.transform.localScale = new Vector3(1f, 1f, 1f);
                break;
            }

            image.sprite = GetSprite(spriteName);

            if (connected)
            {
                image.color = new Color32(0x53, 0xBB, 0x00, 0xFF);
            }
            else
            {
                image.color = new Color32(0x56, 0x56, 0x56, 0xFF);
            }
        }
Exemplo n.º 3
0
        public static void SetupTrackingDeviceIcon(Image image, VRModuleDeviceModel deviceModel, bool bound)
        {
            string spriteName;
            var    scale = Vector3.one;

            switch (deviceModel)
            {
            case VRModuleDeviceModel.ViveHMD:
            case VRModuleDeviceModel.OculusHMD:
                spriteName = "binding_ui_project_HMD";
                break;

            case VRModuleDeviceModel.KnucklesLeft:
                spriteName = MODEL_PROJECT_SPRITE_PREFIX + VRModuleDeviceModel.KnucklesRight;
                scale.x    = -1f;
                break;

            case VRModuleDeviceModel.OculusTouchLeft:
                spriteName = MODEL_PROJECT_SPRITE_PREFIX + VRModuleDeviceModel.OculusTouchRight;
                scale.x    = -1f;
                break;

            default:
                spriteName = MODEL_PROJECT_SPRITE_PREFIX + deviceModel.ToString();
                break;
            }

            var sprite = GetSprite(spriteName);

            //Debug.Log("SetupTrackingDeviceIcon " + deviceModel + " " + bound + " " + spriteName + " null?" + (sprite == null));
            if (sprite == null)
            {
                image.enabled = false;
            }
            else
            {
                image.enabled = true;
                image.sprite  = sprite;

                var spriteRect  = sprite.rect;
                var spritePivot = sprite.pivot;
                image.SetNativeSize();
                image.rectTransform.sizeDelta *= 0.2326f;
                image.rectTransform.pivot      = new Vector2(spritePivot.x / spriteRect.width, spritePivot.y / spriteRect.height);

                image.transform.localScale = scale;

                if (bound)
                {
                    image.color = new Color32(0x21, 0xE3, 0xD8, 0xFF);
                }
                else
                {
                    image.color = new Color32(0x9F, 0xEC, 0x28, 0xFF);
                }
            }
        }
 public static void SetOverrideDeviceModel(VRModuleDeviceModel model, GameObject obj)
 {
     if (Instance == null)
     {
         return;
     }
     if (s_instance.m_overrideDeviceModel == null)
     {
         return;
     }
     s_instance.m_overrideDeviceModel[model] = obj;
 }
Exemplo n.º 5
0
            protected void UpdateDefaultRenderModel(bool shouldActive)
            {
                var deviceState = VRModule.GetDeviceState(hook.GetModelDeviceIndex());

                var lastModelActivated      = m_isModelActivated;
                var lastActivatedModel      = m_activeModel;
                var shouldActiveModelNum    = deviceState.deviceModel;
                var shouldActiveModelPrefab = shouldActive ? GetDefaultDeviceModelPrefab(shouldActiveModelNum) : null;
                var shouldActiveModel       = shouldActive && deviceState.isConnected && shouldActiveModelPrefab != null;

                if (lastModelActivated)
                {
                    if (!shouldActiveModel || lastActivatedModel != shouldActiveModelNum)
                    {
                        // deactivate custom override model
                        var lastActiveModelObj = m_modelObjs[m_activeModel];
                        if (lastActiveModelObj != null && SendBeforeModelDeactivatedMessage(lastActiveModelObj, hook))
                        {
                            lastActiveModelObj.gameObject.SetActive(false);
                        }
                        m_isModelActivated = false;
                    }
                }

                if (shouldActiveModel)
                {
                    var shouldActiveModelObj = m_modelObjs[shouldActiveModelNum];
                    if (shouldActiveModelObj == null)
                    {
                        // instantiate custom override model
                        shouldActiveModelObj = Instantiate(shouldActiveModelPrefab);
                        shouldActiveModelObj.transform.position = Vector3.zero;
                        shouldActiveModelObj.transform.rotation = Quaternion.identity;
                        shouldActiveModelObj.transform.SetParent(hook.transform, false);
                        m_modelObjs[shouldActiveModelNum] = shouldActiveModelObj;
                        m_activeModel      = shouldActiveModelNum;
                        m_isModelActivated = false;
                        SendAfterModelCreatedMessage(shouldActiveModelObj, hook);
                    }

                    if (!m_isModelActivated)
                    {
                        // active custom override model
                        if (SendBeforeModelActivatedMessage(shouldActiveModelObj, hook))
                        {
                            shouldActiveModelObj.gameObject.SetActive(true);
                        }
                        m_isModelActivated = true;
                    }
                }
            }
            public void Update(uint index)
            {
                var deviceState = VRModule.GetDeviceState(index);

                deviceIndex     = index;
                serialNumber    = deviceState.serialNumber;
                modelNumber     = deviceState.modelNumber;
                renderModelName = deviceState.renderModelName;
                deviceClass     = deviceState.deviceClass;
                deviceModel     = deviceState.deviceModel;
                input2DType     = deviceState.input2DType;

                isConnected     = deviceState.isConnected;
                isPoseValid     = deviceState.isPoseValid;
                isOutOfRange    = deviceState.isOutOfRange;
                isCalibrating   = deviceState.isCalibrating;
                isUninitialized = deviceState.isUninitialized;

                velocity        = deviceState.velocity;
                angularVelocity = deviceState.angularVelocity;
                pose            = deviceState.pose;

                UpdateFieldString <VRModuleRawButton>(ref pressedFields, deviceState.buttonPressed, pressed);
                UpdateFieldString <VRModuleRawButton>(ref touchedFields, deviceState.buttonTouched, touched);

                foreach (VRModuleRawAxis i in axisValue.Enums)
                {
                    axisValue[i] = deviceState.GetAxisValue(i);
                }

                jointCount = 0;
                if (deviceState.readOnlyHandJoints != null)
                {
                    foreach (var p in deviceState.readOnlyHandJoints.EnumValues)
                    {
                        handJoints[p.Key] = p.Value;
                        if (p.Value.isValid)
                        {
                            jointCount++;
                        }
                    }
                }
            }
        public static bool IsLeft(this VRModuleDeviceModel deviceModel)
        {
            switch (deviceModel)
            {
            case VRModuleDeviceModel.OculusTouchLeft:
            case VRModuleDeviceModel.KnucklesLeft:
            case VRModuleDeviceModel.WMRControllerLeft:
            case VRModuleDeviceModel.ViveCosmosControllerLeft:
            case VRModuleDeviceModel.OculusQuestControllerLeft:
            case VRModuleDeviceModel.IndexControllerLeft:
            case VRModuleDeviceModel.ViveHandTrackingTrackedHandLeft:
            case VRModuleDeviceModel.WaveLegacyTrackedHandLeft:
            case VRModuleDeviceModel.WaveTrackedHandLeft:
            case VRModuleDeviceModel.OculusTrackedHandLeft:
                return(true);

            default:
                return(false);
            }
        }
Exemplo n.º 8
0
        private void ReloadedStaticModel(VRModuleDeviceModel model)
        {
            CleanUpModelObj();

            var prefab = Resources.Load <GameObject>("Models/VIUModel" + model.ToString());

            if (prefab != null)
            {
                m_modelObj = Instantiate(prefab);
                m_modelObj.transform.SetParent(transform, false);
                m_modelObj.gameObject.name = "VIUModel" + model.ToString();

                if (m_overrideShader != null)
                {
                    var renderer = m_modelObj.GetComponentInChildren <Renderer>();
                    if (renderer != null)
                    {
                        renderer.material.shader = m_overrideShader;
                    }
                }
            }
        }
            public void CopyFrom(DeviceState state)
            {
                m_serialNumber    = state.m_serialNumber;
                m_modelNumber     = state.m_modelNumber;
                m_renderModelName = state.m_renderModelName;
                m_deviceClass     = state.m_deviceClass;
                m_deviceModel     = state.m_deviceModel;

                m_isPoseValid     = state.m_isPoseValid;
                m_isConnected     = state.m_isConnected;
                m_isOutOfRange    = state.m_isOutOfRange;
                m_isCalibrating   = state.m_isCalibrating;
                m_isUninitialized = state.m_isUninitialized;
                m_velocity        = state.m_velocity;
                m_angularVelocity = state.m_angularVelocity;
                m_position        = state.m_position;
                m_rotation        = state.m_rotation;

                m_buttonPressed = state.m_buttonPressed;
                m_buttonTouched = state.m_buttonTouched;
                Array.Copy(state.m_axisValue, m_axisValue, m_axisValue.Length);
            }
        public static bool TryGetDefaultAsset(VRModuleDeviceModel model, out TooltipRigAsset rigAsset)
        {
            if (!EnumArrayBase <VRModuleDeviceModel> .StaticIsValidIndex((int)model))
            {
                rigAsset = null; return(false);
            }

            if (s_defaultTooltipRigSets == null)
            {
                s_defaultTooltipRigSets = new EnumArray <VRModuleDeviceModel, LoadedRigSet>();
            }

            var loadedRigSet = s_defaultTooltipRigSets[(int)model];

            if (!loadedRigSet.haveLoaded)
            {
                TooltipRigAsset asset = null;
                int             modelNameIndex;
                var             info = EnumUtils.GetDisplayInfo(typeof(VRModuleDeviceModel));
                if (info.value2displayedIndex.TryGetValue((int)model, out modelNameIndex))
                {
                    asset = Resources.Load <TooltipRigAsset>("TooltipRig/VIUTooltipRig" + info.displayedNames[modelNameIndex]);
                }

                s_defaultTooltipRigSets[(int)model] = loadedRigSet = new LoadedRigSet()
                {
                    haveLoaded = true,
                    asset      = asset,
                };
            }

            if (loadedRigSet.asset == null)
            {
                rigAsset = null; return(false);
            }

            rigAsset = loadedRigSet.asset;
            return(rigAsset != null);
        }
            public void CopyFrom(DeviceState state)
            {
                m_serialNumber    = state.m_serialNumber;
                m_modelNumber     = state.m_modelNumber;
                m_renderModelName = state.m_renderModelName;
                m_deviceClass     = state.m_deviceClass;
                m_deviceModel     = state.m_deviceModel;
                m_input2DType     = state.m_input2DType;

                m_isPoseValid     = state.m_isPoseValid;
                m_isConnected     = state.m_isConnected;
                m_isOutOfRange    = state.m_isOutOfRange;
                m_isCalibrating   = state.m_isCalibrating;
                m_isUninitialized = state.m_isUninitialized;
                m_velocity        = state.m_velocity;
                m_angularVelocity = state.m_angularVelocity;
                m_position        = state.m_position;
                m_rotation        = state.m_rotation;

                m_buttonPressed = state.m_buttonPressed;
                m_buttonTouched = state.m_buttonTouched;
                Array.Copy(state.m_axisValue, m_axisValue, m_axisValue.Length);

                if (state.m_handJoints == null)
                {
                    m_handJoints = null;
                }
                else
                {
                    if (m_handJoints == null)
                    {
                        m_handJoints = new JointEnumArray();
                    }
                    m_handJoints.CopyFrom(state.m_handJoints);
                }
            }
Exemplo n.º 12
0
            // return true if frame skipped
            public override bool Update()
            {
                if (!ChangeProp.Set(ref updatedFrameCount, Time.frameCount))
                {
                    return(true);
                }

                var deviceIndex = m_map.GetMappedDeviceByRoleValue(m_roleValue);

                // treat this frame as updated if both prevDeviceIndex and currentDeviceIndex are invalid
                if (!VRModule.IsValidDeviceIndex(prevDeviceIndex) && !VRModule.IsValidDeviceIndex(deviceIndex))
                {
                    return(false);
                }

                // get device state
                var currState = VRModule.GetCurrentDeviceState(deviceIndex);

                // copy to previous states
                prevDeviceIndex   = deviceIndex;
                prevButtonPressed = currButtonPressed;
                for (int i = CONTROLLER_AXIS_COUNT - 1; i >= 0; --i)
                {
                    prevAxisValue[i] = currAxisValue[i];
                }

                trackedDeviceModel = currState.deviceModel;

                // update button states
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.System, currState.GetButtonPress(VRModuleRawButton.System));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Menu, currState.GetButtonPress(VRModuleRawButton.ApplicationMenu));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.MenuTouch, currState.GetButtonTouch(VRModuleRawButton.ApplicationMenu));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Trigger, currState.GetButtonPress(VRModuleRawButton.Trigger));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.TriggerTouch, currState.GetButtonTouch(VRModuleRawButton.Trigger));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Pad, currState.GetButtonPress(VRModuleRawButton.Touchpad));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.PadTouch, currState.GetButtonTouch(VRModuleRawButton.Touchpad));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Grip, currState.GetButtonPress(VRModuleRawButton.Grip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.GripTouch, currState.GetButtonTouch(VRModuleRawButton.Grip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.CapSenseGrip, currState.GetButtonPress(VRModuleRawButton.CapSenseGrip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.CapSenseGripTouch, currState.GetButtonTouch(VRModuleRawButton.CapSenseGrip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.AKey, currState.GetButtonPress(VRModuleRawButton.A));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.AKeyTouch, currState.GetButtonTouch(VRModuleRawButton.A));

                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis3, currState.GetButtonPress(VRModuleRawButton.Axis3));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis3Touch, currState.GetButtonTouch(VRModuleRawButton.Axis3));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis4, currState.GetButtonPress(VRModuleRawButton.Axis4));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis4Touch, currState.GetButtonTouch(VRModuleRawButton.Axis4));

                // update axis values
                currAxisValue[(int)ControllerAxis.PadX]         = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                currAxisValue[(int)ControllerAxis.PadY]         = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                currAxisValue[(int)ControllerAxis.Trigger]      = currState.GetAxisValue(VRModuleRawAxis.Trigger);
                currAxisValue[(int)ControllerAxis.CapSenseGrip] = currState.GetAxisValue(VRModuleRawAxis.CapSenseGrip);
                currAxisValue[(int)ControllerAxis.IndexCurl]    = currState.GetAxisValue(VRModuleRawAxis.IndexCurl);
                currAxisValue[(int)ControllerAxis.MiddleCurl]   = currState.GetAxisValue(VRModuleRawAxis.MiddleCurl);
                currAxisValue[(int)ControllerAxis.RingCurl]     = currState.GetAxisValue(VRModuleRawAxis.RingCurl);
                currAxisValue[(int)ControllerAxis.PinkyCurl]    = currState.GetAxisValue(VRModuleRawAxis.PinkyCurl);

                // update hair trigger
                var currTriggerValue = currAxisValue[(int)ControllerAxis.Trigger];

                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.FullTrigger, currTriggerValue == 1f);
                if (EnumUtils.GetFlag(prevButtonPressed, (int)ControllerButton.HairTrigger))
                {
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.HairTrigger, currTriggerValue >= (hairTriggerLimit - hairDelta) && currTriggerValue > 0.0f);
                }
                else
                {
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.HairTrigger, currTriggerValue > (hairTriggerLimit + hairDelta) || currTriggerValue >= 1.0f);
                }

                if (EnumUtils.GetFlag(currButtonPressed, (int)ControllerButton.HairTrigger))
                {
                    hairTriggerLimit = Mathf.Max(hairTriggerLimit, currTriggerValue);
                }
                else
                {
                    hairTriggerLimit = Mathf.Min(hairTriggerLimit, currTriggerValue);
                }

                // record pad down axis values
                if (GetPressDown(ControllerButton.Pad))
                {
                    padDownAxis = new Vector2(currAxisValue[(int)ControllerAxis.PadX], currAxisValue[(int)ControllerAxis.PadY]);
                }

                if (GetPressDown(ControllerButton.PadTouch))
                {
                    padTouchDownAxis = new Vector2(currAxisValue[(int)ControllerAxis.PadX], currAxisValue[(int)ControllerAxis.PadY]);
                }

                // record press down time and click count
                var timeNow = Time.unscaledTime;

                for (int button = 0; button < CONTROLLER_BUTTON_COUNT; ++button)
                {
                    if (GetPressDown((ControllerButton)button))
                    {
                        if (timeNow - lastPressDownTime[button] < clickInterval)
                        {
                            ++clickCount[button];
                        }
                        else
                        {
                            clickCount[button] = 1;
                        }

                        lastPressDownTime[button] = timeNow;
                    }
                }

                // invoke event listeners
                for (ControllerButton button = 0; button < (ControllerButton)CONTROLLER_BUTTON_COUNT; ++button)
                {
                    if (GetPress(button))
                    {
                        if (GetPressDown(button))
                        {
                            // PressDown event
                            TryInvokeListener(button, ButtonEventType.Down);
                            TryInvokeTypeListener(button, ButtonEventType.Down);
                        }

                        // Press event
                        TryInvokeListener(button, ButtonEventType.Press);
                        TryInvokeTypeListener(button, ButtonEventType.Press);
                    }
                    else if (GetPressUp(button))
                    {
                        // PressUp event
                        TryInvokeListener(button, ButtonEventType.Up);
                        TryInvokeTypeListener(button, ButtonEventType.Up);

                        if (timeNow - lastPressDownTime[(int)button] < clickInterval)
                        {
                            // Click event
                            TryInvokeListener(button, ButtonEventType.Click);
                            TryInvokeTypeListener(button, ButtonEventType.Click);
                        }
                    }
                }

                return(false);
            }
Exemplo n.º 13
0
            // return true if frame skipped
            public override bool Update()
            {
                if (!ChangeProp.Set(ref updatedFrameCount, Time.frameCount))
                {
                    return(true);
                }

                var deviceIndex = m_map.GetMappedDeviceByRoleValue(m_roleValue);

                // treat this frame as updated if both prevDeviceIndex and currentDeviceIndex are invalid
                if (!VRModule.IsValidDeviceIndex(prevDeviceIndex) && !VRModule.IsValidDeviceIndex(deviceIndex))
                {
                    return(false);
                }

                // get device state
                var currState = VRModule.GetCurrentDeviceState(deviceIndex);

                // copy to previous states and reset current state
                prevDeviceIndex = deviceIndex;

                prevButtonPressed = currButtonPressed;
                currButtonPressed = 0;

                for (int i = CONTROLLER_AXIS_COUNT - 1; i >= 0; --i)
                {
                    prevAxisValue[i] = currAxisValue[i];
                    currAxisValue[i] = 0f;
                }

                trackedDeviceModel = currState.deviceModel;

                // update button states
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.System, currState.GetButtonPress(VRModuleRawButton.System));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Menu, currState.GetButtonPress(VRModuleRawButton.ApplicationMenu));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.MenuTouch, currState.GetButtonTouch(VRModuleRawButton.ApplicationMenu));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Trigger, currState.GetButtonPress(VRModuleRawButton.Trigger));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.TriggerTouch, currState.GetButtonTouch(VRModuleRawButton.Trigger));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Pad, currState.GetButtonPress(VRModuleRawButton.Touchpad));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.PadTouch, currState.GetButtonTouch(VRModuleRawButton.Touchpad));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Grip, currState.GetButtonPress(VRModuleRawButton.Grip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.GripTouch, currState.GetButtonTouch(VRModuleRawButton.Grip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.CapSenseGrip, currState.GetButtonPress(VRModuleRawButton.CapSenseGrip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.CapSenseGripTouch, currState.GetButtonTouch(VRModuleRawButton.CapSenseGrip));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.ProximitySensor, currState.GetButtonPress(VRModuleRawButton.ProximitySensor));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.AKey, currState.GetButtonPress(VRModuleRawButton.A));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.AKeyTouch, currState.GetButtonTouch(VRModuleRawButton.A));

                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis3, currState.GetButtonPress(VRModuleRawButton.Axis3));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis3Touch, currState.GetButtonTouch(VRModuleRawButton.Axis3));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis4, currState.GetButtonPress(VRModuleRawButton.Axis4));
                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.Axis4Touch, currState.GetButtonTouch(VRModuleRawButton.Axis4));

                // update axis values
                currAxisValue[(int)ControllerAxis.PadX]         = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                currAxisValue[(int)ControllerAxis.PadY]         = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                currAxisValue[(int)ControllerAxis.Trigger]      = currState.GetAxisValue(VRModuleRawAxis.Trigger);
                currAxisValue[(int)ControllerAxis.CapSenseGrip] = currState.GetAxisValue(VRModuleRawAxis.CapSenseGrip);
                currAxisValue[(int)ControllerAxis.IndexCurl]    = currState.GetAxisValue(VRModuleRawAxis.IndexCurl);
                currAxisValue[(int)ControllerAxis.MiddleCurl]   = currState.GetAxisValue(VRModuleRawAxis.MiddleCurl);
                currAxisValue[(int)ControllerAxis.RingCurl]     = currState.GetAxisValue(VRModuleRawAxis.RingCurl);
                currAxisValue[(int)ControllerAxis.PinkyCurl]    = currState.GetAxisValue(VRModuleRawAxis.PinkyCurl);

                switch (trackedDeviceModel)
                {
                case VRModuleDeviceModel.WMRControllerLeft:
                case VRModuleDeviceModel.WMRControllerRight:
                    currAxisValue[(int)ControllerAxis.PadX]      = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                    currAxisValue[(int)ControllerAxis.PadY]      = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                    currAxisValue[(int)ControllerAxis.JoystickX] = currState.GetAxisValue(VRModuleRawAxis.JoystickX);
                    currAxisValue[(int)ControllerAxis.JoystickY] = currState.GetAxisValue(VRModuleRawAxis.JoystickY);
                    break;

                default:
                    if (VIUSettings.individualTouchpadJoystickValue)
                    {
                        switch (trackedDeviceModel)
                        {
                        case VRModuleDeviceModel.OculusTouchLeft:
                        case VRModuleDeviceModel.OculusTouchRight:
                            currAxisValue[(int)ControllerAxis.JoystickX] = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                            currAxisValue[(int)ControllerAxis.JoystickY] = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                            break;

                        default:
                            currAxisValue[(int)ControllerAxis.PadX] = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                            currAxisValue[(int)ControllerAxis.PadY] = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                            break;
                        }
                    }
                    else
                    {
                        currAxisValue[(int)ControllerAxis.PadX]      = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                        currAxisValue[(int)ControllerAxis.PadY]      = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                        currAxisValue[(int)ControllerAxis.JoystickX] = currState.GetAxisValue(VRModuleRawAxis.TouchpadX);
                        currAxisValue[(int)ControllerAxis.JoystickY] = currState.GetAxisValue(VRModuleRawAxis.TouchpadY);
                    }
                    break;
                }

                // update d-pad
                var axis     = new Vector2(currAxisValue[(int)ControllerAxis.PadX], currAxisValue[(int)ControllerAxis.PadY]);
                var deadZone = VIUSettings.virtualDPadDeadZone;

                if (axis.sqrMagnitude >= deadZone * deadZone)
                {
                    var padPress = GetPress(ControllerButton.Pad);
                    var padTouch = GetPress(ControllerButton.PadTouch);

                    var right = Vector2.Angle(Vector2.right, axis) < 45f;
                    var up    = Vector2.Angle(Vector2.up, axis) < 45f;
                    var left  = Vector2.Angle(Vector2.left, axis) < 45f;
                    var down  = Vector2.Angle(Vector2.down, axis) < 45f;

                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadRight, padPress && right);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUp, padPress && up);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLeft, padPress && left);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadDown, padPress && down);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadRightTouch, padTouch && right);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUpTouch, padTouch && up);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLeftTouch, padTouch && left);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadDownTouch, padTouch && down);

                    var upperRight = axis.x > 0f && axis.y > 0f;
                    var upperLeft  = axis.x <0f && axis.y> 0f;
                    var lowerLeft  = axis.x < 0f && axis.y < 0f;
                    var lowerRight = axis.x > 0f && axis.y < 0f;

                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUpperRight, padPress && upperRight);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUpperLeft, padPress && upperLeft);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLowerLeft, padPress && lowerLeft);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLowerRight, padPress && lowerRight);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUpperRightTouch, padTouch && upperRight);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadUpperLeftTouch, padTouch && upperLeft);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLowerLeftTouch, padTouch && lowerLeft);
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.DPadLowerRightTouch, padTouch && lowerRight);
                }

                // update hair trigger
                var currTriggerValue = currAxisValue[(int)ControllerAxis.Trigger];

                EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.FullTrigger, currTriggerValue == 1f);

                if (EnumUtils.GetFlag(prevButtonPressed, (int)ControllerButton.HairTrigger))
                {
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.HairTrigger, currTriggerValue >= (hairTriggerLimit - hairDelta) && currTriggerValue > 0.0f);
                }
                else
                {
                    EnumUtils.SetFlag(ref currButtonPressed, (int)ControllerButton.HairTrigger, currTriggerValue > (hairTriggerLimit + hairDelta) || currTriggerValue >= 1.0f);
                }

                if (EnumUtils.GetFlag(currButtonPressed, (int)ControllerButton.HairTrigger))
                {
                    hairTriggerLimit = Mathf.Max(hairTriggerLimit, currTriggerValue);
                }
                else
                {
                    hairTriggerLimit = Mathf.Min(hairTriggerLimit, currTriggerValue);
                }

                // record pad down axis values
                if (GetPressDown(ControllerButton.Pad))
                {
                    padDownAxis = new Vector2(currAxisValue[(int)ControllerAxis.PadX], currAxisValue[(int)ControllerAxis.PadY]);
                }

                if (GetPressDown(ControllerButton.PadTouch))
                {
                    padTouchDownAxis = new Vector2(currAxisValue[(int)ControllerAxis.PadX], currAxisValue[(int)ControllerAxis.PadY]);
                }

                // record press down time and click count
                var timeNow = Time.unscaledTime;

                for (int button = 0; button < CONTROLLER_BUTTON_COUNT; ++button)
                {
                    if (GetPressDown((ControllerButton)button))
                    {
                        if (timeNow - lastPressDownTime[button] < clickInterval)
                        {
                            ++clickCount[button];
                        }
                        else
                        {
                            clickCount[button] = 1;
                        }

                        lastPressDownTime[button] = timeNow;
                    }
                }

                // invoke event listeners
                for (ControllerButton button = 0; button < (ControllerButton)CONTROLLER_BUTTON_COUNT; ++button)
                {
                    if (GetPress(button))
                    {
                        if (GetPressDown(button))
                        {
                            // PressDown event
                            TryInvokeListener(button, ButtonEventType.Down);
                            TryInvokeTypeListener(button, ButtonEventType.Down);
                        }

                        // Press event
                        TryInvokeListener(button, ButtonEventType.Press);
                        TryInvokeTypeListener(button, ButtonEventType.Press);
                    }
                    else if (GetPressUp(button))
                    {
                        // PressUp event
                        TryInvokeListener(button, ButtonEventType.Up);
                        TryInvokeTypeListener(button, ButtonEventType.Up);

                        if (timeNow - lastPressDownTime[(int)button] < clickInterval)
                        {
                            // Click event
                            TryInvokeListener(button, ButtonEventType.Click);
                            TryInvokeTypeListener(button, ButtonEventType.Click);
                        }
                    }
                }

                return(false);
            }
Exemplo n.º 14
0
        public void UpdateModel()
        {
            if (m_isQuiting)
            {
                return;
            }

            if (m_updateModelLock)
            {
                Debug.LogWarning("Recursive UpdateModel call is not supported");
                return;
            }

            m_updateModelLock = true;

            var deviceState = VRModule.GetDeviceState(GetModelDeviceIndex());

            var lastActiveCustomModelNum      = m_activeCustomModel;
            var lastActiveCustomModelObj      = m_customModelObjs[m_activeCustomModel];
            var lastCustomModelActive         = m_isCustomModelActivated;
            var shouldActiveCustomModelNum    = deviceState.deviceModel;
            var shouldActiveCustomModelPrefab = m_customModels[shouldActiveCustomModelNum];

            if (shouldActiveCustomModelPrefab == null)
            {
                shouldActiveCustomModelPrefab = VIUSettings.GetOverrideDeviceModel(shouldActiveCustomModelNum);
            }
            var shouldActiveCustomModel = enabled && deviceState.isConnected && shouldActiveCustomModelPrefab != null;

            var lastCreatorActive        = m_activeCreatorIndex >= 0;
            var shouldActiveCreator      = enabled && !shouldActiveCustomModel;
            var shouldActiveCreatorIndex = -1;

            if (shouldActiveCreator)
            {
                // determin which creator should be activated
                shouldActiveCreatorIndex = m_defaultCreatorIndex;
                if (m_overrideModel == OverrideModelEnum.DontOverride)
                {
                    for (int i = 0, imax = m_creators.Length; i < imax; ++i)
                    {
                        if (m_creators[i].shouldActive)
                        {
                            shouldActiveCreatorIndex = i;
                            break;
                        }
                    }
                }
            }

            if (lastCustomModelActive)
            {
                if (!shouldActiveCustomModel || lastActiveCustomModelNum != shouldActiveCustomModelNum)
                {
                    // deactivate custom override model
                    if (lastActiveCustomModelObj != null && SendBeforeModelDeactivatedMessage(lastActiveCustomModelObj, this))
                    {
                        lastActiveCustomModelObj.gameObject.SetActive(false);
                    }
                    m_isCustomModelActivated = false;
                }
            }

            if (lastCreatorActive)
            {
                if (!shouldActiveCreator || m_activeCreatorIndex != shouldActiveCreatorIndex)
                {
                    // clean up old creator
                    m_creators[m_activeCreatorIndex].CleanUpRenderModel();
                    m_activeCreatorIndex = -1;
                }
            }

            if (shouldActiveCustomModel)
            {
                var shouldActiveCustomModelObj = m_customModelObjs[shouldActiveCustomModelNum];
                if (shouldActiveCustomModelObj == null)
                {
                    // instantiate custom override model
                    shouldActiveCustomModelObj = Instantiate(shouldActiveCustomModelPrefab);
                    shouldActiveCustomModelObj.transform.position = Vector3.zero;
                    shouldActiveCustomModelObj.transform.rotation = Quaternion.identity;
                    shouldActiveCustomModelObj.transform.SetParent(transform, false);
                    m_activeCustomModel = shouldActiveCustomModelNum;
                    m_customModelObjs[shouldActiveCustomModelNum] = shouldActiveCustomModelObj;
                    m_isCustomModelActivated = false;
                    SendAfterModelCreatedMessage(shouldActiveCustomModelObj, this);
                }

                if (!m_isCustomModelActivated)
                {
                    // active custom override model
                    if (SendBeforeModelActivatedMessage(shouldActiveCustomModelObj, this))
                    {
                        shouldActiveCustomModelObj.gameObject.SetActive(true);
                    }
                    m_isCustomModelActivated = true;
                }
            }

            if (shouldActiveCreator)
            {
                m_activeCreatorIndex = shouldActiveCreatorIndex;
                // update active creator
                m_creators[m_activeCreatorIndex].UpdateRenderModel();
            }

            m_updateModelLock = false;
        }
Exemplo n.º 15
0
 public static GameObject GetOverrideDeviceModel(VRModuleDeviceModel model)
 {
     return(Instance == null || s_instance.m_overrideDeviceModel == null ? null : s_instance.m_overrideDeviceModel[model]);
 }