diff options
Diffstat (limited to 'Assets/ThirdParty/VRM/VRM/UniVRM/Editor/LookAt/VRMLookAtHeadEditor.cs')
-rw-r--r-- | Assets/ThirdParty/VRM/VRM/UniVRM/Editor/LookAt/VRMLookAtHeadEditor.cs | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/Assets/ThirdParty/VRM/VRM/UniVRM/Editor/LookAt/VRMLookAtHeadEditor.cs b/Assets/ThirdParty/VRM/VRM/UniVRM/Editor/LookAt/VRMLookAtHeadEditor.cs new file mode 100644 index 00000000..9fa73a5c --- /dev/null +++ b/Assets/ThirdParty/VRM/VRM/UniVRM/Editor/LookAt/VRMLookAtHeadEditor.cs @@ -0,0 +1,185 @@ +using UnityEditor; +using UnityEngine; +using UniGLTF; +using System.Linq; + + +namespace VRM +{ + [CustomEditor(typeof(VRMLookAtHead))] + public class VRMLookAtHeadEditor : Editor + { + VRMLookAtHead m_target; + PreviewRenderUtility m_previewRenderUtility; + +#if UNITY_2017_1_OR_NEWER + struct Item + { + public Transform Transform; + public SkinnedMeshRenderer SkinnedMeshRenderer; + public Mesh Mesh; + public Material[] Materials; + + public Mesh Baked() + { + if (SkinnedMeshRenderer != null) + { + if (Mesh == null) + { + Mesh = new Mesh(); + } + SkinnedMeshRenderer.BakeMesh(Mesh); + } + return Mesh; + } + } + Item[] m_items; + + void SetupItems() + { + m_items = m_target.transform.Traverse().Select(x => + { + var meshFilter = x.GetComponent<MeshFilter>(); + var meshRenderer = x.GetComponent<MeshRenderer>(); + var skinnedMeshRenderer = x.GetComponent<SkinnedMeshRenderer>(); + if (meshFilter != null && meshRenderer != null) + { + return new Item + { + Mesh = meshFilter.sharedMesh, + Transform = x.transform, + Materials = meshRenderer.sharedMaterials, + }; + } + else if (skinnedMeshRenderer != null) + { + return new Item + { + //Mesh = skinnedMeshRenderer.sharedMesh, + SkinnedMeshRenderer = skinnedMeshRenderer, + Transform = x.transform, + Materials = skinnedMeshRenderer.sharedMaterials + }; + } + else + { + return default(Item); + } + }) + .Where(x => x.Transform != null) + .ToArray(); + } +#endif + + void OnEnable() + { + m_target = (VRMLookAtHead)target; + m_previewRenderUtility = new PreviewRenderUtility(true); + +#if UNITY_2017_1_OR_NEWER + SetupItems(); +#endif + } + + private void OnDisable() + { + m_previewRenderUtility.Cleanup(); + m_previewRenderUtility = null; + } + + static void SetPreviewCamera(Camera camera, Vector3 target, Vector3 forward) + { + camera.fieldOfView = 30f; + camera.farClipPlane = 100; + camera.nearClipPlane = 0.1f; + + camera.transform.position = target + forward * 0.8f; + camera.transform.LookAt(target); + } + + public override bool HasPreviewGUI() + { + return true; + } + + public override void OnPreviewGUI(Rect r, GUIStyle background) + { + m_previewRenderUtility.BeginPreview(r, background); + var target = m_target.Head; + if (target != null) + { +#if UNITY_2017_1_OR_NEWER + SetPreviewCamera( + m_previewRenderUtility.camera, + target.position + new Vector3(0, 0.1f, 0), + target.forward + ); + for(int j=0; j<m_items.Length; ++j) + { + ref var x = ref m_items[j]; + var mesh = x.Baked(); + for(int i=0; i<x.Materials.Length; ++i) + { + m_previewRenderUtility.DrawMesh(mesh, x.Transform.position, x.Transform.rotation, + x.Materials[i], i); + } + } + + m_previewRenderUtility.Render(); +#else + SetPreviewCamera( + m_previewRenderUtility.m_Camera, + target.position + new Vector3(0, 0.1f, 0), + target.forward + ); + m_previewRenderUtility.m_Camera.Render(); +#endif + } + m_previewRenderUtility.EndAndDrawPreview(r); + } + + const float RADIUS = 0.5f; + + void OnSceneGUI() + { + if (m_target.Head == null) return; + if (!m_target.DrawGizmo) return; + + if (m_target.Target != null) + { + { + EditorGUI.BeginChangeCheck(); + var newTargetPosition = Handles.PositionHandle(m_target.Target.position, Quaternion.identity); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(m_target.Target, "Change Look At Target Position"); + m_target.Target.position = newTargetPosition; + } + } + + Handles.color = new Color(1, 1, 1, 0.6f); + Handles.DrawDottedLine(m_target.Head.position, m_target.Target.position, 4.0f); + } + + Handles.matrix = m_target.Head.localToWorldMatrix; + Handles.Label(Vector3.zero, string.Format("Yaw: {0:0.}degree\nPitch: {1:0.}degree", + m_target.Yaw, + m_target.Pitch)); + + Handles.color = new Color(0, 1, 0, 0.2f); + Handles.DrawSolidArc(Vector3.zero, + Matrix4x4.identity.GetColumn(1), + Matrix4x4.identity.GetColumn(2), + m_target.Yaw, + RADIUS); + + Handles.matrix = m_target.Head.localToWorldMatrix * m_target.YawMatrix; + Handles.color = new Color(1, 0, 0, 0.2f); + Handles.DrawSolidArc(Vector3.zero, + Matrix4x4.identity.GetColumn(0), + Matrix4x4.identity.GetColumn(2), + -m_target.Pitch, + RADIUS); + } + } +} |