Mercurial > hg > Game > Games
diff Orchestland/Assets/OVR/Scripts/Util/OVRCrosshair.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/OVR/Scripts/Util/OVRCrosshair.cs Fri Jul 17 23:09:20 2015 +0900 @@ -0,0 +1,257 @@ +/************************************************************************************ + +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; + +/// <summary> +/// OVRCrosshair is a component that adds a stereoscoppic cross-hair into a scene. +/// </summary> +public class OVRCrosshair +{ + #region Variables + public Texture ImageCrosshair = null; + + public OVRCameraRig CameraController = null; + public OVRPlayerController PlayerController = null; + + public float FadeTime = 0.3f; + public float FadeScale = 0.6f; + public float CrosshairDistance = 1.0f; + + public KeyCode CrosshairKey = KeyCode.C; + + private float DeadZoneX = 400.0f; + private float DeadZoneY = 75.0f; + + private float ScaleSpeedX = 7.0f; + private float ScaleSpeedY = 7.0f; + + private bool DisplayCrosshair; + private bool CollisionWithGeometry; + private float FadeVal; + private Transform UIAnchor; + + private float XL = 0.0f; + private float YL = 0.0f; + + private float ScreenWidth = 1280.0f; + private float ScreenHeight = 800.0f; + + #endregion + + #region Public Functions + + /// <summary> + /// Sets the crosshair texture. + /// </summary> + /// <param name="image">Image.</param> + public void SetCrosshairTexture(ref Texture image) + { + ImageCrosshair = image; + } + + /// <summary> + /// Sets the OVR camera controller. + /// </summary> + /// <param name="cameraController">Camera controller.</param> + public void SetOVRCameraController(ref OVRCameraRig cameraController) + { + CameraController = cameraController; + UIAnchor = CameraController.centerEyeAnchor; + } + + /// <summary> + /// Sets the OVR player controller. + /// </summary> + /// <param name="playerController">Player controller.</param> + public void SetOVRPlayerController(ref OVRPlayerController playerController) + { + PlayerController = playerController; + } + + /// <summary> + /// Determines whether the crosshair is visible. + /// </summary> + /// <returns><c>true</c> if this instance is crosshair visible; otherwise, <c>false</c>.</returns> + public bool IsCrosshairVisible() + { + if(FadeVal > 0.0f) + return true; + + return false; + } + + /// <summary> + /// Init this instance. + /// </summary> + public void Init() + { + DisplayCrosshair = false; + CollisionWithGeometry = false; + FadeVal = 0.0f; + + ScreenWidth = Screen.width; + ScreenHeight = Screen.height; + + // Initialize screen location of cursor + XL = ScreenWidth * 0.5f; + YL = ScreenHeight * 0.5f; + } + + /// <summary> + /// Updates the crosshair. + /// </summary> + public void UpdateCrosshair() + { + if (ShouldDisplayCrosshair()) + { + // Do not do these tests within OnGUI since they will be called twice + CollisionWithGeometryCheck(); + } + } + + /// <summary> + /// The GUI crosshair event. + /// </summary> + public void OnGUICrosshair() + { + if ((DisplayCrosshair == true) && (CollisionWithGeometry == false)) + FadeVal += Time.deltaTime / FadeTime; + else + FadeVal -= Time.deltaTime / FadeTime; + + FadeVal = Mathf.Clamp(FadeVal, 0.0f, 1.0f); + + // Check to see if crosshair influences mouse rotation + if(PlayerController != null) + PlayerController.SetSkipMouseRotation(false); + + if ((ImageCrosshair != null) && (FadeVal != 0.0f)) + { + // Assume cursor is on-screen (unless it goes into the dead-zone) + // Other systems will check this to see if it is false for example + // allowing rotation to take place + if(PlayerController != null) + PlayerController.SetSkipMouseRotation(true); + + GUI.color = new Color(1, 1, 1, FadeVal * FadeScale); + + // Calculate X + XL += Input.GetAxis("Mouse X") * ScaleSpeedX; + if(XL < DeadZoneX) + { + if(PlayerController != null) + PlayerController.SetSkipMouseRotation(false); + + XL = DeadZoneX - 0.001f; + } + else if (XL > (Screen.width - DeadZoneX)) + { + if(PlayerController != null) + PlayerController.SetSkipMouseRotation(false); + + XL = ScreenWidth - DeadZoneX + 0.001f; + } + + // Calculate Y + YL -= Input.GetAxis("Mouse Y") * ScaleSpeedY; + if(YL < DeadZoneY) + { + //CursorOnScreen = false; + if(YL < 0.0f) YL = 0.0f; + } + else if (YL > ScreenHeight - DeadZoneY) + { + //CursorOnScreen = false; + if(YL > ScreenHeight) YL = ScreenHeight; + } + + // Finally draw cursor + bool skipMouseRotation = true; + if(PlayerController != null) + PlayerController.GetSkipMouseRotation(ref skipMouseRotation); + + if(skipMouseRotation == true) + { + // Left + GUI.DrawTexture(new Rect( XL - (ImageCrosshair.width * 0.5f), + YL - (ImageCrosshair.height * 0.5f), + ImageCrosshair.width, + ImageCrosshair.height), + ImageCrosshair); + } + + GUI.color = Color.white; + } + } + #endregion + + #region Private Functions + /// <summary> + /// Shoulds the crosshair be displayed. + /// </summary> + /// <returns><c>true</c>, if display crosshair was shoulded, <c>false</c> otherwise.</returns> + bool ShouldDisplayCrosshair() + { + if(Input.GetKeyDown (CrosshairKey)) + { + if(DisplayCrosshair == false) + { + DisplayCrosshair = true; + + // Always initialize screen location of cursor to center + XL = ScreenWidth * 0.5f; + YL = ScreenHeight * 0.5f; + } + else + DisplayCrosshair = false; + } + + return DisplayCrosshair; + } + + /// <summary> + /// Do a collision raycast on geometry for crosshair. + /// </summary> + /// <returns><c>true</c>, if with geometry check was collisioned, <c>false</c> otherwise.</returns> + bool CollisionWithGeometryCheck() + { + CollisionWithGeometry = false; + + Vector3 startPos = UIAnchor.position; + Vector3 dir = Vector3.forward; + dir = UIAnchor.rotation * dir; + dir *= CrosshairDistance; + Vector3 endPos = startPos + dir; + + RaycastHit hit; + if (Physics.Linecast(startPos, endPos, out hit)) + { + if (!hit.collider.isTrigger) + { + CollisionWithGeometry = true; + } + } + + return CollisionWithGeometry; + } + #endregion +}