Merge pull request #1193 from ousttrue/fix10/empty_thumbnail_name

[1.0] thumbnail の名前が無い時に SubAssetKey を作るのに失敗するのを修正
This commit is contained in:
ousttrue
2021-09-08 14:28:47 +09:00
committed by GitHub
8 changed files with 111 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UniGLTF;
using UnityEngine;
@@ -68,6 +69,8 @@ namespace UniVRM10
}
}
public const string THUMBNAIL_NAME = "__VRM10_thumbnail__";
/// <summary>
/// VRM-1 の thumbnail テクスチャー。gltf.textures ではなく gltf.images の参照であることに注意(sampler等の設定が無い)
/// </summary>
@@ -81,14 +84,25 @@ namespace UniVRM10
var imageIndex = vrm.Meta.ThumbnailImage.Value;
var gltfImage = data.GLTF.images[imageIndex];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, gltfImage.name, gltfImage.uri);
// data.GLTF.textures は前処理によりユニーク性がある
// unique な名前を振り出す
var used = new HashSet<string>(data.GLTF.textures.Select(x => x.name));
var imageName = gltfImage.name;
if (string.IsNullOrEmpty(imageName))
{
imageName = THUMBNAIL_NAME;
}
var uniqueName = GlbLowLevelParser.FixNameUnique(used, imageName);
var objectName = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, uniqueName, gltfImage.uri);
GetTextureBytesAsync getThumbnailImageBytesAsync = () =>
{
var bytes = data.GLTF.GetImageBytes(data.Storage, imageIndex);
return Task.FromResult(GltfTextureImporter.ToArray(bytes));
};
var texDesc = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, Vector2.zero, Vector2.one, default, TextureImportTypes.sRGB, default, default,
var texDesc = new TextureDescriptor(objectName, gltfImage.GetExt(), gltfImage.uri, Vector2.zero, Vector2.one, default, TextureImportTypes.sRGB, default, default,
getThumbnailImageBytesAsync, default, default,
default, default, default
);

View File

@@ -38,7 +38,7 @@ namespace UniVRM10
var vrm1 = new UniGLTF.Extensions.VRMC_vrm.VRMC_vrm();
// meta (required)
vrm1.Meta = MigrationVrmMeta.Migrate(vrm0["meta"]);
vrm1.Meta = MigrationVrmMeta.Migrate(gltf, vrm0["meta"]);
// humanoid (required)
vrm1.Humanoid = MigrationVrmHumanoid.Migrate(vrm0["humanoid"]);

View File

@@ -27,7 +27,7 @@ namespace UniVRM10
// },
public static class MigrationVrmMeta
{
public static UniGLTF.Extensions.VRMC_vrm.Meta Migrate(JsonNode vrm0)
public static UniGLTF.Extensions.VRMC_vrm.Meta Migrate(UniGLTF.glTF gltf, JsonNode vrm0)
{
var meta = new UniGLTF.Extensions.VRMC_vrm.Meta
{
@@ -54,7 +54,21 @@ namespace UniVRM10
case "author": meta.Authors = new List<string>() { kv.Value.GetString() }; break;
case "contactInformation": meta.ContactInformation = kv.Value.GetString(); break;
case "reference": meta.References = new List<string>() { kv.Value.GetString() }; break;
case "texture": meta.ThumbnailImage = kv.Value.GetInt32(); break;
case "texture":
{
// vrm0x use texture. vrm10 use image
var textureIndex = kv.Value.GetInt32();
if (textureIndex == -1)
{
meta.ThumbnailImage = -1;
}
else
{
var gltfTexture = gltf.textures[textureIndex];
meta.ThumbnailImage = gltfTexture.source;
}
break;
}
case "allowedUserName":
{

View File

@@ -1,4 +1,3 @@
using System.IO;
using System.Linq;
using NUnit.Framework;
using UnityEngine;
@@ -7,34 +6,10 @@ namespace UniVRM10.Test
{
public class ExpressionTests
{
static string AliciaPath
{
get
{
return Path.GetFullPath(Application.dataPath + "/../Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm")
.Replace("\\", "/");
}
}
static VRM10Controller Load()
{
Vrm10Data.TryParseOrMigrate(AliciaPath, true, out Vrm10Data vrm);
using (var loader = new Vrm10Importer(vrm))
{
var task = loader.LoadAsync(new VRMShaders.ImmediateCaller());
task.Wait();
var instance = task.Result;
return instance.GetComponent<VRM10Controller>();
}
}
[Test]
public void DuplicatedMaterialColorBindings()
{
var controller = Load();
var controller = TestAsset.LoadAlicia();
var src = controller.Vrm.Expression.Aa.MaterialColorBindings.ToList();
@@ -63,7 +38,7 @@ namespace UniVRM10.Test
[Test]
public void DuplicatedMaterialUVBindings()
{
var controller = Load();
var controller = TestAsset.LoadAlicia();
var renderers = controller.GetComponentsInChildren<Renderer>();
var name = renderers[0].sharedMaterials[0].name;

View File

@@ -0,0 +1,23 @@
using NUnit.Framework;
namespace UniVRM10.Test
{
public class LoadTests
{
[Test]
public void EmptyThumbnailName()
{
Assert.True(Vrm10Data.TryParseOrMigrate(TestAsset.AliciaPath, true, out Vrm10Data vrm));
var index = vrm.VrmExtension.Meta.ThumbnailImage.Value;
// empty thumbnail name
vrm.Data.GLTF.images[index].name = null;
using (var loader = new Vrm10Importer(vrm))
{
loader.LoadAsync(new VRMShaders.ImmediateCaller()).Wait();
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c9a9a3ce2deae9c4791d816aa189df3d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,31 @@
using System.IO;
using UnityEngine;
namespace UniVRM10
{
public static class TestAsset
{
public static string AliciaPath
{
get
{
return Path.GetFullPath(Application.dataPath + "/../Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm")
.Replace("\\", "/");
}
}
public static VRM10Controller LoadAlicia()
{
Vrm10Data.TryParseOrMigrate(AliciaPath, true, out Vrm10Data vrm);
using (var loader = new Vrm10Importer(vrm))
{
var task = loader.LoadAsync(new VRMShaders.ImmediateCaller());
task.Wait();
var instance = task.Result;
return instance.GetComponent<VRM10Controller>();
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b18f57dcd7d3c19469aa4842b2ee6ae1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: