mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-23 03:16:12 -05:00
VRMExportMeshes 追加
TODO: mesh 関連の validation 処理、情報表示をこっちに移動する
This commit is contained in:
parent
306fbb3e55
commit
defbf7e675
47
Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs
Normal file
47
Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VRM
|
||||
{
|
||||
/// <summary>
|
||||
/// Export時にMeshを一覧する
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class VRMExportMeshes : ScriptableObject
|
||||
{
|
||||
[Serializable]
|
||||
public struct MeshInfo
|
||||
{
|
||||
public Mesh Mesh;
|
||||
public bool Skinned;
|
||||
public bool HasVertexColor;
|
||||
|
||||
public MeshInfo(Renderer renderer)
|
||||
{
|
||||
Mesh = null;
|
||||
Skinned = false;
|
||||
HasVertexColor = false;
|
||||
if (renderer is SkinnedMeshRenderer smr)
|
||||
{
|
||||
Skinned = true;
|
||||
Mesh = smr.sharedMesh;
|
||||
}
|
||||
else if (renderer is MeshRenderer mr)
|
||||
{
|
||||
var filter = mr.GetComponent<MeshFilter>();
|
||||
if (filter != null)
|
||||
{
|
||||
Mesh = filter.sharedMesh;
|
||||
}
|
||||
}
|
||||
if (Mesh == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HasVertexColor = Mesh.colors != null && Mesh.colors.Length == Mesh.vertexCount;
|
||||
}
|
||||
}
|
||||
|
||||
public MeshInfo[] Meshes;
|
||||
}
|
||||
}
|
||||
11
Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta
Normal file
11
Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 7961eaa3060a80d43b2bcd80961bbd29
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -213,7 +213,7 @@ namespace VRM
|
|||
}
|
||||
|
||||
ExpectedByteSize = 0;
|
||||
foreach (var renderer in ExportRoot.GetComponentsInChildren<Renderer>())
|
||||
foreach (var renderer in ExportRoot.GetComponentsInChildren<Renderer>(true))
|
||||
{
|
||||
var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, ExportRoot.transform);
|
||||
var mesh = GetMesh(renderer);
|
||||
|
|
@ -330,11 +330,11 @@ namespace VRM
|
|||
var renderers = ExportRoot.GetComponentsInChildren<Renderer>();
|
||||
foreach (var r in renderers)
|
||||
{
|
||||
for(int i=0; i<r.sharedMaterials.Length; ++i)
|
||||
if (r.sharedMaterials[i] == null)
|
||||
{
|
||||
yield return Validation.Error($"Renderer: {r.name}.Materials[{i}] is null. please fix it");
|
||||
}
|
||||
for (int i = 0; i < r.sharedMaterials.Length; ++i)
|
||||
if (r.sharedMaterials[i] == null)
|
||||
{
|
||||
yield return Validation.Error($"Renderer: {r.name}.Materials[{i}] is null. please fix it");
|
||||
}
|
||||
}
|
||||
|
||||
var materials = renderers.SelectMany(x => x.sharedMaterials).Where(x => x != null).Distinct();
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using uei = UnityEngine.Internal;
|
||||
|
||||
namespace VRM
|
||||
{
|
||||
|
|
@ -41,6 +39,7 @@ namespace VRM
|
|||
GameObject ExportRoot;
|
||||
|
||||
VRMExportSettings m_settings;
|
||||
VRMExportMeshes m_meshes;
|
||||
|
||||
VRMMetaObject m_meta;
|
||||
VRMMetaObject Meta
|
||||
|
|
@ -98,6 +97,7 @@ namespace VRM
|
|||
|
||||
Editor m_metaEditor;
|
||||
Editor m_settingsInspector;
|
||||
Editor m_meshesInspector;
|
||||
|
||||
VRMExporterValidator m_validator = new VRMExporterValidator();
|
||||
bool m_requireValidation = true;
|
||||
|
|
@ -112,14 +112,11 @@ namespace VRM
|
|||
|
||||
m_tmpMeta = ScriptableObject.CreateInstance<VRMMetaObject>();
|
||||
|
||||
if (m_settings == null)
|
||||
{
|
||||
m_settings = ScriptableObject.CreateInstance<VRMExportSettings>();
|
||||
}
|
||||
if (m_settingsInspector == null)
|
||||
{
|
||||
m_settingsInspector = Editor.CreateEditor(m_settings);
|
||||
}
|
||||
m_settings = ScriptableObject.CreateInstance<VRMExportSettings>();
|
||||
m_settingsInspector = Editor.CreateEditor(m_settings);
|
||||
|
||||
m_meshes = ScriptableObject.CreateInstance<VRMExportMeshes>();
|
||||
m_meshesInspector = Editor.CreateEditor(m_meshes);
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
|
|
@ -136,6 +133,9 @@ namespace VRM
|
|||
// m_settingsInspector
|
||||
UnityEditor.Editor.DestroyImmediate(m_settingsInspector);
|
||||
m_settingsInspector = null;
|
||||
// m_meshesInspector
|
||||
UnityEditor.Editor.DestroyImmediate(m_meshesInspector);
|
||||
m_meshesInspector = null;
|
||||
// Meta
|
||||
Meta = null;
|
||||
ScriptableObject.DestroyImmediate(m_tmpMeta);
|
||||
|
|
@ -143,6 +143,9 @@ namespace VRM
|
|||
// m_settings
|
||||
ScriptableObject.DestroyImmediate(m_settings);
|
||||
m_settings = null;
|
||||
// m_meshes
|
||||
ScriptableObject.DestroyImmediate(m_meshes);
|
||||
m_meshes = null;
|
||||
}
|
||||
|
||||
private void InvokeWizardUpdate()
|
||||
|
|
@ -194,18 +197,28 @@ namespace VRM
|
|||
UpdateRoot(root);
|
||||
}
|
||||
|
||||
// ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting
|
||||
// Validation により GUI の表示項目が変わる場合があるので、
|
||||
// EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。
|
||||
if (Event.current.type == EventType.Layout)
|
||||
{
|
||||
// ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting
|
||||
// Validation により GUI の表示項目が変わる場合があるので、
|
||||
// EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。
|
||||
if (m_requireValidation)
|
||||
{
|
||||
m_validator.Validate(ExportRoot, m_settings, Meta != null ? Meta : m_tmpMeta);
|
||||
m_requireValidation = false;
|
||||
|
||||
if (ExportRoot != null)
|
||||
{
|
||||
m_meshes.Meshes = ExportRoot.GetComponentsInChildren<Renderer>(true).Select(r => new VRMExportMeshes.MeshInfo(r)).ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_meshes.Meshes = new VRMExportMeshes.MeshInfo[] { };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Humanoid として適正か? ここで失敗する場合は Export UI を表示しない
|
||||
//
|
||||
|
|
@ -297,6 +310,7 @@ namespace VRM
|
|||
break;
|
||||
|
||||
case Tabs.Mesh:
|
||||
m_meshesInspector.OnInspectorGUI();
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user