campfire/Assets/SteamVR/InteractionSystem/Core/Scripts/SeeThru.cs

152 lines
4.2 KiB
C#
Raw Permalink Normal View History

2020-04-29 19:40:05 +02:00
//======= 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;
}
}
}
}
}