@loaders.gl/tiles 4.0.0-alpha.5 → 4.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/constants.d.ts +6 -0
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +29 -26
  5. package/dist/dist.min.js +1994 -1035
  6. package/dist/es5/bundle.js +6 -0
  7. package/dist/es5/bundle.js.map +1 -0
  8. package/dist/es5/constants.js +44 -0
  9. package/dist/es5/constants.js.map +1 -0
  10. package/dist/es5/index.js +93 -0
  11. package/dist/es5/index.js.map +1 -0
  12. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js +70 -0
  13. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  14. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js +45 -0
  15. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  16. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js +84 -0
  17. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js.map +1 -0
  18. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js +143 -0
  19. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -0
  20. package/dist/es5/tileset/helpers/3d-tiles-options.js +12 -0
  21. package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -0
  22. package/dist/es5/tileset/helpers/bounding-volume.js +176 -0
  23. package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -0
  24. package/dist/es5/tileset/helpers/frame-state.js +129 -0
  25. package/dist/es5/tileset/helpers/frame-state.js.map +1 -0
  26. package/dist/es5/tileset/helpers/i3s-lod.js +60 -0
  27. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -0
  28. package/dist/es5/tileset/helpers/tiles-3d-lod.js +103 -0
  29. package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -0
  30. package/dist/es5/tileset/helpers/transform-utils.js +50 -0
  31. package/dist/es5/tileset/helpers/transform-utils.js.map +1 -0
  32. package/dist/es5/tileset/helpers/zoom.js +63 -0
  33. package/dist/es5/tileset/helpers/zoom.js.map +1 -0
  34. package/dist/es5/tileset/tile-3d.js +536 -0
  35. package/dist/es5/tileset/tile-3d.js.map +1 -0
  36. package/dist/es5/tileset/tileset-3d.js +855 -0
  37. package/dist/es5/tileset/tileset-3d.js.map +1 -0
  38. package/dist/es5/tileset/tileset-cache.js +82 -0
  39. package/dist/es5/tileset/tileset-cache.js.map +1 -0
  40. package/dist/es5/tileset/tileset-traverser.js +321 -0
  41. package/dist/es5/tileset/tileset-traverser.js.map +1 -0
  42. package/dist/es5/types.js +2 -0
  43. package/dist/es5/types.js.map +1 -0
  44. package/dist/es5/utils/doubly-linked-list-node.js +21 -0
  45. package/dist/es5/utils/doubly-linked-list-node.js.map +1 -0
  46. package/dist/es5/utils/doubly-linked-list.js +88 -0
  47. package/dist/es5/utils/doubly-linked-list.js.map +1 -0
  48. package/dist/es5/utils/managed-array.js +126 -0
  49. package/dist/es5/utils/managed-array.js.map +1 -0
  50. package/dist/esm/bundle.js +4 -0
  51. package/dist/esm/bundle.js.map +1 -0
  52. package/dist/esm/constants.js +32 -0
  53. package/dist/esm/constants.js.map +1 -0
  54. package/dist/esm/index.js +10 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/{tileset/traversers → esm/tileset/format-3d-tiles}/tileset-3d-traverser.js +2 -13
  57. package/dist/esm/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  58. package/dist/esm/tileset/format-i3s/i3s-pending-tiles-register.js +26 -0
  59. package/dist/esm/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  60. package/dist/esm/tileset/format-i3s/i3s-tile-manager.js +79 -0
  61. package/dist/esm/tileset/format-i3s/i3s-tile-manager.js.map +1 -0
  62. package/dist/{tileset/traversers → esm/tileset/format-i3s}/i3s-tileset-traverser.js +14 -26
  63. package/dist/esm/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -0
  64. package/dist/esm/tileset/helpers/3d-tiles-options.js +6 -0
  65. package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -0
  66. package/dist/esm/tileset/helpers/bounding-volume.js +155 -0
  67. package/dist/esm/tileset/helpers/bounding-volume.js.map +1 -0
  68. package/dist/esm/tileset/helpers/frame-state.js +109 -0
  69. package/dist/esm/tileset/helpers/frame-state.js.map +1 -0
  70. package/dist/esm/tileset/helpers/i3s-lod.js +53 -0
  71. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -0
  72. package/dist/esm/tileset/helpers/tiles-3d-lod.js +100 -0
  73. package/dist/{tileset → esm/tileset}/helpers/tiles-3d-lod.js.map +1 -1
  74. package/dist/esm/tileset/helpers/transform-utils.js +50 -0
  75. package/dist/esm/tileset/helpers/transform-utils.js.map +1 -0
  76. package/dist/esm/tileset/helpers/zoom.js +55 -0
  77. package/dist/esm/tileset/helpers/zoom.js.map +1 -0
  78. package/dist/esm/tileset/tile-3d.js +414 -0
  79. package/dist/esm/tileset/tile-3d.js.map +1 -0
  80. package/dist/esm/tileset/tileset-3d.js +606 -0
  81. package/dist/esm/tileset/tileset-3d.js.map +1 -0
  82. package/dist/esm/tileset/tileset-cache.js +57 -0
  83. package/dist/esm/tileset/tileset-cache.js.map +1 -0
  84. package/dist/{tileset/traversers → esm/tileset}/tileset-traverser.js +29 -88
  85. package/dist/esm/tileset/tileset-traverser.js.map +1 -0
  86. package/dist/esm/types.js +2 -0
  87. package/dist/esm/types.js.map +1 -0
  88. package/dist/esm/utils/doubly-linked-list-node.js +12 -0
  89. package/dist/esm/utils/doubly-linked-list-node.js.map +1 -0
  90. package/dist/esm/utils/doubly-linked-list.js +65 -0
  91. package/dist/esm/utils/doubly-linked-list.js.map +1 -0
  92. package/dist/esm/utils/managed-array.js +87 -0
  93. package/dist/esm/utils/managed-array.js.map +1 -0
  94. package/dist/index.d.ts +4 -4
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +26 -10
  97. package/dist/tileset/{traversers → format-3d-tiles}/tileset-3d-traverser.d.ts +2 -2
  98. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  99. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +54 -0
  100. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts +27 -0
  101. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  102. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js +47 -0
  103. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts +34 -0
  104. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  105. package/dist/tileset/format-i3s/i3s-tile-manager.js +80 -0
  106. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts +25 -0
  107. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  108. package/dist/tileset/format-i3s/i3s-tileset-traverser.js +92 -0
  109. package/dist/tileset/helpers/3d-tiles-options.d.ts +3 -2
  110. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +1 -1
  111. package/dist/tileset/helpers/3d-tiles-options.js +8 -5
  112. package/dist/tileset/helpers/bounding-volume.d.ts +10 -0
  113. package/dist/tileset/helpers/bounding-volume.d.ts.map +1 -1
  114. package/dist/tileset/helpers/bounding-volume.js +274 -69
  115. package/dist/tileset/helpers/frame-state.d.ts +16 -5
  116. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  117. package/dist/tileset/helpers/frame-state.js +131 -49
  118. package/dist/tileset/helpers/i3s-lod.d.ts +1 -1
  119. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
  120. package/dist/tileset/helpers/i3s-lod.js +82 -64
  121. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +1 -1
  122. package/dist/tileset/helpers/tiles-3d-lod.js +112 -100
  123. package/dist/tileset/helpers/transform-utils.d.ts.map +1 -1
  124. package/dist/tileset/helpers/transform-utils.js +51 -56
  125. package/dist/tileset/helpers/zoom.d.ts +41 -2
  126. package/dist/tileset/helpers/zoom.d.ts.map +1 -1
  127. package/dist/tileset/helpers/zoom.js +83 -30
  128. package/dist/tileset/tile-3d.d.ts +82 -35
  129. package/dist/tileset/tile-3d.d.ts.map +1 -1
  130. package/dist/tileset/tile-3d.js +607 -534
  131. package/dist/tileset/tileset-3d.d.ts +140 -48
  132. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  133. package/dist/tileset/tileset-3d.js +693 -652
  134. package/dist/tileset/tileset-cache.d.ts +6 -5
  135. package/dist/tileset/tileset-cache.d.ts.map +1 -1
  136. package/dist/tileset/tileset-cache.js +66 -73
  137. package/dist/tileset/tileset-traverser.d.ts +57 -0
  138. package/dist/tileset/tileset-traverser.d.ts.map +1 -0
  139. package/dist/tileset/tileset-traverser.js +300 -0
  140. package/dist/types.d.ts +34 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +2 -0
  143. package/dist/utils/doubly-linked-list-node.d.ts +1 -2
  144. package/dist/utils/doubly-linked-list-node.d.ts.map +1 -1
  145. package/dist/utils/doubly-linked-list-node.js +17 -15
  146. package/dist/utils/doubly-linked-list.d.ts +2 -3
  147. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  148. package/dist/utils/doubly-linked-list.js +91 -75
  149. package/dist/utils/managed-array.d.ts +1 -1
  150. package/dist/utils/managed-array.d.ts.map +1 -1
  151. package/dist/utils/managed-array.js +144 -109
  152. package/package.json +11 -8
  153. package/src/constants.ts +20 -0
  154. package/src/index.ts +6 -4
  155. package/src/tileset/{traversers → format-3d-tiles}/tileset-3d-traverser.ts +4 -2
  156. package/src/tileset/format-i3s/i3s-pending-tiles-register.ts +44 -0
  157. package/src/tileset/format-i3s/i3s-tile-manager.ts +101 -0
  158. package/src/tileset/{traversers → format-i3s}/i3s-tileset-traverser.ts +25 -12
  159. package/src/tileset/helpers/3d-tiles-options.ts +3 -1
  160. package/src/tileset/helpers/bounding-volume.ts +136 -0
  161. package/src/tileset/helpers/frame-state.ts +102 -18
  162. package/src/tileset/helpers/i3s-lod.ts +24 -21
  163. package/src/tileset/helpers/tiles-3d-lod.ts +2 -0
  164. package/src/tileset/helpers/transform-utils.ts +2 -0
  165. package/src/tileset/helpers/zoom.ts +84 -9
  166. package/src/tileset/tile-3d.ts +137 -123
  167. package/src/tileset/tileset-3d.ts +378 -251
  168. package/src/tileset/tileset-cache.ts +24 -17
  169. package/src/tileset/{traversers/tileset-traverser.ts → tileset-traverser.ts} +71 -72
  170. package/src/types.ts +36 -0
  171. package/src/utils/doubly-linked-list-node.ts +3 -2
  172. package/src/utils/doubly-linked-list.ts +2 -3
  173. package/src/utils/managed-array.ts +1 -1
  174. package/dist/bundle.js.map +0 -1
  175. package/dist/constants.js.map +0 -1
  176. package/dist/index.js.map +0 -1
  177. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  178. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  179. package/dist/tileset/helpers/frame-state.js.map +0 -1
  180. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  181. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  182. package/dist/tileset/helpers/zoom.js.map +0 -1
  183. package/dist/tileset/tile-3d.js.map +0 -1
  184. package/dist/tileset/tileset-3d.js.map +0 -1
  185. package/dist/tileset/tileset-cache.js.map +0 -1
  186. package/dist/tileset/traversers/i3s-tile-manager.d.ts +0 -8
  187. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +0 -1
  188. package/dist/tileset/traversers/i3s-tile-manager.js +0 -45
  189. package/dist/tileset/traversers/i3s-tile-manager.js.map +0 -1
  190. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +0 -18
  191. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +0 -1
  192. package/dist/tileset/traversers/i3s-tileset-traverser.js.map +0 -1
  193. package/dist/tileset/traversers/tileset-3d-traverser.d.ts.map +0 -1
  194. package/dist/tileset/traversers/tileset-3d-traverser.js.map +0 -1
  195. package/dist/tileset/traversers/tileset-traverser.d.ts +0 -52
  196. package/dist/tileset/traversers/tileset-traverser.d.ts.map +0 -1
  197. package/dist/tileset/traversers/tileset-traverser.js.map +0 -1
  198. package/dist/utils/doubly-linked-list-node.js.map +0 -1
  199. package/dist/utils/doubly-linked-list.js.map +0 -1
  200. package/dist/utils/managed-array.js.map +0 -1
  201. package/src/tileset/traversers/i3s-tile-manager.ts +0 -39
@@ -1,4 +1,9 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  import {Vector3} from '@math.gl/core';
4
+ import {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';
5
+ import {Ellipsoid} from '@math.gl/geospatial';
6
+ import {BoundingRectangle} from '../../types';
2
7
 
3
8
  const WGS84_RADIUS_X = 6378137.0;
4
9
  const WGS84_RADIUS_Y = 6378137.0;
@@ -8,22 +13,29 @@ const scratchVector = new Vector3();
8
13
 
9
14
  /**
10
15
  * Calculate appropriate zoom value for a particular boundingVolume
11
- * @param {BoundingSphere, OrientedBoundingBox} boundingVolume - the instance of bounding volume
16
+ * @param boundingVolume - the instance of bounding volume
17
+ * @param cartorgraphicCenter - cartographic center of the bounding volume
12
18
  * @returns {number} - zoom value
13
19
  */
14
- export function getZoomFromBoundingVolume(boundingVolume) {
15
- const {halfAxes, radius, width, height} = boundingVolume;
16
-
17
- if (halfAxes) {
20
+ export function getZoomFromBoundingVolume(
21
+ boundingVolume: BoundingSphere | OrientedBoundingBox | BoundingRectangle,
22
+ cartorgraphicCenter: Vector3
23
+ ) {
24
+ if (boundingVolume instanceof OrientedBoundingBox) {
18
25
  // OrientedBoundingBox
26
+ const {halfAxes} = boundingVolume;
19
27
  const obbSize = getObbSize(halfAxes);
20
28
  // Use WGS84_RADIUS_Z to allign with BoundingSphere algorithm
21
- return Math.log2(WGS84_RADIUS_Z / obbSize);
22
- } else if (radius) {
29
+ // Add the tile elevation value for correct zooming to elevated tiles
30
+ return Math.log2(WGS84_RADIUS_Z / (obbSize + cartorgraphicCenter[2]));
31
+ } else if (boundingVolume instanceof BoundingSphere) {
23
32
  // BoundingSphere
24
- return Math.log2(WGS84_RADIUS_Z / radius);
25
- } else if (height && width) {
33
+ const {radius} = boundingVolume;
34
+ // Add the tile elevation value for correct zooming to elevated tiles
35
+ return Math.log2(WGS84_RADIUS_Z / (radius + cartorgraphicCenter[2]));
36
+ } else if (boundingVolume.width && boundingVolume.height) {
26
37
  // BoundingRectangle
38
+ const {width, height} = boundingVolume;
27
39
  const zoomX = Math.log2(WGS84_RADIUS_X / width);
28
40
  const zoomY = Math.log2(WGS84_RADIUS_Y / height);
29
41
 
@@ -33,6 +45,69 @@ export function getZoomFromBoundingVolume(boundingVolume) {
33
45
  return 1;
34
46
  }
35
47
 
48
+ /**
49
+ * Calculate initial zoom for the tileset from 3D `fullExtent` defined in
50
+ * the tileset metadata
51
+ * @param fullExtent - 3D extent of the tileset
52
+ * @param fullExtent.xmin - minimal longitude in decimal degrees
53
+ * @param fullExtent.xmax - maximal longitude in decimal degrees
54
+ * @param fullExtent.ymin - minimal latitude in decimal degrees
55
+ * @param fullExtent.ymax - maximal latitude in decimal degrees
56
+ * @param fullExtent.zmin - minimal elevation in meters
57
+ * @param fullExtent.zmax - maximal elevation in meters
58
+ * @param cartorgraphicCenter - tileset center in cartographic coordinate system
59
+ * @param cartesianCenter - tileset center in cartesian coordinate system
60
+ * @returns - initial zoom for the tileset
61
+ */
62
+ export function getZoomFromFullExtent(
63
+ fullExtent: {
64
+ xmin: number;
65
+ xmax: number;
66
+ ymin: number;
67
+ ymax: number;
68
+ zmin: number;
69
+ zmax: number;
70
+ },
71
+ cartorgraphicCenter: Vector3,
72
+ cartesianCenter: Vector3
73
+ ) {
74
+ const extentVertex = Ellipsoid.WGS84.cartographicToCartesian(
75
+ [fullExtent.xmax, fullExtent.ymax, fullExtent.zmax],
76
+ new Vector3()
77
+ );
78
+ const extentSize = Math.sqrt(
79
+ Math.pow(extentVertex[0] - cartesianCenter[0], 2) +
80
+ Math.pow(extentVertex[1] - cartesianCenter[1], 2) +
81
+ Math.pow(extentVertex[2] - cartesianCenter[2], 2)
82
+ );
83
+ return Math.log2(WGS84_RADIUS_Z / (extentSize + cartorgraphicCenter[2]));
84
+ }
85
+
86
+ /**
87
+ * Calculate initial zoom for the tileset from 2D `extent` defined in
88
+ * the tileset metadata
89
+ * @param extent - 2D extent of the tileset. It is array of 4 elements [xmin, ymin, xmax, ymax]
90
+ * @param extent[0] - minimal longitude in decimal degrees
91
+ * @param extent[1] - minimal latitude in decimal degrees
92
+ * @param extent[2] - maximal longitude in decimal degrees
93
+ * @param extent[3] - maximal latitude in decimal degrees
94
+ * @param cartorgraphicCenter - tileset center in cartographic coordinate system
95
+ * @param cartesianCenter - tileset center in cartesian coordinate system
96
+ * @returns - initial zoom for the tileset
97
+ */
98
+ export function getZoomFromExtent(
99
+ extent: [number, number, number, number],
100
+ cartorgraphicCenter: Vector3,
101
+ cartesianCenter: Vector3
102
+ ) {
103
+ const [xmin, ymin, xmax, ymax] = extent;
104
+ return getZoomFromFullExtent(
105
+ {xmin, xmax, ymin, ymax, zmin: 0, zmax: 0},
106
+ cartorgraphicCenter,
107
+ cartesianCenter
108
+ );
109
+ }
110
+
36
111
  function getObbSize(halfAxes) {
37
112
  halfAxes.getColumn(0, scratchVector);
38
113
  const axeY = halfAxes.getColumn(1);
@@ -1,20 +1,28 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  // This file is derived from the Cesium code base under Apache 2 license
2
4
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
5
+
3
6
  import {Vector3, Matrix4} from '@math.gl/core';
4
7
  import {CullingVolume} from '@math.gl/culling';
5
8
 
6
9
  import {load} from '@loaders.gl/core';
10
+
11
+ // Note: circular dependency
12
+ import type {Tileset3D} from './tileset-3d';
13
+ import type {DoublyLinkedListNode} from '../utils/doubly-linked-list-node';
7
14
  import {TILE_REFINEMENT, TILE_CONTENT_STATE, TILESET_TYPE} from '../constants';
8
15
 
9
16
  import {FrameState} from './helpers/frame-state';
10
- import {createBoundingVolume} from './helpers/bounding-volume';
17
+ import {
18
+ createBoundingVolume,
19
+ getCartographicBounds,
20
+ CartographicBounds
21
+ } from './helpers/bounding-volume';
11
22
  import {getTiles3DScreenSpaceError} from './helpers/tiles-3d-lod';
12
23
  import {getProjectedRadius} from './helpers/i3s-lod';
13
24
  import {get3dTilesOptions} from './helpers/3d-tiles-options';
14
- import TilesetTraverser from './traversers/tileset-traverser';
15
-
16
- // Note: circular dependency
17
- import type Tileset3D from './tileset-3d';
25
+ import {TilesetTraverser} from './tileset-traverser';
18
26
 
19
27
  const scratchVector = new Vector3();
20
28
 
@@ -25,14 +33,14 @@ function defined(x) {
25
33
  /**
26
34
  * @param tileset - Tileset3D instance
27
35
  * @param header - tile header - JSON loaded from a dataset
28
- * @param parentHeader - parent TileHeader instance
36
+ * @param parentHeader - parent Tile3D instance
29
37
  * @param extendedId - optional ID to separate copies of a tile for different viewports.
30
38
  * const extendedId = `${tile.id}-${frameState.viewport.id}`;
31
39
  */
32
- export type TileHeaderProps = {
40
+ export type Tile3DProps = {
33
41
  tileset: Tileset3D;
34
42
  header: Object;
35
- parentHeader: TileHeader;
43
+ parentHeader: Tile3D;
36
44
  extendedId: string;
37
45
  };
38
46
 
@@ -41,84 +49,91 @@ export type TileHeaderProps = {
41
49
  * the content is loaded on-demand when needed based on the view.
42
50
  * Do not construct this directly, instead access tiles through {@link Tileset3D#tileVisible}.
43
51
  */
44
- export default class TileHeader {
52
+ export class Tile3D {
45
53
  tileset: Tileset3D;
46
54
  header: any;
47
55
  id: string;
48
56
  url: string;
49
- parent: TileHeader;
57
+ parent: Tile3D;
58
+ /* Specifies the type of refine that is used when traversing this tile for rendering. */
50
59
  refine: number;
51
60
  type: string;
52
61
  contentUrl: string;
53
- lodMetricType: string;
54
- lodMetricValue: number;
55
- boundingVolume: any;
56
- content: any;
57
- contentState: any;
58
- gpuMemoryUsageInBytes: number;
59
- children: TileHeader[];
60
- depth: number;
61
- viewportIds: any[];
62
- transform: Matrix4;
63
- extensions: any;
64
-
65
- // Container to store application specific data
66
- userData: {[key: string]: any};
62
+ /** Different refinement algorithms used by I3S and 3D tiles */
63
+ lodMetricType: 'geometricError' | 'maxScreenThreshold' = 'geometricError';
64
+ /** The error, in meters, introduced if this tile is rendered and its children are not. */
65
+ lodMetricValue: number = 0;
66
+
67
+ /** @todo math.gl is not exporting BoundingVolume base type? */
68
+ boundingVolume: any = null;
69
+
70
+ /**
71
+ * The tile's content. This represents the actual tile's payload,
72
+ * not the content's metadata in the tileset JSON file.
73
+ */
74
+ content: any = null;
75
+ contentState: number = TILE_CONTENT_STATE.UNLOADED;
76
+ gpuMemoryUsageInBytes: number = 0;
77
+
78
+ /** The tile's children - an array of Tile3D objects. */
79
+ children: Tile3D[] = [];
80
+ depth: number = 0;
81
+ viewportIds: any[] = [];
82
+ transform = new Matrix4();
83
+ extensions: any = null;
84
+ /** TODO Cesium 3d tiles specific */
85
+ implicitTiling?: any = null;
86
+
87
+ /** Container to store application specific data */
88
+ userData: Record<string, any> = {};
89
+
67
90
  computedTransform: any;
68
- hasEmptyContent: boolean;
69
- hasTilesetContent: boolean;
91
+ hasEmptyContent: boolean = false;
92
+ hasTilesetContent: boolean = false;
70
93
 
71
- traverser: object;
94
+ traverser = new TilesetTraverser({});
72
95
 
73
- // @ts-ignore
74
- private _cacheNode: any;
75
- private _frameNumber: any;
76
- // TODO i3s specific, needs to remove
77
- // @ts-ignore
78
- private _lodJudge: any;
79
- // TODO Cesium 3d tiles specific
80
- private _expireDate: any;
81
- private _expiredContent: any;
82
- // @ts-ignore
83
- private _shouldRefine: boolean;
84
-
85
- // Members this are updated every frame for tree traversal and rendering optimizations:
86
- // @ts-ignore
87
- private _distanceToCamera: number;
88
- // @ts-ignore
89
- private _centerZDepth: number;
90
- private _screenSpaceError: number;
91
- private _visibilityPlaneMask: any;
92
- private _visible?: boolean;
93
- private _inRequestVolume: boolean;
96
+ /** Used by TilesetCache */
97
+ _cacheNode: DoublyLinkedListNode | null = null;
94
98
 
95
- // @ts-ignore
96
- private _stackLength: number;
97
- // @ts-ignore
98
- private _selectionDepth: number;
99
+ private _frameNumber: any = null;
99
100
 
100
- // @ts-ignore
101
- private _touchedFrame: number;
102
- // @ts-ignore
103
- private _visitedFrame: number;
104
- private _selectedFrame: number;
105
- // @ts-ignore
106
- private _requestedFrame: number;
101
+ // TODO Cesium 3d tiles specific
102
+ private _expireDate: any = null;
103
+ private _expiredContent: any = null;
104
+
105
+ private _boundingBox?: CartographicBounds;
107
106
 
108
- // @ts-ignore
109
- private _priority: number;
107
+ /** updated every frame for tree traversal and rendering optimizations: */
108
+ public _distanceToCamera: number = 0;
109
+ _screenSpaceError: number = 0;
110
+ private _visibilityPlaneMask: any;
111
+ private _visible: boolean | undefined = undefined;
110
112
 
111
113
  private _contentBoundingVolume: any;
112
114
  private _viewerRequestVolume: any;
113
115
 
114
- _initialTransform: Matrix4;
116
+ _initialTransform: Matrix4 = new Matrix4();
117
+
118
+ // Used by traverser, cannot be marked private
119
+ _priority: number = 0;
120
+ _selectedFrame: number = 0;
121
+ _requestedFrame: number = 0;
122
+ _selectionDepth: number = 0;
123
+ _touchedFrame: number = 0;
124
+ _centerZDepth: number = 0;
125
+ _shouldRefine: boolean = false;
126
+ _stackLength: number = 0;
127
+ _visitedFrame: number = 0;
128
+ _inRequestVolume: boolean = false;
129
+ _lodJudge: any = null; // TODO i3s specific, needs to remove
115
130
 
116
131
  /**
117
132
  * @constructs
118
- * Create a TileHeader instance
133
+ * Create a Tile3D instance
119
134
  * @param tileset - Tileset3D instance
120
135
  * @param header - tile header - JSON loaded from a dataset
121
- * @param parentHeader - parent TileHeader instance
136
+ * @param parentHeader - parent Tile3D instance
122
137
  * @param extendedId - optional ID to separate copies of a tile for different viewports.
123
138
  * const extendedId = `${tile.id}-${frameState.viewport.id}`;
124
139
  */
@@ -126,7 +141,7 @@ export default class TileHeader {
126
141
  constructor(
127
142
  tileset: Tileset3D,
128
143
  header: {[key: string]: any},
129
- parentHeader?: TileHeader,
144
+ parentHeader?: Tile3D,
130
145
  extendedId = ''
131
146
  ) {
132
147
  // PUBLIC MEMBERS
@@ -145,68 +160,12 @@ export default class TileHeader {
145
160
  this.type = header.type;
146
161
  this.contentUrl = header.contentUrl;
147
162
 
148
- // The error, in meters, introduced if this tile is rendered and its children are not.
149
- this.lodMetricType = 'geometricError';
150
- this.lodMetricValue = 0;
151
-
152
- // Specifies the type of refine that is used when traversing this tile for rendering.
153
- this.boundingVolume = null;
154
-
155
- // The tile's content. This represents the actual tile's payload,
156
- // not the content's metadata in the tileset JSON file.
157
- this.content = null;
158
- this.contentState = TILE_CONTENT_STATE.UNLOADED;
159
- this.gpuMemoryUsageInBytes = 0;
160
-
161
- // The tile's children - an array of Tile3D objects.
162
- this.children = [];
163
-
164
- this.hasEmptyContent = false;
165
- this.hasTilesetContent = false;
166
-
167
- this.depth = 0;
168
- this.viewportIds = [];
169
-
170
- // Container to store application specific data
171
- this.userData = {};
172
- this.extensions = null;
173
-
174
- // PRIVATE MEMBERS
175
- this._priority = 0;
176
- this._touchedFrame = 0;
177
- this._visitedFrame = 0;
178
- this._selectedFrame = 0;
179
- this._requestedFrame = 0;
180
- this._screenSpaceError = 0;
181
-
182
- this._cacheNode = null;
183
- this._frameNumber = null;
184
- this._cacheNode = null;
185
-
186
- this.traverser = new TilesetTraverser({});
187
- this._shouldRefine = false;
188
- this._distanceToCamera = 0;
189
- this._centerZDepth = 0;
190
- this._visible = undefined;
191
- this._inRequestVolume = false;
192
- this._stackLength = 0;
193
- this._selectionDepth = 0;
194
- this._initialTransform = new Matrix4();
195
- this.transform = new Matrix4();
196
-
197
163
  this._initializeLodMetric(header);
198
164
  this._initializeTransforms(header);
199
165
  this._initializeBoundingVolumes(header);
200
166
  this._initializeContent(header);
201
167
  this._initializeRenderingState(header);
202
168
 
203
- // TODO i3s specific, needs to remove
204
- this._lodJudge = null;
205
-
206
- // TODO Cesium 3d tiles specific
207
- this._expireDate = null;
208
- this._expiredContent = null;
209
-
210
169
  Object.seal(this);
211
170
  }
212
171
 
@@ -285,6 +244,31 @@ export default class TileHeader {
285
244
  return this.contentState === TILE_CONTENT_STATE.FAILED;
286
245
  }
287
246
 
247
+ /**
248
+ * Distance from the tile's bounding volume center to the camera
249
+ */
250
+ get distanceToCamera(): number {
251
+ return this._distanceToCamera;
252
+ }
253
+
254
+ /**
255
+ * Screen space error for LOD selection
256
+ */
257
+ get screenSpaceError(): number {
258
+ return this._screenSpaceError;
259
+ }
260
+
261
+ /**
262
+ * Get bounding box in cartographic coordinates
263
+ * @returns [min, max] each in [longitude, latitude, altitude]
264
+ */
265
+ get boundingBox(): CartographicBounds {
266
+ if (!this._boundingBox) {
267
+ this._boundingBox = getCartographicBounds(this.header.boundingVolume, this.boundingVolume);
268
+ }
269
+ return this._boundingBox;
270
+ }
271
+
288
272
  /** Get the tile's screen space error. */
289
273
  getScreenSpaceError(frameState, useParentLodMetric) {
290
274
  switch (this.tileset.type) {
@@ -298,6 +282,21 @@ export default class TileHeader {
298
282
  }
299
283
  }
300
284
 
285
+ /**
286
+ * Make tile unselected than means it won't be shown
287
+ * but it can be still loaded in memory
288
+ */
289
+ unselect(): void {
290
+ this._selectedFrame = 0;
291
+ }
292
+
293
+ /**
294
+ * Memory usage of tile on GPU
295
+ */
296
+ _getGpuMemoryUsageInBytes(): number {
297
+ return this.content.gpuMemoryUsageInBytes || this.content.byteLength || 0;
298
+ }
299
+
301
300
  /*
302
301
  * If skipLevelOfDetail is off try to load child tiles as soon as possible so that their parent can refine sooner.
303
302
  * Tiles are prioritized by screen space error.
@@ -381,6 +380,7 @@ export default class TileHeader {
381
380
  const options = {
382
381
  ...this.tileset.loadOptions,
383
382
  [loader.id]: {
383
+ // @ts-expect-error
384
384
  ...this.tileset.loadOptions[loader.id],
385
385
  isTileset: this.type === 'json',
386
386
  ...this._getLoaderSpecificOptions(loader.id)
@@ -691,6 +691,8 @@ export default class TileHeader {
691
691
  // The content may be tileset json
692
692
  if (this._isTileset()) {
693
693
  this.hasTilesetContent = true;
694
+ } else {
695
+ this.gpuMemoryUsageInBytes = this._getGpuMemoryUsageInBytes();
694
696
  }
695
697
  }
696
698
 
@@ -749,8 +751,20 @@ export default class TileHeader {
749
751
  case 'i3s':
750
752
  return {
751
753
  ...this.tileset.options.i3s,
752
- tile: this.header,
753
- tileset: this.tileset.tileset,
754
+ _tileOptions: {
755
+ attributeUrls: this.header.attributeUrls,
756
+ textureUrl: this.header.textureUrl,
757
+ textureFormat: this.header.textureFormat,
758
+ textureLoaderOptions: this.header.textureLoaderOptions,
759
+ materialDefinition: this.header.materialDefinition,
760
+ isDracoGeometry: this.header.isDracoGeometry,
761
+ mbs: this.header.mbs
762
+ },
763
+ _tilesetOptions: {
764
+ store: this.tileset.tileset.store,
765
+ attributeStorageInfo: this.tileset.tileset.attributeStorageInfo,
766
+ fields: this.tileset.tileset.fields
767
+ },
754
768
  isTileHeader: false
755
769
  };
756
770
  case '3d-tiles':