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); } } }
/// <summary> /// Adds an object to be outlined. /// </summary> /// <param name="decorator"></param> internal void AddOutlinedObject(OutlineObjectVisualDecorator decorator) { if (_decorators.Contains(decorator)) { return; } _decorators.Add(decorator); DrawOutline(decorator); }
/// <summary> /// Removes an object from those to be outlined. /// </summary> /// <param name="decorator"></param> internal void RemoveOutlinedObject(OutlineObjectVisualDecorator decorator) { if (_decorators.Remove(decorator)) { _renderCommands.Clear(); foreach (var dec in _decorators) { DrawOutline(dec); } } }
private void DrawOutline(OutlineObjectVisualDecorator decorator) { List <GameObject> objectsToOutline = decorator.GetObjectsToDecorate(); foreach (var go in objectsToOutline) { Renderer renderer = go.GetComponent <Renderer>(); if (renderer) { for (int i = 0; i < renderer.sharedMaterials.Length; ++i) { _renderCommands.DrawRenderer(renderer, decorator.OutlineMaterial, i); } } } }