示例#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
        public static void SimpleCreateG3DTest()
        {
            // Should be a tetrahedron
            var vertexBuffer = TestGeometries.TestTetrahedronVertices.ToVertexAttribute();
            var indexBuffer  = TestGeometries.TestTetrahedronIndices.ToIndexAttribute();

            CheckAttribute(vertexBuffer, Association.assoc_vertex, AttributeType.attr_vertex, DataType.dt_float32, 3);
            CheckAttribute(indexBuffer, Association.assoc_corner, AttributeType.attr_index, DataType.dt_int32, 1);
            var g3d = G3D.Create(vertexBuffer, indexBuffer);

            Assert.AreEqual(4, vertexBuffer.Count);
            Assert.AreEqual(12, indexBuffer.Count);
            var g = g3d.ToIGeometry();

            CheckTestTetrahedron(g);
            var b  = g.ToBFast();
            var g2 = b.ToG3D();

            CheckTestTetrahedron(g2.ToIGeometry());
            var tmpPath = Path.GetTempFileName();

            g.WriteG3D(tmpPath);
            var g3 = G3DExtensions.ReadFromFile(tmpPath);

            CheckTestTetrahedron(g3.ToIGeometry());
        }
示例#4
0
 public static void ReadG3DFiles()
 {
     foreach (var f in Directory.GetFiles(TestOutputFolder))
     {
         var g3d = G3D.Read(f);
         G3dTestUtils.OutputStats(g3d);
     }
 }
示例#5
0
 private void ReturnVolumeData()
 {
     lblRisultato.Text = _risultato +
                         "\n Altezza Solido: " + txtAltezzaV.Text +
                         "\n Volume: " +
                         G3D.CalcoloVolume(_area, Double.Parse(txtAltezzaV.Text)).ToString();
     txtAltezzaV.Text = "";
 }
示例#6
0
文件: Importer.cs 项目: vimaec/g3d
    public override void OnImportAsset(AssetImportContext ctx)
    {
        Debug.Log($"Importing G3D file: {ctx.assetPath}");
        ImportHelpers.TimeBlockingOperation();
        var baseName = Path.GetFileNameWithoutExtension(ctx.assetPath);
        var g3d      = G3D.Read(ctx.assetPath);

        g3d.OutputStats();
        var obj = ctx.ImportG3D(g3d, baseName);

        ctx.AddRandomMaterial(obj);
        ctx.SetMainObject(obj);
    }
示例#7
0
        public static void TestG3DReader()
        {
            foreach (var fileName in GetInputFiles("*.g3d"))
            {
                var g = Util.TimeIt(() => G3D.ReadFile(fileName), $"Reading G3D {fileName}");

                var baseFileName   = Path.GetFileName(fileName);
                var outputFileName = Path.Combine(TestOutputFolder, baseFileName);

                Console.WriteLine("Testing Ara 3D native writer");
                TestWritingFile(outputFileName + ".ara.obj", f => g.ToIGeometry().WriteObj(f, false));
            }
        }
示例#8
0
        private void btnVolume_Click(object sender, EventArgs e)
        {
            double altezzaV = Math.Round(G3D.GetDouble(txtAltezzaV.Text), 2);

            if (txtAltezzaV.Text == "" || G3D.IsNegative(altezzaV))
            {
                MessageBox.Show("Inserisci l' ALTEZZA del solido prima di continuare.");
            }
            else
            {
                ReturnVolumeData();
            }
        }
示例#9
0
文件: Importer.cs 项目: vimaec/g3d
 public static void OutputStats(this G3D g)
 {
     Debug.Log($"# corners per faces {g.CornersPerFace} ");
     Debug.Log($"# vertices = {g.NumVertices}");
     Debug.Log($"# faces = {g.NumFaces}");
     Debug.Log($"# groups = {g.NumGroups}");
     Debug.Log($"Number of attributes = {g.Attributes.Count}");
     //Debug.Log("Header");
     foreach (var attr in g.Attributes)
     {
         Debug.Log($"{attr.Name} #bytes={attr.Bytes.Length} #items={attr.ElementCount}");
     }
 }
示例#10
0
        public static void OutputStats(G3D g)
        {
            //Console.WriteLine("Header");

            Console.WriteLine($"# corners per faces {g.NumCornersPerFace} ");
            Console.WriteLine($"# vertices = {g.NumVertices}");
            Console.WriteLine($"# faces = {g.NumFaces}");
            Console.WriteLine($"# subgeos = {g.NumSubgeometries}");
            Console.WriteLine($"# indices (corners/edges0 = {g.NumCorners}");
            Console.WriteLine($"# instances = {g.NumInstances}");
            Console.WriteLine($"Number of attributes = {g.Attributes.Count}");

            foreach (var attr in g.Attributes.ToEnumerable())
            {
                Console.WriteLine($"{attr.Name} #items={attr.ElementCount}");
            }
        }
示例#11
0
        // 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);
        }
示例#12
0
 public static void AssertSame(G3D g1, G3D g2)
 {
     Assert.AreEqual(g1.NumCornersPerFace, g2.NumCornersPerFace);
     Assert.AreEqual(g1.NumFaces, g2.NumFaces);
     Assert.AreEqual(g1.NumCorners, g2.NumCorners);
     Assert.AreEqual(g1.NumVertices, g2.NumVertices);
     Assert.AreEqual(g1.NumInstances, g2.NumInstances);
     Assert.AreEqual(g1.NumSubgeometries, g2.NumSubgeometries);
     Assert.AreEqual(g1.Attributes.Count, g2.Attributes.Count);
     for (var i = 0; i < g1.Attributes.Count; ++i)
     {
         var attr1 = g1.Attributes[i];
         var attr2 = g2.Attributes[i];
         Assert.AreEqual(attr1.Name, attr2.Name);
         Assert.AreEqual(attr1.GetByteSize(), attr2.GetByteSize());
         Assert.AreEqual(attr1.ElementCount, attr2.ElementCount);
     }
 }
示例#13
0
 public static void ValidateSameG3D(G3D g1, G3D g2)
 {
     ValidateSame(g1.NumCornersPerFace, g2.NumCornersPerFace, "NumCornersPerFace");
     ValidateSame(g1.NumFaces, g2.NumFaces, "NumFaces");
     ValidateSame(g1.NumCorners, g2.NumCorners, "NumCorners");
     ValidateSame(g1.NumVertices, g2.NumVertices, "NumVertices");
     ValidateSame(g1.NumInstances, g2.NumInstances, "NumInstances");
     ValidateSame(g1.NumSubgeometries, g2.NumSubgeometries, "NumSubgeometries");
     ValidateSame(g1.Attributes.Count, g2.Attributes.Count, "NumAttributes");
     for (var i = 0; i < g1.Attributes.Count; ++i)
     {
         var attr1 = g1.Attributes[i];
         var attr2 = g2.Attributes[i];
         ValidateSame(attr1.Name, attr2.Name, $"Attribute[{i}].Name");
         ValidateSame(attr1.GetByteSize(), attr2.GetByteSize(), $"Attribute[{i}].ByteSize");
         ValidateSame(attr1.ElementCount, attr2.ElementCount, $"Attribute[{i}].ElementCount");
     }
 }
示例#14
0
文件: Importer.cs 项目: vimaec/g3d
    public static GameObject ImportG3D(this AssetImportContext ctx, G3D g3d, string baseName)
    {
        var obj = ObjectFactory.CreateGameObject(baseName, typeof(MeshFilter), typeof(MeshRenderer));

        // Create a Mesh filter and assign the mesh to it
        var mf = obj.GetComponent <MeshFilter>();

        mf.sharedMesh = g3d.ToMesh();
        var nFace    = g3d.NumFaces;
        var nVert    = g3d.Vertices.ElementCount;
        var nAttr    = g3d.Attributes.Count;
        var meshName = $"mesh {baseName} ({nFace} polys, {nVert} verts, {nAttr} attributes)";

        ctx.AddObjectToAsset(meshName, mf.sharedMesh);

        // Add the game object as an asset
        ctx.AddObjectToAsset(baseName, obj);
        return(obj);
    }
示例#15
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());
        }
示例#16
0
 public static void AssertSame(Mesh m, G3D g)
 {
     Assert.AreEqual(m.FaceCount, g.NumFaces);
     Assert.AreEqual(m.GetIndices(), g.Indices.ToArray());
     Assert.AreEqual(m.VertexCount, g.NumVertices);
 }
示例#17
0
 public Validator(G3D g3d, Schema schema)
 {
     foreach (var attribute in g3d.)
 }
示例#18
0
        public static SerializableDocument ReadBuffer(this SerializableDocument doc, Stream stream, string name, long numBytes)
        {
            Debug.WriteLine($"Reading buffer {name} of size {Util.BytesToString(numBytes)}");
            switch (name)
            {
            case BufferNames.Header:
                var bytes = stream.ReadArray <byte>((int)numBytes);
                doc.Header = SerializableHeader.Parse(Encoding.UTF8.GetString(bytes));
                return(doc);

            case BufferNames.Assets:
                if (doc.Options?.SkipAssets == true)
                {
                    Debug.WriteLine("Skipping assets");
                    stream.Advance(numBytes);
                    return(doc);
                }
                doc.Assets = stream.ReadBFast().ToArray();
                return(doc);

            case BufferNames.Strings:
                var stringBytes       = stream.ReadArray <byte>((int)numBytes);
                var joinedStringTable = Encoding.UTF8.GetString(stringBytes);
                doc.StringTable = joinedStringTable.Split('\0');
                return(doc);

            case BufferNames.Geometry:
                if (doc.Options?.SkipGeometry == true)
                {
                    Debug.WriteLine("Skipping geometry");
                    stream.Advance(numBytes);
                    return(doc);
                }
                doc.Geometry = G3D.Read(stream);
                return(doc);

            case BufferNames.Nodes:
                if (doc.Options?.SkipGeometry == true)
                {
                    Debug.WriteLine("Skipping nodes");
                    stream.Advance(numBytes);
                    return(doc);
                }
                var cnt = (int)(numBytes / SerializableSceneNode.Size);
                Debug.Assert(numBytes % SerializableSceneNode.Size == 0, $"Number of bytes is not divisible by {SerializableSceneNode.Size}");
                if (cnt < 0)
                {
                    throw new Exception($"More than {int.MaxValue} items in array");
                }
                doc.Nodes = stream.ReadArray <SerializableSceneNode>(cnt);
                return(doc);

            case BufferNames.Entities:
                doc.EntityTables = ReadEntityTables(stream);
                return(doc);
            }

            // NOTE: unrecognized buffers are not an error.
            Debug.WriteLine($"Unrecognized buffer {name}");
            stream.ReadArray <byte>((int)numBytes);
            return(doc);
        }
示例#19
0
        public static void OpenAndConvertAssimpFiles()
        {
            var files = GetInputFiles()
                        .Where(AssimpLoader.CanLoad)
                        .Select(f => new FileLoadData(f))
                        .ToArray();

            // Load all the files
            foreach (var f in files)
            {
                try
                {
                    (f.MemoryConsumption, f.MSecToOpen) =
                        Util.GetMemoryConsumptionAndMSecElapsed(() =>
                                                                f.Scene = AssimpLoader.Load(f.SourceFile.FullName));
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Convert all the Assimp scenes to G3D
            foreach (var f in files)
            {
                if (f.Scene == null)
                {
                    continue;
                }

                try
                {
                    f.MSecToConvert = Util.GetMSecElapsed(() =>
                                                          f.G3d = f.Scene.ToG3d());
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Save all the G3D scenes
            Util.CreateAndClearDirectory(TestOutputFolder);
            foreach (var f in files)
            {
                if (f.G3d == null)
                {
                    continue;
                }

                try
                {
                    var outputFilePath = Path.Combine(TestOutputFolder, f.ShortName + ".g3d");
                    f.G3DFile = new FileInfo(outputFilePath);

                    f.MSecToSaveG3d = Util.GetMSecElapsed(() =>
                                                          f.G3d.Write(outputFilePath));
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Try reading back in all of the G3D scenes, measure load times and the memory consumption
            foreach (var f in files)
            {
                if (f.G3DFile == null)
                {
                    continue;
                }

                try
                {
                    G3D localG3d = null;

                    (f.MemoryConsumptionG3d, f.MSecToOpenG3d) =
                        Util.GetMemoryConsumptionAndMSecElapsed(() =>
                                                                localG3d = G3D.Read(f.G3DFile.FullName));

                    ValidateSameG3D(f.G3d, localG3d);
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Output the header for data
            Console.WriteLine(
                "Importer," +
                "Extension," +
                "File Name," +
                "File Size(KB)," +
                "Load Time(s)," +
                "Memory(KB)," +
                "# Meshes," +
                "Time to Convert," +
                "Time to Write G3D," +
                "G3D File Size(KB)," +
                "G3D Memory(KB)",
                "G3D Load Time(s)",
                "Error");

            // Output the data rows
            foreach (var f in files)
            {
                Console.WriteLine(
                    "Assimp," +
                    $"{Path.GetExtension(f.ShortName)}," +
                    $"{f.ShortName}," +
                    $"{f.SourceFile?.Length / 1000}," +
                    $"{f.MSecToOpen / 100f}," +
                    $"{f.MemoryConsumption / 1000}," +
                    $"{f.NumMeshes}," +
                    $"{f.MSecToConvert / 100f}," +
                    $"{f.MSecToSaveG3d / 100f}," +
                    $"{f.G3DFile?.Length / 1000}," +
                    $"{f.MemoryConsumptionG3d / 1000}," +
                    $"{f.MSecToOpenG3d / 100f}," +
                    $"{f.Error}");
            }

            Assert.AreEqual(0, files.Count(f => f.Error != null), "Errors occurred");
        }
示例#20
0
 public static IMesh ReadG3D(string filePath)
 => G3D.Read(filePath).ToIMesh();
        private void BtnCalcola_Click(object sender, EventArgs e)
        {
            {
                switch (flag)
                {
                case 0:
                    double raggio = G3D.GetDouble(txtRaggio.Text);
                    if (rbtnCerchio.Checked && txtRaggio.Text == "" || G3D.IsNegative(raggio))
                    {
                        MessageBox.Show("Inserisci un RAGGIO valido prima di continuare.");
                    }
                    else
                    {
                        Cerchio       c     = new Cerchio(raggio);
                        FormRisultato cForm = new FormRisultato(c.ToString(), c.CalcoloArea());
                        cForm.Show();
                    }
                    break;

                case 1:
                    double qLato = G3D.GetDouble(txtLato.Text);
                    if (rbtnQuadrato.Checked && txtLato.Text == "" || G3D.IsNegative(qLato))
                    {
                        MessageBox.Show("Inserisci un LATO valido prima di continuare.");
                    }
                    else
                    {
                        Quadrato      q     = new Quadrato(qLato);
                        FormRisultato qForm = new FormRisultato(q.ToString(), q.CalcoloArea());
                        qForm.Show();
                    }
                    break;

                case 3:
                    double tBase    = G3D.GetDouble(txtBase.Text);
                    double tAltezza = G3D.GetDouble(txtAltezza.Text);
                    if (rbtnTriangolo.Checked && txtBase.Text == "" || txtAltezza.Text == "" || G3D.IsNegative(tAltezza, tBase))
                    {
                        MessageBox.Show("Inserisci BASE e ALTEZZA validi prima di continuare.");
                    }
                    else
                    {
                        TriangoloIso  t     = new TriangoloIso(tBase, tAltezza);
                        FormRisultato tForm = new FormRisultato(t.ToString(), t.CalcoloArea());
                        tForm.Show();
                    }
                    break;

                case 4:
                    double rBase     = G3D.GetDouble(txtBase.Text);
                    double rAltezzaa = G3D.GetDouble(txtAltezza.Text);
                    if (rbtnRettangolo.Checked && txtBase.Text == "" || txtAltezza.Text == "" || G3D.IsNegative(rBase, rAltezzaa))
                    {
                        MessageBox.Show("Inserisci BASE e ALTEZZA validi prima di continuare.");
                    }
                    else
                    {
                        Rettangolo    r     = new Rettangolo(rBase, rAltezzaa);
                        FormRisultato rForm = new FormRisultato(r.ToString(), r.CalcoloArea());
                        rForm.Show();
                    }
                    break;

                case 5:
                    double pLato = G3D.GetDouble(txtLato.Text);
                    if (rbtnPentagono.Checked && txtLato.Text == "" || G3D.IsNegative(pLato))
                    {
                        MessageBox.Show("Inserisci un LATO valido prima di continuare.");
                    }
                    else
                    {
                        Pentagono     p     = new Pentagono(pLato);
                        FormRisultato pForm = new FormRisultato(p.ToString(), p.CalcoloArea());
                        pForm.Show();
                    }
                    break;

                case 6:
                    double esLato = G3D.GetDouble(txtLato.Text);
                    if (rbtnEsagono.Checked && txtLato.Text == "" || G3D.IsNegative(esLato))
                    {
                        MessageBox.Show("Inserisci un LATO valido prima di continuare.");
                    }
                    else
                    {
                        Esagono       es     = new Esagono(esLato);
                        FormRisultato esForm = new FormRisultato(es.ToString(), es.CalcoloArea());
                        esForm.Show();
                    }
                    break;

                default:
                    MessageBox.Show("Errore!");
                    break;
                }
            }
        }