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(); }
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(); }