Mercurial > hg > Game > Games
diff Orchestland/Assets/OVR/Scripts/Util/OVRVisionGuide.cs @ 3:0030a1b971fb default tip
merge
author | Yuta ANSE <e135745@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:23:43 +0900 |
parents | f7675884f2a1 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orchestland/Assets/OVR/Scripts/Util/OVRVisionGuide.cs Fri Jul 17 23:23:43 2015 +0900 @@ -0,0 +1,244 @@ +/************************************************************************************ + +Copyright : Copyright 2014 Oculus VR, LLC. All Rights reserved. + +Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); +you may not use the Oculus VR Rift SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +http://www.oculusvr.com/licenses/LICENSE-3.2 + +Unless required by applicable law or agreed to in writing, the Oculus VR SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using System.Collections; + +/// <summary> +/// OVR vision guide. +/// </summary> +public class OVRVisionGuide : MonoBehaviour +{ + // Manual fade (used when out of view; will add textures on top) + private Texture FadeTexture = null; + private float FadeTextureAlpha = 0.0f; + + // Clip Camera (takes position offset into account) + private Vector3 CameraPositionClampMin = new Vector3(-0.45f, -0.25f, -0.5f); + private Vector3 CameraPositionClampMax = new Vector3( 0.45f, 1.35f, 1.0f); + private float CameraPositionOverlap = 0.125f; + private float CameraPositionMaxFade = 0.65f; + + // Handle to OVRCameraRig + private OVRCameraRig CameraController = null; + + // Handle to Vision Guide + private GameObject VisionGuide = null; + private float VisionGuideFlashSpeed = 5.0f; // Radians / sec + + // Layer to render to + private string LayerName = "Default"; + + /// <summary> + /// Start this instance. + /// </summary> + void Start () + { + if(CameraController != null) + { + // Set the GUI target + VisionGuide = GameObject.Instantiate(Resources.Load("OVRVisionGuideMessage")) as GameObject; + // Grab transform of GUI object + Transform t = VisionGuide.transform; + // Attach the GUI object to the camera + VisionGuide.transform.parent = CameraController.centerEyeAnchor; + // Reset the transform values + VisionGuide.transform.localPosition = t.position; + VisionGuide.transform.localRotation = t.rotation; + VisionGuide.transform.localScale = t.localScale; + // Deactivate the object + VisionGuide.SetActive(false); + // Set layer on object + VisionGuide.layer = LayerMask.NameToLayer(LayerName); + } + } + + /// <summary> + /// Update this instance. + /// </summary> + void Update() + { + Vector3 relVisionCam = Vector3.zero; + // Fade screen out based on location of relative Vision Camera + UpdateFadeValueFromRelCamPosition(ref relVisionCam); + + if (Input.GetKeyDown(KeyCode.T)) + OVRManager.instance.timeWarp = !OVRManager.instance.timeWarp; + + if (Input.GetKeyDown(KeyCode.F)) + OVRManager.instance.freezeTimeWarp = !OVRManager.instance.freezeTimeWarp; + } + + /// <summary> + /// Updates the fade value from rel cam position. + /// </summary> + /// <returns><c>true</c>, if fade value from rel cam position was updated, <c>false</c> otherwise.</returns> + /// <param name="relCamPosition">Rel cam position.</param> + bool UpdateFadeValueFromRelCamPosition(ref Vector3 relCamPosition) + { + bool result = false; + FadeTextureAlpha = 0.0f; + + // Clip camera to min amd max values + // MIN + if((relCamPosition.x < CameraPositionClampMin.x) && + (CalculateFadeValue(ref FadeTextureAlpha, + relCamPosition.x, CameraPositionClampMin.x) == true)) + result = true; + + if((relCamPosition.y < CameraPositionClampMin.y) && + (CalculateFadeValue(ref FadeTextureAlpha, + relCamPosition.y, CameraPositionClampMin.y) == true)) + result = true; + + if((relCamPosition.z < CameraPositionClampMin.z) && + (CalculateFadeValue(ref FadeTextureAlpha, + relCamPosition.z, CameraPositionClampMin.z) == true)) + result = true; + + // MAX + if((relCamPosition.x > CameraPositionClampMax.x) && + (CalculateFadeValue(ref FadeTextureAlpha, + CameraPositionClampMax.x, relCamPosition.x ) == true)) + result = true; + + if((relCamPosition.y > CameraPositionClampMax.y) && + (CalculateFadeValue(ref FadeTextureAlpha, + CameraPositionClampMax.y, relCamPosition.y ) == true)) + result = true; + + if((relCamPosition.z > CameraPositionClampMax.z) && + (CalculateFadeValue(ref FadeTextureAlpha, + CameraPositionClampMax.z, relCamPosition.z ) == true)) + result = true; + + return result; + } + + /// <summary> + /// CalculateFadeValue + /// return value tells us which axis is the furthest out, so we + /// can tell the user which direction to go + /// </summary> + /// <returns><c>true</c>, if fade value was calculated, <c>false</c> otherwise.</returns> + /// <param name="curFade">Current fade.</param> + /// <param name="a">The alpha component.</param> + /// <param name="b">The blue component.</param> + bool CalculateFadeValue(ref float curFade, float a, float b) + { + bool result = false; + + float tmpFade = (b - a) / CameraPositionOverlap; + + if(tmpFade > 1.0f) tmpFade = 1.0f; + tmpFade *= CameraPositionMaxFade; + + if(tmpFade > curFade) + { + curFade = tmpFade; + + // We want to show a bit more then the fade + if(tmpFade >= CameraPositionMaxFade) + result = true; + } + + return result; + } + + + // + // PUBLIC FUNCTIONS + // + + /// <summary> + /// Sets the camera controller. + /// </summary> + /// <param name="cameraController">Camera controller.</param> + public void SetOVRCameraController(ref OVRCameraRig cameraController) + { + CameraController = cameraController; + } + + /// <summary> + /// Sets the fade texture. + /// </summary> + /// <param name="fadeTexture">Fade texture.</param> + public void SetFadeTexture(ref Texture fadeTexture) + { + FadeTexture = fadeTexture; + } + + /// <summary> + /// Gets the fade alpha value. + /// </summary> + /// <returns>The fade alpha value.</returns> + public float GetFadeAlphaValue() + { + return FadeTextureAlpha; + } + + /// <summary> + /// Sets the vision guide layer. + /// </summary> + /// <param name="layer">Layer.</param> + public void SetVisionGuideLayer(ref string layer) + { + LayerName = layer; + } + + /// <summary> + /// Raises the GUI vision guide event. + /// </summary> + public void OnGUIVisionGuide() + { + // Separate fade value (externally driven) + if((FadeTexture != null) && (FadeTextureAlpha > 0.0f)) + { + GUI.color = new Color(0.1f, 0.1f, 0.1f, FadeTextureAlpha); + GUI.DrawTexture( new Rect(0, 0, Screen.width, Screen.height ), FadeTexture ); + GUI.color = Color.white; + + if(VisionGuide != null) + { + // Activate the message + VisionGuide.SetActive(true); + + // Sharper curve for fading text + float fade = FadeTextureAlpha / CameraPositionMaxFade; + fade *= fade; + + // Fade and flash the VisionGuide message + float VisionGuideAlpha = + fade * ((Mathf.Sin(Time.time * VisionGuideFlashSpeed) + 1.0f) * 0.5f); + + Material m = VisionGuide.GetComponent<Renderer>().material; + Color c = m.GetColor("_Color"); + c.a = VisionGuideAlpha; + m.SetColor("_Color", c); + } + } + else + { + if(VisionGuide != null) + VisionGuide.SetActive(false); + } + } +}