|
|
- //======= 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<Hand>();
- }
-
-
- //-------------------------------------------------
- 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<SteamVR_RenderModel>();
- 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<MeshRenderer>();
- 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<MeshRenderer>();
- 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;
- }
- }
- }
- }
|