221 lines
7.5 KiB
C#
221 lines
7.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
|
|
namespace UniGLTF
|
|
{
|
|
public class MeshTests
|
|
{
|
|
[Test]
|
|
public void AccessorTest()
|
|
{
|
|
byte[] bytes = default;
|
|
using (var ms = new MemoryStream())
|
|
using (var w = new BinaryWriter(ms))
|
|
{
|
|
w.Write(1.0f);
|
|
w.Write(2.0f);
|
|
w.Write(3.0f);
|
|
w.Write(4.0f);
|
|
w.Write(5.0f);
|
|
w.Write(6.0f);
|
|
w.Write(7.0f);
|
|
w.Write(8.0f);
|
|
bytes = ms.ToArray();
|
|
}
|
|
|
|
var gltf = new glTF
|
|
{
|
|
buffers = new List<glTFBuffer>
|
|
{
|
|
new glTFBuffer
|
|
{
|
|
}
|
|
},
|
|
bufferViews = new List<glTFBufferView>
|
|
{
|
|
new glTFBufferView{
|
|
buffer=0,
|
|
byteLength=32,
|
|
byteOffset=0,
|
|
}
|
|
},
|
|
accessors = new List<glTFAccessor>
|
|
{
|
|
new glTFAccessor{
|
|
bufferView = 0,
|
|
componentType=glComponentType.FLOAT,
|
|
count=2,
|
|
byteOffset=0,
|
|
type="VEC4",
|
|
}
|
|
}
|
|
};
|
|
|
|
using (var data = GltfData.CreateFromGltfDataForTest(gltf, new ArraySegment<byte>(bytes)))
|
|
{
|
|
var (getter, len) = WeightsAccessor.GetAccessor(data, 0);
|
|
Assert.AreEqual((1.0f, 2.0f, 3.0f, 4.0f), getter(0));
|
|
Assert.AreEqual((5.0f, 6.0f, 7.0f, 8.0f), getter(1));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 0 1 2
|
|
/// +-+-+
|
|
/// |A|B|
|
|
/// +-+-+
|
|
/// 5 4 3
|
|
///
|
|
/// 6 vertices
|
|
/// 4 triangles
|
|
/// 2 materials
|
|
///
|
|
/// </summary>
|
|
static (GameObject, Mesh) CreateMesh(Material[] materials)
|
|
{
|
|
var unityMesh = new Mesh();
|
|
unityMesh.vertices = new Vector3[]
|
|
{
|
|
new Vector3(0, 1, 0),
|
|
new Vector3(1, 1, 0),
|
|
new Vector3(2, 1, 0),
|
|
new Vector3(2, 0, 0),
|
|
new Vector3(1, 0, 0),
|
|
new Vector3(0, 0, 0),
|
|
};
|
|
unityMesh.uv = new Vector2[]
|
|
{
|
|
new Vector2(0, 0),
|
|
new Vector2(1, 0),
|
|
new Vector2(2, 0),
|
|
new Vector2(2, 1),
|
|
new Vector2(1, 1),
|
|
new Vector2(0, 1),
|
|
};
|
|
|
|
unityMesh.subMeshCount = 2;
|
|
unityMesh.SetTriangles(new int[]{
|
|
0, 1, 5,
|
|
5, 1, 4,
|
|
}, 0);
|
|
unityMesh.SetTriangles(new int[]{
|
|
1, 2, 4,
|
|
4, 2, 3,
|
|
}, 1);
|
|
|
|
unityMesh.RecalculateNormals();
|
|
unityMesh.RecalculateTangents();
|
|
|
|
var go = new GameObject();
|
|
go.AddComponent<MeshRenderer>().sharedMaterials = materials;
|
|
go.AddComponent<MeshFilter>().sharedMesh = unityMesh;
|
|
|
|
return (go, unityMesh);
|
|
}
|
|
|
|
[Test]
|
|
public void SharedVertexBufferTest()
|
|
{
|
|
var data = new ExportingGltfData(50 * 1024 * 1024);
|
|
|
|
var Materials = new List<Material>{
|
|
new Material(Shader.Find("Standard")), // A
|
|
new Material(Shader.Find("Standard")), // B
|
|
};
|
|
|
|
var (go, mesh) = CreateMesh(Materials.ToArray());
|
|
var meshExportSettings = new GltfExportSettings
|
|
{
|
|
DivideVertexBuffer = false
|
|
};
|
|
var axisInverter = Axes.X.Create();
|
|
|
|
var unityMesh = MeshExportList.Create(go);
|
|
var (gltfMesh, blendShapeIndexMap) = MeshExporter_SharedVertexBuffer.Export(data, unityMesh, Materials, axisInverter, meshExportSettings);
|
|
|
|
using (var parsed = GltfData.CreateFromGltfDataForTest(data.Gltf, data.BinBytes))
|
|
{
|
|
|
|
{
|
|
var indices = parsed.GetIndicesFromAccessorIndex(gltfMesh.primitives[0].indices).Bytes.Reinterpret<int>(1);
|
|
Assert.AreEqual(5, indices[0]);
|
|
Assert.AreEqual(1, indices[1]);
|
|
Assert.AreEqual(0, indices[2]);
|
|
Assert.AreEqual(4, indices[3]);
|
|
Assert.AreEqual(1, indices[4]);
|
|
Assert.AreEqual(5, indices[5]);
|
|
}
|
|
|
|
{
|
|
var indices = parsed.GetIndicesFromAccessorIndex(gltfMesh.primitives[1].indices).Bytes.Reinterpret<int>(1);
|
|
Assert.AreEqual(4, indices[0]);
|
|
Assert.AreEqual(2, indices[1]);
|
|
Assert.AreEqual(1, indices[2]);
|
|
Assert.AreEqual(3, indices[3]);
|
|
Assert.AreEqual(2, indices[4]);
|
|
Assert.AreEqual(4, indices[5]);
|
|
}
|
|
|
|
var positions = parsed.GetArrayFromAccessor<Vector3>(gltfMesh.primitives[0].attributes.POSITION);
|
|
Assert.AreEqual(6, positions.Length);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void DividedVertexBufferTest()
|
|
{
|
|
var data = new ExportingGltfData(50 * 1024 * 1024);
|
|
|
|
var Materials = new List<Material>{
|
|
new Material(Shader.Find("Standard")), // A
|
|
new Material(Shader.Find("Standard")), // B
|
|
};
|
|
|
|
var (go, mesh) = CreateMesh(Materials.ToArray());
|
|
var meshExportSettings = new GltfExportSettings
|
|
{
|
|
DivideVertexBuffer = true
|
|
};
|
|
var axisInverter = Axes.X.Create();
|
|
|
|
var unityMesh = MeshExportList.Create(go);
|
|
|
|
var (gltfMesh, blendShapeIndexMap) = MeshExporter_DividedVertexBuffer.Export(data, unityMesh, Materials, axisInverter, meshExportSettings);
|
|
|
|
using (var parsed = GltfData.CreateFromGltfDataForTest(data.Gltf, data.BinBytes))
|
|
{
|
|
{
|
|
var indices = parsed.GetIndicesFromAccessorIndex(gltfMesh.primitives[0].indices).Bytes.Reinterpret<int>(1);
|
|
Assert.AreEqual(3, indices[0]);
|
|
Assert.AreEqual(1, indices[1]);
|
|
Assert.AreEqual(0, indices[2]);
|
|
Assert.AreEqual(2, indices[3]);
|
|
Assert.AreEqual(1, indices[4]);
|
|
Assert.AreEqual(3, indices[5]);
|
|
}
|
|
{
|
|
var positions = parsed.GetArrayFromAccessor<Vector3>(gltfMesh.primitives[0].attributes.POSITION);
|
|
Assert.AreEqual(4, positions.Length);
|
|
}
|
|
|
|
{
|
|
var indices = parsed.GetIndicesFromAccessorIndex(gltfMesh.primitives[1].indices).Bytes.Reinterpret<int>(1);
|
|
Assert.AreEqual(3, indices[0]);
|
|
Assert.AreEqual(1, indices[1]);
|
|
Assert.AreEqual(0, indices[2]);
|
|
Assert.AreEqual(2, indices[3]);
|
|
Assert.AreEqual(1, indices[4]);
|
|
Assert.AreEqual(3, indices[5]);
|
|
}
|
|
{
|
|
var positions = parsed.GetArrayFromAccessor<Vector3>(gltfMesh.primitives[1].attributes.POSITION);
|
|
Assert.AreEqual(4, positions.Length);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|