/* * @author Valentin Simonov / http://va.lent.in/ */ using System; using TouchScript.Core; using TouchScript.Pointers; using UnityEngine; namespace TouchScript.InputSources { #region Consts public delegate void PointerDelegate(Pointer pointer); #endregion /// /// Base class for all pointer input sources. /// public abstract class InputSource : MonoBehaviour, IInputSource { #region Public properties /// /// Gets or sets current remapper. /// /// Optional remapper to use to change screen coordinates which go into the TouchManager. public ICoordinatesRemapper CoordinatesRemapper { get { return coordinatesRemapper; } set { if (coordinatesRemapper == value) return; coordinatesRemapper = value; updateCoordinatesRemapper(value); } } #endregion #region Private variables /// [SerializeField] [HideInInspector] protected bool basicEditor = true; private ICoordinatesRemapper coordinatesRemapper; private TouchManagerInstance manager; #endregion #region Public methods /// public virtual bool UpdateInput() { return false; } /// public virtual void UpdateResolution() {} /// public virtual bool CancelPointer(Pointer pointer, bool shouldReturn) { return false; } #endregion #region Internal methods /// public virtual void INTERNAL_DiscardPointer(Pointer pointer) {} #endregion #region Unity methods /// /// Unity OnEnable callback. /// protected virtual void OnEnable() { manager = TouchManagerInstance.Instance; if (manager == null) throw new InvalidOperationException("TouchManager instance is required!"); manager.AddInput(this); } /// /// Unity OnDestroy callback. /// protected virtual void OnDisable() { if (manager != null) { manager.RemoveInput(this); manager = null; } } #endregion #region Protected methods /// /// Adds the pointer to the system. /// /// The pointer to add. protected virtual void addPointer(Pointer pointer) { manager.INTERNAL_AddPointer(pointer); } /// /// Mark pointer as updated. /// /// The pointer to update. protected virtual void updatePointer(Pointer pointer) { if (pointer == null) return; manager.INTERNAL_UpdatePointer(pointer.Id); } /// /// Mark the pointer as touching the surface. /// /// The pointer. protected virtual void pressPointer(Pointer pointer) { if (pointer == null) return; manager.INTERNAL_PressPointer(pointer.Id); } /// /// Mark the pointer as no longer touching the surface. /// /// The pointer. protected virtual void releasePointer(Pointer pointer) { if (pointer == null) return; pointer.Buttons &= ~Pointer.PointerButtonState.AnyButtonPressed; manager.INTERNAL_ReleasePointer(pointer.Id); } /// /// Removes the pointer. /// /// The pointer. protected virtual void removePointer(Pointer pointer) { if (pointer == null) return; manager.INTERNAL_RemovePointer(pointer.Id); } /// /// Cancels the pointer. /// /// The pointer. protected virtual void cancelPointer(Pointer pointer) { if (pointer == null) return; manager.INTERNAL_CancelPointer(pointer.Id); } /// /// Called from setter to update touch handlers with the new value. /// /// The new remapper. protected virtual void updateCoordinatesRemapper(ICoordinatesRemapper remapper) {} /// /// Remaps the coordinates using the if it is set. /// /// The position. /// Remapped position if is set; the value of position argument otherwise. protected virtual Vector2 remapCoordinates(Vector2 position) { if (coordinatesRemapper != null) return coordinatesRemapper.Remap(position); return position; } #endregion } }