LMQT/Assets/TouchScript/Scripts/Utils/PointerUtils.cs
2024-12-10 09:03:45 +08:00

203 lines
9.5 KiB
C#

/*
* @author Valentin Simonov / http://va.lent.in/
*/
using System.Text;
using TouchScript.Hit;
using TouchScript.Pointers;
using UnityEngine;
namespace TouchScript.Utils
{
/// <summary>
/// Utility methods to work with Pointers.
/// </summary>
public static class PointerUtils
{
private static StringBuilder sb;
/// <summary>
/// Determines whether the pointer is over its target GameObject.
/// </summary>
/// <param name="pointer"> The pointer. </param>
/// <returns> <c>true</c> if the pointer is over the GameObject; <c>false</c> otherwise.</returns>
public static bool IsPointerOnTarget(Pointer pointer)
{
if (pointer == null) return false;
return IsPointerOnTarget(pointer, pointer.GetPressData().Target);
}
/// <summary>
/// Determines whether the pointer is over a specific GameObject.
/// </summary>
/// <param name="pointer"> The pointer. </param>
/// <param name="target"> The target. </param>
/// <returns> <c>true</c> if the pointer is over the GameObject; <c>false</c> otherwise.</returns>
public static bool IsPointerOnTarget(IPointer pointer, Transform target)
{
HitData hit;
return IsPointerOnTarget(pointer, target, out hit);
}
/// <summary>
/// Determines whether the pointer is over a specific GameObject.
/// </summary>
/// <param name="pointer">The pointer.</param>
/// <param name="target">The target.</param>
/// <param name="hit">The hit.</param>
/// <returns> <c>true</c> if the pointer is over the GameObject; <c>false</c> otherwise. </returns>
public static bool IsPointerOnTarget(IPointer pointer, Transform target, out HitData hit)
{
hit = default(HitData);
if (pointer == null || target == null) return false;
hit = pointer.GetOverData();
if (hit.Target == null) return false;
return hit.Target.IsChildOf(target);
}
/// <summary>
/// Formats currently pressed buttons as a string.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <returns>Formatted string of currently pressed buttons.</returns>
public static string PressedButtonsToString(Pointer.PointerButtonState buttons)
{
initStringBuilder();
PressedButtonsToString(buttons, sb);
return sb.ToString();
}
/// <summary>
/// Formats currently pressed buttons as a string.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <param name="builder">The string builder to use.</param>
public static void PressedButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder)
{
if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5");
else builder.Append("_");
}
/// <summary>
/// Formats the state of buttons as a string.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <returns>Formatted string of the buttons state.</returns>
public static string ButtonsToString(Pointer.PointerButtonState buttons)
{
initStringBuilder();
ButtonsToString(buttons, sb);
return sb.ToString();
}
/// <summary>
/// Formats the state of buttons as a string.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <param name="builder">The string builder to use.</param>
public static void ButtonsToString(Pointer.PointerButtonState buttons, StringBuilder builder)
{
if ((buttons & Pointer.PointerButtonState.FirstButtonDown) != 0) builder.Append("v");
else if ((buttons & Pointer.PointerButtonState.FirstButtonUp) != 0) builder.Append("^");
else if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0) builder.Append("1");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0) builder.Append("v");
else if ((buttons & Pointer.PointerButtonState.SecondButtonUp) != 0) builder.Append("^");
else if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0) builder.Append("2");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0) builder.Append("v");
else if ((buttons & Pointer.PointerButtonState.ThirdButtonUp) != 0) builder.Append("^");
else if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0) builder.Append("3");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0) builder.Append("v");
else if ((buttons & Pointer.PointerButtonState.FourthButtonUp) != 0) builder.Append("^");
else if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0) builder.Append("4");
else builder.Append("_");
if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0) builder.Append("v");
else if ((buttons & Pointer.PointerButtonState.FifthButtonUp) != 0) builder.Append("^");
else if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0) builder.Append("5");
else builder.Append("_");
}
/// <summary>
/// Adds pressed state to downed buttons.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <returns>Changed buttons state.</returns>
public static Pointer.PointerButtonState DownPressedButtons(Pointer.PointerButtonState buttons)
{
if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0)
buttons |= Pointer.PointerButtonState.FirstButtonDown;
if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0)
buttons |= Pointer.PointerButtonState.SecondButtonDown;
if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0)
buttons |= Pointer.PointerButtonState.ThirdButtonDown;
if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0)
buttons |= Pointer.PointerButtonState.FourthButtonDown;
if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0)
buttons |= Pointer.PointerButtonState.FifthButtonDown;
return buttons;
}
/// <summary>
/// Adds downed state to pressed buttons.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <returns>Changed buttons state.</returns>
public static Pointer.PointerButtonState PressDownButtons(Pointer.PointerButtonState buttons)
{
if ((buttons & Pointer.PointerButtonState.FirstButtonDown) != 0)
buttons |= Pointer.PointerButtonState.FirstButtonPressed;
if ((buttons & Pointer.PointerButtonState.SecondButtonDown) != 0)
buttons |= Pointer.PointerButtonState.SecondButtonPressed;
if ((buttons & Pointer.PointerButtonState.ThirdButtonDown) != 0)
buttons |= Pointer.PointerButtonState.ThirdButtonPressed;
if ((buttons & Pointer.PointerButtonState.FourthButtonDown) != 0)
buttons |= Pointer.PointerButtonState.FourthButtonPressed;
if ((buttons & Pointer.PointerButtonState.FifthButtonDown) != 0)
buttons |= Pointer.PointerButtonState.FifthButtonPressed;
return buttons;
}
/// <summary>
/// Converts pressed buttons to up state.
/// </summary>
/// <param name="buttons">The buttons state.</param>
/// <returns>Changed buttons state.</returns>
public static Pointer.PointerButtonState UpPressedButtons(Pointer.PointerButtonState buttons)
{
var btns = Pointer.PointerButtonState.Nothing;
if ((buttons & Pointer.PointerButtonState.FirstButtonPressed) != 0)
btns |= Pointer.PointerButtonState.FirstButtonUp;
if ((buttons & Pointer.PointerButtonState.SecondButtonPressed) != 0)
btns |= Pointer.PointerButtonState.SecondButtonUp;
if ((buttons & Pointer.PointerButtonState.ThirdButtonPressed) != 0)
btns |= Pointer.PointerButtonState.ThirdButtonUp;
if ((buttons & Pointer.PointerButtonState.FourthButtonPressed) != 0)
btns |= Pointer.PointerButtonState.FourthButtonUp;
if ((buttons & Pointer.PointerButtonState.FifthButtonPressed) != 0)
btns |= Pointer.PointerButtonState.FifthButtonUp;
return btns;
}
private static void initStringBuilder()
{
if (sb == null) sb = new StringBuilder();
sb.Length = 0;
}
}
}