VRMainControlPanel.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. namespace ZenFulcrum.EmbeddedBrowser {
  6. /// <summary>
  7. /// Handler class for doing open/close/move of browsers and the animations for such.
  8. /// </summary>
  9. public class VRMainControlPanel : MonoBehaviour {
  10. public static VRMainControlPanel instance;
  11. public GameObject browserPrefab;
  12. public float moveSpeed = .01f;
  13. public float height = 1.5f, radius = 2f;
  14. public int browsersToFit = 8;
  15. protected List<VRBrowserPanel> allBrowsers = new List<VRBrowserPanel>();
  16. public ExternalKeyboard keyboard;
  17. private Vector3 baseKeyboardScale;
  18. public void Awake() {
  19. instance = this;
  20. var browser = GetComponent<Browser>();
  21. browser.RegisterFunction("openNewTab", args => OpenNewTab());
  22. browser.RegisterFunction("shiftTabs", args => ShiftTabs(args[0]));
  23. baseKeyboardScale = keyboard.transform.localScale;
  24. OpenNewTab();
  25. }
  26. private void ShiftTabs(int direction) {
  27. allBrowsers = allBrowsers.Select((t, i) => allBrowsers[(i + direction + allBrowsers.Count) % allBrowsers.Count]).ToList();
  28. }
  29. public VRBrowserPanel OpenNewTab(VRBrowserPanel nextTo = null) {
  30. var tabGO = Instantiate(browserPrefab);
  31. var tab = tabGO.GetComponent<VRBrowserPanel>();
  32. var insertIndex = -1;
  33. if (nextTo) insertIndex = allBrowsers.FindIndex(x => x == nextTo);
  34. if (insertIndex > 0) allBrowsers.Insert(insertIndex + 1, tab);
  35. else allBrowsers.Insert(allBrowsers.Count / 2, tab);
  36. tab.transform.position = transform.position;
  37. tab.transform.rotation = transform.rotation;
  38. tab.transform.localScale = Vector3.zero;
  39. return tab;
  40. }
  41. private VRBrowserPanel keyboardTarget;
  42. public void MoveKeyboardUnder(VRBrowserPanel panel) {
  43. keyboardTarget = panel;
  44. }
  45. public void DestroyPane(VRBrowserPanel pane) {
  46. StartCoroutine(_DestroyBrowser(pane));
  47. }
  48. private IEnumerator _DestroyBrowser(VRBrowserPanel pane) {
  49. //drop the pane and destroy it
  50. allBrowsers.Remove(pane);
  51. if (!pane) yield break;
  52. var targetPos = pane.transform.position;
  53. targetPos.y = 0;
  54. var t0 = Time.time;
  55. while (Time.time < t0 + 3) {
  56. if (!pane) yield break;
  57. MoveToward(pane.transform, targetPos, pane.transform.rotation, Vector3.zero);
  58. yield return null;
  59. }
  60. Destroy(pane.gameObject);
  61. }
  62. private void MoveToward(Transform t, Vector3 pos, Quaternion rot, Vector3 scale) {
  63. t.position = Vector3.Lerp(t.position, pos, moveSpeed);
  64. t.rotation = Quaternion.Slerp(t.rotation, rot, moveSpeed);
  65. t.localScale = Vector3.Lerp(t.localScale, scale, moveSpeed);
  66. }
  67. public void Update() {
  68. //animate all panes to their respective positions
  69. var p = Mathf.Clamp01((allBrowsers.Count - 1) / (float)browsersToFit);
  70. var radialAmount = Mathf.Lerp(0, 360, p);
  71. var radialOffset = Mathf.Lerp(0, 180, p);
  72. var countOffset = Mathf.Lerp(1, 0, p);
  73. for (int i = 0; i < allBrowsers.Count; i++) {
  74. var angle = i / (allBrowsers.Count - countOffset) * radialAmount - radialOffset;
  75. if (i == 0 && allBrowsers.Count == 1) angle = radialAmount / 2f - radialOffset;
  76. angle *= Mathf.Deg2Rad;
  77. var pos = new Vector3(Mathf.Sin(angle) * radius, height, Mathf.Cos(angle) * radius);
  78. var rotation = Quaternion.LookRotation(new Vector3(pos.x, 0, pos.z), Vector3.up);
  79. MoveToward(allBrowsers[i].transform, pos, rotation, Vector3.one);
  80. }
  81. {
  82. var pos = keyboardTarget ? keyboardTarget.keyboardLocation.position : Vector3.zero;
  83. var rot = keyboardTarget ? keyboardTarget.keyboardLocation.rotation : Quaternion.LookRotation(Vector3.down, Vector3.forward);
  84. var scale = keyboardTarget ? baseKeyboardScale : Vector3.zero;
  85. MoveToward(keyboard.transform, pos, rot, scale);
  86. }
  87. }
  88. }
  89. }