public void InstancedTexturedTest() { // arrange // source: https://github.com/flywave/go-3dtile/tree/master/data/Textured/instancedTextured.i3dm var i3dmfile = File.OpenRead(@"testfixtures/instancedTextured.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":1,\"POSITION\":{\"byteOffset\":0}} "); Assert.IsTrue(i3dm.FeatureTable.InstancesLength == 1); var stream = new MemoryStream(i3dm.GlbData); try { var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); } catch (SchemaException le) { // we expect schemaexception because no support for gltf1' Assert.IsTrue(le != null); Assert.IsTrue(le.Message == "Unknown version number: 1"); } }
public void InstancedBarrelTest() { // arrange // source: https://github.com/PrincessGod/objTo3d-tiles/blob/master/bin/barrel/output/Instancedbarrel/barrel.i3dm var i3dmfile = File.OpenRead(@"testfixtures/barrel.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.BatchTableJson == "{\"name\":[\"center\",\"right\",\"left\",\"top\",\"bottom\",\"up\",\"right-top\",\"right-bottom\",\"left-top\",\"left-bottom\"],\"id\":[0,1,2,3,4,5,6,7,8,9]} "); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.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}} "); Assert.IsTrue(i3dm.FeatureTable.InstancesLength == 10); Assert.IsTrue(i3dm.Positions[0].Equals(new Vector3(0, 0, 0))); Assert.IsTrue(i3dm.Positions[1].Equals(new Vector3(20, 0, 0))); Assert.IsTrue(i3dm.BatchIdsBytes[0] == 0); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 496); var stream = new MemoryStream(i3dm.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); glb.SaveGLB(@"barrel.glb"); }
public void TreeTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/tree.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 304); Assert.IsTrue(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]} "); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":25,\"EAST_NORTH_UP\":true,\"POSITION\":{\"byteOffset\":0}}"); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 304); Assert.IsTrue(i3dm.Positions[0].Equals(new Vector3(1214947.2f, -4736379f, 4081540.8f))); var stream = new MemoryStream(i3dm.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); Assert.IsTrue(glb.Asset.Version.Major == 2.0); Assert.IsTrue(glb.Asset.Generator == "COLLADA2GLTF"); glb.SaveGLB(@"tree.glb"); }
public void CubeTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/cube.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); // assert Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 16); var expectedFeatureTableBinary = new byte[16]; Assert.IsTrue(i3dm.FeatureTableBinary.SequenceEqual(expectedFeatureTableBinary)); Assert.IsTrue(i3dm.FeatureTableJson == "{\"type\":\"Buffer\",\"data\":[123,34,73,78,83,84,65,78,67,69,83,95,76,69,78,71,84,72,34,58,49,44,34,80,79,83,73,84,73,79,78,34,58,123,34,98,121,116,101,79,102,102,115,101,116,34,58,48,125,125,32,32,32,32,32,32]} "); var stream = new MemoryStream(i3dm.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"); glb.SaveGLB(@"cube.glb"); }
public void TreeBillboardTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/tree_billboard.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 304); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":25,\"EAST_NORTH_UP\":true,\"POSITION\":{\"byteOffset\":0}}"); Assert.IsTrue(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]} "); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 304); var stream = new MemoryStream(i3dm.GlbData); try { var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); //Assert.IsTrue(glb.Asset.Version.Major == 2.0); //Assert.IsTrue(glb.Asset.Generator == "COLLADA2GLTF"); } catch (LinkException le) { // we expect linkexception because SharpGLTF does not support KHR_techniques_webgl' Assert.IsTrue(le != null); Assert.IsTrue(le.Message == "ModelRoot Extensions: KHR_techniques_webgl"); } }
public void GetTileWithRtcCenterTest() { // arrange var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.Model = "box.glb"; instances.Add(instance); var instance1 = new Instance(); instance1.Position = new Wkx.Point(10, 20); instance1.Model = "box.glb"; instances.Add(instance1); // act var tile = TileHandler.GetTile(instances, UseRtcCenter: true); var i3dm = I3dmReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(tile.isI3dm == true); Assert.IsTrue(tile.tile.Length > 0); Assert.IsTrue(i3dm.Positions.Count == 2); Assert.IsTrue(i3dm.Positions[0] == new Vector3(0, 0, 0)); Assert.IsTrue(i3dm.Positions[1] == new Vector3(9, 18, 0)); Assert.IsTrue(i3dm.RtcCenter == new Vector3(1, 2, 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)); }
public void GetTileWithScaleNonUniformTest() { // arrange var scaleNonuniform = new double[3] { 1, 2, 3 }; var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.ScaleNonUniform = scaleNonuniform; instance.Model = "box.glb"; instances.Add(instance); // act var tile = TileHandler.GetTile(instances, UseScaleNonUniform: true); var i3dm = I3dmReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(tile.isI3dm == true); Assert.IsTrue(tile.tile.Length > 0); Assert.IsTrue(i3dm.Positions.Count == 1); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.ScaleNonUniforms[0] == new Vector3((float)scaleNonuniform[0], (float)scaleNonuniform[1], (float)scaleNonuniform[2])); }
public void WriteBarrelI3dmWithBatchIdShortTest() { // arrange var originalFile = @"testfixtures/barrel.i3dm"; var i3dmOriginalfile = File.OpenRead(originalFile); var i3dmOriginal = I3dmReader.Read(i3dmOriginalfile); Assert.IsTrue(i3dmOriginal.I3dmHeader.FeatureTableBinaryByteLength == 496); Assert.IsTrue(i3dmOriginal.FeatureTable.BatchIdOffset.componentType == "UNSIGNED_BYTE"); i3dmOriginal.FeatureTable.BatchIdOffset.componentType = "UNSIGNED_SHORT"; var result = @"barrel_actual_short.i3dm"; I3dmWriter.Write(result, i3dmOriginal); var headerValidateErrors = i3dmOriginal.I3dmHeader.Validate(); Assert.IsTrue(headerValidateErrors.Count == 0); // assert var i3dmActualfile = File.OpenRead(result); var i3dmActualShort = I3dmReader.Read(i3dmActualfile); i3dmActualShort.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 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 result = @"testfixtures/barrel_actual.i3dm"; I3dmWriter.Write(result, i3dmExpected); var i3dmActualStream = File.OpenRead(@"testfixtures/barrel_actual.i3dm"); var i3dmActual = I3dmReader.Read(i3dmActualStream); // Assert.IsTrue(i3dmExpected.Equals(i3dmActual)); 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 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 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); }
public void ReadInstancedRTCTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/instancedRTC.i3dm"); Assert.IsTrue(i3dmfile != null); var i3dm = I3dmReader.Read(i3dmfile); Assert.IsNotNull(i3dm); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":25,\"RTC_CENTER\":[1215013.8340490046,-4736316.75897742,4081608.4380407534],\"EAST_NORTH_UP\":true,\"POSITION\":{\"byteOffset\":0}} "); Assert.IsTrue(i3dm.Positions[0] == new Vector3(-64.70168f, -69.73304f, -61.245365f)); }
public void ReadInvalidI3dmTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/tree_invalid.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); // assert var validationErrors = i3dm.I3dmHeader.Validate(); Assert.IsTrue(validationErrors.Count == 3); }
public void I3dmComparerTests() { var i3dmfile = File.OpenRead(@"testfixtures/tree.i3dm"); var treeI3dm = I3dmReader.Read(i3dmfile); var i3dmAfterfile = File.OpenRead(@"testfixtures/tree.i3dm"); var treeI3dmAfter = I3dmReader.Read(i3dmAfterfile); Assert.IsTrue(treeI3dm.FeatureTableBinary.Length == treeI3dmAfter.FeatureTableBinary.Length); for (var i = 0; i < treeI3dmAfter.FeatureTableBinary.Length; i++) { Assert.IsTrue(treeI3dm.FeatureTableBinary[i] == treeI3dmAfter.FeatureTableBinary[i]); } }
public void GetCompositeTileTest() { // arrange var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.Scale = 1; instance.Model = "box.glb"; instances.Add(instance); var instance2 = new Instance(); instance2.Position = new Wkx.Point(3, 4); instance2.Scale = 1; instance2.Model = "box1.glb"; instances.Add(instance2); var instance3 = new Instance(); instance3.Position = new Wkx.Point(5, 6); instance3.Scale = 1; instance3.Model = "box1.glb"; instances.Add(instance3); // act var tile = TileHandler.GetTile(instances, UseExternalModel: true); Assert.IsTrue(tile.isI3dm == false); var cmpt = CmptReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(cmpt.Tiles.Count == 2); var i3dm0 = I3dmReader.Read(new MemoryStream(cmpt.Tiles[0])); Assert.IsTrue(i3dm0.Positions.Count == 1); Assert.IsTrue(i3dm0.GlbUrl == "box.glb"); Assert.IsTrue(i3dm0.Positions[0] == new Vector3(1, 2, 0)); var i3dm1 = I3dmReader.Read(new MemoryStream(cmpt.Tiles[1])); Assert.IsTrue(i3dm1.Positions.Count == 2); Assert.IsTrue(i3dm1.GlbUrl == "box1.glb"); Assert.IsTrue(i3dm1.Positions[0] == new Vector3(3, 4, 0)); Assert.IsTrue(i3dm1.Positions[1] == new Vector3(5, 6, 0)); }
public void ReadCompositeOfInstancedTest() { // source: https://github.com/CesiumGS/cesium/blob/master/Specs/Data/Cesium3DTiles/Composite/CompositeOfInstanced/ var cmptfile = File.OpenRead(@"testfixtures/compositeOfInstanced.cmpt"); Assert.IsTrue(cmptfile != null); var cmpt = CmptReader.Read(cmptfile); Assert.IsTrue(cmpt != null); Assert.IsTrue(cmpt.CmptHeader.Magic == expectedMagicHeader); Assert.IsTrue(cmpt.CmptHeader.Version == expectedVersionHeader); Assert.IsTrue(cmpt.CmptHeader.TilesLength == 2); var i3dm = I3dmReader.Read(new MemoryStream(cmpt.Tiles.First())); Assert.IsTrue(i3dm.Positions.Count == 25); }
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); } }
public void WriteToBytesTest() { // arrange var i3dm = GetTestI3dm(treeUrlGlb); // act var bytes = I3dmWriter.Write(i3dm); // assert Assert.IsTrue(bytes.Length > 0); // and try to recreate i3dm var stream = new MemoryStream(bytes); var i3dmRound = I3dmReader.Read(stream); // assert again Assert.IsTrue(i3dmRound.Positions.Count == 2); Assert.IsTrue(i3dmRound.GlbUrl == treeUrlGlb); }
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 WriteI3dmWithExternalGltfTest() { // arrange var i3dm = GetTestI3dm(treeUrlGlb); i3dm.RtcCenter = new Vector3(100, 100, 100); // 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.GlbUrl == treeUrlGlb); Assert.IsTrue(i3dmActual.RtcCenter.Equals(i3dm.RtcCenter)); }
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 GetTileTest() { // arrange var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.Scale = 1; instance.Model = "box.glb"; instances.Add(instance); // act var tile = TileHandler.GetTile(instances); var i3dm = I3dmReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(tile.isI3dm == true); Assert.IsTrue(tile.tile.Length > 0); Assert.IsTrue(i3dm.Positions.Count == 1); Assert.IsTrue(i3dm.Positions[0] == new System.Numerics.Vector3(1, 2, 0)); }
public void GetTileWithExternalModelTest() { // arrange var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.Model = "box.glb"; instances.Add(instance); // act var tile = TileHandler.GetTile(instances, UseExternalModel: true); var i3dm = I3dmReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(tile.isI3dm == true); Assert.IsTrue(tile.tile.Length > 0); Assert.IsTrue(i3dm.Positions.Count == 1); Assert.IsTrue(i3dm.GlbUrl == "box.glb"); Assert.IsTrue(i3dm.GlbData == null); }
public void GetTileWithTagsTest() { // arrange var instances = new List <Instance>(); var instance = new Instance(); instance.Position = new Wkx.Point(1, 2); instance.Model = "box.glb"; var tags = JArray.Parse("[{'id':123},{'name': 'test'}]"); instance.Tags = tags; instances.Add(instance); // act var tile = TileHandler.GetTile(instances); var i3dm = I3dmReader.Read(new MemoryStream(tile.tile)); // assert Assert.IsTrue(tile.isI3dm == true); Assert.IsTrue(i3dm.Positions.Count == 1); Assert.IsTrue(i3dm.BatchTableJson == "{\"id\":[\"123\"],\"name\":[\"test\"]} "); }
public void InstancedAnimatedTest() { // arrange var i3dmfile = File.OpenRead(@"testfixtures/instancedAnimated.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":25,\"EAST_NORTH_UP\":true,\"POSITION\":{\"byteOffset\":0}}"); Assert.IsTrue(i3dm.FeatureTable.InstancesLength == 25); var stream = new MemoryStream(i3dm.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); Assert.IsTrue(glb.LogicalAnimations.Count == 1); Assert.IsTrue(glb.LogicalAnimations[0].Name == "Object_0Action"); }
public void InstancedWithBatchTableTest() { // arrange // source: http://vcities.umsl.edu/Cesium1.54/Apps/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/ var i3dmfile = File.OpenRead(@"testfixtures/instancedWithBatchTable.i3dm"); Assert.IsTrue(i3dmfile != null); // act var i3dm = I3dmReader.Read(i3dmfile); Assert.IsTrue(expectedMagicHeader == i3dm.I3dmHeader.Magic); Assert.IsTrue(expectedVersionHeader == i3dm.I3dmHeader.Version); Assert.IsTrue(i3dm.I3dmHeader.GltfFormat == 1); Assert.IsTrue(i3dm.BatchTableJson.Length >= 0); Assert.IsTrue(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]} "); Assert.IsTrue(i3dm.GlbData.Length > 0); Assert.IsTrue(i3dm.FeatureTableJson == "{\"INSTANCES_LENGTH\":25,\"EAST_NORTH_UP\":true,\"POSITION\":{\"byteOffset\":0}}"); Assert.IsTrue(i3dm.FeatureTableBinary.Length == 304); var stream = new MemoryStream(i3dm.GlbData); var glb = SharpGLTF.Schema2.ModelRoot.ReadGLB(stream); glb.SaveGLB(@"instancedwithbatchtable.glb"); }
static void Unpack(UnpackOptions o) { Console.WriteLine($"Action: Unpack"); Console.WriteLine($"Input: {o.Input}"); var f = File.OpenRead(o.Input); var i3dm = I3dmReader.Read(f); Console.WriteLine("i3dm version: " + i3dm.I3dmHeader.Version); var glbfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".glb" : o.Output); var batchfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".batch.csv" : o.Output); var featurefile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".feature.csv" : o.Output); var positionsfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".positions.csv" : o.Output); var normal_upsfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".normal_ups.csv" : o.Output); var normal_rightsfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".normal_rights.csv" : o.Output); var scale_non_uniformsfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".scale_non_uniforms.csv" : o.Output); var scalesfile = (o.Output == string.Empty ? Path.GetFileNameWithoutExtension(o.Input) + ".scales.csv" : o.Output); if (File.Exists(glbfile) && !o.Force) { Console.WriteLine($"File {glbfile} already exists. Specify -f or --force to overwrite existing files."); } else { if (i3dm.I3dmHeader.GltfFormat == 0) { // todo: write to file or something? Console.WriteLine("external glTF uri:" + i3dm.GlbUrl); } else { File.WriteAllBytes(glbfile, i3dm.GlbData); } Console.WriteLine($"Glb created: {glbfile}"); SaveItems(i3dm.Positions, positionsfile); Console.WriteLine($"Positions file created: {positionsfile}"); if (i3dm.NormalUps != null) { SaveItems(i3dm.NormalUps, normal_upsfile); Console.WriteLine($"normalups file created: {normal_upsfile}"); } if (i3dm.NormalRights != null) { SaveItems(i3dm.NormalRights, normal_rightsfile); Console.WriteLine($"normalrights file created: {normal_rightsfile}"); } if (i3dm.ScaleNonUniforms != null) { SaveItems(i3dm.ScaleNonUniforms, scale_non_uniformsfile); Console.WriteLine($"scale_non_uniforms file created: {scale_non_uniformsfile}"); } if (i3dm.Scales != null) { SaveItems(i3dm.Scales, scalesfile);; Console.WriteLine($"scales file created: {scalesfile}"); } if (i3dm.BatchTableJson != String.Empty) { File.WriteAllText(batchfile, i3dm.BatchTableJson); Console.WriteLine($"batch file created: {batchfile}"); } if (i3dm.FeatureTableJson != String.Empty) { File.WriteAllText(featurefile, i3dm.FeatureTableJson); Console.WriteLine($"feature file created: {featurefile}"); } } }