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); }
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)); }
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); }
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}"); } } }
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(); }
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(); }
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); }
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); }
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); }
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); }
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(); }
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); }
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); } }
public void ReadB3dm() { var stream = File.OpenRead("1311.b3dm"); B3dmReader.ReadB3dm(stream); }
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(); }
public void ParseB3dmTileFromStream() { var stream = File.OpenRead("1311.b3dm"); B3dmReader.ReadB3dm(stream); }