//======= Copyright (c) Valve Corporation, All rights reserved. ===============
|
|
//
|
|
// Purpose: Spawns a render model for the controller from SteamVR
|
|
//
|
|
//=============================================================================
|
|
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Valve.VR.InteractionSystem
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
public class SpawnRenderModel : MonoBehaviour
|
|
{
|
|
public Material[] materials;
|
|
|
|
private SteamVR_RenderModel[] renderModels;
|
|
private Hand hand;
|
|
private List<MeshRenderer> renderers = new List<MeshRenderer>();
|
|
|
|
private static List<SpawnRenderModel> spawnRenderModels = new List<SpawnRenderModel>();
|
|
private static int lastFrameUpdated;
|
|
private static int spawnRenderModelUpdateIndex;
|
|
|
|
SteamVR_Events.Action renderModelLoadedAction;
|
|
|
|
|
|
//-------------------------------------------------
|
|
void Awake()
|
|
{
|
|
renderModels = new SteamVR_RenderModel[materials.Length];
|
|
renderModelLoadedAction = SteamVR_Events.RenderModelLoadedAction( OnRenderModelLoaded );
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
void OnEnable()
|
|
{
|
|
ShowController();
|
|
|
|
renderModelLoadedAction.enabled = true;
|
|
|
|
spawnRenderModels.Add( this );
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
void OnDisable()
|
|
{
|
|
HideController();
|
|
|
|
renderModelLoadedAction.enabled = false;
|
|
|
|
spawnRenderModels.Remove( this );
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
private void OnAttachedToHand( Hand hand )
|
|
{
|
|
this.hand = hand;
|
|
ShowController();
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
private void OnDetachedFromHand( Hand hand )
|
|
{
|
|
this.hand = null;
|
|
HideController();
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
void Update()
|
|
{
|
|
// Only update one per frame
|
|
if ( lastFrameUpdated == Time.renderedFrameCount )
|
|
{
|
|
return;
|
|
}
|
|
lastFrameUpdated = Time.renderedFrameCount;
|
|
|
|
|
|
// SpawnRenderModel overflow
|
|
if ( spawnRenderModelUpdateIndex >= spawnRenderModels.Count )
|
|
{
|
|
spawnRenderModelUpdateIndex = 0;
|
|
}
|
|
|
|
|
|
// Perform update
|
|
if ( spawnRenderModelUpdateIndex < spawnRenderModels.Count )
|
|
{
|
|
SteamVR_RenderModel renderModel = spawnRenderModels[spawnRenderModelUpdateIndex].renderModels[0];
|
|
if ( renderModel != null )
|
|
{
|
|
renderModel.UpdateComponents( OpenVR.RenderModels );
|
|
}
|
|
}
|
|
|
|
spawnRenderModelUpdateIndex++;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
private void ShowController()
|
|
{
|
|
if ( hand == null || hand.controller == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
for ( int i = 0; i < renderModels.Length; i++ )
|
|
{
|
|
if ( renderModels[i] == null )
|
|
{
|
|
renderModels[i] = new GameObject( "SteamVR_RenderModel" ).AddComponent<SteamVR_RenderModel>();
|
|
renderModels[i].updateDynamically = false; // Update one per frame (see Update() method)
|
|
renderModels[i].transform.parent = transform;
|
|
Util.ResetTransform( renderModels[i].transform );
|
|
}
|
|
|
|
renderModels[i].gameObject.SetActive( true );
|
|
renderModels[i].SetDeviceIndex( (int)hand.controller.index );
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
private void HideController()
|
|
{
|
|
for ( int i = 0; i < renderModels.Length; i++ )
|
|
{
|
|
if ( renderModels[i] != null )
|
|
{
|
|
renderModels[i].gameObject.SetActive( false );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------
|
|
private void OnRenderModelLoaded( SteamVR_RenderModel renderModel, bool success )
|
|
{
|
|
for ( int i = 0; i < renderModels.Length; i++ )
|
|
{
|
|
if ( renderModel == renderModels[i] )
|
|
{
|
|
if ( materials[i] != null )
|
|
{
|
|
renderers.Clear();
|
|
renderModels[i].GetComponentsInChildren<MeshRenderer>( renderers );
|
|
for ( int j = 0; j < renderers.Count; j++ )
|
|
{
|
|
Texture mainTexture = renderers[j].material.mainTexture;
|
|
renderers[j].sharedMaterial = materials[i];
|
|
renderers[j].material.mainTexture = mainTexture;
|
|
renderers[j].gameObject.layer = gameObject.layer;
|
|
renderers[j].tag = gameObject.tag;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|