//======= Copyright (c) Valve Corporation, All rights reserved. =============== // // Purpose: This object will get hover events and can be attached to the hands // //============================================================================= using UnityEngine; using UnityEngine.Events; using System.Collections; using System.Collections.Generic; namespace Valve.VR.InteractionSystem { //------------------------------------------------------------------------- public class InteractableDebug : MonoBehaviour { [System.NonSerialized] public Hand attachedToHand; public float simulateReleasesForXSecondsAroundRelease = 0; public float simulateReleasesEveryXSeconds = 0.005f; public bool setPositionsForSimulations = false; private Renderer[] selfRenderers; private Collider[] colliders; private Color lastColor; private Throwable throwable; private bool isThrowable { get { return throwable != null; } } private const bool onlyColorOnChange = true; public new Rigidbody rigidbody; private void Awake() { selfRenderers = this.GetComponentsInChildren(); throwable = this.GetComponent(); rigidbody = this.GetComponent(); colliders = this.GetComponentsInChildren(); } private void OnAttachedToHand( Hand hand ) { attachedToHand = hand; CreateMarker(Color.green); } protected virtual void HandAttachedUpdate(Hand hand) { Color grabbedColor; switch (hand.currentAttachedObjectInfo.Value.grabbedWithType) { case GrabTypes.Grip: grabbedColor = Color.blue; break; case GrabTypes.Pinch: grabbedColor = Color.green; break; case GrabTypes.Trigger: grabbedColor = Color.yellow; break; case GrabTypes.Scripted: grabbedColor = Color.red; break; case GrabTypes.None: default: grabbedColor = Color.white; break; } if ((onlyColorOnChange && grabbedColor != lastColor) || onlyColorOnChange == false) ColorSelf(grabbedColor); lastColor = grabbedColor; } private void OnDetachedFromHand( Hand hand ) { if (isThrowable) { Vector3 velocity; Vector3 angularVelocity; throwable.GetReleaseVelocities(hand, out velocity, out angularVelocity); CreateMarker(Color.cyan, velocity.normalized); } CreateMarker(Color.red); attachedToHand = null; if (isSimulation == false && simulateReleasesForXSecondsAroundRelease != 0) { float startTime = -simulateReleasesForXSecondsAroundRelease; float endTime = simulateReleasesForXSecondsAroundRelease; List list = new List(); list.Add(this); for (float offset = startTime; offset <= endTime; offset += simulateReleasesEveryXSeconds) { float lerp = Mathf.InverseLerp(startTime, endTime, offset); InteractableDebug copy = CreateSimulation(hand, offset, Color.Lerp(Color.red, Color.green, lerp)); list.Add(copy); } for (int index = 0; index < list.Count; index++) { for (int otherIndex = 0; otherIndex < list.Count; otherIndex++) { list[index].IgnoreObject(list[otherIndex]); } } } } public Collider[] GetColliders() { return colliders; } public void IgnoreObject(InteractableDebug otherInteractable) { Collider[] otherColliders = otherInteractable.GetColliders(); for (int myIndex = 0; myIndex < colliders.Length; myIndex++) { for (int otherIndex = 0; otherIndex < otherColliders.Length; otherIndex++) { Physics.IgnoreCollision(colliders[myIndex], otherColliders[otherIndex]); } } } private bool isSimulation = false; public void SetIsSimulation() { isSimulation = true; } private InteractableDebug CreateSimulation(Hand fromHand, float timeOffset, Color copyColor) { GameObject copy = GameObject.Instantiate(this.gameObject); InteractableDebug debugCopy = copy.GetComponent(); debugCopy.SetIsSimulation(); debugCopy.ColorSelf(copyColor); copy.name = string.Format("{0} [offset: {1:0.000}]", copy.name, timeOffset); Vector3 velocity = fromHand.GetTrackedObjectVelocity(timeOffset); velocity *= throwable.scaleReleaseVelocity; debugCopy.rigidbody.velocity = velocity; return debugCopy; } private void CreateMarker(Color markerColor, float destroyAfter = 10) { CreateMarker(markerColor, attachedToHand.GetTrackedObjectVelocity().normalized, destroyAfter); } private void CreateMarker(Color markerColor, Vector3 forward, float destroyAfter = 10) { GameObject baseMarker = GameObject.CreatePrimitive(PrimitiveType.Cube); DestroyImmediate(baseMarker.GetComponent()); baseMarker.transform.localScale = new Vector3(0.02f, 0.02f, 0.02f); GameObject line = GameObject.Instantiate(baseMarker); line.transform.localScale = new Vector3(0.01f, 0.01f, 0.25f); line.transform.parent = baseMarker.transform; line.transform.localPosition = new Vector3(0, 0, line.transform.localScale.z / 2f); baseMarker.transform.position = attachedToHand.transform.position; baseMarker.transform.forward = forward; ColorThing(markerColor, baseMarker.GetComponentsInChildren()); if (destroyAfter > 0) Destroy(baseMarker, destroyAfter); } private void ColorSelf(Color newColor) { ColorThing(newColor, selfRenderers); } private void ColorThing(Color newColor, Renderer[] renderers) { for (int rendererIndex = 0; rendererIndex < renderers.Length; rendererIndex++) { renderers[rendererIndex].material.color = newColor; } } } }