3using System.Collections;
4using System.Collections.Generic;
12using Valve.VR.InteractionSystem;
13using ViveHandTracking;
20 : Valve.VR.InteractionSystem.Hand
33 private float flyIn = 0.0f;
34 private float time = 0.0f;
37 private Vector3 objectStart, rightHandPos, leftHandPos;
38 private Quaternion objectRot;
39 private bool leftSpawn =
false;
43 private Vector3 originalRotation;
44 private Vector3 attachOriginalRotation;
45 private Vector3 OriginalHandPosition;
46 private Vector3 OriginalHandRotation;
48 internal List<GameObject> collidedFingers =
new List<GameObject>();
49 internal List<GameObject> SavedCollidedFingers =
new List<GameObject>();
50 internal bool attachedToHand =
false;
51 internal bool handAnim =
false;
52 internal bool twoHand =
false;
53 internal bool delay =
false;
54 internal bool animIsOver =
false;
56 internal bool realToolInHand =
false;
61 protected override IEnumerator
Start()
66 grabPinchAction =
null;
67 grabGripAction =
null;
71 uiInteractAction =
null;
72 if (GetComponentInChildren<HandCopyAvg>())
74 OriginalHandPosition = GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localPosition;
75 OriginalHandRotation = GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localEulerAngles;
86 overlappingColliders =
new Collider[ColliderArraySize];
91 if (noSteamVRFallbackCamera)
105 HideController(
true);
106 if (GetComponentInChildren<HandAnimHelper>())
107 originalRotation = GetComponentInChildren<HandAnimHelper>().gameObject.transform.localEulerAngles;
109 if (objectAttachmentPoint)
110 attachOriginalRotation = objectAttachmentPoint.localEulerAngles;
115 bool hadOldRendermodel = mainRenderModel !=
null;
116 EVRSkeletalMotionRange oldRM_rom = EVRSkeletalMotionRange.WithController;
117 if (hadOldRendermodel)
118 oldRM_rom = mainRenderModel.GetSkeletonRangeOfMotion;
121 foreach (RenderModel r
in renderModels)
124 Destroy(r.gameObject);
127 renderModels.Clear();
128 if (renderModelPrefab)
130 GameObject renderModelInstance =
null;
133 renderModelInstance = GameObject.Instantiate(renderModelPrefab);
134 renderModelInstance.layer = gameObject.layer;
135 renderModelInstance.tag = gameObject.tag;
136 renderModelInstance.transform.parent = this.transform;
137 renderModelInstance.transform.localPosition = Vector3.zero;
138 renderModelInstance.transform.localRotation = Quaternion.identity;
139 renderModelInstance.transform.localScale = renderModelPrefab.transform.localScale;
144 renderModelInstance.transform.localPosition = Vector3.zero;
145 renderModelInstance.transform.localRotation = Quaternion.identity;
146 renderModelInstance.transform.localScale = renderModelPrefab.transform.localScale;
153 mainRenderModel = renderModelInstance.GetComponent<RenderModel>();
154 renderModels.Add(mainRenderModel);
157 if (hadOldRendermodel)
158 mainRenderModel.SetSkeletonRangeOfMotion(oldRM_rom);
161 this.BroadcastMessage(
"SetInputSource", handType, SendMessageOptions.DontRequireReceiver);
187 if (!leftSpawn && objectStart !=
default(Vector3) && Vector3.Distance(objectStart, transform.position) > 0.2f)
192 if (leftSpawn && Vector3.Distance(objectStart, transform.position) < 0.2f)
199 if (
dropFive && currentAttachedObject)
201 if (GestureProvider.Current.engine.State.LeftHand !=
null)
202 if (handType == SteamVR_Input_Sources.LeftHand &&
203 GestureProvider.Current.engine.State.LeftHand.gesture == GestureType.Five)
208 if (GestureProvider.Current.engine.State.RightHand !=
null)
209 if (handType == SteamVR_Input_Sources.RightHand &&
210 GestureProvider.Current.engine.State.RightHand.gesture == GestureType.Five)
218 flyIn -= Time.deltaTime;
222 Debug.Log(
"flyIn done!");
242 if (GetComponentInChildren<TwoHandGrab>())
245 if (!otherHand.GetComponentInChildren<
HandCopySkelet>().isCollision && delay)
247 time += Time.deltaTime;
250 var tcd = GetComponentInChildren<ThrowableCanDisable>();
251 var rigidBody = tcd.GetComponent<Rigidbody>();
252 StartCoroutine(DelayKinematicTurnOff(tcd, rigidBody));
286 return base.GetGrabStarting(explicitType);
291 return GrabTypes.Grip;
293 return GrabTypes.None;
301 return base.IsGrabbingWithType(type);
310 internal void CheckNow()
314 public override void DetachObject(GameObject objectToDetach,
bool restoreOriginalParent =
true)
316 int index = attachedObjects.FindIndex(l => l.attachedObject == objectToDetach);
317 if (index == -1)
return;
320 if (GetComponentInChildren<HandCopyAvg>() && GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>())
324 GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
334 GetComponentInChildren<HandCopyAvg>(
true).enabled =
true;
340 attachedToHand =
false;
345 var info = currentAttachedObjectInfo;
347 var tempUE =
new UnityEvent();
360 tempUE = tcd.onDetachFromHand;
361 tcd.onDetachFromHand =
new UnityEvent();
375 if (objectToDetach.name.Contains(
"Csavar"))
377 FindObjectOfType<PromoHelper>().PlaySound(5);
379 if (objectToDetach.name.Contains(
"oszlop"))
381 FindObjectOfType<PromoHelper>().PlaySound(1);
383 if (objectToDetach.name.Contains(
"base"))
385 FindObjectOfType<PromoHelper>().PlaySound(3);
387 if (objectToDetach.name.Contains(
"topBack"))
389 FindObjectOfType<PromoHelper>().PlaySound(3);
395 base.setTwoHand(
false);
397 objectToDetach.GetComponent<
ThrowableCanDisable>().onDetachFromHand.RemoveListener(CheckNow);
399 otherHand.GetComponentInChildren<SkinnedMeshRenderer>().enabled =
true;
404 var rb = objectToDetach.GetComponentInChildren<Rigidbody>();
407 rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
410 var ph = GetComponent<PhysicsHand>();
413 ph.SetHoldItemRadius(0);
414 ph.SetHoldItemBounds(
default);
415 ph.SetHoldItemRenderer(
null);
419 base.DetachObject(objectToDetach, restoreOriginalParent);
430 if (tcd) tcd.onDetachFromHand = tempUE;
431 if (objectToDetach.transform.parent)
442 if (
returnItem && objectStart !=
default(Vector3) && objectRot !=
default(Quaternion))
444 objectToDetach.transform.position = objectStart;
445 objectToDetach.transform.rotation = objectRot;
448 if (GetComponentInChildren<HandAnimHelper>())
449 GetComponentInChildren<HandAnimHelper>().gameObject.transform.localEulerAngles = originalRotation;
451 objectStart =
default(Vector3);
452 objectRot =
default(Quaternion);
456 objectToDetach.transform.SetParent(info.Value.originalParent.transform,
true);
474 public override void AttachObject(GameObject objectToAttach, GrabTypes grabbedWithType,
475 AttachmentFlags flags = defaultAttachmentFlags, Transform attachmentOffset =
null)
478 AttachedObject attachedObject =
new AttachedObject();
479 attachedObject.attachmentFlags = flags;
480 attachedObject.attachedOffsetTransform = attachmentOffset;
481 attachedObject.attachTime = Time.time;
482 attachedObject.attachedObject = objectToAttach;
483 var savedrot = objectToAttach.transform.rotation;
486 flags = defaultAttachmentFlags;
488 if (otherHand && otherHand.attachedObjects.Count > 0 && attachedObjects.Count > 0)
494 attachedToHand =
true;
497 if (objectToAttach.GetComponentInChildren<MeshRenderer>())
499 var size = objectToAttach.GetComponentInChildren<MeshRenderer>().bounds.size;
500 volume = size.x * size.y * size.z;
509 if (GetComponentInChildren<HandCopyAvg>() && GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>())
511 GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
513 if (GetComponentInChildren<HandCopyAvg>())
517 GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localPosition = OriginalHandPosition;
518 GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localEulerAngles = OriginalHandRotation;
522 if (Vector3.Distance(objectToAttach.transform.position, hoverSphereTransform.position) > 0.1f && objectToAttach.GetComponent<
TwoHandGrab>() ==
null)
525 Debug.LogError(
"mi a fene " + name);
528 Transform trans =
null;
530 var rb = objectToAttach.GetComponentInParent<Rigidbody>();
534 base.setTwoHand(
true);
535 objectToAttach.GetComponent<
TwoHandGrab>().enabled =
true;
537 tcd.DelayedOnPickUp?.AddListener(CheckNow);
539 otherHand.GetComponentInChildren<SkinnedMeshRenderer>().enabled =
false;
548 if (objectToAttach.name !=
"DobotGrabSphere")
553 if (objectStart ==
default(Vector3) && objectRot ==
default(Quaternion))
555 objectStart = objectToAttach.transform.position;
556 objectRot = objectToAttach.transform.rotation;
559 GameObject origiParent =
null;
560 if (otherHand && otherHand.ObjectIsAttached(objectToAttach))
563 origiParent = otherHand.AttachedObjects[0].originalParent;
571 var offsetHolder = objectToAttach.GetComponent<
OffsetHolder>();
574 if (objectAttachmentPoint)
576 objectToAttach.transform.position = objectAttachmentPoint.position;
577 if (handType == SteamVR_Input_Sources.RightHand)
579 if (tcd && tcd.attachmentOffset)
581 Quaternion rotDiff = Quaternion.Inverse(tcd.attachmentOffset.transform.rotation) * objectToAttach.transform.rotation;
582 objectToAttach.transform.rotation = objectAttachmentPoint.rotation * rotDiff;
583 objectToAttach.transform.position += objectAttachmentPoint.position - tcd.attachmentOffset.position;
588 if (tcd && tcd.attachmentOffsetLeft)
590 Quaternion rotDiff = Quaternion.Inverse(tcd.attachmentOffsetLeft.transform.rotation) * objectToAttach.transform.rotation;
591 objectToAttach.transform.rotation = objectAttachmentPoint.rotation * rotDiff;
592 objectToAttach.transform.position += objectAttachmentPoint.position - tcd.attachmentOffsetLeft.position;
598 if (offsetHolder && (offsetHolder.Offset !=
default || offsetHolder.Rotation !=
default) && handType == SteamVR_Input_Sources.RightHand)
602 trans =
new GameObject(
"offset").transform;
603 trans.SetParent(objectToAttach.transform);
605 trans.localPosition = offsetHolder.Offset;
606 if (offsetHolder.Rotation !=
default)
607 trans.localEulerAngles = offsetHolder.Rotation;
608 attachmentOffset = trans;
611 if (offsetHolder && (offsetHolder.LeftOffset !=
default || offsetHolder.LeftRotation !=
default) && handType == SteamVR_Input_Sources.LeftHand)
615 trans =
new GameObject(
"offset").transform;
618 trans.SetParent(objectToAttach.transform);
620 trans.localPosition = offsetHolder.LeftOffset;
621 if (offsetHolder.LeftRotation !=
default)
622 trans.localEulerAngles = offsetHolder.LeftRotation;
623 attachmentOffset = trans;
630 var ph = GetComponent<PhysicsHand>();
634 ph.SetHoldItemRadius(itemBounds.extents.magnitude);
635 ph.SetHoldItemBounds(itemBounds);
636 ph.SetHoldItemRenderer(objectToAttach.GetComponentInChildren<Renderer>());
642 flags ^= AttachmentFlags.ParentToHand;
646 flags |= AttachmentFlags.SnapOnAttach;
647 objectToAttach.GetComponent<
ThrowableCanDisable>().attachmentFlags |= AttachmentFlags.SnapOnAttach;
651 base.AttachObject(objectToAttach, grabbedWithType, flags, attachmentOffset);
662 rb.useGravity =
false;
663 rb.isKinematic =
false;
674 var temp = attachedObjects[0];
675 temp.originalParent = origiParent;
676 attachedObjects.Clear();
677 attachedObjects.Add(temp);
685 if (tcd.handRotate !=
default && tcd.handRotate != Vector3.zero)
687 var tcdt = GetComponentInChildren<HandAnimHelper>().gameObject.transform;
689 if (objectAttachmentPoint)
691 objectAttachmentPoint.localEulerAngles = attachOriginalRotation;
692 objectAttachmentPoint.localEulerAngles += tcd.handRotate;
694 tcdt.localEulerAngles = originalRotation;
695 tcdt.localEulerAngles += tcd.handRotate;
701 objectToAttach.transform.SetParent(GetComponentInChildren<FollowOtherHand>().transform,
true);
702 objectToAttach.transform.localPosition = Vector3.zero;
703 StartCoroutine(LateRotate(objectToAttach.transform, savedrot));
713 objectToAttach.transform.SetParent(GetComponentInChildren<FollowOtherHand>().transform,
true);
714 objectToAttach.transform.localPosition = Vector3.zero;
715 StartCoroutine(LateRotate(objectToAttach.transform, savedrot));
733 if (attachedObject.HasAttachFlag(AttachmentFlags.SnapOnAttach) || flags.HasFlag(AttachmentFlags.SnapOnAttach))
754 IEnumerator LateRotate(Transform t, Quaternion rot)
763 IEnumerator LateReparent(GameObject objectToAttach)
765 yield
return new WaitForSeconds(1);
768 IEnumerator DelayColliderTurnOff(GameObject objectToDetach)
770 objectToDetach.GetComponentInChildren<Collider>().enabled =
false;
771 objectToDetach.GetComponent<Rigidbody>().isKinematic =
false;
772 yield
return new WaitForSeconds(1);
773 objectToDetach.GetComponentInChildren<Collider>().enabled =
true;
774 objectToDetach.GetComponent<Rigidbody>().isKinematic =
true;
781 rigidBody.isKinematic =
false;
782 rigidBody.useGravity =
true;
784 IEnumerator LateReOrient()
788 float duration = 0.75f;
790 while (time <= duration)
792 time += Time.deltaTime;
793 if (GetComponentInChildren<HandCopyAvg>())
795 var GOLocalPos = GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localPosition;
796 var GOLocalRot = GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localEulerAngles;
798 GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localPosition =
Vector3.Lerp(GOLocalPos, OriginalHandPosition, time / duration);
799 GetComponentInChildren<HandCopyAvg>(
true).gameObject.transform.localEulerAngles =
Vector3.Lerp(GOLocalRot, OriginalHandRotation, time / duration);
806 IEnumerator LateReScale(GameObject objectToAttach)
808 objectToAttach.transform.localScale =
new Vector3(Mathf.Abs(objectToAttach.transform.localScale.x), Mathf.Abs(objectToAttach.transform.localScale.y), Mathf.Abs(objectToAttach.transform.localScale.z));
819 float seconds = (float)microSecondsDuration / 1000000f;
820 if (hapticAction !=
null)
821 hapticAction.Execute(0, seconds, 1f / seconds, 1, handType);
826 if (currentAttachedObject ==
null)
return;
830 private bool isInFieldOfView(GameObject interactedGO)
832 Vector3 screenPoint =
VRCamera.WorldToViewportPoint(interactedGO.transform.position);
833 bool onScreen = screenPoint.z > 0 && screenPoint.x > 0 && screenPoint.x < 1 && screenPoint.y > 0 && screenPoint.y < 1;
840 var handEnabled = GetComponent<HandEnableDisable>().Hand.activeInHierarchy;
843 hoveringInteractable =
null;
844 if ((noSteamVRFallbackCamera ==
null) && (isActive ==
false))
855 if (applicationLostFocusObject.activeSelf)
858 float closestDistance =
float.MaxValue;
859 Interactable closestInteractable =
null;
863 float scaledHoverRadius = hoverSphereRadius * Mathf.Abs(SteamVR_Utils.GetLossyScale(hoverSphereTransform));
864 CheckHoveringForTransform(hoverSphereTransform.position, scaledHoverRadius, ref closestDistance, ref closestInteractable,
Color.green);
867 if (useControllerHoverComponent && mainRenderModel !=
null && mainRenderModel.IsControllerVisibile())
869 float scaledHoverRadius = controllerHoverRadius * Mathf.Abs(SteamVR_Utils.GetLossyScale(
this.transform));
870 CheckHoveringForTransform(mainRenderModel.GetControllerPosition(controllerHoverComponent), scaledHoverRadius / 2f, ref closestDistance, ref closestInteractable,
Color.blue);
880 Debug.LogWarning(
"HandCopyAvg and HandCopyLeap is NULL but using useFingerJointHover!");
883 var thumbCollider = hca?.
thumb2[2].GetComponent<Collider>();
885 thumbCollider = hcl?.thumb2[2].GetComponent<Collider>();
887 bool isThumbCollided =
false;
889 var numOfColliders = 0;
890 collidedFingers.Clear();
891 var lastDistance =
float.MaxValue;
893 foreach (var collider
in allboneColliders)
895 float scaledHoverRadius = fingerJointHoverRadius * collider.bounds.size.x;
896 CheckHoveringForTransform(collider.transform.position, scaledHoverRadius / 2f, ref closestDistance, ref closestInteractable,
Color.yellow);
897 if (lastDistance != closestDistance)
900 if (collider.gameObject.name == thumbCollider.gameObject.name)
902 isThumbCollided =
true;
904 if (!collidedFingers.Contains(collider.gameObject))
906 collidedFingers.Add(collider.gameObject);
907 collidedFingers.Add(collider.gameObject.transform.parent.gameObject);
908 collidedFingers.Add(collider.gameObject.transform.parent.transform.parent.gameObject);
914 lastDistance = closestDistance;
929 if (GetComponentInChildren<HandCopyAvg>(
true).speedometer() > 1.0f)
return;
939 if (attachedToHand)
return;
948 if (!thumb.Contains(GetComponentInChildren<HandCopyAvg>().thumb2[2]) && !thumb.Contains(GetComponentInChildren<HandCopyAvg>().thumb1[2].transform.GetChild(0).gameObject))
return;
950 if (!thumb.Contains(GetComponentInChildren<HandCopyAvg>().to[2]) && !thumb.Contains(GetComponentInChildren<HandCopyAvg>().from[2].transform.GetChild(0).gameObject))
return;
953 if (!otherHand.GetComponentInChildren<
HandCopySkelet>().isCollision)
961 if (!otherHand.GetComponentInChildren<
HandCopySkelet>().isCollision)
975 if (closestInteractable && closestInteractable.hideHighlight ==
null)
977 closestInteractable.hideHighlight =
new GameObject[0];
979 if (
VRCamera !=
null && closestInteractable !=
null)
981 if (!isInFieldOfView(closestInteractable.gameObject))
987 hoveringInteractable = closestInteractable;
989 IEnumerator DelayedAnimOff()
991 var anim = GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>();
993 anim.SetTrigger(
"idle");
995 yield
return new WaitForSeconds(0.6f);
996 anim.enabled =
false;
997 GetComponentInChildren<HandCopyAvg>(
true).enabled =
true;
1001 IEnumerator DelayedDetachHand()
1004 attachedToHand =
false;
1006 internal void PinchAnimOff()
1008 GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>().SetTrigger(
"idle");
1009 StartCoroutine(DelayedAnimOff());
1012 internal void PinchAnimOn()
1014 GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
1016 GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>().enabled =
true;
1017 GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>().SetTrigger(
"pinch");
1018 GetComponentInChildren<HandCopyAvg>(
true).enabled =
false;
1021 IEnumerator DelayedAnimOn()
1023 GetComponentInChildren<HandCopyAvg>().GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
1026 GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>().enabled =
true;
1027 GetComponentInChildren<HandCopyAvg>(
true).gameObject.GetComponent<Animator>().SetTrigger(
"pinch");
1028 GetComponentInChildren<HandCopyAvg>(
true).enabled =
false;
1033 internal void collidersSet(
bool set)
1035 var colliders = GetComponentsInChildren<Collider>();
1036 var FastIK = GetComponentsInChildren<FastIKFabric>();
1037 var Tracer = GetComponentsInChildren<FastIKTargetTracer>();
1038 var physicsHand = GetComponentInChildren<PhysicsHand>(
true);
1041 physicsHand.enabled =
set;
1043 foreach (var coll
in colliders)
1045 if (!coll.gameObject.GetComponent<MeshCollider>() && !coll.gameObject.GetComponent<
ThrowableCanDisable>())
1051 foreach (var item
in FastIK)
1055 foreach (var t
in Tracer)
1062 float closestDistance =
float.MaxValue;
1063 Interactable closestInteractable =
null;
1067 float scaledHoverRadius = hoverSphereRadius * Mathf.Abs(SteamVR_Utils.GetLossyScale(hoverSphereTransform));
1068 CheckHoveringForTransform(hoverSphereTransform.position, scaledHoverRadius, ref closestDistance, ref closestInteractable,
Color.green);
1071 if (useControllerHoverComponent && mainRenderModel !=
null && mainRenderModel.IsControllerVisibile())
1073 float scaledHoverRadius = controllerHoverRadius * Mathf.Abs(SteamVR_Utils.GetLossyScale(
this.transform));
1074 CheckHoveringForTransform(mainRenderModel.GetControllerPosition(controllerHoverComponent), scaledHoverRadius / 2f, ref closestDistance, ref closestInteractable,
Color.blue);
1079 bool isThumbCollided =
false;
1081 var numOfColliders = 0;
1082 var lastDistance =
float.MaxValue;
1083 foreach (var collider
in allboneColliders)
1085 float scaledHoverRadius = fingerJointHoverRadius * collider.bounds.size.x;
1086 CheckHoveringForTransform(collider.transform.position, scaledHoverRadius / 2f, ref closestDistance, ref closestInteractable,
Color.yellow);
1087 if (lastDistance != closestDistance)
1090 if (collider.gameObject.name == thumbCollider.gameObject.name)
1092 isThumbCollided =
true;
1095 lastDistance = closestDistance;
1099 if (numOfColliders > 2 && isThumbCollided)
override void HideGrabHint()
override void UpdateHovering()
GameObject InstantiatedHand
Transform forceAttachParent
Transform FingerJointBoneParent
override GrabTypes GetGrabStarting(GrabTypes explicitType=GrabTypes.None)
override void AttachObject(GameObject objectToAttach, GrabTypes grabbedWithType, AttachmentFlags flags=defaultAttachmentFlags, Transform attachmentOffset=null)
override void DetachObject(GameObject objectToDetach, bool restoreOriginalParent=true)
override void TriggerHapticPulse(ushort microSecondsDuration)
Transform forceAttachPosition
new void InitController()
UnityEvent onDetachObject
override bool IsGrabbingWithType(GrabTypes type)
UnityEvent onAttachObject
override IEnumerator Start()
static Bounds GetBounds(GameObject go)
static void SetLayerRecursive(GameObject go, string layerName)
static List< GameObject > CollidesWithFingers(GameObject bounds, bool skipHand=true)
static bool CollidesWithSnapOnAttach(GameObject bounds, bool skipHand=true)
static bool CollidesWithTwoHandGrab(GameObject bounds, bool skipHand=true)