239 lines
6.8 KiB
C#
239 lines
6.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
using VRMShaders;
|
|
|
|
namespace UniGLTF
|
|
{
|
|
public class GltfLoadTests
|
|
{
|
|
static string[] Skip = new string[]
|
|
{
|
|
"BrainStem",
|
|
"RiggedSimple",
|
|
"RecursiveSkeletons",
|
|
"AnimatedMorphCube",
|
|
};
|
|
|
|
static IEnumerable<FileInfo> EnumerateGltfFiles(DirectoryInfo dir)
|
|
{
|
|
if (dir.Name == ".git")
|
|
{
|
|
yield break;
|
|
}
|
|
|
|
foreach (var child in dir.EnumerateDirectories())
|
|
{
|
|
foreach (var x in EnumerateGltfFiles(child))
|
|
{
|
|
yield return x;
|
|
}
|
|
}
|
|
|
|
foreach (var child in dir.EnumerateFiles())
|
|
{
|
|
switch (child.Extension.ToLower())
|
|
{
|
|
case ".gltf":
|
|
case ".glb":
|
|
yield return child;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void Message(string path, Exception exception)
|
|
{
|
|
while (exception.InnerException != null)
|
|
{
|
|
exception = exception.InnerException;
|
|
}
|
|
|
|
if (exception is UniGLTFNotSupportedException ex)
|
|
{
|
|
Debug.LogWarning($"LoadError: {path}: {ex}");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError($"LoadError: {path}");
|
|
Debug.LogException(exception);
|
|
}
|
|
}
|
|
|
|
static Byte[] Export(GameObject root)
|
|
{
|
|
var data = new ExportingGltfData();
|
|
using (var exporter = new gltfExporter(data, new GltfExportSettings()))
|
|
{
|
|
exporter.Prepare(root);
|
|
exporter.Export(new EditorTextureSerializer());
|
|
}
|
|
return data.ToGlbBytes();
|
|
}
|
|
|
|
static void RuntimeLoadExport(FileInfo gltf, int subStrStart)
|
|
{
|
|
GltfData data = null;
|
|
try
|
|
{
|
|
data = new AutoGltfFileParser(gltf.FullName).Parse();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogError($"ParseError: {gltf}");
|
|
Debug.LogException(ex);
|
|
}
|
|
|
|
using (data)
|
|
using (var loader = new ImporterContext(data))
|
|
{
|
|
try
|
|
{
|
|
var loaded = loader.Load();
|
|
if (loaded == null)
|
|
{
|
|
Debug.LogWarning($"root is null: ${gltf}");
|
|
return;
|
|
}
|
|
|
|
if (Skip.Contains(gltf.Directory.Parent.Name))
|
|
{
|
|
// Export issue:
|
|
// skip
|
|
return;
|
|
}
|
|
|
|
Export(loaded.gameObject);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Message(gltf.FullName.Substring(subStrStart), ex);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extract をテスト
|
|
/// </summary>
|
|
/// <param name="gltf"></param>
|
|
/// <param name="root"></param>
|
|
static void EditorLoad(FileInfo gltf, int subStrStart)
|
|
{
|
|
GltfData data = null;
|
|
try
|
|
{
|
|
data = new AutoGltfFileParser(gltf.FullName).Parse();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogError($"ParseError: {gltf}");
|
|
Debug.LogException(ex);
|
|
}
|
|
|
|
// should unique
|
|
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)
|
|
{
|
|
foreach (var skip in Skip)
|
|
{
|
|
if (f.Directory.Parent.Name == skip)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
[Test]
|
|
public void GltfSampleModelsTests()
|
|
{
|
|
var env = System.Environment.GetEnvironmentVariable("GLTF_SAMPLE_MODELS");
|
|
if (string.IsNullOrEmpty(env))
|
|
{
|
|
return;
|
|
}
|
|
var root = new DirectoryInfo($"{env}/2.0");
|
|
if (!root.Exists)
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach (var gltf in EnumerateGltfFiles(root))
|
|
{
|
|
if (Exclude(gltf))
|
|
{
|
|
continue;
|
|
}
|
|
RuntimeLoadExport(gltf, root.FullName.Length);
|
|
|
|
EditorLoad(gltf, root.FullName.Length);
|
|
}
|
|
}
|
|
|
|
// [Test]
|
|
public void GltfSampleModelsTest_BrainStem()
|
|
{
|
|
var env = System.Environment.GetEnvironmentVariable("GLTF_SAMPLE_MODELS");
|
|
if (string.IsNullOrEmpty(env))
|
|
{
|
|
return;
|
|
}
|
|
var root = new DirectoryInfo($"{env}/2.0");
|
|
if (!root.Exists)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// foreach (var gltf in EnumerateGltfFiles(root))
|
|
{
|
|
var gltf = new FileInfo(Path.Combine(root.FullName, "BrainStem/glTF-Binary/BrainStem.glb"));
|
|
RuntimeLoadExport(gltf, root.FullName.Length);
|
|
|
|
EditorLoad(gltf, root.FullName.Length);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void GltfSampleModelsTest_DamagedHelmet()
|
|
{
|
|
var env = System.Environment.GetEnvironmentVariable("GLTF_SAMPLE_MODELS");
|
|
if (string.IsNullOrEmpty(env))
|
|
{
|
|
return;
|
|
}
|
|
var root = new DirectoryInfo($"{env}/2.0");
|
|
if (!root.Exists)
|
|
{
|
|
return;
|
|
}
|
|
|
|
{
|
|
var path = Path.Combine(root.FullName, "DamagedHelmet/glTF-Binary/DamagedHelmet.glb");
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|