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); } } }
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; }
/// <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; }
/// <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; }
/// <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; }