Files
dungeons/Assets/HurricaneVR/Framework/Editor/HVRSocketableEditor.cs

146 lines
5.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using HurricaneVR.Framework.Core.Grabbers;
using HurricaneVR.Framework.Core.Sockets;
using HurricaneVR.Framework.Core.Utils;
using UnityEditor;
using UnityEngine;
namespace HurricaneVR.Editor
{
[CustomEditor(typeof(HVRSocketable), editorForChildClasses: true)]
public class HVRSocketableEditor : UnityEditor.Editor
{
private bool _expand;
private HVRSocket _socket;
private HVRSocketable component;
private Vector3 _pos;
private Quaternion _rot;
private static Dictionary<HVRSocketable, HVRSocket> _cache = new Dictionary<HVRSocketable, HVRSocket>();
private void OnEnable()
{
component = target as HVRSocketable;
if (_cache.TryGetValue(component, out var socket))
{
_socket = socket;
}
}
public override void OnInspectorGUI()
{
// _expand = EditorGUILayout.Foldout(_expand, "Posing Interface");
EditorGUILayout.LabelField("Posing:");
//if (_expand)
{
var temp = _socket;
HVREditorExtensions.ObjectField("Socket", ref _socket);
if (_socket)
{
if (string.IsNullOrWhiteSpace(_socket.PoseTag))
{
EditorGUILayout.HelpBox("Socket's PoseTag field is not assigned.", MessageType.Warning);
}
else
{
// if (GUILayout.Button("Snapshot Transform"))
// {
// _pos = component.transform.position;
// _rot = component.transform.rotation;
// }
//
// if (GUILayout.Button("Restore Transform"))
// {
// Undo.RecordObject(component.transform, "Restore Socketable");
// component.transform.SetPositionAndRotation(_pos, _rot);
// }
if (_socket.ScaleGrabbable)
{
if (GUILayout.Button("Apply Socket Scale"))
{
Undo.RecordObject(component.transform, "Editor Socket Scale");
component.transform.localScale = _socket.ComputeScale(component);
}
if (GUILayout.Button("Reset Scale"))
{
Undo.RecordObject(component.transform, "Editor Socket Scale");
component.transform.localScale = Vector3.one;
}
}
if (GUILayout.Button("Move to Socket"))
{
Undo.RecordObject(component.transform, "Move to Socket");
component.transform.position = _socket.transform.position;
component.transform.rotation = _socket.transform.rotation;
}
if (GUILayout.Button("Save Pose"))
{
var poses = serializedObject.FindProperty("Poses");
var i = component.Poses.FindIndex(e => e.SocketTag == _socket.PoseTag);
if (i < 0)
{
i = poses.arraySize;
poses.InsertArrayElementAtIndex(i);
}
var pose = poses.GetArrayElementAtIndex(i);
pose.FindPropertyRelative("Position").vector3Value = _socket.transform.InverseTransformPoint(component.transform.position);
pose.FindPropertyRelative("EulerAngles").vector3Value = (Quaternion.Inverse(_socket.transform.rotation) * component.transform.rotation).eulerAngles;
pose.FindPropertyRelative("SocketTag").stringValue = _socket.PoseTag;
serializedObject.ApplyModifiedProperties();
}
}
}
else
{
if(GUILayout.Button("Find Closest Socket"))
{
var dist = float.MaxValue;
HVRSocket closest = null;
foreach (var socket in FindObjectsOfType<HVRSocket>())
{
if (socket.transform.IsChildOf(component.transform))
{
continue;
}
var d = Vector3.Distance(component.transform.position, socket.transform.position);
if (d < dist)
{
dist = d;
closest = socket;
}
}
_socket = closest;
}
}
if (temp && !_socket)
{
_cache[component] = null;
}
else if (!temp && _socket)
{
_cache[component] = _socket;
}
}
EditorGUILayout.Space();
base.OnInspectorGUI();
}
}
}