123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- //======= 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<Renderer>();
- throwable = this.GetComponent<Throwable>();
- rigidbody = this.GetComponent<Rigidbody>();
- colliders = this.GetComponentsInChildren<Collider>();
- }
- 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<InteractableDebug> list = new List<InteractableDebug>();
- 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<InteractableDebug>();
- 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<Collider>());
- 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<Renderer>());
- 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;
- }
- }
- }
- }
|