Singularity/Library/PackageCache/com.unity.2d.animation@7.0.10/Editor/SkinningModule/IMGUI/Brush.cs
2024-05-06 11:45:45 -07:00

128 lines
3.9 KiB
C#

using System;
using UnityEngine;
namespace UnityEditor.U2D.Animation
{
internal class Brush
{
private static readonly float kWheelSizeSpeed = 1f;
private static readonly int kBrushHashCode = "Brush".GetHashCode();
private IGUIWrapper m_GUIWrapper;
private float m_DeltaAcc = 0f;
private int m_ControlID = -1;
private SliderData m_SliderData = SliderData.zero;
public event Action<Brush> onMove = (b) => {};
public event Action<Brush> onSize = (b) => {};
public event Action<Brush> onRepaint = (b) => {};
public event Action<Brush> onStrokeBegin = (b) => {};
public event Action<Brush> onStrokeDelta = (b) => {};
public event Action<Brush> onStrokeStep = (b) => {};
public event Action<Brush> onStrokeEnd = (b) => {};
public bool isHot
{
get { return m_GUIWrapper.IsControlHot(m_ControlID); }
}
public bool isActivable
{
get { return m_GUIWrapper.IsControlHot(0) && m_GUIWrapper.IsControlNearest(m_ControlID); }
}
public int controlID
{
get { return m_ControlID; }
}
public float hardness { get; set; }
public float step { get; set; }
public float size { get; set; }
public Vector3 position
{
get { return m_SliderData.position; }
}
public Brush(IGUIWrapper guiWrapper)
{
m_GUIWrapper = guiWrapper;
size = 25f;
step = 20f;
}
public void OnGUI()
{
m_ControlID = m_GUIWrapper.GetControlID(kBrushHashCode, FocusType.Passive);
var eventType = m_GUIWrapper.eventType;
if (!m_GUIWrapper.isAltDown)
m_GUIWrapper.LayoutControl(controlID, 0f);
if (isActivable)
{
m_SliderData.position = m_GUIWrapper.GUIToWorld(m_GUIWrapper.mousePosition);
if (m_GUIWrapper.IsMouseDown(0))
{
m_DeltaAcc = 0f;
onStrokeBegin(this);
onStrokeStep(this);
m_GUIWrapper.SetGuiChanged(true);
}
if (eventType == EventType.MouseMove)
{
onMove(this);
m_GUIWrapper.UseCurrentEvent();
}
if (m_GUIWrapper.isShiftDown && eventType == EventType.ScrollWheel)
{
var sizeDelta = HandleUtility.niceMouseDeltaZoom * kWheelSizeSpeed;
size = Mathf.Max(1f, size + sizeDelta);
onSize(this);
m_GUIWrapper.UseCurrentEvent();
}
}
if (isHot && m_GUIWrapper.IsMouseUp(0))
onStrokeEnd(this);
if (m_GUIWrapper.IsRepainting() && (isHot || isActivable))
onRepaint(this);
Vector3 position;
if (m_GUIWrapper.DoSlider(m_ControlID, m_SliderData, out position))
{
step = Mathf.Max(step, 1f);
var delta = position - m_SliderData.position;
var direction = delta.normalized;
var magnitude = delta.magnitude;
m_SliderData.position -= direction * m_DeltaAcc;
m_DeltaAcc += magnitude;
if (m_DeltaAcc >= step)
{
var stepVector = direction * step;
while (m_DeltaAcc >= step)
{
m_SliderData.position += stepVector;
onMove(this);
onStrokeStep(this);
m_DeltaAcc -= step;
}
}
m_SliderData.position = position;
onStrokeDelta(this);
}
}
}
}