2using System.Collections;
3using System.Collections.Generic;
4using System.Runtime.Serialization;
6using NaughtyAttributes;
10using System.Globalization;
13using Valve.VR.InteractionSystem;
20 internal Vector3 targetPosition, targetRotation;
21 internal bool activated;
23 internal GameObject highlightObject, highlightTool;
27 internal GameObject finishBtn, inspector, canvas, stageManagerWindow, savedCustomTool;
28 private Coroutine mouseOver, mouseOver2;
29 internal float time = 0.0f;
30 internal int selectedAxis;
31 internal GameObject cachedGO;
32 private Vector3 currpos, currrot;
33 private Vector3 lastHandPos = Vector3.zero;
34 private float currentProgress = 0.0f;
35 internal float rotateAmount = 360f;
45 stageManagerWindow = GameObject.Find(
"StageManager Window");
49 canvas = GameObject.Find(
"Canvas");
50 var trs = canvas.GetComponentsInChildren<Transform>(
true);
51 foreach (var t
in trs)
52 if (t.name ==
"Inspector")
53 inspector = t.gameObject;
55 trs = inspector.GetComponentsInChildren<Transform>(
true);
56 foreach (var t
in trs)
57 if (t.name ==
"FinishToolPos_Btn")
58 finishBtn = t.gameObject;
61 if (!cachedGO) cachedGO = GetInputGO();
68 if (mouseOver !=
null)
69 StopCoroutine(mouseOver);
70 if (mouseOver2 !=
null)
71 StopCoroutine(mouseOver2);
72 Destroy(highlightObject);
73 Destroy(highlightTool);
79 cachedGO = GetInputGO();
84 if (targetPosition ==
default)
return;
88 mouseOver = StartCoroutine(ShowHighLight());
89 mouseOver2 = StartCoroutine(ShowToolHighLight());
96 if (mouseOver !=
null)
97 StopCoroutine(mouseOver);
98 if (mouseOver2 !=
null)
99 StopCoroutine(mouseOver2);
100 Destroy(highlightObject);
101 Destroy(highlightTool);
108 Vector3 axis = xyz == 0 ? Vector3.right : (xyz == 1) ? Vector3.up : Vector3.forward;
109 StartCoroutine(AxisVisualizer(axis));
112 private IEnumerator AxisVisualizer(Vector3 axis)
114 var origrot = cachedGO.transform.eulerAngles;
115 for (
float i = 0; i < 1; i += Time.deltaTime)
117 var currrot = (i * 360f) * axis;
118 cachedGO.transform.eulerAngles = origrot + currrot;
121 cachedGO.transform.eulerAngles = origrot;
126 if (!inspector.activeSelf)
127 inspector.SetActive(
true);
129 var btnOffset = finishBtn.transform.parent.GetComponent<RectTransform>().rect.width;
131 finishBtn.GetComponent<RectTransform>().anchoredPosition =
new Vector2(-(btnOffset + spacing), 0);
133 finishBtn.SetActive(
true);
138 finishBtn.SetActive(
false);
142 void SaveTarget(Transform t)
144 targetPosition = t.position;
145 targetRotation = t.eulerAngles;
152 if (
Math.Abs(t.position.x - targetPosition.x) > 0.05f)
return false;
153 if (
Math.Abs(t.position.y - targetPosition.y) > 0.05f)
return false;
154 if (
Math.Abs(t.position.z - targetPosition.z) > 0.09f)
return false;
164 if (base.isInFieldOfView(GetToolObject())) base.actionRecognized =
true;
167 if (!activated || done)
return;
172 var tool = GetToolObject();
178 var t = tool.transform;
181 time += Time.deltaTime;
192 if (!highlightObject)
194 Destroy(highlightObject);
195 StartCoroutine(ShowHighLight());
207 if (
gripButton.GetState(SteamVR_Input_Sources.Any))
218 private void DeltaRotate(Transform t)
221 var lastHand =
gripButton.GetActiveDevice(SteamVR_Input_Sources.Any);
225 foreach (var hand
in Player.instance.hands)
227 if (hand.handType == lastHand)
229 handpos = hand.transform.position;
234 if (lastHandPos ==
Vector3.zero)
236 lastHandPos = handpos;
240 if (!cachedGO) cachedGO = GetInputGO();
243 var localHandPos = cachedGO.transform.InverseTransformPoint(handpos);
244 var localLastHandPos = cachedGO.transform.InverseTransformPoint(lastHandPos);
246 switch (selectedAxis)
250 localLastHandPos.x = 0;
255 localLastHandPos.y = 0;
260 localLastHandPos.z = 0;
266 var c =
Vector3.Distance(localHandPos, localLastHandPos);
273 var handDelta = lastHandPos - handpos;
274 var localDelta = cachedGO.transform.InverseTransformDirection(handDelta);
277 if (selectedAxis == 0)
279 if (localDelta.z > 0)
281 if (localHandPos.y < 0)
292 if (localHandPos.y > 0)
302 if (selectedAxis == 1)
304 if (localDelta.z > 0)
306 if (localHandPos.x > 0)
317 if (localHandPos.x < 0)
327 if (selectedAxis == 2)
329 if (localDelta.x < 0)
331 if (localHandPos.y < 0)
343 if (localHandPos.y > 0)
354 var angle = Mathf.Acos((Mathf.Pow(a, 2) + Mathf.Pow(b, 2) - Mathf.Pow(c, 2)) / (2 * a * b)) * Mathf.Rad2Deg;
358 cachedGO.transform.Rotate(axis, right ? angle : -angle);
360 lastHandPos = handpos;
363 currentProgress += angle;
364 if (Mathf.Abs(currentProgress) >= rotateAmount)
367 tcd.onDetachFromHand.AddListener(OnToolPutDown);
368 Destroy(highlightObject);
369 Destroy(highlightTool);
377 internal GameObject GetToolObject()
382 return savedCustomTool;
401 Debug.LogWarning(
"not parsable number(?) in holdTime inputfield!");
408 internal IEnumerator ShowHighLight()
410 if (highlightObject) Destroy(highlightObject);
414 yield
return new WaitForEndOfFrame();
424 var cachedGO = savedCustomTool;
426 highlightObject = Instantiate(cachedGO, targetPosition, Quaternion.Euler(targetRotation), cachedGO.transform.parent);
427 highlightObject.transform.position = targetPosition;
428 highlightObject.transform.eulerAngles = targetRotation;
434 Destroy(highlightObject.GetComponent<Interactable>());
437 var allCollider = highlightObject.GetComponentsInChildren<Collider>();
438 var allRb = highlightObject.GetComponentsInChildren<Rigidbody>();
440 foreach (var c
in allCollider)
443 foreach (var c
in allRb)
446 Destroy(highlightObject.GetComponent<
HashHolder>());
448 yield
return new WaitForEndOfFrame();
452 Destroy(highlightObject);
456 if (!highlightObject) yield
break;
458 highlightObject.transform.SetPositionAndRotation(targetPosition,
Quaternion.Euler(targetRotation));
459 highlightObject.transform.position = targetPosition;
460 highlightObject.transform.eulerAngles = targetRotation;
463 highlightObject.transform.localScale *= 1.001f;
465 highlightObject.transform.SetParent(
null,
true);
466 highlightObject.SetActive(
true);
467 MatChange(highlightObject);
468 if (highlightTool) highlightTool.SetActive(
false);
471 private IEnumerator ShowPreview(Vector3 TargetPosition, GameObject TargetObject)
474 yield
return new WaitForEndOfFrame();
484 private IEnumerator ShowToolHighLight()
486 if (highlightTool) Destroy(highlightTool);
490 yield
return new WaitForEndOfFrame();
494 var thl = GetToolObject();
496 if (thl ==
null)
Debug.LogError(
"ShowToolHighlight tool is null!");
498 highlightTool = Instantiate(thl, thl.transform.position, thl.transform.rotation,
null);
503 Destroy(highlightTool.GetComponent<Interactable>());
505 var allCollider = highlightTool.GetComponentsInChildren<Collider>();
506 var allRb = highlightTool.GetComponentsInChildren<Rigidbody>();
508 foreach (var c
in allCollider)
511 foreach (var c
in allRb)
514 Destroy(highlightTool.GetComponent<
HashHolder>());
516 yield
return new WaitForEndOfFrame();
518 highlightTool.transform.SetPositionAndRotation(thl.transform.position, thl.transform.rotation);
521 highlightTool.transform.localScale *= 1.001f;
523 highlightTool.SetActive(
true);
525 MatChange(highlightTool,
true);
528 private void MatChange(GameObject go,
bool tool =
false)
530 var mrs = go.GetComponentsInChildren<MeshRenderer>();
531 foreach (var meshRenderer
in mrs)
533 var list =
new List<Material>();
534 for (var i = 0; i < meshRenderer.materials.Length; i++)
537 meshRenderer.materials = list.ToArray();
549 Destroy(highlightTool);
554 StartCoroutine(Cleanup());
557 private IEnumerator LateOnPutToolDown()
561 if (nextActionIsTheSame()) OnToolPutDown();
566 if (tcd.onDetachFromHand ==
null)
568 tcd.onDetachFromHand.AddListener(OnToolPutDown);
572 internal bool nextActionIsTheSame()
575 foreach (var conn
in connections)
580 foreach (var act
in actions)
592 private IEnumerator Cleanup()
595 Destroy(highlightTool);
596 Destroy(highlightObject);
598 Destroy(highlightTool);
599 Destroy(highlightObject);
601 Destroy(highlightTool);
602 Destroy(highlightObject);
604 Destroy(highlightTool);
605 Destroy(highlightObject);
608 private void TriggerOutput()
612 var tool = GetToolObject();
613 if (tool && !nextActionIsTheSame())
620 Destroy(highlightTool);
622 TriggerOutput(
outPuts[0].name);
631 if (GetToolObject() ==
null && savedCustomTool !=
null)
647 lastHandPos = Vector3.zero;
648 currentProgress = 0.0f;
652 StartCoroutine(ShowToolHighLight());
656 StartCoroutine(ShowPreview(GetToolObject().transform.position, GetToolObject()));
657 var tool = GetToolObject();
665 if (tcd.onDetachFromHand ==
null)
682 var tool = GetToolObject();
700 GetToolObject()?.SetActive(
true);
705 internal GameObject GetInputGO()
711 GameObject retval =
null;
716 Debug.Log($
"RotateAction requested: \"{retval}\"");
754 var to = GetToolObject();
755 if (to !=
null) toolname = to.name;
756 toolname = toolname.Replace(
"(Clone)",
"").Replace(
"_blue",
"");
770 savedCustomTool = tool;
772 currpos = tool.transform.position;
773 currrot = tool.transform.eulerAngles;
774 GameObject.Find(
"Btn_StageMgr").GetComponent<
Button>().onClick.Invoke();
777 finishBtn.GetComponent<
Button>().onClick.RemoveAllListeners();
778 finishBtn.GetComponent<
Button>().onClick.AddListener(OnFinishBtn);
785 ResetTool(selection,
true);
788 void OnRemovedFromSelection(IEnumerable<GameObject> selection)
790 ResetTool(selection);
793 void ResetTool(IEnumerable<GameObject> selection,
bool saveTarget =
false)
795 foreach (var o
in selection)
796 if (o.GetComponent<
ToolGO>())
799 if (stageManagerWindow.GetComponent<CanvasGroup>().alpha == 0)
800 GameObject.Find(
"Btn_StageMgr").GetComponent<
Button>().onClick.Invoke();
802 if (saveTarget) SaveTarget(o.transform);
803 o.transform.eulerAngles = currrot;
804 o.transform.position = currpos;
813 if (hash ==
"")
return;
820 rotateInput?.SetTextWithoutNotify(rotateAmount.ToString(
"F2"));
823 private void OnToolPutDown()
828 TriggerOutput(
outPuts[0].name);
831 if (!nextActionIsTheSame())
833 if (GetToolObject() ==
null)
848 Destroy(highlightTool);
849 Destroy(highlightObject);
854 var tool = GetToolObject();
857 tcd.onDetachFromHand.RemoveListener(OnToolPutDown);
866 internal IEnumerator TCDOff()
868 yield
return new WaitForSeconds(0.7f);
869 if (GetToolObject() ==
null)
878 public override void GetObjectData(SerializationInfo info, StreamingContext context)
880 base.GetObjectData(info, context);
882 info.AddValue(
"targetPosition", targetPosition, typeof(Vector3));
883 info.AddValue(
"targetRotation", targetRotation, typeof(Vector3));
884 info.AddValue(
"axis", selectedAxis, typeof(
int));
889 info.AddValue(
"selectedGOHash",
selectedHash, typeof(
string));
891 info.AddValue(
"selectedGOHash", cachedGO.GetComponent<
HashHolder>().
Hash, typeof(
string));
901 info.AddValue(
"taktTime", taktTime, typeof(
float));
902 if (rotateAmount == 0)
904 info.AddValue(
"rotateAmount", rotateAmount);
907 public RotateAction(SerializationInfo info, StreamingContext context) : base(info, context)
909 targetPosition = (Vector3)info.GetValue(
"targetPosition", typeof(Vector3));
910 targetRotation = (Vector3)info.GetValue(
"targetRotation", typeof(Vector3));
914 foreach (var e
in info)
916 if (e.Name ==
"selectedToolHash")
918 if (e.Name ==
"selectedGOHash")
selectedHash = info.GetString(
"selectedGOHash");
919 if (e.Name ==
"taktTime") taktTime = (float)info.GetValue(
"taktTime", typeof(
float));
920 if (e.Name ==
"axis") selectedAxis = info.GetInt32(
"axis");
921 if (e.Name ==
"rotateAmount") rotateAmount = info.GetSingle(
"rotateAmount");
UnityEngine.UI.Button Button
List< GameObject > outPuts
ActionObject[] GetActionsByIn(string id)
List< string > GetOutputConnectionsToObject(string id)
Connection GetConnectionByEndPointId(string id)
Connection GetConnectionById(string id)
ActionObject GetActionByInOut(string id)
static Controller Instance
void StartFollowing(Vector3 EndPosition, GameObject TargetObject)
static List< GameObject > gameObjects
A list of the currently selected GameObjects.
static void AddOnRemovedFromSelectionListener(Callback< IEnumerable< GameObject > > del)
static void SetSelection(IEnumerable< GameObject > selection)
static float StoF(string value)
void hideHandPreview(GameObject objectToGrab)
void EnterOffsetEditor(GameObject objectToGrab, ActionObject action, Vector3 TargetPos, Vector3 TargetRot)
static PreviewHand Instance
void OnAxisChanged(int xyz)
Material highlightMaterial
override void InputAdded(string id)
Material origHighlightToolMaterial
void OnRotateAmountChanged(string s)
GameObject GetGameObject()
void SelectedCustomTool(GameObject tool)
override void GetObjectData(SerializationInfo info, StreamingContext context)
override void Deactivate()
SteamVR_Action_Boolean gripButton
override void OnPointerExit(PointerEventData eventData)
override void OnPointerEnter(PointerEventData eventData)
RotateAction(SerializationInfo info, StreamingContext context)
void SetGameObject(string hash)
Material highlightToolMaterial
void RefreshTargetDisplay()
override void Triggered(string id)
IEnumerator SetGameObjectJob(string hash)
bool InGoodPos(Transform t)
void onTaktTimeChanged(string value)
static SoundManager instance
static TorqueWrenchDigital instance
static TorqueWrench instance
static TorqueWrenchSmol instance