public void DeserializeFeatureTableToJsonTest() { // arrange var positions = new List <Vector3>(); positions.Add(new Vector3(0, 0, 0)); positions.Add(new Vector3(1, 1, 1)); var treeGlb = File.ReadAllBytes(@"testfixtures/barrel.glb"); var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); i3dm.Positions = positions; // act var featureTableJson = i3dm.GetFeatureTableJson(); var serializeOptions = new JsonSerializerOptions() { IgnoreNullValues = true }; serializeOptions.Converters.Add(new Vector3Converter()); var featureTable = JsonSerializer.Deserialize <FeatureTable>(featureTableJson, serializeOptions); // assert Assert.IsTrue(featureTable.InstancesLength == 2); Assert.IsTrue(featureTable.IsEastNorthUp == true); Assert.IsTrue(featureTable.PositionOffset.offset == 0); }
public void WriteI3dmWithRtcCenterTest() { var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); i3dm.RtcCenter = new Vector3(100, 100, 100); var i3dmBytes = I3dmWriter.Write(i3dm); var ms = new MemoryStream(i3dmBytes); var headerValidateErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); var i3dmActual = I3dmReader.Read(ms); Assert.IsTrue(i3dmActual.RtcCenter.Equals(i3dm.RtcCenter)); }
private static void WriteToStream(I3dm i3dm, Stream stream) { var binaryWriter = new BinaryWriter(stream); binaryWriter.Write(i3dm.I3dmHeader.AsBinary()); binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.FeatureTableJson)); if (i3dm.FeatureTableBinary != null) { binaryWriter.Write(i3dm.FeatureTableBinary); } binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.BatchTableJson)); if (i3dm.BatchTableBinary != null) { binaryWriter.Write(i3dm.BatchTableBinary); } if (i3dm.I3dmHeader.GltfFormat == 0) { binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.GlbUrl)); } else { binaryWriter.Write(i3dm.GlbData); } binaryWriter.Flush(); binaryWriter.Close(); }
public void TestRotations() { var seatGlb = File.ReadAllBytes(@"testfixtures/stoel000.glb"); var positions = new List <Vector3>(); positions.Add(new Vector3(1214947.2f, -4736379f, 4081540.8f)); var i3dm = new I3dm.Tile.I3dm(positions, seatGlb); i3dm.FeatureTable.IsEastNorthUp = true; var rotationsUp = new List <Vector3>(); var rotationsRight = new List <Vector3>(); rotationsUp.Add(new Vector3(0.9686397001928082f, 0.24846957803801f, 0)); rotationsRight.Add(new Vector3(0.1598520208967612f, -0.6231709121869502f, -0.765575173068789f)); i3dm.NormalUps = rotationsUp; i3dm.NormalRights = rotationsRight; // act var bytes = I3dmWriter.Write(i3dm); // assert Assert.IsTrue(bytes.Length > 0); }
public void FirstCmptWriterTest() { // arrange var treeUrlGlb = "https://bertt.github.io/mapbox_3dtiles_samples/samples/instanced/trees_external_gltf/tree.glb"; var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var i3dm = new I3dm.Tile.I3dm(positions, treeUrlGlb); i3dm.RtcCenter = new Vector3(100, 100, 100); var tileBytes = I3dmWriter.Write(i3dm); var tiles = new List <byte[]>(); tiles.Add(tileBytes); // act var cmptBytes = CmptWriter.Write(tiles); // assert Assert.IsTrue(cmptBytes.Length > 0); }
public void WriteI3dmHelloWorld() { var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var batchIds = new List <int>() { 9, 11 }; var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); var result = @"tree_basic.i3dm"; i3dm.BatchIds = batchIds; I3dmWriter.Write(result, i3dm); var headerValidateErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); var i3dmActualfile = File.OpenRead(result); var i3dmActual = I3dmReader.Read(i3dmActualfile); Assert.IsTrue(i3dmActual.Positions.Count == 2); Assert.IsTrue(i3dmActual.Positions[0].Equals(pos1)); Assert.IsTrue(i3dmActual.Positions[1].Equals(pos2)); Assert.IsTrue(i3dmActual.BatchIds.Count == 2); Assert.IsTrue(i3dmActual.BatchIds[0] == 9); Assert.IsTrue(i3dmActual.BatchIds[1] == 11); Assert.IsTrue(i3dmActual.FeatureTable.BatchIdOffset.componentType == "UNSIGNED_SHORT"); }
public void WriteI3dmWithRtcCenterTest() { var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); i3dm.RtcCenter = new Vector3(100, 100, 100); var result = @"tree_invalid.i3dm"; I3dmWriter.Write(result, i3dm); var headerValidateErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); var i3dmActualfile = File.OpenRead(result); var i3dmActual = I3dmReader.Read(i3dmActualfile); Assert.IsTrue(i3dmActual.RtcCenter.Equals(i3dm.RtcCenter)); }
public static byte[] Write(I3dm i3dm, string batchIdSerializeType = "UNSIGNED_SHORT") { UpdateProperties(i3dm, batchIdSerializeType); var stream = new MemoryStream(); WriteToStream(i3dm, stream); return(stream.ToArray()); }
public static string Write(string path, I3dm i3dm) { i3dm.FeatureTableJson = i3dm.GetFeatureTableJson(); var featureTableBinary = new List <byte>(); featureTableBinary.AddRange(i3dm.Positions.ToBytes()); if (i3dm.NormalUps != null) { featureTableBinary.AddRange(i3dm.NormalUps.ToBytes()); } if (i3dm.NormalRights != null) { featureTableBinary.AddRange(i3dm.NormalRights.ToBytes()); } if (i3dm.ScaleNonUniforms != null) { featureTableBinary.AddRange(i3dm.ScaleNonUniforms.ToBytes()); } if (i3dm.BatchIdsBytes != null) { featureTableBinary.AddRange(i3dm.BatchIdsBytes.ToArray()); } i3dm.FeatureTableBinary = featureTableBinary.ToArray(); var header_length = 28; i3dm.I3dmHeader.ByteLength = i3dm.GlbData.Length + header_length + i3dm.FeatureTableJson.Length + i3dm.BatchTableJson.Length + i3dm.BatchTableBinary.Length + i3dm.FeatureTableBinary.Length; i3dm.I3dmHeader.FeatureTableJsonByteLength = i3dm.FeatureTableJson.Length; i3dm.I3dmHeader.BatchTableJsonByteLength = i3dm.BatchTableJson.Length; i3dm.I3dmHeader.FeatureTableBinaryByteLength = i3dm.FeatureTableBinary.Length; i3dm.I3dmHeader.BatchTableBinaryByteLength = i3dm.BatchTableBinary.Length; var fileStream = File.Open(path, FileMode.Create); var binaryWriter = new BinaryWriter(fileStream); binaryWriter.Write(i3dm.I3dmHeader.AsBinary()); binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.FeatureTableJson)); if (i3dm.FeatureTableBinary != null) { binaryWriter.Write(i3dm.FeatureTableBinary); } binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.BatchTableJson)); if (i3dm.BatchTableBinary != null) { binaryWriter.Write(i3dm.BatchTableBinary); } binaryWriter.Write(i3dm.GlbData); binaryWriter.Flush(); binaryWriter.Close(); return(fileStream.Name); }
public static I3dm Read(Stream stream) { using (var reader = new BinaryReader(stream)) { var i3dmHeader = new I3dmHeader(reader); var featureTableJson = Encoding.UTF8.GetString(reader.ReadBytes(i3dmHeader.FeatureTableJsonByteLength)); var featureTableBytes = reader.ReadBytes(i3dmHeader.FeatureTableBinaryByteLength); var batchTableJson = Encoding.UTF8.GetString(reader.ReadBytes(i3dmHeader.BatchTableJsonByteLength)); var batchTableBytes = reader.ReadBytes(i3dmHeader.BatchTableBinaryByteLength); var glbLength = (int)(reader.BaseStream.Length - reader.BaseStream.Position); var glbBuffer = reader.ReadBytes(glbLength); var featureTable = JsonSerializer.Deserialize <FeatureTable>(featureTableJson); var positions = GetVector3Collection(featureTable.InstancesLength, featureTable.PositionOffset.offset, featureTableBytes); var i3dm = new I3dm(positions, glbBuffer) { I3dmHeader = i3dmHeader, GlbData = glbBuffer, FeatureTableJson = featureTableJson, FeatureTableBinary = featureTableBytes, BatchTableJson = batchTableJson, BatchTableBinary = batchTableBytes, FeatureTable = featureTable }; if (featureTable.NormalUpOffset != null) { i3dm.NormalUps = GetVector3Collection(featureTable.InstancesLength, featureTable.NormalUpOffset.offset, featureTableBytes); } if (featureTable.NormalRightOffset != null) { i3dm.NormalRights = GetVector3Collection(featureTable.InstancesLength, featureTable.NormalRightOffset.offset, featureTableBytes); } if (featureTable.ScaleNonUniformOffset != null) { i3dm.ScaleNonUniforms = GetVector3Collection(featureTable.InstancesLength, featureTable.ScaleNonUniformOffset.offset, featureTableBytes); } if (featureTable.BatchIdOffset != null) { i3dm.BatchIds = GetBatchIdCollection(featureTable.InstancesLength, featureTable.BatchIdOffset.offset, featureTableBytes, featureTable.BatchIdOffset.componentType); } if (featureTable.ScaleOffset != null) { i3dm.Scales = GetFloatCollection(featureTable.InstancesLength, featureTable.ScaleOffset.offset, featureTableBytes); } if (featureTable.RtcCenterOffset != null) { i3dm.RtcCenter = GetVector3(featureTable.RtcCenterOffset.offset, featureTableBytes); } return(i3dm); } }
private static I3dm.Tile.I3dm GetTestI3dm(string treeUrlGlb) { var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var i3dm = new I3dm.Tile.I3dm(positions, treeUrlGlb); return(i3dm); }
public static I3dm Read(Stream stream) { using (var reader = new BinaryReader(stream)) { var i3dmHeader = new I3dmHeader(reader); var featureTableJson = Encoding.UTF8.GetString(reader.ReadBytes(i3dmHeader.FeatureTableJsonByteLength)); var featureTableBytes = reader.ReadBytes(i3dmHeader.FeatureTableBinaryByteLength); var batchTableJson = Encoding.UTF8.GetString(reader.ReadBytes(i3dmHeader.BatchTableJsonByteLength)); var batchTableBytes = reader.ReadBytes(i3dmHeader.BatchTableBinaryByteLength); var glbLength = (int)(reader.BaseStream.Length - reader.BaseStream.Position); var glbBuffer = reader.ReadBytes(glbLength); var featureTable = JsonSerializer.Deserialize <FeatureTable>(featureTableJson); // todo: batch table ids'... complexity it can be any format like 'UNSIGNED_BYTE' or others var i3dm = new I3dm { I3dmHeader = i3dmHeader, GlbData = glbBuffer, FeatureTableJson = featureTableJson, FeatureTableBinary = featureTableBytes, BatchTableJson = batchTableJson, BatchTableBinary = batchTableBytes, FeatureTable = featureTable }; if (featureTable.PositionOffset != null) { i3dm.Positions = GetVector3Collection(featureTable.InstancesLength, featureTable.PositionOffset.byteOffset, featureTableBytes); } ; if (featureTable.NormalUpOffset != null) { i3dm.NormalUps = GetVector3Collection(featureTable.InstancesLength, featureTable.NormalUpOffset.byteOffset, featureTableBytes); } if (featureTable.NormalRightOffset != null) { i3dm.NormalRights = GetVector3Collection(featureTable.InstancesLength, featureTable.NormalRightOffset.byteOffset, featureTableBytes); } if (featureTable.ScaleNonUniformOffset != null) { i3dm.ScaleNonUniforms = GetVector3Collection(featureTable.InstancesLength, featureTable.ScaleNonUniformOffset.byteOffset, featureTableBytes); } if (featureTable.BatchIdOffset != null) { // todo: uint8 is handled here (As byte), add uint16(default - as System.UInt16 ) and uint32 (as System.UInt32) i3dm.BatchIdsBytes = GetBatchIdCollection(featureTable.InstancesLength, featureTable.BatchIdOffset.byteOffset, featureTableBytes); } return(i3dm); } }
public void Setup() { GlbModel = File.ReadAllBytes(@"barrel.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; i3dm = new I3dm.Tile.I3dm(positions, GlbModel); i3dm.RtcCenter = new Vector3(100, 100, 100); }
public void WriteI3dmHelloWorldWithBatchIdType() { var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var batchIds = new List <int>() { 9, 11 }; var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); var types = new List <string> { "UNSIGNED_BYTE", "UNSIGNED_SHORT", "UNSIGNED_INT" }; // write i3dm with every type for batch_id foreach (var type in types) { var result = $"tree_batchid_{type}.i3dm"; i3dm.BatchIds = batchIds; I3dmWriter.Write(result, i3dm, type); var headerValidateErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); var i3dmActualfile = File.OpenRead(result); var i3dmActual = I3dmReader.Read(i3dmActualfile); Assert.IsTrue(i3dmActual.Positions.Count == 2); Assert.IsTrue(i3dmActual.Positions[0].Equals(pos1)); Assert.IsTrue(i3dmActual.Positions[1].Equals(pos2)); Assert.IsTrue(i3dmActual.BatchIds.Count == 2); Assert.IsTrue(i3dmActual.BatchIds[0] == 9); Assert.IsTrue(i3dmActual.BatchIds[1] == 11); Assert.IsTrue(i3dmActual.FeatureTable.BatchIdOffset.componentType == type); var stream = new MemoryStream(i3dmActual.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); Assert.IsTrue(glb.Asset.Version.Major == 2.0); } }
private void exportTiles(List <I3dmTileInfo> tiles) { foreach (var tile in tiles) { var i3dm = new I3dm.Tile.I3dm(tile.Positions, tile.File); if (!string.IsNullOrEmpty(tile.BatchTableJson)) { i3dm.BatchTableJson = tile.BatchTableJson; } if (!string.IsNullOrEmpty(tile.FeatureTableJson)) { i3dm.FeatureTableJson = tile.FeatureTableJson; } if (tile.NormalsUp != null) { i3dm.NormalUps = tile.NormalsUp; } if (tile.NormalsRight != null) { i3dm.NormalRights = tile.NormalsRight; } if (tile.ScaleNonUniforms != null) { i3dm.ScaleNonUniforms = tile.ScaleNonUniforms; } if (tile.Scales != null) { i3dm.Scales = tile.Scales; } var file = (Output == string.Empty ? tile.TileName : Path.Combine(Path.GetDirectoryName(Output), tile.TileName)); if (File.Exists(file) && !Force) { Console.WriteLine($"File {file} already exists. Specify -f or --force to overwrite existing files."); } else { I3dmWriter.Write(file, i3dm); Console.WriteLine("I3dm created " + file); } } }
public void WriteTreeBasicI3dmTest() { // arrange var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var mapbox_positions = new List <Vector3>(); mapbox_positions.Add(new Vector3(-8407346.9596f, 4743739.3031f, 38.29f)); mapbox_positions.Add(new Vector3(-8406181.2949f, 4744924.0771f, 38.29f)); var i3dm = new I3dm.Tile.I3dm(mapbox_positions, treeGlb); i3dm.BatchTableJson = "{\"Height\":[100,101]}"; i3dm.FeatureTable.IsEastNorthUp = true; var result = @"tree.i3dm"; // act I3dmWriter.Write(result, i3dm); }
public void DeserializeFeatureTableToJsonTest() { // arrange var i3dm = new I3dm.Tile.I3dm(); var positions = new List <Vector3>(); positions.Add(new Vector3(0, 0, 0)); positions.Add(new Vector3(1, 1, 1)); i3dm.Positions = positions; // act var featureTableJson = i3dm.GetFeatureTableJson(); var featureTable = JsonSerializer.Deserialize <FeatureTable>(featureTableJson); // assert Assert.IsTrue(featureTable.InstancesLength == 2); Assert.IsTrue(featureTable.IsEastNorthUp == false); Assert.IsTrue(featureTable.PositionOffset.byteOffset == 0); }
public void WriteI3dmHelloWorldWithScales() { // arrange var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var scales = new List <float> { 2, 3 }; var batchIds = new List <int>() { 9, 11 }; var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); i3dm.BatchIds = batchIds; i3dm.Scales = scales; // act var bytes = I3dmWriter.Write(i3dm); // assert var headerValidateErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); var i3dmActual = I3dmReader.Read(new MemoryStream(bytes)); Assert.IsTrue(i3dmActual.Positions.Count == 2); Assert.IsTrue(i3dmActual.Positions[0].Equals(pos1)); Assert.IsTrue(i3dmActual.Positions[1].Equals(pos2)); Assert.IsTrue(i3dmActual.BatchIds.Count == 2); Assert.IsTrue(i3dmActual.BatchIds[0] == 9); Assert.IsTrue(i3dmActual.BatchIds[1] == 11); Assert.IsTrue(i3dmActual.FeatureTable.BatchIdOffset.componentType == "UNSIGNED_SHORT"); Assert.IsTrue(i3dmActual.Scales[0] == 2); Assert.IsTrue(i3dmActual.Scales[1] == 3); }
public void WriteTreeI3dmTest() { // arrange var i3dmExpectedfile = File.OpenRead(@"testfixtures/tree.i3dm"); var i3dmExpected = I3dmReader.Read(i3dmExpectedfile); var positions = i3dmExpected.Positions; Assert.IsTrue(positions.Count == 25); var treeGlb = File.ReadAllBytes(@"testfixtures/tree.glb"); var i3dm = new I3dm.Tile.I3dm(positions, treeGlb); i3dm.FeatureTable.IsEastNorthUp = true; i3dm.BatchTableJson = @"{""Height"":[20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20]} "; // act var result = @"testfixtures/tree_actual.i3dm"; I3dmWriter.Write(result, i3dm); var i3dmActualStream = File.OpenRead(@"testfixtures/tree_actual.i3dm"); var i3dmActual = I3dmReader.Read(i3dmActualStream); // Assert Assert.IsTrue(i3dmActual.I3dmHeader.Version == 1); Assert.IsTrue(i3dmActual.I3dmHeader.Magic == "i3dm"); Assert.IsTrue(i3dmActual.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dmActual.I3dmHeader.BatchTableJsonByteLength == 88); Assert.IsTrue(i3dmActual.I3dmHeader.FeatureTableJsonByteLength == 72); // Assert.IsTrue(i3dmActual.I3dmHeader.FeatureTableBinaryByteLength == 25 * 4 * 3); // note: is 304 in original file? Assert.IsTrue(i3dmActual.I3dmHeader.ByteLength == 282064); // Note is: 282072 originally) Assert.IsTrue(i3dmActual.I3dmHeader.BatchTableBinaryByteLength == 0); Assert.IsTrue(i3dmActual.Positions.Count == 25); Assert.IsTrue(i3dmActual.FeatureTable.IsEastNorthUp == true); Assert.IsTrue(i3dmActual.Positions[0].Equals(new Vector3(1214947.2f, -4736379f, 4081540.8f))); var stream = new MemoryStream(i3dmActual.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); Assert.IsTrue(glb.Asset.Version.Major == 2.0); Assert.IsTrue(glb.Asset.Generator == "COLLADA2GLTF"); }
public void WriteBarrelI3dmTest() { // arrange var i3dmExpectedfile = File.OpenRead(@"testfixtures/barrel.i3dm"); var i3dmExpected = I3dmReader.Read(i3dmExpectedfile); var positions = i3dmExpected.Positions; Assert.IsTrue(positions.Count == 10); Assert.IsTrue(i3dmExpected.FeatureTableJson == "{\"INSTANCES_LENGTH\":10,\"POSITION\":{\"byteOffset\":0},\"BATCH_ID\":{\"byteOffset\":120,\"componentType\":\"UNSIGNED_BYTE\"},\"NORMAL_UP\":{\"byteOffset\":132},\"NORMAL_RIGHT\":{\"byteOffset\":252},\"SCALE_NON_UNIFORM\":{\"byteOffset\":372}} "); var barrelGlb = File.ReadAllBytes(@"testfixtures/barrel.glb"); var i3dm = new I3dm.Tile.I3dm(positions, barrelGlb); i3dm.NormalUps = i3dmExpected.NormalUps; i3dm.NormalRights = i3dmExpected.NormalRights; i3dm.ScaleNonUniforms = i3dmExpected.ScaleNonUniforms; i3dm.BatchIdsBytes = i3dmExpected.BatchIdsBytes; i3dm.BatchTableJson = @"{""Height"":[20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20]} "; var result = @"testfixtures/barrel_actual.i3dm"; I3dmWriter.Write(result, i3dm); var i3dmActualStream = File.OpenRead(@"testfixtures/barrel_actual.i3dm"); var i3dmActual = I3dmReader.Read(i3dmActualStream); Assert.IsTrue(i3dmActual.I3dmHeader.Version == 1); Assert.IsTrue(i3dmActual.I3dmHeader.Magic == "i3dm"); Assert.IsTrue(i3dmActual.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dmActual.I3dmHeader.BatchTableJsonByteLength == 88); Assert.IsTrue(i3dmActual.I3dmHeader.FeatureTableBinaryByteLength == 10 * 4 * 3 * 4 + 10); // note: is 304 in original file? Assert.IsTrue(i3dmActual.I3dmHeader.BatchTableBinaryByteLength == 0); Assert.IsTrue(i3dmActual.Positions.Count == 10); Assert.IsTrue(i3dmActual.FeatureTable.IsEastNorthUp == false); Assert.IsTrue(i3dmActual.Positions[0].Equals(i3dmExpected.Positions[0])); var stream = new MemoryStream(i3dmActual.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); Assert.IsTrue(glb.Asset.Version.Major == 2.0); Assert.IsTrue(glb.Asset.Generator == "obj2gltf"); }
public void MultipleInnertilesCmptWriterTest() { // arrange var treeUrlGlb = "https://bertt.github.io/mapbox_3dtiles_samples/samples/instanced/trees_external_gltf/tree.glb"; var pos1 = new Vector3(100, 101, 102); var pos2 = new Vector3(200, 201, 202); var positions = new List <Vector3>() { pos1, pos2 }; var i3dm = new I3dm.Tile.I3dm(positions, treeUrlGlb); i3dm.RtcCenter = new Vector3(100, 100, 100); var i3dm1 = new I3dm.Tile.I3dm(positions, treeUrlGlb); i3dm1.RtcCenter = new Vector3(200, 200, 200); var i3dmBytes = I3dmWriter.Write(i3dm); File.WriteAllBytes(@"d:\aaa\i3dmvalid.i3dm", i3dmBytes); var i3dm1Bytes = I3dmWriter.Write(i3dm1); var tiles = new List <byte[]>(); tiles.Add(i3dmBytes); tiles.Add(i3dm1Bytes); // act var cmptBytes = CmptWriter.Write(tiles); // assert Assert.IsTrue(cmptBytes.Length > 0); var ms = new MemoryStream(cmptBytes); var cmpt = CmptReader.Read(ms); Assert.IsTrue(cmpt.Tiles.Count() == 2); }
public void TestArgumentExceptionWhenNot8byteAligned() { // arrange var treeUrlGlb = "https://mymodels/tree.glb"; var pos1 = new Vector3(100, 101, 102); var positions = new List <Vector3>() { pos1 }; var i3dm = new I3dm.Tile.I3dm(positions, treeUrlGlb); var tiles = new List <byte[]>(); var tileBytes = I3dmWriter.Write(i3dm); // act // make i3dm tile not 8 byte aligned var wrongTile = tileBytes.SkipLast(1).ToArray(); tiles.Add(wrongTile); // assert, should throw argumentexception Assert.Throws <ArgumentException>(() => CmptWriter.Write(tiles)); }
private static I3dm.Tile.I3dm GetI3dm(string model, List <Vector3> positions, List <float> scales, List <Vector3> scalesNonUniform, List <Vector3> normalUps, List <Vector3> normalRights, List <JArray> tags, Point firstPosition, bool UseExternalModel = false, bool UseRtcCenter = false, bool UseScaleNonUniform = false) { I3dm.Tile.I3dm i3dm; if (!UseExternalModel) { var glbBytes = File.ReadAllBytes(model); i3dm = new I3dm.Tile.I3dm(positions, glbBytes); } else { i3dm = new I3dm.Tile.I3dm(positions, model); } if (!UseScaleNonUniform) { i3dm.Scales = scales; } else { i3dm.ScaleNonUniforms = scalesNonUniform; } i3dm.NormalUps = normalUps; i3dm.NormalRights = normalRights; if (UseRtcCenter) { i3dm.RtcCenter = new Vector3((float)firstPosition.X, (float)firstPosition.Y, (float)firstPosition.Z.GetValueOrDefault()); } if (tags[0] != null) { var properties = TinyJson.GetProperties(tags[0]); i3dm.BatchTableJson = TinyJson.ToJson(tags, properties); } return(i3dm); }
static void Main(string[] args) { Parser.Default.ParseArguments <Options>(args).WithParsed(o => { string tileFolder = "tiles"; string geom_column = "geom"; Console.WriteLine($"Exporting i3dm's from {o.Table}..."); SqlMapper.AddTypeHandler(new GeometryTypeHandler()); var glbBytes = File.ReadAllBytes(o.Model); var tilefolder = $"{o.Output}{Path.DirectorySeparatorChar}{tileFolder}"; if (!Directory.Exists(tilefolder)) { Directory.CreateDirectory(tilefolder); } var conn = new NpgsqlConnection(o.ConnectionString); var rootBounds = BoundingBoxRepository.GetBoundingBox3DForTable(conn, o.Table, geom_column); var tiles = new List <TileInfo>(); var xrange = (int)Math.Ceiling(rootBounds.ExtentX() / o.ExtentTile); var yrange = (int)Math.Ceiling(rootBounds.ExtentY() / o.ExtentTile); var totalTicks = xrange * yrange; var options = new ProgressBarOptions { ProgressCharacter = '-', ProgressBarOnBottom = true }; var pbar = new ProgressBar(totalTicks, "Exporting i3dm tiles...", options); for (var x = 0; x < xrange; x++) { for (var y = 0; y < yrange; y++) { var from = new Point(rootBounds.XMin + o.ExtentTile * x, rootBounds.YMin + o.ExtentTile * y); var to = new Point(rootBounds.XMin + o.ExtentTile * (x + 1), rootBounds.YMin + o.ExtentTile * (y + 1)); var instances = BoundingBoxRepository.GetTileInstances(conn, o.Table, from, to); if (instances.Count > 0) { // todo: handle rotations + scale + other instance properties var positions = new List <Vector3>(); foreach (var instance in instances) { var p = (Point)instance.Position; positions.Add(new Vector3((float)p.X, (float)p.Y, (float)p.Z)); } var i3dm = new I3dm.Tile.I3dm(positions, glbBytes); var i3dmFile = $"{o.Output}{Path.DirectorySeparatorChar}{tileFolder}{Path.DirectorySeparatorChar}tile_{x}_{y}.i3dm"; I3dmWriter.Write(i3dmFile, i3dm); tiles.Add(new TileInfo { Filename = $"{tileFolder}/tile_{x}_{y}.i3dm", Bounds = new BoundingBox3D((float)from.X, (float)from.Y, 0, (float)to.X, (float)to.Y, 0) }); } pbar.Tick(); } } Console.WriteLine(); Console.WriteLine("Writing tileset.json..."); WriteJson(o.Output, rootBounds, tiles, o.GeometricErrors); Console.WriteLine("\nExport finished!"); }); }
public static string Write(string path, I3dm i3dm, string batchIdSerializeType = "UNSIGNED_SHORT") { var batchIdBytes = new byte[0]; if (i3dm.BatchIds != null) { batchIdBytes = GetBatchIdsBytes(i3dm.BatchIds, batchIdSerializeType); } i3dm.FeatureTableJson = BufferPadding.AddPadding(i3dm.GetFeatureTableJson(batchIdSerializeType, batchIdBytes.Length)); var featureTableBinary = new List <byte>(); featureTableBinary.AddRange(i3dm.Positions.ToBytes()); if (i3dm.NormalUps != null) { featureTableBinary.AddRange(i3dm.NormalUps.ToBytes()); } if (i3dm.NormalRights != null) { featureTableBinary.AddRange(i3dm.NormalRights.ToBytes()); } if (i3dm.ScaleNonUniforms != null) { featureTableBinary.AddRange(i3dm.ScaleNonUniforms.ToBytes()); } if (i3dm.Scales != null) { featureTableBinary.AddRange(i3dm.Scales.ToBytes()); } if (i3dm.BatchIds != null) { featureTableBinary.AddRange(batchIdBytes); } if (!i3dm.RtcCenter.Equals(Vector3.Zero)) { featureTableBinary.AddRange(i3dm.RtcCenter.ToBytes()); } if (i3dm.BatchTableJson != string.Empty) { i3dm.BatchTableJson = BufferPadding.AddPadding(i3dm.BatchTableJson); } if (i3dm.BatchTableBinary != null) { i3dm.BatchTableBinary = BufferPadding.AddPadding(i3dm.BatchTableBinary); } i3dm.FeatureTableBinary = BufferPadding.AddPadding(featureTableBinary.ToArray()); var header_length = 28; i3dm.I3dmHeader.ByteLength = i3dm.GlbData.Length + header_length + i3dm.FeatureTableJson.Length + i3dm.BatchTableJson.Length + i3dm.BatchTableBinary.Length + i3dm.FeatureTableBinary.Length + BitConverter.GetBytes(i3dm.I3dmHeader.GltfFormat).Length; i3dm.I3dmHeader.FeatureTableJsonByteLength = i3dm.FeatureTableJson.Length; i3dm.I3dmHeader.BatchTableJsonByteLength = i3dm.BatchTableJson.Length; i3dm.I3dmHeader.FeatureTableBinaryByteLength = i3dm.FeatureTableBinary.Length; i3dm.I3dmHeader.BatchTableBinaryByteLength = i3dm.BatchTableBinary.Length; var fileStream = File.Open(path, FileMode.Create); var binaryWriter = new BinaryWriter(fileStream); binaryWriter.Write(i3dm.I3dmHeader.AsBinary()); binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.FeatureTableJson)); if (i3dm.FeatureTableBinary != null) { binaryWriter.Write(i3dm.FeatureTableBinary); } binaryWriter.Write(Encoding.UTF8.GetBytes(i3dm.BatchTableJson)); if (i3dm.BatchTableBinary != null) { binaryWriter.Write(i3dm.BatchTableBinary); } binaryWriter.Write(i3dm.GlbData); binaryWriter.Flush(); binaryWriter.Close(); return(fileStream.Name); }
private static void UpdateProperties(I3dm i3dm, string batchIdSerializeType) { var batchIdBytes = new byte[0]; if (i3dm.BatchIds != null) { batchIdBytes = GetBatchIdsBytes(i3dm.BatchIds, batchIdSerializeType); } i3dm.FeatureTableJson = BufferPadding.AddPadding(i3dm.GetFeatureTableJson(batchIdSerializeType, batchIdBytes.Length)); var featureTableBinary = new List <byte>(); featureTableBinary.AddRange(i3dm.Positions.ToBytes()); if (i3dm.NormalUps != null) { featureTableBinary.AddRange(i3dm.NormalUps.ToBytes()); } if (i3dm.NormalRights != null) { featureTableBinary.AddRange(i3dm.NormalRights.ToBytes()); } if (i3dm.ScaleNonUniforms != null) { featureTableBinary.AddRange(i3dm.ScaleNonUniforms.ToBytes()); } if (i3dm.Scales != null) { featureTableBinary.AddRange(i3dm.Scales.ToBytes()); } if (i3dm.BatchIds != null) { featureTableBinary.AddRange(batchIdBytes); } if (i3dm.RtcCenter != null) { featureTableBinary.AddRange(((Vector3)i3dm.RtcCenter).ToBytes()); } if (i3dm.BatchTableJson != string.Empty) { i3dm.BatchTableJson = BufferPadding.AddPadding(i3dm.BatchTableJson); } if (i3dm.BatchTableBinary != null) { i3dm.BatchTableBinary = BufferPadding.AddPadding(i3dm.BatchTableBinary); } i3dm.FeatureTableBinary = BufferPadding.AddPadding(featureTableBinary.ToArray()); var header_length = 28; var glbLength = i3dm.I3dmHeader.GltfFormat == 0 ? i3dm.GlbUrl.Length : i3dm.GlbData.Length; i3dm.I3dmHeader.ByteLength = glbLength + header_length + i3dm.FeatureTableJson.Length + i3dm.BatchTableJson.Length + i3dm.BatchTableBinary.Length + i3dm.FeatureTableBinary.Length + BitConverter.GetBytes(i3dm.I3dmHeader.GltfFormat).Length; i3dm.I3dmHeader.FeatureTableJsonByteLength = i3dm.FeatureTableJson.Length; i3dm.I3dmHeader.BatchTableJsonByteLength = i3dm.BatchTableJson.Length; i3dm.I3dmHeader.FeatureTableBinaryByteLength = i3dm.FeatureTableBinary.Length; i3dm.I3dmHeader.BatchTableBinaryByteLength = i3dm.BatchTableBinary.Length; }