8 using System.Collections;
9 using System.Collections.Generic;
11 namespace Valve.VR.InteractionSystem
16 public Material seeThruMaterial;
18 private GameObject seeThru;
20 private Renderer sourceRenderer;
21 private Renderer destRenderer;
27 interactable = GetComponentInParent<Interactable>();
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;
41 MeshFilter sourceMeshFilter = GetComponent<MeshFilter>();
42 if ( sourceMeshFilter != null )
44 MeshFilter destMeshFilter = seeThru.AddComponent<MeshFilter>();
45 destMeshFilter.sharedMesh = sourceMeshFilter.sharedMesh;
51 MeshRenderer sourceMeshRenderer = GetComponent<MeshRenderer>();
52 if ( sourceMeshRenderer != null )
54 sourceRenderer = sourceMeshRenderer;
55 destRenderer = seeThru.AddComponent<MeshRenderer>();
61 SkinnedMeshRenderer sourceSkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
62 if ( sourceSkinnedMeshRenderer != null )
64 SkinnedMeshRenderer destSkinnedMeshRenderer = seeThru.AddComponent<SkinnedMeshRenderer>();
66 sourceRenderer = sourceSkinnedMeshRenderer;
67 destRenderer = destSkinnedMeshRenderer;
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;
79 if ( sourceRenderer != null && destRenderer != null )
81 int materialCount = sourceRenderer.sharedMaterials.Length;
82 Material[] destRendererMaterials =
new Material[materialCount];
83 for (
int i = 0; i < materialCount; i++ )
85 destRendererMaterials[i] = seeThruMaterial;
87 destRenderer.sharedMaterials = destRendererMaterials;
89 for (
int i = 0; i < destRenderer.materials.Length; i++ )
91 destRenderer.materials[i].renderQueue = 2001;
94 for (
int i = 0; i < sourceRenderer.materials.Length; i++ )
96 if ( sourceRenderer.materials[i].renderQueue == 2000 )
98 sourceRenderer.materials[i].renderQueue = 2002;
103 seeThru.gameObject.SetActive( false );
110 interactable.onAttachedToHand += AttachedToHand;
111 interactable.onDetachedFromHand += DetachedFromHand;
118 interactable.onAttachedToHand -= AttachedToHand;
119 interactable.onDetachedFromHand -= DetachedFromHand;
124 private void AttachedToHand(
Hand hand )
126 seeThru.SetActive( true );
131 private void DetachedFromHand(
Hand hand )
133 seeThru.SetActive( false );
140 if ( seeThru.activeInHierarchy )
142 int materialCount = Mathf.Min( sourceRenderer.materials.Length, destRenderer.materials.Length );
143 for (
int i = 0; i < materialCount; i++ )
145 destRenderer.materials[i].mainTexture = sourceRenderer.materials[i].mainTexture;
146 destRenderer.materials[i].color = destRenderer.materials[i].color * sourceRenderer.materials[i].color;