IMHOTEP Framework
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Pages
MeshMaterialControl.cs
1 using UnityEngine;
2 using System.Collections;
3 
4 
5 // This script changes the opacity of all chrildren containing a mesh renderer
6 public class MeshMaterialControl : MonoBehaviour {
7 
8  //private Shader meshShader, meshShaderTransparent;
9  private Material materialOpaque, materialTransparent, materialHologram;
10 
11  private Color materialColor;
12 
13  public void setColor( Color color )
14  {
15  materialColor = color;
16  materialOpaque.color = color;
17  materialTransparent.color = color;
18  materialHologram.color = color;
19  }
20 
21  bool loadingEffectActive = false;
22  float loadingAmount = 0;
23 
24  // Use this for initialization
25  void Awake() {
26  //meshShader = Shader.Find("Custom/MeshShader");
27  //meshShaderTransparent = Shader.Find("Custom/MeshShaderTransparent");
28  materialHologram = Instantiate( Resources.Load("Materials/MeshHologram", typeof(Material)) as Material ) as Material;
29  materialOpaque = Instantiate( Resources.Load("Materials/MeshOpaque", typeof(Material)) as Material ) as Material;
30  materialTransparent = Instantiate( Resources.Load("Materials/MeshTransparent", typeof(Material)) as Material ) as Material;
31  }
32 
33  private Bounds calculateBoundingBox()
34  {
35  Bounds b = new Bounds ();
36  bool initialized = false;
37 
38  foreach (Transform tf in transform)
39  {
40  MeshFilter mf = tf.GetComponent<MeshFilter> ();
41  if (mf) {
42  if (!initialized) {
43  b = new Bounds (mf.mesh.bounds.center, mf.mesh.bounds.size);
44  initialized = true;
45  } else {
46  b.Encapsulate (mf.mesh.bounds);
47  }
48  }
49  }
50  return b;
51  }
52 
53  public void changeOpactiyOfChildren(float f){
54  if (f <= 0.0f)
55  {
56  gameObject.SetActive(false);
57  return;
58  }
59  gameObject.SetActive(true);
60 
61  Material mat;
62  if(f >= 1.0f) //Use opaque material
63  mat = materialOpaque;
64  else
65  mat = materialTransparent;
66 
67  mat.color = new Color (materialColor.r, materialColor.g, materialColor.b, f);
68 
69  foreach (Transform tf in transform)
70  {
71  MeshRenderer mr = tf.GetComponent<MeshRenderer> ();
72  if( mr )
73  mr.material = mat;
74  }
75  }
76 
77  public void startLoadingEffect()
78  {
79  endLoadingEffect (); // Clean up from possible earlier loading effects
80  SetLoadingEffectAmount (0);
81 
82  GameObject loadingEffectGameObject = new GameObject ("LoadingEffect");
83 
84  foreach (Transform tf in transform) {
85  tf.gameObject.SetActive (true);
86  GameObject clone = Object.Instantiate (tf.gameObject);
87  clone.GetComponent<MeshRenderer> ().material = materialHologram;
88  clone.transform.SetParent (loadingEffectGameObject.transform, false);
89  Destroy (clone.GetComponent<MeshCollider> ());
90  }
91  loadingEffectGameObject.transform.SetParent (transform, false);
92 
93  loadingEffectActive = true;
94  loadingAmount = 0;
95  }
96 
97  public void endLoadingEffect()
98  {
99  loadingEffectActive = false;
100  Transform tf = transform.Find ("LoadingEffect");
101  if( tf != null )
102  Destroy (tf.gameObject);
103  }
104 
105  public void SetLoadingEffectAmount( float amount )
106  {
107  Bounds b = calculateBoundingBox ();
108 
109  amount = Mathf.Clamp (amount, 0f, 5f);
110  materialHologram.SetFloat ("_amount", amount);
111  materialHologram.SetVector ("_size", b.size);
112  materialHologram.SetVector ("_center", b.center);
113 
114  materialOpaque.SetFloat ("_amount", amount - 3f );
115  materialOpaque.SetVector ("_size", b.size);
116  materialOpaque.SetVector ("_center", b.center);
117 
118  materialTransparent.SetFloat ("_amount", amount - 3f );
119  materialTransparent.SetVector ("_size", b.size);
120  materialTransparent.SetVector ("_center", b.center);
121  }
122 
123  void Update () {
124  if (loadingEffectActive) {
125  loadingAmount = loadingAmount + 2f*Time.deltaTime;
126  SetLoadingEffectAmount (loadingAmount);
127  if (loadingAmount > 5) {
128  endLoadingEffect ();
129  }
130  }
131  }
132 }