Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

197 lines
4.4 KiB

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