Пример #1
0
        public void WriteB3dmWithBatchTest()
        {
            // arrange
            var buildingGlb    = File.ReadAllBytes(@"testfixtures/with_batch.glb");
            var batchTableJson = File.ReadAllText(@"testfixtures/BatchTableJsonExpected.json");

            var b3dmBytesExpected = File.OpenRead(@"testfixtures/with_batch.b3dm");
            var b3dmExpected      = B3dmReader.ReadB3dm(b3dmBytesExpected);
            var errors            = b3dmExpected.B3dmHeader.Validate();

            Assert.IsTrue(errors.Count > 0);

            var b3dm = new B3dm(buildingGlb);

            b3dm.FeatureTableJson   = b3dmExpected.FeatureTableJson;
            b3dm.BatchTableJson     = b3dmExpected.BatchTableJson;
            b3dm.FeatureTableBinary = b3dmExpected.FeatureTableBinary;
            b3dm.BatchTableBinary   = b3dmExpected.BatchTableBinary;

            // act
            var result = "with_batch.b3dm";
            var bytes  = b3dm.ToBytes();

            File.WriteAllBytes(result, bytes);
            var b3dmActual = B3dmReader.ReadB3dm(File.OpenRead(result));

            // Assert
            var errorsActual = b3dmActual.B3dmHeader.Validate();

            Assert.IsTrue(errorsActual.Count == 0);

            Assert.IsTrue(b3dmActual.B3dmHeader.Magic == b3dmExpected.B3dmHeader.Magic);
            Assert.IsTrue(b3dmActual.B3dmHeader.Version == b3dmExpected.B3dmHeader.Version);
            Assert.IsTrue(b3dmActual.B3dmHeader.FeatureTableJsonByteLength == b3dmExpected.B3dmHeader.FeatureTableJsonByteLength);
        }
Пример #2
0
        public void WriteB3dmWithBatchTest()
        {
            // arrange
            var buildingGlb    = File.ReadAllBytes(@"testfixtures/with_batch.glb");
            var batchTableJson = File.ReadAllText(@"testfixtures/BatchTableJsonExpected.json");

            var b3dmBytesExpected = File.OpenRead(@"testfixtures/with_batch.b3dm");
            var b3dmExpected      = B3dmReader.ReadB3dm(b3dmBytesExpected);

            var b3dm = new B3dm(buildingGlb);

            b3dm.FeatureTableJson   = b3dmExpected.FeatureTableJson;
            b3dm.BatchTableJson     = b3dmExpected.BatchTableJson;
            b3dm.FeatureTableBinary = b3dmExpected.FeatureTableBinary;
            b3dm.BatchTableBinary   = b3dmExpected.BatchTableBinary;

            // act
            var result     = "with_batch.b3dm";
            var newB3dm    = B3dmWriter.WriteB3dm(result, b3dm);
            var b3dmActual = B3dmReader.ReadB3dm(File.OpenRead(newB3dm));

            // Assert
            Assert.IsTrue(b3dmActual.B3dmHeader.Magic == b3dmExpected.B3dmHeader.Magic);
            Assert.IsTrue(b3dmActual.B3dmHeader.Version == b3dmExpected.B3dmHeader.Version);
            Assert.IsTrue(b3dmActual.B3dmHeader.FeatureTableJsonByteLength == b3dmExpected.B3dmHeader.FeatureTableJsonByteLength);
            Assert.IsTrue(b3dmActual.B3dmHeader.BatchTableJsonByteLength == b3dmExpected.B3dmHeader.BatchTableJsonByteLength);
            Assert.IsTrue(b3dmActual.B3dmHeader.ByteLength == b3dmExpected.B3dmHeader.ByteLength);

            var fiResult   = new FileInfo(result);
            var fiExpected = new FileInfo(@"testfixtures/with_batch.b3dm");

            Assert.IsTrue(fiResult.Length == fiExpected.Length);
            Assert.IsTrue(FilesAreEqual(fiResult, fiExpected));
        }
Пример #3
0
        public void ReadFirstCompositeTest()
        {
            // arrange
            // source: https://github.com/CesiumGS/cesium/tree/master/Specs/Data/Cesium3DTiles/Composite/Composite
            var cmptfile = File.OpenRead(@"testfixtures/composite.cmpt");

            Assert.IsTrue(cmptfile != null);

            // act. This cmpt contains a batched model and an instanced model
            var cmpt = CmptReader.Read(cmptfile);

            // assert
            Assert.IsTrue(cmpt != null);
            Assert.IsTrue(cmpt.CmptHeader.Magic == expectedMagicHeader);
            Assert.IsTrue(cmpt.CmptHeader.Version == expectedVersionHeader);
            Assert.IsTrue(cmpt.CmptHeader.ByteLength == 13472); // The length of the entire Composite tile, including this header and each inner tile, in bytes.
            Assert.IsTrue(cmpt.CmptHeader.TilesLength == 2);
            Assert.IsTrue(cmpt.Tiles.Count() == 2);
            Assert.IsTrue(cmpt.Magics.ToArray()[0] == "b3dm");
            Assert.IsTrue(cmpt.Magics.ToArray()[1] == "i3dm");

            var b3dm = B3dmReader.ReadB3dm(new MemoryStream(cmpt.Tiles.ToArray()[0]));

            Assert.IsTrue(b3dm.FeatureTableJson == "{\"BATCH_LENGTH\":10,\"RTC_CENTER\":[1215012.8988049095,-4736313.0423059845,4081604.3368623317]}");
            Assert.IsTrue(b3dm.GlbData != null);


            var i3dm = I3dmReader.Read(new MemoryStream(cmpt.Tiles.ToArray()[1]));

            Assert.IsTrue(i3dm.Positions.Count == 25);
        }
Пример #4
0
        static void Unpack(UnpackOptions o)
        {
            Console.WriteLine($"Action: Unpack");
            Console.WriteLine($"Input: {o.Input}");
            var f    = File.OpenRead(o.Input);
            var b3dm = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm version: " + b3dm.B3dmHeader.Version);

            var glbfile              = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".glb" : o.Output);
            var batchTableJsonFile   = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".batchtable.json" : o.Output);
            var featureTableJsonFile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".featuretable.json" : o.Output);

            if (File.Exists(glbfile) && !o.Force)
            {
                Console.WriteLine($"File {glbfile} already exists. Specify -f or --force to overwrite existing files.");
            }
            else
            {
                File.WriteAllBytes(glbfile, b3dm.GlbData);
                Console.WriteLine($"Glb created: {glbfile}");
                if (b3dm.BatchTableJson != String.Empty)
                {
                    File.WriteAllText(batchTableJsonFile, b3dm.BatchTableJson);
                    Console.WriteLine($"BatchTable json file created: {batchTableJsonFile}");
                }
                if (b3dm.FeatureTableJson != String.Empty)
                {
                    File.WriteAllText(featureTableJsonFile, b3dm.FeatureTableJson);
                    Console.WriteLine($"FeatureTable json file created: {featureTableJsonFile}");
                }
            }
        }
Пример #5
0
        static void Main(string[] args)
        {
            Console.WriteLine("Sample code for unpacking a b3dm to glb and glTF/bin file");
            var inputfile  = @"testfixtures/building.b3dm";
            var outputfile = Path.GetFileNameWithoutExtension(inputfile) + ".glb";
            var f          = File.OpenRead(inputfile);
            var b3dm       = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm version: " + b3dm.B3dmHeader.Version);
            var stream = new MemoryStream(b3dm.GlbData);
            var gltf   = Interface.LoadModel(stream);

            Console.WriteLine("glTF asset generator: " + gltf.Asset.Generator);
            Console.WriteLine("glTF version: " + gltf.Asset.Version);
            var model = gltf.SerializeModel();

            Console.WriteLine("glTF model: " + model);
            var bufferBytes = gltf.Buffers[0].ByteLength;

            Console.WriteLine("Buffer bytes: " + bufferBytes);
            File.WriteAllBytes(outputfile, b3dm.GlbData);
            Interface.Unpack(outputfile, "testfixtures");
            Console.WriteLine("press any key to continue...");
            Console.ReadKey();
        }
Пример #6
0
        static void Info(InfoOptions o)
        {
            Console.WriteLine($"Action: Info");
            Console.WriteLine("b3dm file: " + o.Input);
            var f    = File.OpenRead(o.Input);
            var b3dm = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm header version: " + b3dm.B3dmHeader.Version);
            Console.WriteLine("b3dm header magic: " + b3dm.B3dmHeader.Magic);
            Console.WriteLine("b3dm header bytelength: " + b3dm.B3dmHeader.ByteLength);
            Console.WriteLine("b3dm header featuretablejson length: " + b3dm.B3dmHeader.FeatureTableJsonByteLength);
            Console.WriteLine("b3dm header batchtablejson length: " + b3dm.B3dmHeader.BatchTableJsonByteLength);
            Console.WriteLine("Batch table json: " + b3dm.BatchTableJson);
            Console.WriteLine("Feature table json: " + b3dm.FeatureTableJson);
            var stream = new MemoryStream(b3dm.GlbData);

            try
            {
                var gltf = Interface.LoadModel(stream);
                Console.WriteLine("glTF model is loaded");
                Console.WriteLine("glTF generator: " + gltf.Asset.Generator);
                Console.WriteLine("glTF version:" + gltf.Asset.Version);
                Console.WriteLine("glTF primitives: " + gltf.Meshes[0].Primitives.Length);
                if (gltf.ExtensionsUsed != null)
                {
                    Console.WriteLine("glTF extensions used:" + string.Join(',', gltf.ExtensionsUsed));
                }
                else
                {
                    Console.WriteLine("glTF: no extensions used.");
                }
                if (gltf.ExtensionsRequired != null)
                {
                    Console.WriteLine("glTF extensions required:" + string.Join(',', gltf.ExtensionsRequired));
                }
                else
                {
                    Console.WriteLine("glTF: no extensions required.");
                }

                if (gltf.Meshes[0].Primitives.Length > 0)
                {
                    Console.WriteLine("glTF primitive mode: " + gltf.Meshes[0].Primitives[0].Mode);
                    Console.WriteLine("glTF primitive attributes: " + String.Join(',', gltf.Meshes[0].Primitives[0].Attributes));
                    // gltf.Meshes[0].Primitives[0];
                    // todo: how to get to the vertices?
                }
            }
            catch (InvalidDataException ex)
            {
                Console.WriteLine("glTF version not supported.");
                Console.WriteLine(ex.Message);
            }
            f.Dispose();
        }
Пример #7
0
        public void ReadNederland3DB3dmTest()
        {
            // arrange
            var b3dmfile1 = File.OpenRead(@"testfixtures/nederland3d_6825.b3dm");

            // act
            var b3dm = B3dmReader.ReadB3dm(b3dmfile1);

            // assert
            Assert.IsTrue(expectedMagicHeader == b3dm.B3dmHeader.Magic);
            Assert.IsTrue(expectedVersionHeader == b3dm.B3dmHeader.Version);
        }
Пример #8
0
        public void ReadB3dmWithBatchTest()
        {
            // arrange
            var batchB3dm = File.OpenRead(@"testfixtures/with_batch.b3dm");
            var expectedBatchTableJsonText = File.ReadAllText(@"testfixtures/BatchTableJsonExpected.json");
            var expectedBatchTableJson     = JObject.Parse(expectedBatchTableJsonText);

            // act
            var b3dm = B3dmReader.ReadB3dm(batchB3dm);
            var actualBatchTableJson = JObject.Parse(b3dm.BatchTableJson);

            // assert
            Assert.IsTrue(b3dm.FeatureTableJson == "{\"BATCH_LENGTH\":12} ");
            Assert.AreEqual(expectedBatchTableJson, actualBatchTableJson);
        }
Пример #9
0
        public void ReadB3dmTest()
        {
            // arrange

            // act
            var b3dm   = B3dmReader.ReadB3dm(b3dmfile);
            var stream = new MemoryStream(b3dm.GlbData);
            var gltf   = Interface.LoadModel(stream);

            // assert
            Assert.IsTrue(expectedMagicHeader == b3dm.B3dmHeader.Magic);
            Assert.IsTrue(expectedVersionHeader == b3dm.B3dmHeader.Version);
            Assert.IsTrue(b3dm.BatchTableJson.Length >= 0);
            Assert.IsTrue(b3dm.GlbData.Length > 0);
        }
Пример #10
0
        public void WriteB3dmWithCyrlllicCharacters()
        {
            // arrange
            var buildingGlb    = File.ReadAllBytes(@"testfixtures/1.glb");
            var b3dm           = new B3dm(buildingGlb);
            var batchTableJson = File.ReadAllText(@"testfixtures/BatchTableWithCyrillicCharacters.json");

            b3dm.BatchTableJson   = batchTableJson;
            b3dm.FeatureTableJson = "{\"BATCH_LENGTH\":12} ";

            // act
            var bytes      = b3dm.ToBytes();
            var b3dmActual = B3dmReader.ReadB3dm(new MemoryStream(bytes));

            // Assert
            Assert.IsTrue(b3dmActual.B3dmHeader.Validate().Count == 0);
        }
Пример #11
0
        static void Main(string[] args)
        {
            Console.WriteLine("Sample code for unpacking a b3dm to glb and glTF/bin file");
            var inputfile  = @"testfixtures/662.b3dm";
            var outputfile = Path.GetFileNameWithoutExtension(inputfile) + ".glb";
            var f          = File.OpenRead(inputfile);
            var b3dm       = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm version: " + b3dm.B3dmHeader.Version);
            var stream = new MemoryStream(b3dm.GlbData);
            var gltf   = ModelRoot.ReadGLB(stream, new ReadSettings());

            Console.WriteLine("glTF asset generator: " + gltf.Asset.Generator);
            Console.WriteLine("glTF version: " + gltf.Asset.Version);
            gltf.SaveGLB(outputfile);
            Console.WriteLine("press any key to continue...");
            Console.ReadKey();
        }
Пример #12
0
        public void ReadB3dmTest()
        {
            // arrange

            // act
            var b3dm   = B3dmReader.ReadB3dm(b3dmfile);
            var stream = new MemoryStream(b3dm.GlbData);
            var glb    = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream);

            Assert.IsTrue(glb.Asset.Version.Major == 2.0);
            Assert.IsTrue(glb.Asset.Generator == "SharpGLTF 1.0.0-alpha0009");

            // assert
            Assert.IsTrue(expectedMagicHeader == b3dm.B3dmHeader.Magic);
            Assert.IsTrue(expectedVersionHeader == b3dm.B3dmHeader.Version);
            Assert.IsTrue(b3dm.BatchTableJson.Length >= 0);
            Assert.IsTrue(b3dm.GlbData.Length > 0);
        }
Пример #13
0
        static void Unpack(UnpackOptions o)
        {
            Console.WriteLine($"Action: Unpack");
            Console.WriteLine($"Input: {o.Input}");
            var f    = File.OpenRead(o.Input);
            var b3dm = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm version: " + b3dm.B3dmHeader.Version);
            var stream = new MemoryStream(b3dm.GlbData);

            try {
                var gltf = Interface.LoadModel(stream);
                Console.WriteLine("glTF asset generator: " + gltf.Asset.Generator);
                Console.WriteLine("glTF version: " + gltf.Asset.Version);
                var bufferBytes = gltf.Buffers[0].ByteLength;
                var glbfile     = (o.Output == string.Empty?Path.GetFileNameWithoutExtension(o.Input) + ".glb": o.Output);
                var batchfile   = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".batch" : o.Output);

                if (File.Exists(glbfile) && !o.Force)
                {
                    Console.WriteLine($"File {glbfile} already exists. Specify -f or --force to overwrite existing files.");
                }
                else
                {
                    File.WriteAllBytes(glbfile, b3dm.GlbData);
                    Console.WriteLine($"Glb created: {glbfile}");
                    if (b3dm.BatchTableJson != String.Empty)
                    {
                        var sb = new StringBuilder();
                        sb.Append(b3dm.FeatureTableJson);
                        sb.AppendLine();
                        sb.Append(b3dm.BatchTableJson);
                        File.WriteAllText(batchfile, sb.ToString());
                        Console.WriteLine($"batch file created: {batchfile}");
                    }
                }
            }
            catch (InvalidDataException ex) {
                Console.WriteLine("glTF version not supported.");
                Console.WriteLine(ex.Message);
            }
        }
Пример #14
0
        public void ReadB3dm()
        {
            var stream = File.OpenRead("1311.b3dm");

            B3dmReader.ReadB3dm(stream);
        }
Пример #15
0
        static void Info(InfoOptions o)
        {
            Console.WriteLine($"Action: Info");
            Console.WriteLine("b3dm file: " + o.Input);
            var f    = File.OpenRead(o.Input);
            var b3dm = B3dmReader.ReadB3dm(f);

            Console.WriteLine("b3dm header version: " + b3dm.B3dmHeader.Version);
            Console.WriteLine("b3dm header magic: " + b3dm.B3dmHeader.Magic);
            Console.WriteLine("b3dm header bytelength: " + b3dm.B3dmHeader.ByteLength);
            Console.WriteLine("b3dm header featuretablejson length: " + b3dm.B3dmHeader.FeatureTableJsonByteLength);
            Console.WriteLine("b3dm header batchtablejson length: " + b3dm.B3dmHeader.BatchTableJsonByteLength);
            Console.WriteLine("Feature table json: '" + b3dm.FeatureTableJson + "'");
            Console.WriteLine("Batch table json: '" + b3dm.BatchTableJson + "'");

            var validationErrors = b3dm.B3dmHeader.Validate();

            if (validationErrors.Count > 0)
            {
                Console.WriteLine($"Byte padding rule check: {validationErrors.Count} errors");
                foreach (var error in validationErrors)
                {
                    Console.WriteLine(error);
                }
            }
            else
            {
                Console.WriteLine("Validation check: no errors");
            }

            var stream = new MemoryStream(b3dm.GlbData);

            try
            {
                var glb = ModelRoot.ReadGLB(stream, new ReadSettings());
                Console.WriteLine("glTF model is loaded");
                Console.WriteLine("glTF generator: " + glb.Asset.Generator);
                Console.WriteLine("glTF version:" + glb.Asset.Version);
                Console.WriteLine("glTF primitives: " + glb.LogicalMeshes[0].Primitives.Count);
                var triangles = Toolkit.EvaluateTriangles(glb.DefaultScene).ToList();
                Console.WriteLine("glTF triangles: " + triangles.Count);

                var points = triangles.SelectMany(item => new[] { item.A.GetGeometry().GetPosition(), item.B.GetGeometry().GetPosition(), item.C.GetGeometry().GetPosition() }.Distinct().ToList());
                var xmin   = (from p in points select p.X).Min();
                var xmax   = (from p in points select p.X).Max();
                var ymin   = (from p in points select p.Y).Min();
                var ymax   = (from p in points select p.Y).Max();
                var zmin   = (from p in points select p.Z).Min();
                var zmax   = (from p in points select p.Z).Max();

                Console.WriteLine($"Bounding box vertices (xmin, ymin, zmin, xmax, ymax, zmax): {xmin}, {ymin}, {zmin}, {xmax}, {ymax}, {zmax}");
                foreach (var primitive in glb.LogicalMeshes[0].Primitives)
                {
                    Console.Write($"Primitive {primitive.LogicalIndex} ({primitive.DrawPrimitiveType}) ");

                    if (primitive.GetVertexAccessor("_BATCHID") != null)
                    {
                        var batchIds = primitive.GetVertexAccessor("_BATCHID").AsScalarArray();
                        Console.WriteLine($"batch ids (unique): {string.Join(',',batchIds.Distinct())}");
                    }
                    else
                    {
                        Console.WriteLine($"No _BATCHID attribute found...");
                    }
                }

                if (glb.ExtensionsUsed.Count() > 0)
                {
                    Console.WriteLine("glTF extensions used: " + string.Join(',', glb.ExtensionsUsed));
                }
                else
                {
                    Console.WriteLine("glTF: no extensions used.");
                }
                if (glb.ExtensionsRequired.Count() > 0)
                {
                    Console.WriteLine("glTF extensions required: " + string.Join(',', glb.ExtensionsRequired));
                }
                else
                {
                    Console.WriteLine("glTF: no extensions required.");
                }
            }
            catch (SchemaException ex)
            {
                Console.WriteLine("glTF schema exception");
                Console.WriteLine(ex.Message);
            }
            catch (InvalidDataException ex)
            {
                Console.WriteLine("Invalid data exception");
                Console.WriteLine(ex.Message);
            }
            catch (LinkException ex)
            {
                Console.WriteLine("glTF Link exception");
                Console.WriteLine(ex.Message);
            }
            catch (ArgumentException ex)
            {
                Console.WriteLine(ex.Message);
            }

            f.Dispose();
        }
Пример #16
0
        public void ParseB3dmTileFromStream()
        {
            var stream = File.OpenRead("1311.b3dm");

            B3dmReader.ReadB3dm(stream);
        }