diff --git a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs b/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs deleted file mode 100644 index 5a8488792..000000000 --- a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs +++ /dev/null @@ -1,60 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace UniVRM10 -{ - public static class LookAtEditor - { - public static void Draw2D(VRM10Controller target) - { - - } - - public static void Draw3D(VRM10Controller target, Transform head) - { - if (target == null) - { - return; - } - if (!target.DrawLookAtGizmo) - { - return; - } - if (head == null) - { - return; - } - - OnSceneGUIOffset(target, head); - if (!Application.isPlaying) - { - // offset - var p = target.Vrm.LookAt.OffsetFromHead; - Handles.Label(head.position, $"fromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]"); - } - else - { - target.Vrm.LookAt.OnSceneGUILookAt(head, target.LookAtTargetType, target.Gaze); - } - } - - static void OnSceneGUIOffset(VRM10Controller m_target, Transform head) - { - EditorGUI.BeginChangeCheck(); - - var worldOffset = head.localToWorldMatrix.MultiplyPoint(m_target.Vrm.LookAt.OffsetFromHead); - worldOffset = Handles.PositionHandle(worldOffset, head.rotation); - - Handles.DrawDottedLine(head.position, worldOffset, 5); - Handles.SphereHandleCap(0, head.position, Quaternion.identity, 0.02f, Event.current.type); - Handles.SphereHandleCap(0, worldOffset, Quaternion.identity, 0.02f, Event.current.type); - - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(m_target, "Changed FirstPerson"); - - m_target.Vrm.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset); - } - } - } -} diff --git a/Assets/VRM10/Editor/Components/VRM10Window.cs b/Assets/VRM10/Editor/Components/VRM10Window.cs index 886e0eea7..2b3a3d31c 100644 --- a/Assets/VRM10/Editor/Components/VRM10Window.cs +++ b/Assets/VRM10/Editor/Components/VRM10Window.cs @@ -81,7 +81,6 @@ namespace UniVRM10 enum VRMSceneUI { Constraints, - LookAt, SpringBone, } static VRMSceneUI s_ui = default; @@ -110,11 +109,6 @@ namespace UniVRM10 Tools.hidden = false; break; - case VRMSceneUI.LookAt: - Tools.hidden = true; - LookAtEditor.Draw3D(Root, m_head); - break; - case VRMSceneUI.SpringBone: Tools.hidden = true; SpringBoneEditor.Draw3D(Root, m_so); @@ -169,10 +163,6 @@ namespace UniVRM10 m_scrollView.Draw(this.position.y, DrawConstraints, Repaint); break; - case VRMSceneUI.LookAt: - LookAtEditor.Draw2D(Root); - break; - case VRMSceneUI.SpringBone: SpringBoneEditor.Draw2D(Root, m_so); break; diff --git a/Assets/VRM10/Editor/Components/LookAt.meta b/Assets/VRM10/Editor/EditorTool.meta similarity index 77% rename from Assets/VRM10/Editor/Components/LookAt.meta rename to Assets/VRM10/Editor/EditorTool.meta index a9e2d423a..d950d90b8 100644 --- a/Assets/VRM10/Editor/Components/LookAt.meta +++ b/Assets/VRM10/Editor/EditorTool.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8823eaceb68051c43be15ea92028d412 +guid: af5da07aebd9a47428d49b56b245b095 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs b/Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs new file mode 100644 index 000000000..29cc66626 --- /dev/null +++ b/Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs @@ -0,0 +1,167 @@ +using UnityEngine; +using UnityEditor; +using UnityEditor.EditorTools; + + +namespace UniVRM10 +{ + [EditorTool("vrm-1.0/LookAt", typeof(UniVRM10.VRM10Controller))] + class VRM10LookAtEditorTool : EditorTool + { + static GUIContent s_cachedIcon; + public override GUIContent toolbarIcon + { + get + { + if (s_cachedIcon == null) + { + s_cachedIcon = EditorGUIUtility.IconContent("d_BillboardRenderer Icon", "|vrm-1.0 LookAt"); + } + return s_cachedIcon; + } + } + + void OnEnable() + { + EditorTools.activeToolChanged += ActiveToolDidChange; + } + + void OnDisable() + { + EditorTools.activeToolChanged -= ActiveToolDidChange; + } + + void ActiveToolDidChange() + { + if (!EditorTools.IsActiveTool(this)) + { + return; + } + } + + public override void OnToolGUI(EditorWindow window) + { + var root = Selection.activeTransform.GetComponent(); + if (root == null) + { + return; + } + if (!root.DrawLookAtGizmo) + { + return; + } + var humanoid = root.GetComponent(); + var head = humanoid.Head; + if (head == null) + { + return; + } + + { + EditorGUI.BeginChangeCheck(); + + var worldOffset = head.localToWorldMatrix.MultiplyPoint(root.Vrm.LookAt.OffsetFromHead); + worldOffset = Handles.PositionHandle(worldOffset, head.rotation); + + Handles.DrawDottedLine(head.position, worldOffset, 5); + Handles.SphereHandleCap(0, head.position, Quaternion.identity, 0.02f, Event.current.type); + Handles.SphereHandleCap(0, worldOffset, Quaternion.identity, 0.02f, Event.current.type); + + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(root.Vrm, "LookAt.OffsetFromHead"); + + root.Vrm.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset); + } + } + + if (Application.isPlaying) + { + OnSceneGUILookAt(root.Vrm.LookAt, head, root.LookAtTargetType, root.Gaze); + } + else + { + // offset + var p = root.Vrm.LookAt.OffsetFromHead; + Handles.Label(head.position, $"fromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]"); + } + } + + #region Gizmo + static void DrawMatrix(Matrix4x4 m, float size) + { + Gizmos.matrix = m; + Gizmos.color = Color.red; + Gizmos.DrawLine(Vector3.zero, Vector3.right * size); + Gizmos.color = Color.green; + Gizmos.DrawLine(Vector3.zero, Vector3.up * size); + Gizmos.color = Color.blue; + Gizmos.DrawLine(Vector3.zero, Vector3.forward * size); + } + + const float LOOKAT_GIZMO_SIZE = 0.5f; + + // private void OnDrawGizmos() + // { + // if (DrawGizmo) + // { + // if (m_leftEye != null & m_rightEye != null) + // { + // DrawMatrix(m_leftEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE); + // DrawMatrix(m_rightEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE); + // } + // } + // } + #endregion + + const float RADIUS = 0.5f; + + static void OnSceneGUILookAt(VRM10ObjectLookAt lookAt, Transform head, VRM10ObjectLookAt.LookAtTargetTypes lookAtTargetType, Transform gaze) + { + if (head == null) return; + + if (gaze != null) + { + { + EditorGUI.BeginChangeCheck(); + var newTargetPosition = Handles.PositionHandle(gaze.position, Quaternion.identity); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(gaze, "Change Look At Target Position"); + gaze.position = newTargetPosition; + } + } + + Handles.color = new Color(1, 1, 1, 0.6f); + Handles.DrawDottedLine(lookAt.GetLookAtOrigin(head).position, gaze.position, 4.0f); + } + + var (yaw, pitch) = lookAt.GetLookAtYawPitch(head, lookAtTargetType, gaze); + var lookAtOriginMatrix = lookAt.GetLookAtOrigin(head).localToWorldMatrix; + Handles.matrix = lookAtOriginMatrix; + var p = lookAt.OffsetFromHead; + Handles.Label(Vector3.zero, + $"FromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]\nYaw: {yaw:0.}degree\nPitch: {pitch:0.}degree"); + + Handles.color = new Color(0, 1, 0, 0.2f); + Handles.DrawSolidArc(Vector3.zero, + Matrix4x4.identity.GetColumn(1), + Matrix4x4.identity.GetColumn(2), + yaw, + RADIUS); + + + var yawQ = Quaternion.AngleAxis(yaw, Vector3.up); + var yawMatrix = default(Matrix4x4); + yawMatrix.SetTRS(Vector3.zero, yawQ, Vector3.one); + + Handles.matrix = lookAtOriginMatrix * yawMatrix; + Handles.color = new Color(1, 0, 0, 0.2f); + Handles.DrawSolidArc(Vector3.zero, + Matrix4x4.identity.GetColumn(0), + Matrix4x4.identity.GetColumn(2), + -pitch, + RADIUS); + } + } +} diff --git a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs.meta b/Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs.meta similarity index 83% rename from Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs.meta rename to Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs.meta index 06c907abd..9f4ef9e90 100644 --- a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs.meta +++ b/Assets/VRM10/Editor/EditorTool/VRM10LookAtEditorTool.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0f9ee1d04c43d8048a51e032b19a8ebd +guid: a780c0aef1cdb9a4895e352e39ad40b9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Editor/VRM10.Editor.asmdef b/Assets/VRM10/Editor/VRM10.Editor.asmdef index de8ec9fe7..1e347d844 100644 --- a/Assets/VRM10/Editor/VRM10.Editor.asmdef +++ b/Assets/VRM10/Editor/VRM10.Editor.asmdef @@ -6,7 +6,8 @@ "GUID:5f875fdc81c40184c8333b9d63c6ddd5", "GUID:8d76e605759c3f64a957d63ef96ada7c", "GUID:da3e51d19d51a544fa14d43fee843098", - "GUID:7da8a75dcade2144aab699032d7d7987" + "GUID:7da8a75dcade2144aab699032d7d7987", + "GUID:b7aa47b240b57de44a4b2021c143c9bf" ], "includePlatforms": [ "Editor" diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectLookAt.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectLookAt.cs index f65649afa..0c3682256 100644 --- a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectLookAt.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectLookAt.cs @@ -46,7 +46,7 @@ namespace UniVRM10 #region LookAtTargetTypes.CalcYawPitchToGaze // 座標計算用のempty Transform m_lookAtOrigin; - Transform GetLookAtOrigin(Transform head) + public Transform GetLookAtOrigin(Transform head) { if (!Application.isPlaying) { @@ -94,7 +94,7 @@ namespace UniVRM10 /// LookAtTargetType に応じた yaw, pitch を得る /// /// Headボーンのforwardに対するyaw角(度), pitch角(度) - private (float, float) GetLookAtYawPitch(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze) + public (float, float) GetLookAtYawPitch(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze) { switch (lookAtTargetType) { @@ -145,85 +145,5 @@ namespace UniVRM10 var (yaw, pitch) = GetLookAtYawPitch(m_head, lookAtTargetType, gaze); EyeDirection = new LookAtEyeDirection(yaw, pitch, 0, 0); } - -#if UNITY_EDITOR - #region Gizmo - static void DrawMatrix(Matrix4x4 m, float size) - { - Gizmos.matrix = m; - Gizmos.color = Color.red; - Gizmos.DrawLine(Vector3.zero, Vector3.right * size); - Gizmos.color = Color.green; - Gizmos.DrawLine(Vector3.zero, Vector3.up * size); - Gizmos.color = Color.blue; - Gizmos.DrawLine(Vector3.zero, Vector3.forward * size); - } - - const float LOOKAT_GIZMO_SIZE = 0.5f; - - // private void OnDrawGizmos() - // { - // if (DrawGizmo) - // { - // if (m_leftEye != null & m_rightEye != null) - // { - // DrawMatrix(m_leftEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE); - // DrawMatrix(m_rightEye.localToWorldMatrix, LOOKAT_GIZMO_SIZE); - // } - // } - // } - #endregion - - const float RADIUS = 0.5f; - - public void OnSceneGUILookAt(Transform head, LookAtTargetTypes lookAtTargetType, Transform gaze) - { - if (head == null) return; - - if (gaze != null) - { - { - EditorGUI.BeginChangeCheck(); - var newTargetPosition = Handles.PositionHandle(gaze.position, Quaternion.identity); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(gaze, "Change Look At Target Position"); - gaze.position = newTargetPosition; - } - } - - Handles.color = new Color(1, 1, 1, 0.6f); - Handles.DrawDottedLine(GetLookAtOrigin(head).position, gaze.position, 4.0f); - } - - var (yaw, pitch) = GetLookAtYawPitch(head, lookAtTargetType, gaze); - var lookAtOriginMatrix = GetLookAtOrigin(head).localToWorldMatrix; - Handles.matrix = lookAtOriginMatrix; - var p = OffsetFromHead; - Handles.Label(Vector3.zero, - $"FromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]\nYaw: {yaw:0.}degree\nPitch: {pitch:0.}degree"); - - Handles.color = new Color(0, 1, 0, 0.2f); - Handles.DrawSolidArc(Vector3.zero, - Matrix4x4.identity.GetColumn(1), - Matrix4x4.identity.GetColumn(2), - yaw, - RADIUS); - - - var yawQ = Quaternion.AngleAxis(yaw, Vector3.up); - var yawMatrix = default(Matrix4x4); - yawMatrix.SetTRS(Vector3.zero, yawQ, Vector3.one); - - Handles.matrix = lookAtOriginMatrix * yawMatrix; - Handles.color = new Color(1, 0, 0, 0.2f); - Handles.DrawSolidArc(Vector3.zero, - Matrix4x4.identity.GetColumn(0), - Matrix4x4.identity.GetColumn(2), - -pitch, - RADIUS); - } - -#endif } }