UniVRM/Assets/VRM10/Editor/Components/Constraint/VRM10AimConstraintEditor.cs
2021-05-18 18:21:08 +09:00

88 lines
2.7 KiB
C#

using System.Text;
using UnityEditor;
using UnityEngine;
namespace UniVRM10
{
[CustomEditor(typeof(VRM10AimConstraint))]
public class VRM10AimConstraintEditor : Editor
{
VRM10AimConstraint m_target;
void OnEnable()
{
m_target = (VRM10AimConstraint)target;
}
static GUIStyle s_style;
static GUIStyle Style
{
get
{
if (s_style == null)
{
s_style = new GUIStyle("box");
}
return s_style;
}
}
static void DrawAimUp(Quaternion rot, Vector3 pos, Color c)
{
Handles.matrix = Matrix4x4.identity;
Handles.color = c;
// aim
var aim = pos + rot * Vector3.forward * 0.3f;
Handles.DrawLine(pos, aim);
Handles.Label(aim, "aim");
// up
var up = pos + rot * Vector3.up * 0.3f;
Handles.DrawLine(pos, up);
Handles.Label(up, "up");
}
public void OnSceneGUI()
{
if (m_target.Source == null)
{
return;
}
// this to target line
Handles.color = Color.yellow;
Handles.DrawLine(m_target.Source.position, m_target.transform.position);
var pos = m_target.transform.position;
var pr = TR.FromParent(m_target.transform);
if (m_target.m_src == null)
{
EditorGUI.BeginChangeCheck();
TR.FromWorld(m_target.transform).Draw(0.2f);
Handles.matrix = Matrix4x4.identity;
var rot = Handles.RotationHandle(pr.Rotation * m_target.DestinationOffset, pos);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(m_target, "Rotated RotateAt Point");
m_target.DestinationOffset = Quaternion.Inverse(pr.Rotation) * rot;
}
DrawAimUp(rot, pos, Color.yellow);
}
else
{
var init = pr.Rotation * m_target.m_src.LocalInitial.Rotation;
DrawAimUp(init * m_target.DestinationOffset, m_target.transform.position, Color.yellow);
new TR(init, m_target.transform.position).Draw(0.2f);
DrawAimUp(init * m_target.DestinationOffset * m_target.Delta, m_target.transform.position, Color.magenta);
}
// Target UPVector
Handles.color = Color.green;
Handles.DrawLine(m_target.transform.position, m_target.transform.position + m_target.UpVector);
}
}
}