Mercurial > hg > Game > Games
diff Orchestland/Assets/LeapMotion+OVR/SystemWipe/QuickSwitcher.cs @ 1:f7675884f2a1
Add Orchestland project
author | Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:09:20 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orchestland/Assets/LeapMotion+OVR/SystemWipe/QuickSwitcher.cs Fri Jul 17 23:09:20 2015 +0900 @@ -0,0 +1,175 @@ +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System.Collections.Generic; + +public class QuickSwitcher : MonoBehaviour { + + public bool m_enabled = false; + [SerializeField] + private HandController m_handController; + [SerializeField] + private LeapCameraAlignment m_cameraAlignment; + [SerializeField] + private float m_minProgressToStartTransition; + [SerializeField] + private float m_fractionToLockTransition; + [SerializeField] + private Vector3 m_wipeOutPosition; + [SerializeField] + private List<LeapImageRetriever> m_imageRetriever; + + private Vector3 m_startPosition; + + private enum TransitionState { ON, OFF, MANUAL, TWEENING }; + private TransitionState m_currentTransitionState; + // Know what the last locked state was so we know what we're transitioning to. + private TransitionState m_lastLockedState; + + // Where are we transitioning to and from + private Vector3 m_from; + private Vector3 m_to; + + private delegate void TweenCompleteDelegate(); + + // Use this for initialization + void Start () { + m_startPosition = transform.localPosition; + m_from = m_startPosition; + m_to = m_wipeOutPosition; + m_lastLockedState = TransitionState.ON; + SystemWipeRecognizerListener.Instance.SystemWipeUpdate += onWipeUpdate; + TweenToOffPosition(); + } + + private void onWipeUpdate(object sender, SystemWipeArgs eventArgs) { + if ( !m_enabled ) { return; } + + string debugLine = "Debug"; + if ( eventArgs.WipeInfo.Status == Leap.Util.Status.SwipeAbort ) { + debugLine += " | Abort"; + // If the user aborts, tween back to original location + if ( m_lastLockedState == TransitionState.ON ) { + TweenToOnPosition(); + } + else { + TweenToOffPosition(); + } + } + + if ( m_currentTransitionState == TransitionState.MANUAL ) { + debugLine += " | Manual Control"; + float fraction = Mathf.Clamp01(eventArgs.WipeInfo.Progress); + + debugLine += ": " + fraction; + transform.localPosition = Vector3.Lerp(m_from, m_to, fraction); + + // If we're sure of the gesture, just go make the transition + if ( fraction >= m_fractionToLockTransition ) { + debugLine += " | Transition Cofirmed"; + if ( m_lastLockedState == TransitionState.OFF ) { + TweenToOnPosition(); + } + else { + TweenToOffPosition(); + } + } + } + else if ( m_currentTransitionState == TransitionState.TWEENING ) { + debugLine += " | Currently Tweening"; + //Debug.Log(debugLine); + return; + } + else { // We're either on or off + debugLine += " | Locked"; + if ( eventArgs.WipeInfo.Progress >= m_minProgressToStartTransition ) { + debugLine += " | Go To Manual"; + m_currentTransitionState = TransitionState.MANUAL; + } + } + + //Debug.Log(debugLine); + } + + private void onOnPosition() { + //Debug.Log("onOnPosition"); + m_currentTransitionState = TransitionState.ON; + m_lastLockedState = TransitionState.ON; + m_from = m_startPosition; + m_to = m_wipeOutPosition; + m_handController.gameObject.SetActive(false); + if (m_cameraAlignment != null) + m_cameraAlignment.enabled = true; + } + + private void onOffPosition() { + //Debug.Log("onOffPosition"); + m_currentTransitionState = TransitionState.OFF; + m_lastLockedState = TransitionState.OFF; + m_from = m_wipeOutPosition; + m_to = m_startPosition; + if ( m_imageRetriever != null ) { + foreach (LeapImageRetriever image in m_imageRetriever) { + image.enabled = false; + } + } + else { + Debug.LogError("No image retreiver on: " + gameObject.name); + } + m_handController.gameObject.SetActive(true); + if (m_cameraAlignment != null) + m_cameraAlignment.enabled = false; + } + + public void TweenToOnPosition() { + //Debug.Log("tweenToOnPosition"); + if ( m_imageRetriever != null ) { + foreach (LeapImageRetriever image in m_imageRetriever) { + image.enabled = true; + } + } + StopAllCoroutines(); + StartCoroutine(doPositionTween(0.0f, 0.1f, onOnPosition)); + } + + public void TweenToOffPosition() { +// Debug.Log("tweenToOffPosition"); + StopAllCoroutines(); + StartCoroutine(doPositionTween(1.0f, 0.1f, onOffPosition)); + } + + public void TweenToPosition(float fraction, float time = 0.4f) { + m_currentTransitionState = TransitionState.TWEENING; + StopAllCoroutines(); + StartCoroutine(doPositionTween(fraction, time)); + } + + private IEnumerator doPositionTween(float goalPercent, float transitionTime, TweenCompleteDelegate onComplete = null) { +// Debug.Log("doPositionTween: " + goalPercent); + float startTime = Time.time; + + Vector3 from = transform.localPosition; + Vector3 to = Vector3.Lerp(m_startPosition, m_wipeOutPosition, goalPercent); + + while ( true ) { + float fraction = Mathf.Clamp01((Time.time - startTime)/transitionTime); +// Debug.Log("Tween step: " + fraction); + + transform.localPosition = Vector3.Lerp(from, to, fraction); + if (m_cameraAlignment != null) + m_cameraAlignment.tween = fraction; + + // Kick out of the loop if we're done + if ( fraction == 1 ) { + break; + } else { // otherwise continue + yield return 1; + } + } + + if ( onComplete != null ) { + onComplete(); + } + } +} +