mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-04 16:58:25 -05:00
Merge pull request #1497 from ousttrue/fix10/vrm10data_api
Fix10/vrm10data api
This commit is contained in:
commit
77fbb6ff77
|
|
@ -61,28 +61,47 @@ namespace UniVRM10
|
|||
}
|
||||
}
|
||||
|
||||
void OnData()
|
||||
{
|
||||
if (m_result == null)
|
||||
{
|
||||
// error
|
||||
return;
|
||||
}
|
||||
m_model = ModelReader.Read(m_result.Data);
|
||||
|
||||
var tmp = m_importer.GetExternalObjectMap();
|
||||
|
||||
var generator = new Vrm10MaterialDescriptorGenerator();
|
||||
var materialKeys = m_result.Data.GLTF.materials.Select((x, i) => generator.Get(m_result.Data, i).SubAssetKey);
|
||||
var textureKeys = new Vrm10TextureDescriptorGenerator(m_result.Data).Get().GetEnumerable().Select(x => x.SubAssetKey);
|
||||
m_materialEditor = new RemapEditorMaterial(materialKeys.Concat(textureKeys), GetEditorMap, SetEditorMap);
|
||||
m_vrmEditor = new RemapEditorVrm(new[] { VRM10Object.SubAssetKey }.Concat(EnumerateExpressinKeys(m_result.VrmExtension.Expressions)), GetEditorMap, SetEditorMap);
|
||||
}
|
||||
|
||||
public override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
var importer = target as VrmScriptedImporter;
|
||||
m_importer = importer;
|
||||
using (Vrm10Data.ParseOrMigrate(m_importer.assetPath, importer.MigrateToVrm1, out m_result, out m_migration))
|
||||
using (var data = new GlbFileParser(m_importer.assetPath).Parse())
|
||||
{
|
||||
if (m_result == null)
|
||||
m_result = Vrm10Data.Parse(data);
|
||||
if (m_result != null)
|
||||
{
|
||||
// error
|
||||
return;
|
||||
OnData();
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var migrated = Vrm10Data.Migrate(data, out m_result, out m_migration))
|
||||
{
|
||||
if (m_result != null)
|
||||
{
|
||||
OnData();
|
||||
}
|
||||
}
|
||||
}
|
||||
m_model = ModelReader.Read(m_result.Data);
|
||||
|
||||
var tmp = m_importer.GetExternalObjectMap();
|
||||
|
||||
var generator = new Vrm10MaterialDescriptorGenerator();
|
||||
var materialKeys = m_result.Data.GLTF.materials.Select((x, i) => generator.Get(m_result.Data, i).SubAssetKey);
|
||||
var textureKeys = new Vrm10TextureDescriptorGenerator(m_result.Data).Get().GetEnumerable().Select(x => x.SubAssetKey);
|
||||
m_materialEditor = new RemapEditorMaterial(materialKeys.Concat(textureKeys), GetEditorMap, SetEditorMap);
|
||||
m_vrmEditor = new RemapEditorVrm(new[] { VRM10Object.SubAssetKey }.Concat(EnumerateExpressinKeys(m_result.VrmExtension.Expressions)), GetEditorMap, SetEditorMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,60 +29,87 @@ namespace UniVRM10
|
|||
}
|
||||
}
|
||||
|
||||
static void Process(Vrm10Data result, ScriptedImporter scriptedImporter, AssetImportContext context, RenderPipelineTypes renderPipeline, bool doNormalize)
|
||||
{
|
||||
//
|
||||
// Import(create unity objects)
|
||||
//
|
||||
var extractedObjects = scriptedImporter.GetExternalObjectMap()
|
||||
.Where(kv => kv.Value != null)
|
||||
.ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value);
|
||||
|
||||
var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline);
|
||||
|
||||
using (var loader = new Vrm10Importer(result, extractedObjects,
|
||||
materialGenerator: materialGenerator,
|
||||
doNormalize: doNormalize))
|
||||
{
|
||||
// settings TextureImporters
|
||||
foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable())
|
||||
{
|
||||
VRMShaders.TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalTextures);
|
||||
}
|
||||
|
||||
var loaded = loader.Load();
|
||||
loaded.ShowMeshes();
|
||||
|
||||
loaded.TransferOwnership((key, o) =>
|
||||
{
|
||||
context.AddObjectToAsset(key.Name, o);
|
||||
});
|
||||
var root = loaded.Root;
|
||||
GameObject.DestroyImmediate(loaded);
|
||||
|
||||
context.AddObjectToAsset(root.name, root);
|
||||
context.SetMainObject(root);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="scriptedImporter"></param>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="migrateToVrm1">vrm0 だった場合に vrm1 化する</param>
|
||||
/// <param name="doMigrate">vrm0 だった場合に vrm1 化する</param>
|
||||
/// <param name="renderPipeline"></param>
|
||||
/// <param name="doNormalize">normalize する</param>
|
||||
public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1, RenderPipelineTypes renderPipeline, bool doNormalize)
|
||||
public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool doMigrate, RenderPipelineTypes renderPipeline, bool doNormalize)
|
||||
{
|
||||
#if VRM_DEVELOP
|
||||
Debug.Log("OnImportAsset to " + scriptedImporter.assetPath);
|
||||
#endif
|
||||
|
||||
using (var data = Vrm10Data.ParseOrMigrate(scriptedImporter.assetPath, migrateToVrm1, out Vrm10Data result, out MigrationData migration))
|
||||
// 1st parse as vrm1
|
||||
using (var data = new GlbFileParser(scriptedImporter.assetPath).Parse())
|
||||
{
|
||||
if (result == null)
|
||||
var vrm1Data = Vrm10Data.Parse(data);
|
||||
if (vrm1Data != null)
|
||||
{
|
||||
// successfully parsed vrm-1.0
|
||||
Process(vrm1Data, scriptedImporter, context, renderPipeline, doNormalize);
|
||||
}
|
||||
|
||||
if (!doMigrate)
|
||||
{
|
||||
// fail to parse vrm1
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Import(create unity objects)
|
||||
//
|
||||
var extractedObjects = scriptedImporter.GetExternalObjectMap()
|
||||
.Where(kv => kv.Value != null)
|
||||
.ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value);
|
||||
|
||||
var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline);
|
||||
|
||||
using (var loader = new Vrm10Importer(result, extractedObjects,
|
||||
materialGenerator: materialGenerator,
|
||||
doNormalize: doNormalize))
|
||||
// try migration...
|
||||
MigrationData migration;
|
||||
using (var migrated = Vrm10Data.Migrate(data, out vrm1Data, out migration))
|
||||
{
|
||||
// settings TextureImporters
|
||||
foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable())
|
||||
if (vrm1Data != null)
|
||||
{
|
||||
VRMShaders.TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalTextures);
|
||||
Process(vrm1Data, scriptedImporter, context, renderPipeline, doNormalize);
|
||||
}
|
||||
|
||||
var loaded = loader.Load();
|
||||
loaded.ShowMeshes();
|
||||
|
||||
loaded.TransferOwnership((key, o) =>
|
||||
{
|
||||
context.AddObjectToAsset(key.Name, o);
|
||||
});
|
||||
var root = loaded.Root;
|
||||
GameObject.DestroyImmediate(loaded);
|
||||
|
||||
context.AddObjectToAsset(root.name, root);
|
||||
context.SetMainObject(root);
|
||||
}
|
||||
|
||||
// fail to migrate...
|
||||
if (migration != null)
|
||||
{
|
||||
Debug.LogWarning(migration.Message);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
27
Assets/VRM10/Runtime/IO/MigrationData.cs
Normal file
27
Assets/VRM10/Runtime/IO/MigrationData.cs
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
namespace UniVRM10
|
||||
{
|
||||
public class MigrationData
|
||||
{
|
||||
/// <summary>
|
||||
/// マイグレーション失敗など
|
||||
/// </summary>
|
||||
public readonly string Message;
|
||||
|
||||
/// <summary>
|
||||
/// vrm0 からマイグレーションした場合に、vrm0 版の meta 情報
|
||||
/// </summary>
|
||||
public readonly Migration.Vrm0Meta OriginalMetaBeforeMigration;
|
||||
|
||||
/// <summary>
|
||||
/// Migration した結果のバイト列(デバッグ用)
|
||||
/// </summary>
|
||||
public readonly byte[] MigratedBytes;
|
||||
|
||||
public MigrationData(string msg, Migration.Vrm0Meta meta = default, byte[] bytes = default)
|
||||
{
|
||||
Message = msg;
|
||||
OriginalMetaBeforeMigration = meta;
|
||||
MigratedBytes = bytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VRM10/Runtime/IO/MigrationData.cs.meta
Normal file
11
Assets/VRM10/Runtime/IO/MigrationData.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 86d0f8ee9681a2e43b959952e51810cd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -4,34 +4,10 @@ using System.Linq;
|
|||
using UniGLTF;
|
||||
using UniGLTF.Extensions.VRMC_vrm;
|
||||
using UniJSON;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UniVRM10
|
||||
{
|
||||
public class MigrationData
|
||||
{
|
||||
/// <summary>
|
||||
/// マイグレーション失敗など
|
||||
/// </summary>
|
||||
public readonly String Message;
|
||||
|
||||
/// <summary>
|
||||
/// vrm0 からマイグレーションした場合に、vrm0 版の meta 情報
|
||||
/// </summary>
|
||||
public readonly Migration.Vrm0Meta OriginalMetaBeforeMigration;
|
||||
|
||||
/// <summary>
|
||||
/// Migration した結果のバイト列(デバッグ用)
|
||||
/// </summary>
|
||||
public readonly byte[] MigratedBytes;
|
||||
|
||||
public MigrationData(string msg, Migration.Vrm0Meta meta = default, byte[] bytes = default)
|
||||
{
|
||||
Message = msg;
|
||||
OriginalMetaBeforeMigration = meta;
|
||||
MigratedBytes = bytes;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vrm10Data
|
||||
{
|
||||
public GltfData Data { get; }
|
||||
|
|
@ -43,92 +19,67 @@ namespace UniVRM10
|
|||
VrmExtension = vrm;
|
||||
}
|
||||
|
||||
public static GltfData ParseOrMigrate(string path, bool doMigrate, out Vrm10Data vrm1Data, out MigrationData migration)
|
||||
/// <summary>
|
||||
/// VRM-1.0 拡張を取得する。
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>失敗したら null が返る</returns>
|
||||
public static Vrm10Data Parse(GltfData data)
|
||||
{
|
||||
return ParseOrMigrate(path, File.ReadAllBytes(path), doMigrate, out vrm1Data, out migration);
|
||||
if (!UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(data.GLTF.extensions, out var vrm))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return new Vrm10Data(data, vrm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// vrm1 をパースする。vrm0 からのマイグレートもできる。
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="doMigrate"></param>
|
||||
/// <param name="vrm1Data">成功した場合非 null</param>
|
||||
/// <param name="migration">doMigrate==true の場合、関連情報が入る</param>
|
||||
/// <returns>GltfDataを作成できたときは Return するのでDisposeすること</returns>
|
||||
public static GltfData ParseOrMigrate(string path, byte[] bytes, bool doMigrate, out Vrm10Data vrm1Data, out MigrationData migration)
|
||||
/// <param name="data"></param>
|
||||
/// <param name="vrm1Data"></param>
|
||||
/// <param name="migration"></param>
|
||||
/// <returns>Migrated GltfData if succeeded. Must Dispose</returns>
|
||||
public static GltfData Migrate(GltfData data, out Vrm10Data vrm1Data, out MigrationData migration)
|
||||
{
|
||||
var data = new GlbLowLevelParser(path, bytes).Parse();
|
||||
byte[] migrated = default;
|
||||
byte[] migratedBytes = null;
|
||||
Migration.Vrm0Meta oldMeta = default;
|
||||
try
|
||||
var json = data.Json.ParseAsJson();
|
||||
if (!json.TryGet("extensions", out JsonNode extensions))
|
||||
{
|
||||
if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(data.GLTF.extensions, out UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm))
|
||||
{
|
||||
// success
|
||||
vrm1Data = new Vrm10Data(data, vrm);
|
||||
migration = default;
|
||||
return data;
|
||||
}
|
||||
|
||||
if (!doMigrate)
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("Not vrm1 and no migration");
|
||||
return data;
|
||||
}
|
||||
|
||||
// try migrateion
|
||||
// Migration.Vrm0Meta oldMeta = default;
|
||||
JsonNode json = data.Json.ParseAsJson();
|
||||
if (!json.TryGet("extensions", out JsonNode extensions))
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("gltf: no extensions");
|
||||
return data;
|
||||
}
|
||||
|
||||
if (!extensions.TryGet("VRM", out JsonNode vrm0))
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("gltf: no vrm0");
|
||||
return data;
|
||||
}
|
||||
|
||||
// found vrm0
|
||||
oldMeta = Migration.Vrm0Meta.FromJsonBytes(json);
|
||||
if (oldMeta == null)
|
||||
{
|
||||
throw new NullReferenceException("oldMeta");
|
||||
}
|
||||
|
||||
// try migrate...
|
||||
migrated = MigrationVrm.Migrate(data);
|
||||
if (migrated == null)
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("Found vrm0. But fail to migrate", oldMeta);
|
||||
return data;
|
||||
}
|
||||
|
||||
if (VRMShaders.Symbols.VRM_DEVELOP)
|
||||
{
|
||||
// load 時の右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている
|
||||
migratedBytes = migrated.Select(x => x).ToArray();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 何か起きた。Dispose は頼む
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData(ex.Message);
|
||||
return data;
|
||||
migration = new MigrationData("gltf: no extensions");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!extensions.TryGet("VRM", out JsonNode vrm0))
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("gltf: no vrm0");
|
||||
return null;
|
||||
}
|
||||
|
||||
// found vrm0
|
||||
var oldMeta = Migration.Vrm0Meta.FromJsonBytes(json);
|
||||
if (oldMeta == null)
|
||||
{
|
||||
throw new NullReferenceException("oldMeta");
|
||||
}
|
||||
|
||||
// try migrate...
|
||||
var migrated = MigrationVrm.Migrate(data);
|
||||
if (migrated == null)
|
||||
{
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("Found vrm0. But fail to migrate", oldMeta);
|
||||
return null;
|
||||
}
|
||||
|
||||
byte[] debugCopy = null;
|
||||
if (VRMShaders.Symbols.VRM_DEVELOP)
|
||||
{
|
||||
// load 時の右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている
|
||||
debugCopy = migrated.Select(x => x).ToArray();
|
||||
}
|
||||
|
||||
// マイグレーション前を破棄
|
||||
data.Dispose();
|
||||
// マイグレーション結果をパースする
|
||||
var migratedData = new GlbLowLevelParser(data.TargetPath, migrated).Parse();
|
||||
try
|
||||
|
|
@ -138,22 +89,26 @@ namespace UniVRM10
|
|||
// migration した結果のパースに失敗した !
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData("vrm0: migrate but error ?", oldMeta, migrated);
|
||||
return migratedData;
|
||||
// 破棄
|
||||
migratedData.Dispose();
|
||||
return null;
|
||||
}
|
||||
|
||||
{
|
||||
// success
|
||||
// success. 非null値が返るのはここだけ。
|
||||
vrm1Data = new Vrm10Data(migratedData, vrm);
|
||||
migration = new MigrationData("vrm0: migrated", oldMeta, migratedBytes);
|
||||
migration = new MigrationData("vrm0: migrated", oldMeta, debugCopy);
|
||||
return migratedData;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 何か起きた。Dispose は頼む
|
||||
Debug.LogWarning(ex);
|
||||
vrm1Data = default;
|
||||
migration = new MigrationData(ex.Message);
|
||||
return migratedData;
|
||||
// 破棄
|
||||
migratedData.Dispose();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,9 +7,8 @@ namespace UniVRM10
|
|||
{
|
||||
public static class Vrm10Utility
|
||||
{
|
||||
// public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
|
||||
public delegate void MetaCallback(Texture2D thumbnail, UniGLTF.Extensions.VRMC_vrm.Meta meta1, Migration.Vrm0Meta meta0);
|
||||
public static async Task<RuntimeGltfInstance> LoadAsync(string path,
|
||||
public static async Task<RuntimeGltfInstance> LoadPathAsync(string path,
|
||||
bool doMigrate,
|
||||
bool doNormalize,
|
||||
IAwaitCaller awaitCaller = null,
|
||||
|
|
@ -17,24 +16,67 @@ namespace UniVRM10
|
|||
MetaCallback metaCallback = null
|
||||
)
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(path, doMigrate, out Vrm10Data vrm1Data, out MigrationData migration))
|
||||
return await LoadBytesAsync(path, System.IO.File.ReadAllBytes(path), doMigrate, doNormalize, awaitCaller, materialGenerator, metaCallback);
|
||||
}
|
||||
|
||||
public static async Task<RuntimeGltfInstance> LoadBytesAsync(string path, byte[] bytes,
|
||||
bool doMigrate,
|
||||
bool doNormalize,
|
||||
IAwaitCaller awaitCaller = null,
|
||||
IMaterialDescriptorGenerator materialGenerator = null,
|
||||
MetaCallback metaCallback = null
|
||||
)
|
||||
{
|
||||
// 1st parse as vrm1
|
||||
using (var data = new GlbLowLevelParser(path, bytes).Parse())
|
||||
{
|
||||
if (vrm1Data == null)
|
||||
var vrm1Data = Vrm10Data.Parse(data);
|
||||
if (vrm1Data != null)
|
||||
{
|
||||
// successfully parsed vrm-1.0
|
||||
using (var loader = new Vrm10Importer(vrm1Data, materialGenerator: materialGenerator, doNormalize: doNormalize))
|
||||
{
|
||||
if (metaCallback != null)
|
||||
{
|
||||
var thumbnail = await loader.LoadVrmThumbnailAsync();
|
||||
metaCallback(thumbnail, vrm1Data.VrmExtension.Meta, null);
|
||||
}
|
||||
var instance = await loader.LoadAsync(awaitCaller);
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
if (!doMigrate)
|
||||
{
|
||||
return default;
|
||||
}
|
||||
using (var loader = new Vrm10Importer(vrm1Data, materialGenerator: materialGenerator, doNormalize: doNormalize))
|
||||
{
|
||||
// migrate しても thumbnail は同じ
|
||||
if (metaCallback != null)
|
||||
{
|
||||
var thumbnail = await loader.LoadVrmThumbnailAsync();
|
||||
metaCallback(thumbnail, vrm1Data.VrmExtension.Meta, migration.OriginalMetaBeforeMigration);
|
||||
}
|
||||
|
||||
var instance = await loader.LoadAsync(awaitCaller);
|
||||
return instance;
|
||||
// try migration...
|
||||
MigrationData migration;
|
||||
using (var migrated = Vrm10Data.Migrate(data, out vrm1Data, out migration))
|
||||
{
|
||||
if (vrm1Data != null)
|
||||
{
|
||||
// successfully migrated from vrm-0.x
|
||||
using (var loader = new Vrm10Importer(vrm1Data, materialGenerator: materialGenerator, doNormalize: doNormalize))
|
||||
{
|
||||
if (metaCallback != null)
|
||||
{
|
||||
var thumbnail = await loader.LoadVrmThumbnailAsync();
|
||||
metaCallback(thumbnail, vrm1Data.VrmExtension.Meta, null);
|
||||
}
|
||||
var instance = await loader.LoadAsync(awaitCaller);
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fail to migrate...
|
||||
if (migration != null)
|
||||
{
|
||||
Debug.LogWarning(migration.Message);
|
||||
}
|
||||
return default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,27 +13,21 @@ namespace UniVRM10.Sample
|
|||
[SerializeField]
|
||||
string m_vrmPath = "Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm";
|
||||
|
||||
static GameObject Import(byte[] bytes, FileInfo path)
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(path.FullName, bytes, doMigrate: true, out Vrm10Data result, out MigrationData migration))
|
||||
using (var loader = new Vrm10Importer(result))
|
||||
{
|
||||
var loaded = loader.Load();
|
||||
loaded.ShowMeshes();
|
||||
return loaded.gameObject;
|
||||
}
|
||||
}
|
||||
|
||||
// Start is called before the first frame update
|
||||
void OnEnable()
|
||||
{
|
||||
var src = new FileInfo(m_vrmPath);
|
||||
var go = Import(File.ReadAllBytes(m_vrmPath), src);
|
||||
Run();
|
||||
}
|
||||
|
||||
var exportedBytes = Vrm10Exporter.Export(go);
|
||||
async void Run()
|
||||
{
|
||||
var src = new FileInfo(m_vrmPath);
|
||||
var instance = await Vrm10Utility.LoadPathAsync(m_vrmPath, true, true);
|
||||
|
||||
var exportedBytes = Vrm10Exporter.Export(instance.gameObject);
|
||||
|
||||
// Import 1.0
|
||||
var vrm10 = Import(exportedBytes, src);
|
||||
var vrm10 = await Vrm10Utility.LoadBytesAsync("tmp.vrm", exportedBytes, false, true);
|
||||
var pos = vrm10.transform.position;
|
||||
pos.x += 1.5f;
|
||||
vrm10.transform.position = pos;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ namespace UniVRM10.Test
|
|||
private (GameObject, IReadOnlyList<VRMShaders.MaterialFactory.MaterialLoadInfo>) ToUnity(byte[] bytes)
|
||||
{
|
||||
// Vrm => Model
|
||||
using (var data = Vrm10Data.ParseOrMigrate("tpm.vrm", bytes, true, out Vrm10Data result, out MigrationData migration))
|
||||
using(var data = new GlbBinaryParser(bytes, "tmp.vrm").Parse())
|
||||
using (var migrated = Vrm10Data.Migrate(data, out Vrm10Data result, out MigrationData migration))
|
||||
{
|
||||
if (result == null)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ namespace UniVRM10.Test
|
|||
var path = "Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm";
|
||||
Debug.Log($"load: {path}");
|
||||
|
||||
using (var data = Vrm10Data.ParseOrMigrate(path, true, out Vrm10Data result, out MigrationData migration))
|
||||
using (var data = new GlbFileParser(path).Parse())
|
||||
using (var migrated = Vrm10Data.Migrate(data, out Vrm10Data result, out MigrationData migration))
|
||||
{
|
||||
Assert.NotNull(result);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using NUnit.Framework;
|
||||
using UniGLTF;
|
||||
|
||||
namespace UniVRM10.Test
|
||||
{
|
||||
|
|
@ -7,16 +8,18 @@ namespace UniVRM10.Test
|
|||
[Test]
|
||||
public void EmptyThumbnailName()
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(TestAsset.AliciaPath, true, out Vrm10Data vrm, out MigrationData migration))
|
||||
using (var data = new GlbFileParser(TestAsset.AliciaPath).Parse())
|
||||
using (var migrated = Vrm10Data.Migrate(data, out var vrm1Data, out var migration))
|
||||
{
|
||||
Assert.NotNull(vrm);
|
||||
// Vrm10Data.ParseOrMigrate(TestAsset.AliciaPath, true, out Vrm10Data vrm, out MigrationData migration))
|
||||
Assert.NotNull(vrm1Data);
|
||||
|
||||
var index = vrm.VrmExtension.Meta.ThumbnailImage.Value;
|
||||
var index = vrm1Data.VrmExtension.Meta.ThumbnailImage.Value;
|
||||
|
||||
// empty thumbnail name
|
||||
vrm.Data.GLTF.images[index].name = null;
|
||||
vrm1Data.Data.GLTF.images[index].name = null;
|
||||
|
||||
using (var loader = new Vrm10Importer(vrm))
|
||||
using (var loader = new Vrm10Importer(vrm1Data))
|
||||
{
|
||||
loader.LoadAsync(new VRMShaders.ImmediateCaller()).Wait();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -198,11 +198,7 @@ namespace UniVRM10
|
|||
{
|
||||
try
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(gltf.FullName, true, out Vrm10Data vrm, out MigrationData migration))
|
||||
using (var loader = new Vrm10Importer(vrm))
|
||||
{
|
||||
loader.LoadAsync().Wait();
|
||||
}
|
||||
Vrm10Utility.LoadPathAsync(gltf.FullName, true, false).Wait();
|
||||
}
|
||||
catch (UnNormalizedException)
|
||||
{
|
||||
|
|
@ -261,7 +257,8 @@ namespace UniVRM10
|
|||
[Test]
|
||||
public void MigrateMeta()
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(AliciaPath, true, out Vrm10Data vrm, out MigrationData migration))
|
||||
using (var data = new GlbFileParser(AliciaPath).Parse())
|
||||
using (var migrated = Vrm10Data.Migrate(data, out Vrm10Data vrm, out MigrationData migration))
|
||||
{
|
||||
Assert.NotNull(vrm);
|
||||
Assert.NotNull(migration);
|
||||
|
|
|
|||
|
|
@ -16,16 +16,11 @@ namespace UniVRM10
|
|||
|
||||
public static Vrm10Instance LoadAlicia()
|
||||
{
|
||||
using (var data = Vrm10Data.ParseOrMigrate(AliciaPath, true, out Vrm10Data vrm, out MigrationData migration))
|
||||
using (var loader = new Vrm10Importer(vrm))
|
||||
{
|
||||
var task = loader.LoadAsync(new VRMShaders.ImmediateCaller());
|
||||
task.Wait();
|
||||
var task = Vrm10Utility.LoadPathAsync(AliciaPath, true, true);
|
||||
task.Wait();
|
||||
var instance = task.Result;
|
||||
|
||||
var instance = task.Result;
|
||||
|
||||
return instance.GetComponent<Vrm10Instance>();
|
||||
}
|
||||
return instance.GetComponent<Vrm10Instance>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ namespace UniVRM10.FirstPersonSample
|
|||
|
||||
async Task<RuntimeGltfInstance> LoadAsync(string path)
|
||||
{
|
||||
var instance = await Vrm10Utility.LoadAsync(path, true, true);
|
||||
var instance = await Vrm10Utility.LoadPathAsync(path, true, true);
|
||||
|
||||
// VR用 FirstPerson 設定
|
||||
var controller = instance.GetComponent<Vrm10Instance>();
|
||||
|
|
|
|||
|
|
@ -415,7 +415,7 @@ namespace UniVRM10.VRM10Viewer
|
|||
}
|
||||
|
||||
Debug.LogFormat("{0}", path);
|
||||
var instance = await Vrm10Utility.LoadAsync(path, true, m_useNormalization.isOn,
|
||||
var instance = await Vrm10Utility.LoadPathAsync(path, true, m_useNormalization.isOn,
|
||||
awaitCaller: new RuntimeOnlyAwaitCaller(),
|
||||
materialGenerator: GetVrmMaterialDescriptorGenerator(m_useUrpMaterial.isOn),
|
||||
metaCallback: m_texts.UpdateMeta);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user