IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
SeeThru.cs
1 //======= Copyright (c) Valve Corporation, All rights reserved. ===============
2 //
3 // Purpose: Uses the see thru renderer while attached to hand
4 //
5 //=============================================================================
6 
7 using UnityEngine;
8 using System.Collections;
9 using System.Collections.Generic;
10 
11 namespace Valve.VR.InteractionSystem
12 {
13  //-------------------------------------------------------------------------
14  public class SeeThru : MonoBehaviour
15  {
16  public Material seeThruMaterial;
17 
18  private GameObject seeThru;
19  private Interactable interactable;
20  private Renderer sourceRenderer;
21  private Renderer destRenderer;
22 
23 
24  //-------------------------------------------------
25  void Awake()
26  {
27  interactable = GetComponentInParent<Interactable>();
28 
29  //
30  // Create child game object for see thru renderer
31  //
32  seeThru = new GameObject( "_see_thru" );
33  seeThru.transform.parent = transform;
34  seeThru.transform.localPosition = Vector3.zero;
35  seeThru.transform.localRotation = Quaternion.identity;
36  seeThru.transform.localScale = Vector3.one;
37 
38  //
39  // Copy mesh filter
40  //
41  MeshFilter sourceMeshFilter = GetComponent<MeshFilter>();
42  if ( sourceMeshFilter != null )
43  {
44  MeshFilter destMeshFilter = seeThru.AddComponent<MeshFilter>();
45  destMeshFilter.sharedMesh = sourceMeshFilter.sharedMesh;
46  }
47 
48  //
49  // Copy mesh renderer
50  //
51  MeshRenderer sourceMeshRenderer = GetComponent<MeshRenderer>();
52  if ( sourceMeshRenderer != null )
53  {
54  sourceRenderer = sourceMeshRenderer;
55  destRenderer = seeThru.AddComponent<MeshRenderer>();
56  }
57 
58  //
59  // Copy skinned mesh renderer
60  //
61  SkinnedMeshRenderer sourceSkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
62  if ( sourceSkinnedMeshRenderer != null )
63  {
64  SkinnedMeshRenderer destSkinnedMeshRenderer = seeThru.AddComponent<SkinnedMeshRenderer>();
65 
66  sourceRenderer = sourceSkinnedMeshRenderer;
67  destRenderer = destSkinnedMeshRenderer;
68 
69  destSkinnedMeshRenderer.sharedMesh = sourceSkinnedMeshRenderer.sharedMesh;
70  destSkinnedMeshRenderer.rootBone = sourceSkinnedMeshRenderer.rootBone;
71  destSkinnedMeshRenderer.bones = sourceSkinnedMeshRenderer.bones;
72  destSkinnedMeshRenderer.quality = sourceSkinnedMeshRenderer.quality;
73  destSkinnedMeshRenderer.updateWhenOffscreen = sourceSkinnedMeshRenderer.updateWhenOffscreen;
74  }
75 
76  //
77  // Create see thru materials
78  //
79  if ( sourceRenderer != null && destRenderer != null )
80  {
81  int materialCount = sourceRenderer.sharedMaterials.Length;
82  Material[] destRendererMaterials = new Material[materialCount];
83  for ( int i = 0; i < materialCount; i++ )
84  {
85  destRendererMaterials[i] = seeThruMaterial;
86  }
87  destRenderer.sharedMaterials = destRendererMaterials;
88 
89  for ( int i = 0; i < destRenderer.materials.Length; i++ )
90  {
91  destRenderer.materials[i].renderQueue = 2001; // Rendered after geometry
92  }
93 
94  for ( int i = 0; i < sourceRenderer.materials.Length; i++ )
95  {
96  if ( sourceRenderer.materials[i].renderQueue == 2000 )
97  {
98  sourceRenderer.materials[i].renderQueue = 2002;
99  }
100  }
101  }
102 
103  seeThru.gameObject.SetActive( false );
104  }
105 
106 
107  //-------------------------------------------------
108  void OnEnable()
109  {
110  interactable.onAttachedToHand += AttachedToHand;
111  interactable.onDetachedFromHand += DetachedFromHand;
112  }
113 
114 
115  //-------------------------------------------------
116  void OnDisable()
117  {
118  interactable.onAttachedToHand -= AttachedToHand;
119  interactable.onDetachedFromHand -= DetachedFromHand;
120  }
121 
122 
123  //-------------------------------------------------
124  private void AttachedToHand( Hand hand )
125  {
126  seeThru.SetActive( true );
127  }
128 
129 
130  //-------------------------------------------------
131  private void DetachedFromHand( Hand hand )
132  {
133  seeThru.SetActive( false );
134  }
135 
136 
137  //-------------------------------------------------
138  void Update()
139  {
140  if ( seeThru.activeInHierarchy )
141  {
142  int materialCount = Mathf.Min( sourceRenderer.materials.Length, destRenderer.materials.Length );
143  for ( int i = 0; i < materialCount; i++ )
144  {
145  destRenderer.materials[i].mainTexture = sourceRenderer.materials[i].mainTexture;
146  destRenderer.materials[i].color = destRenderer.materials[i].color * sourceRenderer.materials[i].color;
147  }
148  }
149  }
150  }
151 }