8 using UnityEngine.Rendering;
9 using System.Collections;
12 [ExecuteInEditMode, RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
15 public float borderThickness = 0.15f;
16 public float wireframeHeight = 2.0f;
17 public bool drawWireframeWhenSelectedOnly =
false;
18 public bool drawInGame =
true;
29 public Color color = Color.cyan;
32 public Vector3[] vertices;
34 public static bool GetBounds( Size size, ref
HmdQuad_t pRect )
36 if (size == Size.Calibrated)
38 var initOpenVR = (!SteamVR.active && !SteamVR.usingNativeSupport);
41 var error = EVRInitError.None;
42 OpenVR.Init(ref error, EVRApplicationType.VRApplication_Utility);
45 var chaperone = OpenVR.Chaperone;
46 Debug.Log (chaperone);
47 bool success = (chaperone != null) && chaperone.GetPlayAreaRect(ref pRect);
49 Debug.LogWarning(
"Failed to get Calibrated Play Area bounds! Make sure you have tracking first, and that your space is calibrated.");
60 var str = size.ToString().Substring(1);
61 var arr = str.Split(
new char[] {
'x'}, 2);
64 var x = float.Parse(arr[0]) / 200;
65 var z = float.Parse(arr[1]) / 200;
67 pRect.vCorners0.v0 = x;
68 pRect.vCorners0.v1 = 0;
69 pRect.vCorners0.v2 = -z;
71 pRect.vCorners1.v0 = -x;
72 pRect.vCorners1.v1 = 0;
73 pRect.vCorners1.v2 = -z;
75 pRect.vCorners2.v0 = -x;
76 pRect.vCorners2.v1 = 0;
77 pRect.vCorners2.v2 = z;
79 pRect.vCorners3.v0 = x;
80 pRect.vCorners3.v1 = 0;
81 pRect.vCorners3.v2 = z;
91 public void BuildMesh()
94 if ( !GetBounds( size, ref rect ) )
97 var corners =
new HmdVector3_t[] { rect.vCorners0, rect.vCorners1, rect.vCorners2, rect.vCorners3 };
99 vertices =
new Vector3[corners.Length * 2];
100 for (
int i = 0; i < corners.Length; i++)
103 vertices[i] =
new Vector3(c.v0, 0.01f, c.v2);
106 if (borderThickness == 0.0f)
108 GetComponent<MeshFilter>().mesh = null;
112 for (
int i = 0; i < corners.Length; i++)
114 int next = (i + 1) % corners.Length;
115 int prev = (i + corners.Length - 1) % corners.Length;
117 var nextSegment = (vertices[next] - vertices[i]).normalized;
118 var prevSegment = (vertices[prev] - vertices[i]).normalized;
120 var vert = vertices[i];
121 vert += Vector3.Cross(nextSegment, Vector3.up) * borderThickness;
122 vert += Vector3.Cross(prevSegment, Vector3.down) * borderThickness;
124 vertices[corners.Length + i] = vert;
127 var triangles =
new int[]
139 var uv =
new Vector2[]
141 new Vector2(0.0f, 0.0f),
142 new Vector2(1.0f, 0.0f),
143 new Vector2(0.0f, 0.0f),
144 new Vector2(1.0f, 0.0f),
145 new Vector2(0.0f, 1.0f),
146 new Vector2(1.0f, 1.0f),
147 new Vector2(0.0f, 1.0f),
148 new Vector2(1.0f, 1.0f)
151 var colors =
new Color[]
157 new Color(color.r, color.g, color.b, 0.0f),
158 new Color(color.r, color.g, color.b, 0.0f),
159 new Color(color.r, color.g, color.b, 0.0f),
160 new Color(color.r, color.g, color.b, 0.0f)
163 var mesh =
new Mesh();
164 GetComponent<MeshFilter>().mesh = mesh;
165 mesh.vertices = vertices;
167 mesh.colors = colors;
168 mesh.triangles = triangles;
170 var renderer = GetComponent<MeshRenderer>();
171 renderer.material =
new Material(Shader.Find(
"Sprites/Default"));
172 renderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
173 renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
174 renderer.receiveShadows =
false;
175 renderer.lightProbeUsage = LightProbeUsage.Off;
182 if (!Application.isPlaying)
184 var fields = GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
186 bool rebuild =
false;
188 if (values == null || (borderThickness != 0.0f && GetComponent<MeshFilter>().sharedMesh == null))
194 foreach (var f
in fields)
196 if (!values.Contains(f) || !f.GetValue(
this).Equals(values[f]))
208 values =
new Hashtable();
209 foreach (var f
in fields)
210 values[f] = f.GetValue(
this);
218 if (!drawWireframeWhenSelectedOnly)
222 void OnDrawGizmosSelected()
224 if (drawWireframeWhenSelectedOnly)
228 public void DrawWireframe()
230 if (vertices == null || vertices.Length == 0)
233 var offset = transform.TransformVector(Vector3.up * wireframeHeight);
234 for (
int i = 0; i < 4; i++)
236 int next = (i + 1) % 4;
238 var a = transform.TransformPoint(vertices[i]);
240 var c = transform.TransformPoint(vertices[next]);
242 Gizmos.DrawLine(a, b);
243 Gizmos.DrawLine(a, c);
244 Gizmos.DrawLine(b, d);
248 public void OnEnable()
250 if (Application.isPlaying)
252 GetComponent<MeshRenderer>().enabled = drawInGame;
261 if (drawInGame && size == Size.Calibrated)
262 StartCoroutine(UpdateBounds());
266 IEnumerator UpdateBounds()
268 GetComponent<MeshFilter>().mesh = null;
270 var chaperone = OpenVR.Chaperone;
271 if (chaperone == null)
274 while (chaperone.GetCalibrationState() != ChaperoneCalibrationState.OK)