public static void QuadAndCopyTest() { // Serialize a triangle g3d as bytes and read it back. var vertices = new[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(1, 1, 1) }; var indices = new[] { 0, 1, 2, 3 }; var materialIndices = new[] { 5 }; var g3d = new G3DBuilder() .AddVertices(vertices.ToIArray()) .AddIndices(indices.ToIArray()) .Add(materialIndices.ToIArray().ToFaceMaterialAttribute()) .ToG3D(); var bytes = g3d.WriteToBytes(); var g = G3D.Read(bytes); Assert.IsNotNull(g); Assert.AreEqual(4, g.NumCornersPerFace); Assert.AreEqual(4, g.NumVertices); Assert.AreEqual(4, g.NumCorners); Assert.AreEqual(1, g.NumFaces); Assert.AreEqual(0, g.NumMeshes); Assert.AreEqual(0, g.NumInstances); Assert.AreEqual(vertices, g.Vertices.ToArray()); Assert.AreEqual(indices, g.Indices.ToArray()); Assert.AreEqual(materialIndices, g.FaceMaterials.ToArray()); var g2 = g.TriangulateQuadMesh(); Assert.AreEqual(3, g2.NumCornersPerFace); Assert.AreEqual(4, g2.NumVertices); Assert.AreEqual(6, g2.NumCorners); Assert.AreEqual(2, g2.NumFaces); Assert.AreEqual(0, g2.NumMeshes); Assert.AreEqual(0, g2.NumInstances); Assert.AreEqual(vertices, g2.GetAttributeDataPosition().ToArray()); Assert.AreEqual(new[] { 0, 1, 2, 0, 2, 3 }, g2.GetAttributeDataIndex().ToArray()); Assert.AreEqual(new[] { 5, 5 }, g2.GetAttributeDataFaceMaterial().ToArray()); g2 = g2.CopyFaces(1, 1); Assert.AreEqual(3, g2.NumCornersPerFace); Assert.AreEqual(4, g2.NumVertices); Assert.AreEqual(3, g2.NumCorners); Assert.AreEqual(1, g2.NumFaces); Assert.AreEqual(vertices, g2.GetAttributeDataPosition().ToArray()); Assert.AreEqual(new[] { 0, 2, 3 }, g2.GetAttributeDataIndex().ToArray()); Assert.AreEqual(new[] { 5 }, g2.GetAttributeDataFaceMaterial().ToArray()); }
public static void TriangleTest() { // Serialize a triangle g3d as bytes and read it back. var vertices = new[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 1) }; var indices = new[] { 0, 1, 2 }; var materialIndices = new[] { 5 }; var g3d = new G3DBuilder() .AddVertices(vertices.ToIArray()) .AddIndices(indices.ToIArray()) .Add(materialIndices.ToIArray().ToFaceMaterialAttribute()) .ToG3D(); var bytes = g3d.WriteToBytes(); var g = G3D.Read(bytes); Assert.IsNotNull(g); Assert.AreEqual(3, g.NumVertices); Assert.AreEqual(3, g.NumCorners); Assert.AreEqual(1, g.NumFaces); Assert.AreEqual(3, g.NumCornersPerFace); Assert.AreEqual(0, g.NumMeshes); Assert.AreEqual(0, g.NumInstances); Assert.AreEqual(vertices, g.Vertices.ToArray()); Assert.AreEqual(indices, g.Indices.ToArray()); Assert.AreEqual(materialIndices, g.FaceMaterials.ToArray()); }
// NOTE: can't be run as part of NUnit because it requires the GC public static void BigFileTest() { var nVerts = (300 * 1000 * 1000); // 300 * 12 = 3.6 GB var vertices = nVerts.Select(i => new Vector3(i, i, i)); var bldr = new G3DBuilder(); bldr.AddVertices(vertices); var g3d = bldr.ToG3D(); Assert.AreEqual(nVerts, g3d.NumVertices); var tempFile = Path.Combine(Path.GetTempPath(), "bigfile.g3d"); g3d.Write(tempFile); var tmp = G3D.Read(tempFile); ValidateSameG3D(g3d, tmp); }
public static void TriangleSerializationTest() { // Serialize a triangle g3d to a bfast as bytes and read it back. var vertices = new[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 1) }; var indices = new[] { 0, 1, 2 }; var materialIds = new[] { 0 }; var faceGroupIds = new[] { 0 }; var g3d = new G3DBuilder() .AddVertices(vertices.ToIArray()) .AddIndices(indices.ToIArray()) .Add(faceGroupIds.ToIArray().ToFaceGroupAttribute()) .Add(materialIds.ToIArray().ToFaceMaterialIdAttribute()) .ToG3D(); var bfastBytes = g3d.WriteToBytes(); var readG3d = G3D.Read(bfastBytes); Assert.IsNotNull(readG3d); var mesh = readG3d.ToIMesh(); ValidateGeometry(mesh); Assert.AreEqual(3, mesh.NumVertices); Assert.AreEqual(new Vector3(0, 0, 0), mesh.Vertices[0]); Assert.AreEqual(new Vector3(0, 1, 0), mesh.Vertices[1]); Assert.AreEqual(new Vector3(0, 1, 1), mesh.Vertices[2]); Assert.AreEqual(1, mesh.NumFaces); Assert.AreEqual(0, mesh.FaceGroups.First()); Assert.AreEqual(0, mesh.FaceMaterialIds.First()); }
public static G3D ToG3D(this Mesh mesh) { // The Assimp mesh must be triangulated if (mesh.FaceCount == 0) { return(G3D.Empty); } var bldr = new G3DBuilder(); // Note: should be at most 3 for meses, but could 2 for lines, or 1 for point clouds var numCornersPerFace = mesh.Faces[0].IndexCount; if (numCornersPerFace > 3) { throw new Exception("The Assimp mesh must be triangulated as a post-process"); } if (numCornersPerFace <= 0) { throw new Exception("The Assimp mesh has faces without indices"); } foreach (var f in mesh.Faces) { if (f.IndexCount != numCornersPerFace) { throw new Exception($"Each face of the assimp mesh must have {numCornersPerFace} corners, but found one with {f.IndexCount}"); } } bldr.SetObjectFaceSize(numCornersPerFace); var indices = mesh.GetIndices(); if (indices.Length % numCornersPerFace != 0) { throw new Exception($"The mesh index buffer length {indices.Length} is not divisible by {numCornersPerFace}"); } bldr.AddVertices(mesh.Vertices.ToIArray().Select(ToMath3D)); bldr.AddIndices(indices); if (mesh.HasTangentBasis) { bldr.Add(mesh.BiTangents.ToIArray().Select(ToMath3D).ToVertexBitangentAttribute()); } if (mesh.HasTangentBasis) { bldr.Add(mesh.Tangents.ToIArray().Select(x => ToMath3D(x).ToVector4()).ToVertexTangentAttribute()); } if (mesh.HasNormals) { bldr.Add(mesh.Normals.ToIArray().Select(ToMath3D).ToVertexNormalAttribute()); } for (var i = 0; i < mesh.TextureCoordinateChannelCount; ++i) { var uvChannel = mesh.TextureCoordinateChannels[i]; bldr.Add(uvChannel.ToIArray().Select(ToMath3D).ToVertexUvwAttribute(i)); } for (var i = 0; i < mesh.VertexColorChannelCount; ++i) { var vcChannel = mesh.VertexColorChannels[i]; bldr.Add(vcChannel.ToIArray().Select(ToMath3D).ToVertexColorAttribute(i)); } return(bldr.ToG3D()); }