//======= Copyright (c) Valve Corporation, All rights reserved. =============== // // Purpose: Highlights the controller when hovering over interactables // //============================================================================= using UnityEngine; using System.Collections; namespace Valve.VR.InteractionSystem { //------------------------------------------------------------------------- public class ControllerHoverHighlight : MonoBehaviour { public Material highLightMaterial; public bool fireHapticsOnHightlight = true; private Hand hand; private MeshRenderer bodyMeshRenderer; private MeshRenderer trackingHatMeshRenderer; private SteamVR_RenderModel renderModel; private bool renderModelLoaded = false; SteamVR_Events.Action renderModelLoadedAction; //------------------------------------------------- void Start() { hand = GetComponentInParent(); } //------------------------------------------------- void Awake() { renderModelLoadedAction = SteamVR_Events.RenderModelLoadedAction( OnRenderModelLoaded ); } //------------------------------------------------- void OnEnable() { renderModelLoadedAction.enabled = true; } //------------------------------------------------- void OnDisable() { renderModelLoadedAction.enabled = false; } //------------------------------------------------- private void OnHandInitialized( int deviceIndex ) { renderModel = gameObject.AddComponent(); renderModel.SetDeviceIndex( deviceIndex ); renderModel.updateDynamically = false; } //------------------------------------------------- private void OnRenderModelLoaded( SteamVR_RenderModel renderModel, bool success ) { if ( renderModel != this.renderModel ) { return; } Transform bodyTransform = transform.Find( "body" ); if ( bodyTransform != null ) { bodyTransform.gameObject.layer = gameObject.layer; bodyTransform.gameObject.tag = gameObject.tag; bodyMeshRenderer = bodyTransform.GetComponent(); bodyMeshRenderer.material = highLightMaterial; bodyMeshRenderer.enabled = false; } Transform trackingHatTransform = transform.Find( "trackhat" ); if ( trackingHatTransform != null ) { trackingHatTransform.gameObject.layer = gameObject.layer; trackingHatTransform.gameObject.tag = gameObject.tag; trackingHatMeshRenderer = trackingHatTransform.GetComponent(); trackingHatMeshRenderer.material = highLightMaterial; trackingHatMeshRenderer.enabled = false; } foreach ( Transform child in transform ) { if ( ( child.name != "body" ) && ( child.name != "trackhat" ) ) { Destroy( child.gameObject ); } } renderModelLoaded = true; } //------------------------------------------------- private void OnParentHandHoverBegin( Interactable other ) { if ( !this.isActiveAndEnabled ) { return; } if ( other.transform.parent != transform.parent ) { ShowHighlight(); } } //------------------------------------------------- private void OnParentHandHoverEnd( Interactable other ) { HideHighlight(); } //------------------------------------------------- private void OnParentHandInputFocusAcquired() { if ( !this.isActiveAndEnabled ) { return; } if ( hand.hoveringInteractable && hand.hoveringInteractable.transform.parent != transform.parent ) { ShowHighlight(); } } //------------------------------------------------- private void OnParentHandInputFocusLost() { HideHighlight(); } //------------------------------------------------- public void ShowHighlight() { if ( renderModelLoaded == false ) { return; } if ( fireHapticsOnHightlight ) { hand.controller.TriggerHapticPulse( 500 ); } if ( bodyMeshRenderer != null ) { bodyMeshRenderer.enabled = true; } if ( trackingHatMeshRenderer != null ) { trackingHatMeshRenderer.enabled = true; } } //------------------------------------------------- public void HideHighlight() { if ( renderModelLoaded == false ) { return; } if ( fireHapticsOnHightlight ) { hand.controller.TriggerHapticPulse( 300 ); } if ( bodyMeshRenderer != null ) { bodyMeshRenderer.enabled = false; } if ( trackingHatMeshRenderer != null ) { trackingHatMeshRenderer.enabled = false; } } } }