Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.0] Fix10/vrm extract #900

Merged
merged 5 commits into from
Apr 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public static void DrawRemapGUI<T>(this ScriptedImporter importer, IEnumerable<S
if (asset != value)
{
// update
importer.SetExternalUnityObject(new AssetImporter.SourceAssetIdentifier(value), asset);
importer.SetExternalUnityObject(new AssetImporter.SourceAssetIdentifier(key.Type, key.Name), asset);
}
EditorGUILayout.EndHorizontal();
}
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM10.Samples/Runtime/ViewerUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ void SetModel(GameObject go)
if (m_controller != null)
{

m_texts.UpdateMeta(m_controller.Meta);
m_texts.UpdateMeta(m_controller.Meta.Meta);

m_controller.Controller.UpdateType = VRM10Controller.VRM10ControllerImpl.UpdateTypes.LateUpdate; // after HumanPoseTransfer's setPose
{
Expand Down
13 changes: 8 additions & 5 deletions Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,12 @@ void OnEnable()
;
}

if (m_target.Meta)
if (m_target?.Meta.Meta != null)
{
m_metaEditor = Editor.CreateEditor(m_target.Meta);
m_metaEditor = Editor.CreateEditor(m_target.Meta.Meta);
}
m_controller = PropGui.FromObject(serializedObject, nameof(m_target.Controller));
m_meta = PropGui.FromObject(serializedObject, nameof(m_target.Meta));
m_expression = PropGui.FromObject(serializedObject, nameof(m_target.Expression));
m_lookAt = PropGui.FromObject(serializedObject, nameof(m_target.LookAt));
m_firstPerson = PropGui.FromObject(serializedObject, nameof(m_target.FirstPerson));
Expand All @@ -70,13 +71,13 @@ void OnDisable()

enum Tabs
{
Meta,
Controller,
Meta,
Expression,
LookAt,
FirstPerson,
}
Tabs _tab;
Tabs _tab = Tabs.Meta;

Editor m_metaEditor;

Expand Down Expand Up @@ -113,6 +114,7 @@ public void RecursiveProperty()
}

PropGui m_controller;
PropGui m_meta;
PropGui m_expression;
PropGui m_lookAt;
PropGui m_firstPerson;
Expand All @@ -139,6 +141,7 @@ public override void OnInspectorGUI()
switch (_tab)
{
case Tabs.Meta:
m_meta.RecursiveProperty();
m_metaEditor?.OnInspectorGUI();
break;

Expand All @@ -147,8 +150,8 @@ public override void OnInspectorGUI()
break;

case Tabs.Expression:
ExpressionGUI();
m_expression.RecursiveProperty();
ExpressionGUI();
break;

case Tabs.LookAt:
Expand Down
29 changes: 21 additions & 8 deletions Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Linq;
using System.IO;
using UnityEditor;
using VRMShaders;
#if UNITY_2020_2_OR_NEWER
using UnityEditor.AssetImporters;
#else
Expand Down Expand Up @@ -55,6 +54,22 @@ public static void OnGUI(ScriptedImporter importer, GltfParser parser, UniGLTF.E
}
}

/// <summary>
/// $"{assetPath without extension}.{folderName}"
/// </summary>
/// <param name="assetPath"></param>
/// <param name="folderName"></param>
/// <returns></returns>
static string GetAndCreateFolder(string assetPath, string suffix)
{
var path = $"{Path.GetDirectoryName(assetPath)}/{Path.GetFileNameWithoutExtension(assetPath)}{suffix}";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
return path;
}

/// <summary>
/// SubAssetを外部ファイルに展開する
/// </summary>
Expand All @@ -65,14 +80,9 @@ public static void Extract(ScriptedImporter importer, GltfParser parser)
return;
}

var path = $"{Path.GetDirectoryName(importer.assetPath)}/{Path.GetFileNameWithoutExtension(importer.assetPath)}.Extracted";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}

// meta
{
var path = GetAndCreateFolder(importer.assetPath, ".Meta");
foreach (var (key, asset) in importer.GetSubAssets<VRM10MetaObject>(importer.assetPath))
{
asset.ExtractSubAsset($"{path}/{asset.name}.asset", false);
Expand All @@ -81,12 +91,15 @@ public static void Extract(ScriptedImporter importer, GltfParser parser)

{
// expressions
var path = GetAndCreateFolder(importer.assetPath, ".Expressions");
foreach (var (key, asset) in importer.GetSubAssets<VRM10Expression>(importer.assetPath))
{
asset.ExtractSubAsset($"{path}/{asset.name}.asset", false);
}

}
{
// expressions
var path = GetAndCreateFolder(importer.assetPath, ".ExpressionAvatar");
foreach (var (key, asset) in importer.GetSubAssets<VRM10ExpressionAvatar>(importer.assetPath))
{
asset.ExtractSubAsset($"{path}/{asset.name}.asset", false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,16 @@ public override void OnEnable()

m_importer = target as VrmScriptedImporter;
m_message = VrmScriptedImporterImpl.TryParseOrMigrate(m_importer.assetPath, m_importer.MigrateToVrm1, out m_parser);
if (string.IsNullOrEmpty(m_message))
if (!string.IsNullOrEmpty(m_message))
{
// ok
// error
return;
}
if (!UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(m_parser.GLTF.extensions, out m_vrm))
{
// error
m_message = "no vrm1";
m_parser = null;
return;
}
m_model = VrmLoader.CreateVrmModel(m_parser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public static void Import(ScriptedImporter scriptedImporter, AssetImportContext
//
// Import(create unity objects)
//
var externalObjectMap = scriptedImporter.GetExternalObjectMap().Select(kv => (kv.Value.name, kv.Value)).ToArray();
var externalObjectMap = scriptedImporter.GetExternalObjectMap().ToDictionary(kv => new SubAssetKey(kv.Key.type, kv.Key.name), kv => kv.Value);

using (var loader = new RuntimeUnityBuilder(parser, externalObjectMap))
{
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM10/Editor/Vrm10ExportDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ protected override void Initialize()
var controller = root.GetComponent<VRM10Controller>();
if (controller != null)
{
Meta = controller.Meta;
Meta = controller.Meta.Meta;
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM10/Runtime/Components/VRM10Controller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public enum UpdateTypes
public VRM10ControllerImpl Controller = new VRM10ControllerImpl();

[SerializeField]
public VRM10MetaObject Meta;
public VRM10ControllerMeta Meta = new VRM10ControllerMeta();

[SerializeField]
public VRM10ControllerExpression Expression = new VRM10ControllerExpression();
Expand Down
12 changes: 12 additions & 0 deletions Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using UnityEngine;

namespace UniVRM10
{
[Serializable]
public sealed class VRM10ControllerMeta
{
[SerializeField]
public VRM10MetaObject Meta;
}
}
11 changes: 11 additions & 0 deletions Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 21 additions & 6 deletions Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@ public class RuntimeUnityBuilder : UniGLTF.ImporterContext

UniGLTF.Extensions.VRMC_vrm.VRMC_vrm m_vrm;

public RuntimeUnityBuilder(UniGLTF.GltfParser parser, IEnumerable<(string, UnityEngine.Object)> externalObjectMap = null) : base(parser, externalObjectMap)
IDictionary<SubAssetKey, UnityEngine.Object> m_externalMap;

public RuntimeUnityBuilder(UniGLTF.GltfParser parser, IDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null)
: base(parser, externalObjectMap.Select(kv => (kv.Key.Name, kv.Value)))
{
m_externalMap = externalObjectMap;
m_model = VrmLoader.CreateVrmModel(parser);

// for `VRMC_materials_mtoon`
Expand Down Expand Up @@ -241,12 +245,16 @@ static ExpressionKey Key(UniGLTF.Extensions.VRMC_vrm.Expression e)
async Task LoadVrmAsync(IAwaitCaller awaitCaller, VRM10Controller controller, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm)
{
// meta
if (vrm.Meta != null)
if (m_externalMap.TryGetValue(VRM10MetaObject.SubAssetKey, out UnityEngine.Object meta))
{
controller.Meta.Meta = meta as VRM10MetaObject;
}
else if (vrm.Meta != null)
{
var src = vrm.Meta;
m_meta = ScriptableObject.CreateInstance<VRM10MetaObject>();
m_meta.name = VRM10MetaObject.SubAssetKey.Name;
controller.Meta = m_meta;
controller.Meta.Meta = m_meta;
m_meta.Name = src.Name;
m_meta.Version = src.Version;
m_meta.ContactInformation = src.ContactInformation;
Expand Down Expand Up @@ -281,7 +289,11 @@ async Task LoadVrmAsync(IAwaitCaller awaitCaller, VRM10Controller controller, Un
}

// expression
if (vrm.Expressions != null)
if (m_externalMap.TryGetValue(VRM10ExpressionAvatar.SubAssetKey, out UnityEngine.Object expressionAvatar))
{
controller.Expression.ExpressionAvatar = expressionAvatar as VRM10ExpressionAvatar;
}
else if (vrm.Expressions != null)
{
controller.Expression.ExpressionAvatar = ScriptableObject.CreateInstance<VRM10ExpressionAvatar>();

Expand Down Expand Up @@ -573,9 +585,12 @@ public override void TransferOwnership(Func<UnityEngine.Object, bool> take)
m_humanoid = null;
}

if (take(m_meta))
if (m_meta != null)
{
m_meta = null;
if (take(m_meta))
{
m_meta = null;
}
}

if (m_exressionAvatar != null && m_exressionAvatar.Clips != null)
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM10/Runtime/IO/Vrm10Exporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ public void Export(GameObject root, Model model, RuntimeVrmConverter converter,
{
throw new NullReferenceException("metaObject is null");
}
meta = vrmController.Meta;
meta = vrmController.Meta.Meta;
}

var vrm = new UniGLTF.Extensions.VRMC_vrm.VRMC_vrm
Expand Down