private void OnHandInteractionStateChanged(GameObject target, PalmState fromState, PalmState toState)
        {
            if (!_stereoCameraObjectOutline)
            {
                _stereoCameraObjectOutline = GameObject.FindObjectOfType <StereoCameraObjectOutline>();
                if (!_stereoCameraObjectOutline)
                {
                    return;
                }
            }

            InteractionObjectOutlineSettings settings = target.GetComponent <InteractionObjectOutlineSettings>();

            if (settings)
            {
                OutlineObjectVisualDecorator decorator = target.GetComponent <OutlineObjectVisualDecorator>();
                if (!decorator)
                {
                    decorator           = target.AddComponent <OutlineObjectVisualDecorator>();
                    decorator.hideFlags = HideFlags.HideInInspector;
                }

                //Add or remove based on the event
                decorator.ChangeColorBasedOnState(toState);
                if (toState == PalmState.Idle)
                {
                    _stereoCameraObjectOutline.RemoveOutlinedObject(decorator);
                }
                else if ((toState == PalmState.Hovering || toState == PalmState.Grabbing) && fromState == PalmState.Idle)
                {
                    _stereoCameraObjectOutline.AddOutlinedObject(decorator);
                }
            }
        }
示例#2
0
        private void MoveStateMachine(PalmStateCommand command)
        {
            PalmState beforeState = _palmState.CurrentState;

            _palmState.MoveNext(command);
            PalmState afterState = _palmState.CurrentState;

            GameObject nearestGameObject = null;

            if ((beforeState == PalmState.Grabbing || beforeState == PalmState.Hovering) && afterState == PalmState.Idle)
            {
                nearestGameObject = _cachedNearestGameObject;
            }
            else
            {
                _cachedNearestGameObject = Hand.Palm.NearObjects[0].gameObject;
                nearestGameObject        = _cachedNearestGameObject;
            }

            if (!nearestGameObject)
            {
                Debug.LogError("Could not reference the nearest gameobject");
                return;
            }

            _handObjectReferences.AcceptStateTransitionForObject(nearestGameObject, beforeState, afterState);
        }
 private void UpdateStateVisuals(PalmState newState)
 {
     foreach (var materialState in Materials)
     {
         materialState.SetColor(newState);
     }
 }
        private void UpdateStateVisuals(PalmState newState)
        {
            // -- Keep record of previous target color
            _previousTargetColor = _targetColor;

            // -- Update target color
            switch (newState)
            {
            case PalmState.Idle:
                _targetColor = IdleColor;
                break;

            case PalmState.Hovering:
                _targetColor = HighlightColor;
                break;

            case PalmState.Grabbing:
                _targetColor = EngagedColor;
                break;

            default:
                throw new ArgumentOutOfRangeException("newState", newState, null);
            }

            // -- Reset interpolation variables
            _interpAmount         = 0f;
            _interpAmountVelocity = 0f;
        }
示例#5
0
        /// <summary>
        /// Updates the visuals for the cursor which are not dependent upon the grab residual.
        /// </summary>
        private void SetCursorVisualState()
        {
            // Return if no feedback should be displayed
            if (!_showVisualFeedback)
            {
                return;
            }

            if (_centerHandFeature.PalmState != _lastPalmState)
            {
                switch (_centerHandFeature.PalmState)
                {
                case PalmState.Idle:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = false;
                    break;

                case PalmState.Hovering:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = true;
                    _grabSprite.enabled        = false;

                    break;

                case PalmState.Grabbing:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = true;
                    break;
                }
            }

            if (_centerHandFeature.PalmState == PalmState.Idle)
            {
                if (_centerHandFeature.NearObjects.Count != 0)
                {
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = true;
                }
                else if (CheckHandInFrontOfInteractionObject())
                {
                    _idleSprite.enabled        = true;
                    _idleContactSprite.enabled = false;
                }
                else
                {
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                }
            }


            _lastPalmState = _centerHandFeature.PalmState;
        }
示例#6
0
        /// <summary>
        /// Updates the visuals for the cursor which are not dependent upon the grab residual.
        /// </summary>
        private void SetCursorVisualState()
        {
            // Return if no feedback should be displayed
            if (!_showVisualFeedback)
            {
                return;
            }

            //bool vicinityTargetState = false;
            if (_centerHandFeature.PalmState != _lastPalmState)
            {
                switch (_centerHandFeature.PalmState)
                {
                case PalmState.Idle:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = false;
                    break;

                case PalmState.Hovering:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = true;
                    _grabSprite.enabled        = false;

                    break;

                case PalmState.Grabbing:
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = true;
                    break;
                }
            }
            if ((_centerHandFeature.NearObjects.Count != 0) ^ _vicinityOn)
            {
                _vicinityOn = !_vicinityOn;
                if (_vicinityOn && _centerHandFeature.PalmState == PalmState.Idle)
                {
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = true;
                }
                if (!_vicinityOn && _centerHandFeature.PalmState == PalmState.Idle)
                {
                    _idleSprite.enabled        = false;
                    _idleContactSprite.enabled = false;
                }
            }

            _lastPalmState = _centerHandFeature.PalmState;
        }
        /// <summary>
        /// Event to notify state machine to move onto next state.
        /// </summary>
        /// <param name="palmStateCommand">Command to exicute.</param>
        /// <returns>New palm state.</returns>
        public PalmState MoveNext(PalmStateCommand palmStateCommand)
        {
            var nextState = GetNext(palmStateCommand);

            _currentState = nextState.Key;
            if (nextState.Value != null)
            {
                nextState.Value.Invoke();
            }
            else
            {
                UnityEngine.Debug.Log("Nest state event is null");
            }
            return(_currentState);
        }
        /// <summary>
        /// Changes thw ourlining color based on PalmState.
        /// </summary>
        /// <param name="state"></param>
        internal void ChangeColorBasedOnState(PalmState state)
        {
            if (_settings)
            {
                switch (state)
                {
                case PalmState.Idle:
                    OutlineMaterial.SetColor(OutlineObjectVisualDecorator.OutlineShaderColorAttributeName, _settings.ObjectIdleColor);
                    break;

                case PalmState.Hovering:
                    OutlineMaterial.SetColor(OutlineObjectVisualDecorator.OutlineShaderColorAttributeName, _settings.ObjectHoverColor);
                    break;

                case PalmState.Grabbing:
                    OutlineMaterial.SetColor(OutlineObjectVisualDecorator.OutlineShaderColorAttributeName, _settings.ObjectGrabbedColor);
                    break;
                }
            }
        }
        /// <summary>
        /// Updates the visuals for the cursor which are not dependent upon the grab residual.
        /// </summary>
        private void SetCursorVisualState()
        {
            if (_centerHandFeature.PalmState != _lastPalmState)
            {
                switch (_centerHandFeature.PalmState)
                {
                case PalmState.Idle:
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = false;
                    break;

                case PalmState.Hovering:
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = !MetaLocking.showMouse;
                    _grabSprite.enabled        = false;

                    break;

                case PalmState.Grabbing:
                    _idleContactSprite.enabled = false;
                    _hoverSprite.enabled       = false;
                    _grabSprite.enabled        = !MetaLocking.showMouse;
                    break;
                }
            }
            if ((_centerHandFeature.NearObjects.Count != 0) ^ _vicinityOn)
            {
                _vicinityOn = !_vicinityOn;
                if (_vicinityOn && _centerHandFeature.PalmState == PalmState.Idle)
                {
                    _idleContactSprite.enabled = true;
                }
                if (!_vicinityOn && _centerHandFeature.PalmState == PalmState.Idle)
                {
                    _idleContactSprite.enabled = false;
                }
            }

            _lastPalmState = _centerHandFeature.PalmState;
        }
            public void SetColor(PalmState state)
            {
                switch (state)
                {
                case PalmState.Idle:
                    _targetColor = Idle;
                    break;

                case PalmState.Hovering:
                    _targetColor = Highlight;
                    break;

                case PalmState.Grabbing:
                    _targetColor = Active;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("state", state, null);
                }

                _previousColor = _renderer.materials[MaterialIndex].GetColor("_EmissionColor");
                _interpAmount  = 0f;
            }
示例#11
0
 /// <summary>
 /// Lets subscribers know of interaction-related events happening to GameObjects.
 /// </summary>
 /// <param name="target"></param>
 /// <param name="fromState"></param>
 /// <param name="toState"></param>
 public void AcceptStateTransitionForObject(GameObject target, PalmState fromState, PalmState toState)
 {
     _onStateTransition.Invoke(target, fromState, toState);
 }
 public PalmStateMachine()
 {
     _currentState = PalmState.Idle;
 }
 public PalmStateTransition(PalmState currentState, PalmStateCommand palmStateCommand)
 {
     _currentState     = currentState;
     _palmStateCommand = palmStateCommand;
 }