Example #1
0
        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");
            }
        }
Example #2
0
        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");
        }
Example #3
0
        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");
        }
Example #4
0
        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");
        }
Example #5
0
        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");
            }
        }
Example #6
0
        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));
        }
Example #7
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));
        }
Example #8
0
        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]));
        }
Example #9
0
        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";
        }
Example #10
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 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));
        }
Example #11
0
        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");
        }
Example #12
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 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);
        }
Example #14
0
        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));
        }
Example #15
0
        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);
        }
Example #16
0
        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]);
            }
        }
Example #17
0
        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);
        }
Example #19
0
        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);
            }
        }
Example #20
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);
        }
Example #21
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);
        }
Example #22
0
        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");
        }
Example #23
0
        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));
        }
Example #24
0
        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");
        }
Example #25
0
        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));
        }
Example #26
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);
        }
Example #27
0
        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\"]}  ");
        }
Example #28
0
        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");
        }
Example #29
0
        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");
        }
Example #30
0
        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}");
                }
            }
        }