Example #1
0
        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);
        }
Example #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));
        }
Example #3
0
        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();
        }
Example #4
0
        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);
        }
Example #5
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);
        }
Example #6
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");
        }
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 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 #8
0
        public static byte[] Write(I3dm i3dm, string batchIdSerializeType = "UNSIGNED_SHORT")
        {
            UpdateProperties(i3dm, batchIdSerializeType);
            var stream = new MemoryStream();

            WriteToStream(i3dm, stream);
            return(stream.ToArray());
        }
Example #9
0
        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);
        }
Example #10
0
        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);
            }
        }
Example #11
0
        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);
        }
Example #12
0
        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);
            }
        }
Example #13
0
        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);
        }
Example #14
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 #15
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);
                }
            }
        }
Example #16
0
        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);
        }
Example #18
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 #19
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 #20
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 #21
0
        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);
        }
Example #22
0
        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));
        }
Example #23
0
        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);
        }
Example #24
0
        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!");
            });
        }
Example #25
0
        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);
        }
Example #26
0
        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;
        }