|
|
- //======= Copyright (c) Valve Corporation, All rights reserved. ===============
- //
- // Purpose: Uses the see thru renderer while attached to hand
- //
- //=============================================================================
-
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
-
- namespace Valve.VR.InteractionSystem
- {
- //-------------------------------------------------------------------------
- public class SeeThru : MonoBehaviour
- {
- public Material seeThruMaterial;
-
- private GameObject seeThru;
- private Interactable interactable;
- private Renderer sourceRenderer;
- private Renderer destRenderer;
-
-
- //-------------------------------------------------
- void Awake()
- {
- interactable = GetComponentInParent<Interactable>();
-
- //
- // Create child game object for see thru renderer
- //
- seeThru = new GameObject( "_see_thru" );
- seeThru.transform.parent = transform;
- seeThru.transform.localPosition = Vector3.zero;
- seeThru.transform.localRotation = Quaternion.identity;
- seeThru.transform.localScale = Vector3.one;
-
- //
- // Copy mesh filter
- //
- MeshFilter sourceMeshFilter = GetComponent<MeshFilter>();
- if ( sourceMeshFilter != null )
- {
- MeshFilter destMeshFilter = seeThru.AddComponent<MeshFilter>();
- destMeshFilter.sharedMesh = sourceMeshFilter.sharedMesh;
- }
-
- //
- // Copy mesh renderer
- //
- MeshRenderer sourceMeshRenderer = GetComponent<MeshRenderer>();
- if ( sourceMeshRenderer != null )
- {
- sourceRenderer = sourceMeshRenderer;
- destRenderer = seeThru.AddComponent<MeshRenderer>();
- }
-
- //
- // Copy skinned mesh renderer
- //
- SkinnedMeshRenderer sourceSkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
- if ( sourceSkinnedMeshRenderer != null )
- {
- SkinnedMeshRenderer destSkinnedMeshRenderer = seeThru.AddComponent<SkinnedMeshRenderer>();
-
- sourceRenderer = sourceSkinnedMeshRenderer;
- destRenderer = destSkinnedMeshRenderer;
-
- destSkinnedMeshRenderer.sharedMesh = sourceSkinnedMeshRenderer.sharedMesh;
- destSkinnedMeshRenderer.rootBone = sourceSkinnedMeshRenderer.rootBone;
- destSkinnedMeshRenderer.bones = sourceSkinnedMeshRenderer.bones;
- destSkinnedMeshRenderer.quality = sourceSkinnedMeshRenderer.quality;
- destSkinnedMeshRenderer.updateWhenOffscreen = sourceSkinnedMeshRenderer.updateWhenOffscreen;
- }
-
- //
- // Create see thru materials
- //
- if ( sourceRenderer != null && destRenderer != null )
- {
- int materialCount = sourceRenderer.sharedMaterials.Length;
- Material[] destRendererMaterials = new Material[materialCount];
- for ( int i = 0; i < materialCount; i++ )
- {
- destRendererMaterials[i] = seeThruMaterial;
- }
- destRenderer.sharedMaterials = destRendererMaterials;
-
- for ( int i = 0; i < destRenderer.materials.Length; i++ )
- {
- destRenderer.materials[i].renderQueue = 2001; // Rendered after geometry
- }
-
- for ( int i = 0; i < sourceRenderer.materials.Length; i++ )
- {
- if ( sourceRenderer.materials[i].renderQueue == 2000 )
- {
- sourceRenderer.materials[i].renderQueue = 2002;
- }
- }
- }
-
- seeThru.gameObject.SetActive( false );
- }
-
-
- //-------------------------------------------------
- void OnEnable()
- {
- interactable.onAttachedToHand += AttachedToHand;
- interactable.onDetachedFromHand += DetachedFromHand;
- }
-
-
- //-------------------------------------------------
- void OnDisable()
- {
- interactable.onAttachedToHand -= AttachedToHand;
- interactable.onDetachedFromHand -= DetachedFromHand;
- }
-
-
- //-------------------------------------------------
- private void AttachedToHand( Hand hand )
- {
- seeThru.SetActive( true );
- }
-
-
- //-------------------------------------------------
- private void DetachedFromHand( Hand hand )
- {
- seeThru.SetActive( false );
- }
-
-
- //-------------------------------------------------
- void Update()
- {
- if ( seeThru.activeInHierarchy )
- {
- int materialCount = Mathf.Min( sourceRenderer.materials.Length, destRenderer.materials.Length );
- for ( int i = 0; i < materialCount; i++ )
- {
- destRenderer.materials[i].mainTexture = sourceRenderer.materials[i].mainTexture;
- destRenderer.materials[i].color = destRenderer.materials[i].color * sourceRenderer.materials[i].color;
- }
- }
- }
- }
- }
|