コード例 #1
0
ファイル: G3dTests.cs プロジェクト: vimaec/g3d
        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());
        }
コード例 #2
0
ファイル: G3dTests.cs プロジェクト: vimaec/g3d
        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());
        }
コード例 #3
0
ファイル: G3dTests.cs プロジェクト: dmk-rib/Open.Vim.Sdk
        // 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);
        }
コード例 #4
0
        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());
        }
コード例 #5
0
        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());
        }