@@ -52,13 +52,13 @@ public static void CreateExplicitTilesetsJson(Version version, string outputDire
5252 {
5353 var splitLevel = ( int ) Math . Ceiling ( ( tiles . Max ( ( Tile s ) => s . Z ) + 1.0 ) / 2.0 ) ;
5454
55- var rootTiles = TileSelector . Select ( tiles , tile , 0 , splitLevel ) ;
55+ var rootTiles = TileSelector . Select ( tiles , tile , 0 , splitLevel - 1 ) ;
5656 var rootTileset = TreeSerializer . ToTileset ( rootTiles , translation , rootBoundingVolumeRegion , geometricError , geometricErrorFactor , version , refinement , tilesetVersion , crs ) ;
5757
5858 var maxlevel = tiles . Max ( ( Tile s ) => s . Z ) ;
5959
6060 var externalTilesets = 0 ;
61- if ( maxlevel > splitLevel ) {
61+ if ( maxlevel >= splitLevel ) {
6262 // now create the tileset.json files on splitLevel
6363
6464 var width = Math . Pow ( 2 , splitLevel ) ;
@@ -113,4 +113,92 @@ private static BoundingBox GetBoundingBox(List<Tile> children)
113113 return new BoundingBox ( minx , miny , maxx , maxy ) ;
114114 }
115115
116+ private static BoundingBox3D GetBoundingBox3D ( List < Tile3D > children , Dictionary < string , BoundingBox3D > tileBounds )
117+ {
118+ var keys = children . Select ( t => $ "{ t . Level } _{ t . Z } _{ t . X } _{ t . Y } ") . ToList ( ) ;
119+ var boxes = keys . Select ( k => tileBounds [ k ] ) . ToList ( ) ;
120+
121+ var minx = boxes . Min ( b => b . XMin ) ;
122+ var maxx = boxes . Max ( b => b . XMax ) ;
123+ var miny = boxes . Min ( b => b . YMin ) ;
124+ var maxy = boxes . Max ( b => b . YMax ) ;
125+ var minz = boxes . Min ( b => b . ZMin ) ;
126+ var maxz = boxes . Max ( b => b . ZMax ) ;
127+
128+ return new BoundingBox3D ( minx , miny , minz , maxx , maxy , maxz ) ;
129+ }
130+
131+ public static List < Tile3D > GetChildren ( List < Tile3D > tiles , Tile3D tile )
132+ {
133+ var res = new List < Tile3D > ( ) ;
134+ var root = tiles . Where ( x => x . Equals ( tile ) && x . Available ) . FirstOrDefault ( ) ;
135+ if ( root != null ) {
136+ res . Add ( root ) ;
137+ }
138+ var children = tiles . Where ( x => tile . HasChild ( x ) && x . Available ) ;
139+ res . AddRange ( children ) ;
140+
141+ return res ;
142+ }
143+
144+ public static void CreateExplicitTilesetsJson3D ( Version version , string outputDirectory , double [ ] translation , double geometricError , double geometricErrorFactor , RefinementType refinement , double [ ] rootBoundingVolumeRegion , Tile3D tile , List < Tile3D > tiles , Dictionary < string , BoundingBox3D > tileBounds , bool createGltf = false , string tilesetVersion = "" , string crs = "" )
145+ {
146+ var splitLevel = ( int ) Math . Ceiling ( ( tiles . Max ( ( Tile3D s ) => s . Level ) + 1.0 ) / 2.0 ) ;
147+
148+ var rootTiles = TileSelector3D . Select ( tiles , tile , 0 , splitLevel - 1 ) ;
149+ var rootTileset = TreeSerializer . ToTileset3D ( rootTiles , tileBounds , translation , rootBoundingVolumeRegion , geometricError , geometricErrorFactor , version , refinement , createGltf , tilesetVersion , crs ) ;
150+
151+ var maxlevel = tiles . Max ( ( Tile3D s ) => s . Level ) ;
152+
153+ var externalTilesets = 0 ;
154+ if ( maxlevel >= splitLevel ) {
155+ // now create the tileset.json files on splitLevel
156+
157+ var dimension = Math . Pow ( 2 , splitLevel ) ;
158+ Console . WriteLine ( $ "Writing tileset.json files...") ;
159+
160+ for ( var x = 0 ; x < dimension ; x ++ ) {
161+ for ( var y = 0 ; y < dimension ; y ++ ) {
162+ for ( var z = 0 ; z < dimension ; z ++ ) {
163+ var splitLevelTile = new Tile3D ( splitLevel , x , y , z ) ;
164+ var children = GetChildren ( tiles , splitLevelTile ) ;
165+
166+ if ( children . Count > 0 ) {
167+ var childrenBbox3D = GetBoundingBox3D ( children , tileBounds ) ;
168+ var childrenBbox2D = new BoundingBox ( childrenBbox3D . XMin , childrenBbox3D . YMin , childrenBbox3D . XMax , childrenBbox3D . YMax ) ;
169+ var childrenBoundingVolumeRegion = childrenBbox2D . ToRadians ( ) . ToRegion ( childrenBbox3D . ZMin , childrenBbox3D . ZMax ) ;
170+
171+ // Translation is the same as identity matrix in case of child tileset.
172+ var tileset = TreeSerializer . ToTileset3D ( children , tileBounds , null , childrenBoundingVolumeRegion , geometricError , geometricErrorFactor , version , refinement , createGltf , tilesetVersion ) ;
173+
174+ var childGeometricError = GeometricErrorCalculator . GetGeometricError ( geometricError , geometricErrorFactor , splitLevel ) ;
175+ tileset . geometricError = childGeometricError ;
176+ tileset . root . geometricError = GeometricErrorCalculator . GetGeometricError ( childGeometricError , geometricErrorFactor , 1 ) ;
177+ var detailedJson = JsonConvert . SerializeObject ( tileset , Formatting . Indented , new JsonSerializerSettings ( ) { NullValueHandling = NullValueHandling . Ignore } ) ;
178+ var filename = $ "tileset_{ splitLevel } _{ z } _{ x } _{ y } .json";
179+ Console . Write ( $ "\r Writing { filename } ...") ;
180+
181+ File . WriteAllText ( $ "{ outputDirectory } { Path . AltDirectorySeparatorChar } { filename } ", detailedJson ) ;
182+ externalTilesets ++ ;
183+ // add the child tilesets to the root tileset
184+ var child = new Child ( ) ;
185+ child . boundingVolume = new Boundingvolume ( ) { region = childrenBoundingVolumeRegion } ;
186+ child . refine = refinement ;
187+ child . geometricError = tileset . root . geometricError ;
188+
189+ child . content = new Content ( ) { uri = filename } ;
190+ rootTileset . root . children . Add ( child ) ;
191+ }
192+ }
193+ }
194+ }
195+ }
196+ // write the root tileset
197+ Console . WriteLine ( ) ;
198+ Console . WriteLine ( $ "External tileset.json files: { externalTilesets } ") ;
199+ Console . WriteLine ( "Writing root tileset.json..." ) ;
200+ var rootJson = JsonConvert . SerializeObject ( rootTileset , Formatting . Indented , new JsonSerializerSettings ( ) { NullValueHandling = NullValueHandling . Ignore } ) ;
201+ File . WriteAllText ( $ "{ outputDirectory } { Path . AltDirectorySeparatorChar } tileset.json", rootJson ) ;
202+ }
203+
116204}
0 commit comments