From 6ef0729e556ebf5351b538301d82f9a57a2f8978 Mon Sep 17 00:00:00 2001 From: G21 Date: Fri, 13 Apr 2018 22:59:21 +0900 Subject: [PATCH] fix VRMLookAtHeadEditor preview for Unity2017 or later --- Scripts/LookAt/Editor/VRMLookAtHeadEditor.cs | 83 +++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/Scripts/LookAt/Editor/VRMLookAtHeadEditor.cs b/Scripts/LookAt/Editor/VRMLookAtHeadEditor.cs index 663b3c833..de624b25d 100644 --- a/Scripts/LookAt/Editor/VRMLookAtHeadEditor.cs +++ b/Scripts/LookAt/Editor/VRMLookAtHeadEditor.cs @@ -1,5 +1,8 @@ -using UnityEditor; +using System.Collections.Generic; +using UnityEditor; using UnityEngine; +using UniGLTF; +using System.Linq; namespace VRM @@ -10,10 +13,64 @@ namespace VRM VRMLookAtHead m_target; PreviewRenderUtility m_previewRenderUtility; + 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 OnEnable() { m_target = (VRMLookAtHead)target; m_previewRenderUtility = new PreviewRenderUtility(true); + + m_items = m_target.transform.Traverse().Select(x => + { + var meshFilter = x.GetComponent(); + var meshRenderer = x.GetComponent(); + var skinnedMeshRenderer = x.GetComponent(); + 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(); } private void OnDisable() @@ -30,7 +87,6 @@ namespace VRM camera.transform.position = target + forward * 0.8f; camera.transform.LookAt(target); - camera.Render(); } public override bool HasPreviewGUI() @@ -44,10 +100,31 @@ namespace VRM var target = m_target.Head.Transform; if (target != null) { - SetPreviewCamera(m_previewRenderUtility.m_Camera, +#if UNITY_2017_1_OR_NEWER + SetPreviewCamera( + m_previewRenderUtility.camera, target.position + new Vector3(0, 0.1f, 0), target.forward ); + foreach(var x in m_items) + { + var mesh = x.Baked(); + for(int i=0; i