2 using System.Collections;
3 using System.Collections.Generic;
12 public Sprite ToolSelectSprite;
13 public Sprite ToolAcceptSprite;
18 private GameObject activeTool = null;
20 public static ToolControl instance {
private set;
get; }
22 private GameObject toolRing;
24 private float rotationStartTime = 0f;
25 private float toolRingTargetAngle = 0.0f;
26 private float rotationTime = 0.3f;
28 private bool toolRingActive =
false;
29 private float movingStartTime = 0f;
30 private Vector3 targetPosition;
31 private float movingTime = 0.3f;
32 private float toolRingY = 0.1f;
33 private TextMesh ActiveToolName;
35 public Color iconColor =
new Color( 0.7f, 0.85f, 1.0f );
40 private List<ToolWidget> availableTools =
new List<ToolWidget> ();
43 private GameObject overridingTool;
44 private GameObject previousTool;
47 if( instance != null )
48 throw(
new System.Exception (
"Error: Cannot create more than one instance of ToolControl!"));
54 PatientEventSystem.startListening( PatientEventSystem.Event.PATIENT_FinishedLoading, patientLoaded );
55 PatientEventSystem.startListening( PatientEventSystem.Event.PATIENT_Closed, patientClosed );
57 InputDeviceManager.instance.setLeftControllerTouchpadIconCentral (ToolSelectSprite);
59 foreach (Transform child
in transform) {
60 child.gameObject.SetActive (
false);
62 updateAvailableTools ();
68 InputDevice inputDevice = InputDeviceManager.instance.currentInputDevice;
69 if (inputDevice.getDeviceType() == InputDeviceManager.InputDeviceType.ViveController) {
70 Controller lc = InputDeviceManager.instance.leftController;
73 if( lc.touchpadButtonState == UnityEngine.EventSystems.PointerEventData.FramePressState.Released ) {
74 if (lc.hoverTouchpadCenter()) {
76 }
else if (toolRingActive) {
77 if (lc.hoverTouchpadLeft()) {
79 }
else if (lc.hoverTouchpadRight()) {
81 }
else if (lc.hoverTouchpadDown()) {
89 if (toolRing != null) {
91 Quaternion targetRotation = Quaternion.AngleAxis (toolRingTargetAngle, Vector3.up);
92 toolRing.transform.localRotation = Quaternion.Slerp (toolRing.transform.localRotation,
93 targetRotation, (Time.time - rotationStartTime) / rotationTime);
96 toolRing.transform.localPosition = Vector3.Slerp( toolRing.transform.localPosition,
97 targetPosition, (Time.time - movingStartTime) / movingTime);
99 ActiveToolName.transform.localPosition = toolRing.transform.localPosition +
new Vector3 ( 0f, -0.06f, -0.07f );
101 updateToolRingIcons ();
105 public void updateAvailableTools(
object obj = null )
107 availableTools =
new List<ToolWidget> ();
109 foreach (Transform child
in transform) {
116 availableTools.Add (tool);
123 foreach (Transform child
in ToolUIAnchor.instance.transform)
133 availableTools.Add(tool);
143 Controller lc = InputDeviceManager.instance.leftController;
146 Transform oldToolRing = lc.transform.Find (
"ToolRingAnchor");
147 if (oldToolRing != null)
148 Destroy (oldToolRing.gameObject);
151 GameObject anchor =
new GameObject (
"ToolRingAnchor");
152 anchor.transform.SetParent (lc.transform,
false);
153 anchor.transform.localPosition =
new Vector3 (0f, -0.025f, 0f);
154 anchor.transform.localRotation = Quaternion.AngleAxis (85f, Vector3.right);
155 toolRing =
new GameObject (
"ToolRing");
156 toolRing.transform.SetParent (anchor.transform,
false);
160 int numTools = availableTools.Count;
161 float radius = 0.07f;
164 float currentAngle = (float)i * (2f * Mathf.PI) / (float)numTools;
166 GameObject go =
new GameObject (i.ToString ());
167 go.transform.SetParent (toolRing.transform);
168 go.transform.localPosition = radius * (
new Vector3 (-Mathf.Sin (currentAngle), 0f, -Mathf.Cos (currentAngle)));
169 go.transform.localRotation = Quaternion.AngleAxis (currentAngle * 180f / Mathf.PI, Vector3.up);
170 go.transform.localScale =
new Vector3 (0.045f, 0.045f, 0.045f);
171 SpriteRenderer sr = go.AddComponent<SpriteRenderer> ();
172 sr.sprite = tool.ToolIcon;
173 sr.sortingLayerID = SortingLayer.NameToID (
"Sprites");
177 entry.name = tool.name;
182 GameObject text =
new GameObject (
"ToolNameText");
183 text.transform.SetParent (anchor.transform);
184 text.transform.localPosition =
new Vector3 (0f, -0.06f, -radius);
185 text.transform.localRotation = Quaternion.AngleAxis (0f * 180f / Mathf.PI, Vector3.up);
186 text.transform.localScale =
new Vector3 (0.02f, 0.02f, 0.02f);
187 ActiveToolName = text.AddComponent<TextMesh> ();
188 ActiveToolName.text =
"";
189 ActiveToolName.fontSize = 40;
190 ActiveToolName.alignment = TextAlignment.Center;
191 ActiveToolName.anchor = TextAnchor.MiddleCenter;
193 Renderer r = text.GetComponent<Renderer> ();
194 r.sortingLayerID = SortingLayer.NameToID (
"Sprites");
199 RiftToolRing.instance.setAvailableTools (availableTools);
204 public void removeToolRing()
206 targetPosition =
new Vector3 (0f, 0f, 0.0f);
208 movingStartTime = Time.time;
211 public void activateToolRing()
217 InputDeviceManager.instance.setLeftControllerTouchpadIconCentral (ToolAcceptSprite);
218 InputDeviceManager.instance.setLeftControllerTouchpadIcons (ArrowL, ArrowR, null, Cancel);
219 toolRingActive =
true;
222 targetPosition =
new Vector3 (0f, toolRingY, 0f);
224 movingStartTime = Time.time;
227 public void toggleToolRing()
233 InputDeviceManager.instance.setLeftControllerTouchpadIconCentral (ToolSelectSprite);
234 InputDeviceManager.instance.setLeftControllerTouchpadIcons (null, null, null, null);
235 toolRingActive =
false;
238 if( selectedToolEntry != null )
240 Debug.Log (
"SelectedToolEntry: " + selectedToolEntry.Tool.name);
241 chooseTool (selectedToolEntry.Tool);
249 public void toolRingCancel()
252 InputDeviceManager.instance.setLeftControllerTouchpadIconCentral (ToolSelectSprite);
253 InputDeviceManager.instance.setLeftControllerTouchpadIcons (null, null, null, null);
254 toolRingActive =
false;
260 if (toolRing == null)
263 int numTools = transform.childCount;
264 float angle = (360f) / (
float)numTools;
265 setToolRingTargetRotation( toolRingTargetAngle + angle );
272 if (toolRing == null)
275 int numTools = transform.childCount;
276 float angle = (360f) / (
float)numTools;
277 setToolRingTargetRotation( toolRingTargetAngle - angle );
281 public void setToolRingTargetRotation(
float angle )
283 toolRingTargetAngle = angle;
284 rotationStartTime = Time.time;
288 public void updateToolRingIcons()
290 if (toolRing != null) {
293 float alpha = Mathf.Pow (toolRing.transform.localPosition.y / toolRingY, 2f);
295 float scale = 0.75f + 0.25f * alpha;
296 Vector3 scaleVec = 0.045f*(
new Vector3( scale, scale, scale ));
299 float smallestAngleDiff = float.MaxValue;
300 selectedToolEntry = null;
302 foreach (Transform tf
in toolRing.transform) {
304 tf.gameObject.SetActive (
true);
306 float angleDiff = Mathf.Abs(-toolRing.transform.localEulerAngles.y - tf.localEulerAngles.y);
307 angleDiff = angleDiff % 360f;
308 if (angleDiff > 180f)
309 angleDiff = 360f - angleDiff;
310 Color col = (1f - angleDiff / 360f)*(iconColor);
313 tf.localScale = scaleVec;
315 if(tf.GetComponent<SpriteRenderer> () != null)
316 tf.GetComponent<SpriteRenderer> ().color = col;
318 if (angleDiff < smallestAngleDiff) {
319 smallestAngleDiff = angleDiff;
323 tf.gameObject.SetActive (
false);
326 if (selectedToolEntry != null) {
327 Color col = Color.white;
329 selectedToolEntry.GetComponent<SpriteRenderer>().color = col;
330 ActiveToolName.text = selectedToolEntry.name;
332 Color textCol = ActiveToolName.color;
333 textCol.a = alpha*alpha;
334 ActiveToolName.color = textCol;
335 ActiveToolName.transform.localScale = scaleVec * 0.1f;
339 public void patientLoaded(
object obj = null )
341 updateAvailableTools ();
345 public void patientClosed(
object obj = null )
347 if (activeTool != null) {
352 updateAvailableTools ();
356 public void closeActiveTool()
358 if (activeTool != null) {
359 activeTool.SetActive (
false);
362 InputDeviceManager.instance.resetToolIcons ();
368 previousTool = activeTool;
369 overridingTool = null;
373 activeTool = tool.gameObject;
375 activeTool.SetActive (
true);
376 InputDeviceManager.instance.shakeLeftController( 0.5f, 0.15f );
383 if (tool.name == name) {
384 if (tool.gameObject != activeTool) {
386 overridingTool = tool.gameObject;
392 public void unoverrideTool(
string name )
394 if (overridingTool != null && overridingTool.name == name) {
395 overridingTool = null;
396 if (previousTool != null) {
397 chooseTool (previousTool.GetComponent<
ToolWidget> ());