fix GltfData.Dispose for tests

This commit is contained in:
ousttrue 2022-01-25 19:17:24 +09:00
parent d6dac4db9c
commit 684db5091f
8 changed files with 107 additions and 80 deletions

View File

@ -143,16 +143,17 @@ namespace UniGLTF
UnityEngine.Object.DestroyImmediate(mat);
UnityEngine.Object.DestroyImmediate(root);
var parsed = GltfData.CreateFromGltfDataForTest(gltf, data.BinBytes);
using (var parsed = GltfData.CreateFromGltfDataForTest(gltf, data.BinBytes))
{
// Extract Image to Texture2D
var exportedBytes = parsed.GetBytesFromBufferView(exportedImage.bufferView).ToArray();
var exportedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false, linear: false);
Assert.IsTrue(exportedTexture.LoadImage(exportedBytes)); // Always true ?
Assert.AreEqual(srcTex.width, exportedTexture.width);
Assert.AreEqual(srcTex.height, exportedTexture.height);
// Extract Image to Texture2D
var exportedBytes = parsed.GetBytesFromBufferView(exportedImage.bufferView).ToArray();
var exportedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false, linear: false);
Assert.IsTrue(exportedTexture.LoadImage(exportedBytes)); // Always true ?
Assert.AreEqual(srcTex.width, exportedTexture.width);
Assert.AreEqual(srcTex.height, exportedTexture.height);
return exportedTexture;
return exportedTexture;
}
}
private static Color32 GetFirstPixelInTexture2D(Texture2D tex)

View File

@ -33,11 +33,13 @@ namespace UniGLTF
});
var parser = new GlbLowLevelParser("Test", data.ToGlbBytes());
var parsed = parser.Parse();
using (var parsed = parser.Parse())
{
Assert.AreEqual("FooBar", parsed.GLTF.textures[0].name);
// NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。
Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name);
Assert.AreEqual("FooBar", parsed.GLTF.textures[0].name);
// NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。
Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name);
}
}
/// <summary>
@ -61,16 +63,18 @@ namespace UniGLTF
Assert.True(File.Exists(path));
var bytes = File.ReadAllBytes(path);
var data = new GlbBinaryParser(bytes, Path.GetFileNameWithoutExtension(path)).Parse();
// glb header + 1st chunk only
var mod = bytes.Take(12 + 8 + data.Chunks[0].Bytes.Count).ToArray();
Assert.Throws<GlbParseException>(() =>
using (var data = new GlbBinaryParser(bytes, Path.GetFileNameWithoutExtension(path)).Parse())
{
// glb header + 1st chunk only
var mod = bytes.Take(12 + 8 + data.Chunks[0].Bytes.Count).ToArray();
Assert.Throws<GlbParseException>(() =>
{
// 再パース
var data2 = new GlbBinaryParser(mod, Path.GetFileNameWithoutExtension(path)).Parse();
});
});
}
}
}
}

View File

@ -89,6 +89,7 @@ namespace UniGLTF
Debug.LogException(ex);
}
using (data)
using (var loader = new ImporterContext(data))
{
try
@ -136,12 +137,15 @@ namespace UniGLTF
}
// should unique
var gltfTextures = new GltfTextureDescriptorGenerator(data).Get().GetEnumerable()
.Select(x => x.SubAssetKey)
.ToArray();
var distinct = gltfTextures.Distinct().ToArray();
Assert.True(gltfTextures.Length == distinct.Length);
Assert.True(gltfTextures.SequenceEqual(distinct));
using (data)
{
var gltfTextures = new GltfTextureDescriptorGenerator(data).Get().GetEnumerable()
.Select(x => x.SubAssetKey)
.ToArray();
var distinct = gltfTextures.Distinct().ToArray();
Assert.True(gltfTextures.Length == distinct.Length);
Assert.True(gltfTextures.SequenceEqual(distinct));
}
}
static bool Exclude(FileInfo f)
@ -220,13 +224,14 @@ namespace UniGLTF
{
var path = Path.Combine(root.FullName, "DamagedHelmet/glTF-Binary/DamagedHelmet.glb");
var data = new AutoGltfFileParser(path).Parse();
var matDesc = new GltfMaterialDescriptorGenerator().Get(data, 0);
Assert.AreEqual("Standard", matDesc.ShaderName);
Assert.AreEqual(5, matDesc.TextureSlots.Count);
var (key, value) = matDesc.EnumerateSubAssetKeyValue().First();
Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "texture_0"), key);
using (var data = new AutoGltfFileParser(path).Parse())
{
var matDesc = new GltfMaterialDescriptorGenerator().Get(data, 0);
Assert.AreEqual("Standard", matDesc.ShaderName);
Assert.AreEqual(5, matDesc.TextureSlots.Count);
var (key, value) = matDesc.EnumerateSubAssetKeyValue().First();
Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "texture_0"), key);
}
}
}
}

View File

@ -72,6 +72,7 @@ namespace VRM
try
{
using (data)
using (var importer = new VRMImporterContext(new VRMData(data)))
{
return importer.Load().gameObject;

View File

@ -22,6 +22,7 @@ namespace VRM
{
var data = new GlbFileParser(AliciaPath).Parse();
byte[] bytes = default;
using (data)
using (var loader = new VRMImporterContext(new VRMData(data)))
using (var loaded = loader.Load())
{
@ -37,7 +38,7 @@ namespace VRM
});
}
var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse();
using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse())
using (var loader2 = new VRMImporterContext(new VRMData(data2)))
{
Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
@ -50,6 +51,7 @@ namespace VRM
var data = new GlbFileParser(AliciaPath).Parse();
byte[] bytes = default;
CurveMapper horizontalInner = default;
using (data)
using (var loader = new VRMImporterContext(new VRMData(data)))
using (var loaded = loader.Load())
{
@ -65,7 +67,7 @@ namespace VRM
});
}
var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse();
using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse())
using (var loader = new VRMImporterContext(new VRMData(data2)))
using (var loaded = loader.Load())
{
@ -83,6 +85,7 @@ namespace VRM
var data = new GlbFileParser(AliciaPath).Parse();
byte[] bytes = default;
CurveMapper horizontalInner = default;
using (data)
using (var loader = new VRMImporterContext(new VRMData(data)))
using (var loaded = loader.Load())
{
@ -98,7 +101,7 @@ namespace VRM
});
}
var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse();
using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse())
using (var loader = new VRMImporterContext(new VRMData(data2)))
using (var loaded = loader.Load())
{

View File

@ -22,22 +22,24 @@ namespace UniVRM10
public void MaterialImporterTest()
{
var migratedBytes = MigrationVrm.Migrate(File.ReadAllBytes(AliciaPath));
var data = new GlbLowLevelParser(AliciaPath, migratedBytes).Parse();
using (var data = new GlbLowLevelParser(AliciaPath, migratedBytes).Parse())
{
var matDesc = new Vrm10MaterialDescriptorGenerator().Get(data, 0);
Assert.AreEqual("Alicia_body", matDesc.Name);
Assert.AreEqual("VRM10/MToon10", matDesc.ShaderName);
Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_MainTex"].UnityObjectName);
Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_ShadeTex"].UnityObjectName);
var matDesc = new Vrm10MaterialDescriptorGenerator().Get(data, 0);
Assert.AreEqual("Alicia_body", matDesc.Name);
Assert.AreEqual("VRM10/MToon10", matDesc.ShaderName);
Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_MainTex"].UnityObjectName);
Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_ShadeTex"].UnityObjectName);
AreColorEqualApproximately(new Color(1, 1, 1, 1), matDesc.Colors["_Color"]);
ColorUtility.TryParseHtmlString("#FFDDD6", out var shadeColor);
AreColorEqualApproximately(shadeColor, matDesc.Colors["_ShadeColor"]);
AreColorEqualApproximately(new Color(1, 1, 1, 1), matDesc.Colors["_Color"]);
ColorUtility.TryParseHtmlString("#FFDDD6", out var shadeColor);
AreColorEqualApproximately(shadeColor, matDesc.Colors["_ShadeColor"]);
Assert.AreEqual(1.0f - 0.1f, matDesc.FloatValues["_GiEqualization"]);
Assert.AreEqual(1.0f - 0.1f, matDesc.FloatValues["_GiEqualization"]);
var (key, value) = matDesc.EnumerateSubAssetKeyValue().First();
Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key);
var (key, value) = matDesc.EnumerateSubAssetKeyValue().First();
Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key);
}
}
private void AreColorEqualApproximately(Color expected, Color actual)

View File

@ -22,9 +22,11 @@ namespace UniVRM10
static JsonNode GetVRM0(byte[] bytes)
{
var glb = new GlbBinaryParser(bytes, "vrm0").Parse();
var json = glb.Json.ParseAsJson();
return json["extensions"]["VRM"];
using (var glb = new GlbBinaryParser(bytes, "vrm0").Parse())
{
var json = glb.Json.ParseAsJson();
return json["extensions"]["VRM"];
}
}
T GetExtension<T>(UniGLTF.glTFExtension extensions, UniJSON.Utf8String key, Func<JsonNode, T> deserializer)
@ -50,14 +52,16 @@ namespace UniVRM10
var vrm0Json = GetVRM0(vrm0Bytes);
var vrm1 = MigrationVrm.Migrate(vrm0Bytes);
var glb = new GlbBinaryParser(vrm1, "vrm1").Parse();
var json = glb.Json.ParseAsJson();
var gltf = UniGLTF.GltfDeserializer.Deserialize(json);
using (var glb = new GlbBinaryParser(vrm1, "vrm1").Parse())
{
var json = glb.Json.ParseAsJson();
var gltf = UniGLTF.GltfDeserializer.Deserialize(json);
MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.ExtensionNameUtf8,
UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.Deserialize), MigrationVrm.CreateMeshToNode(gltf));
MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.ExtensionNameUtf8,
UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.Deserialize), gltf.nodes);
MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.ExtensionNameUtf8,
UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.Deserialize), MigrationVrm.CreateMeshToNode(gltf));
MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.ExtensionNameUtf8,
UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.Deserialize), gltf.nodes);
}
}
const float EPS = 1e-4f;
@ -195,6 +199,7 @@ namespace UniVRM10
try
{
Vrm10Data.TryParseOrMigrate(gltf.FullName, true, out Vrm10Data vrm);
using (vrm)
using (var loader = new Vrm10Importer(vrm))
{
loader.LoadAsync().Wait();
@ -218,35 +223,40 @@ namespace UniVRM10
//
var VALUE = new Vector3(-0.0359970331f, -0.0188314915f, 0.00566166639f);
var bytes0 = File.ReadAllBytes(AliciaPath);
var data0 = new GlbLowLevelParser(AliciaPath, bytes0).Parse();
var json0 = data0.Json.ParseAsJson();
var groupIndex = json0["extensions"]["VRM"]["secondaryAnimation"]["boneGroups"][0]["colliderGroups"][0].GetInt32();
var x = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["x"].GetSingle();
var y = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["y"].GetSingle();
var z = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["z"].GetSingle();
Assert.AreEqual(VALUE.x, x);
Assert.AreEqual(VALUE.y, y);
Assert.AreEqual(VALUE.z, z);
int groupIndex = default;
using (var data0 = new GlbLowLevelParser(AliciaPath, bytes0).Parse())
{
var json0 = data0.Json.ParseAsJson();
groupIndex = json0["extensions"]["VRM"]["secondaryAnimation"]["boneGroups"][0]["colliderGroups"][0].GetInt32();
var x = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["x"].GetSingle();
var y = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["y"].GetSingle();
var z = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["z"].GetSingle();
Assert.AreEqual(VALUE.x, x);
Assert.AreEqual(VALUE.y, y);
Assert.AreEqual(VALUE.z, z);
}
//
// vrm1 に migrate
//
var bytes1 = MigrationVrm.Migrate(bytes0);
var data1 = new GlbLowLevelParser(AliciaPath, bytes1).Parse();
Assert.True(UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(data1.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone));
var spring = springBone.Springs[0];
// var colliderNodeIndex = spring.ColliderGroups[0];
// x軸だけが反転する
var colliderIndex = 0;
for (int i = 0; i < groupIndex; ++i)
using (var data1 = new GlbLowLevelParser(AliciaPath, bytes1).Parse())
{
colliderIndex += springBone.ColliderGroups[i].Colliders.Length;
}
Assert.True(UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(data1.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone));
var spring = springBone.Springs[0];
// var colliderNodeIndex = spring.ColliderGroups[0];
// x軸だけが反転する
Assert.AreEqual(-VALUE.x, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[0]);
Assert.AreEqual(VALUE.y, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[1]);
Assert.AreEqual(VALUE.z, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[2]);
var colliderIndex = 0;
for (int i = 0; i < groupIndex; ++i)
{
colliderIndex += springBone.ColliderGroups[i].Colliders.Length;
}
Assert.AreEqual(-VALUE.x, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[0]);
Assert.AreEqual(VALUE.y, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[1]);
Assert.AreEqual(VALUE.z, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[2]);
}
}
[Test]

View File

@ -17,6 +17,7 @@ namespace UniVRM10
public static Vrm10Instance LoadAlicia()
{
Vrm10Data.TryParseOrMigrate(AliciaPath, true, out Vrm10Data vrm);
using (vrm)
using (var loader = new Vrm10Importer(vrm))
{
var task = loader.LoadAsync(new VRMShaders.ImmediateCaller());