/* * @author Valentin Simonov / http://va.lent.in/ */ using System.Collections.Generic; using TouchScript.Hit; using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Layers { /// /// Layer which gets all input from a camera. Should be used instead of a background object getting all the pointers which come through. /// [AddComponentMenu("TouchScript/Layers/Fullscreen Layer")] [HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Layers_FullscreenLayer.htm")] public class FullscreenLayer : TouchLayer { #region Constants /// /// The type of FullscreenLayer. /// public enum LayerType { /// /// Get pointers from main camera. /// MainCamera, /// /// Get pointers from specific camera. /// Camera, /// /// Get all pointers on Z=0 plane without a camera. /// Global } #endregion #region Public properties /// /// Layer type. /// public LayerType Type { get { return type; } set { if (value == type) return; type = value; updateCamera(); cacheCameraTransform(); } } /// /// Target camera if or is used. /// public Camera Camera { get { return _camera; } set { if (value == _camera) return; _camera = value; if (_camera == null) Type = LayerType.Global; else Type = LayerType.Camera; setName(); } } /// public override Vector3 WorldProjectionNormal { get { if (cameraTransform == null) return transform.forward; return cameraTransform.forward; } } #endregion #region Private variables [SerializeField] private LayerType type = LayerType.MainCamera; [SerializeField] private Camera _camera; private Transform cameraTransform; #endregion #region Public methods /// public override HitResult Hit(IPointer pointer, out HitData hit) { if (base.Hit(pointer, out hit) != HitResult.Hit) return HitResult.Miss; if (_camera != null) { if (!_camera.pixelRect.Contains(pointer.Position)) return HitResult.Miss; } hit = new HitData(transform, this); var result = checkHitFilters(pointer, hit); if (result != HitResult.Hit) { hit = default(HitData); return result; } return HitResult.Hit; } #endregion #region Unity methods /// protected override void Awake() { updateCamera(); base.Awake(); if (!Application.isPlaying) return; cacheCameraTransform(); } #endregion #region Protected functions /// protected override void setName() { if (_camera == null) Name = "Global Fullscreen"; else Name = "Fullscreen @ " + _camera.name; } /// protected override ProjectionParams createProjectionParams() { if (_camera) return new CameraProjectionParams(_camera); return base.createProjectionParams(); } #endregion #region Private functions private void updateCamera() { switch (type) { case LayerType.Global: _camera = null; break; case LayerType.MainCamera: _camera = Camera.main; if (_camera == null) Debug.LogError("No Main camera found!"); break; } setName(); } private void cacheCameraTransform() { if (_camera == null) cameraTransform = null; else cameraTransform = _camera.transform; } #endregion } }