/*
* @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
}
}