@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
@@ -0,0 +1,606 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { Matrix4, Vector3 } from '@math.gl/core';
3
+ import { Ellipsoid } from '@math.gl/geospatial';
4
+ import { Stats } from '@probe.gl/stats';
5
+ import { RequestScheduler, path } from '@loaders.gl/loader-utils';
6
+ import { TilesetCache } from './tileset-cache';
7
+ import { calculateTransformProps } from './helpers/transform-utils';
8
+ import { getFrameState, limitSelectedTiles } from './helpers/frame-state';
9
+ import { getZoomFromBoundingVolume, getZoomFromExtent, getZoomFromFullExtent } from './helpers/zoom';
10
+ import { Tile3D } from './tile-3d';
11
+ import { TILESET_TYPE } from '../constants';
12
+ import { TilesetTraverser } from './tileset-traverser';
13
+ import { Tileset3DTraverser } from './format-3d-tiles/tileset-3d-traverser';
14
+ import { I3STilesetTraverser } from './format-i3s/i3s-tileset-traverser';
15
+ const DEFAULT_PROPS = {
16
+ description: '',
17
+ ellipsoid: Ellipsoid.WGS84,
18
+ modelMatrix: new Matrix4(),
19
+ throttleRequests: true,
20
+ maxRequests: 64,
21
+ maximumMemoryUsage: 32,
22
+ maximumTilesSelected: 0,
23
+ debounceTime: 0,
24
+ onTileLoad: () => {},
25
+ onTileUnload: () => {},
26
+ onTileError: () => {},
27
+ onTraversalComplete: selectedTiles => selectedTiles,
28
+ contentLoader: undefined,
29
+ viewDistanceScale: 1.0,
30
+ maximumScreenSpaceError: 8,
31
+ loadTiles: true,
32
+ updateTransforms: true,
33
+ viewportTraversersMap: null,
34
+ loadOptions: {
35
+ fetch: {}
36
+ },
37
+ attributions: [],
38
+ basePath: '',
39
+ i3s: {}
40
+ };
41
+ const TILES_TOTAL = 'Tiles In Tileset(s)';
42
+ const TILES_IN_MEMORY = 'Tiles In Memory';
43
+ const TILES_IN_VIEW = 'Tiles In View';
44
+ const TILES_RENDERABLE = 'Tiles To Render';
45
+ const TILES_LOADED = 'Tiles Loaded';
46
+ const TILES_LOADING = 'Tiles Loading';
47
+ const TILES_UNLOADED = 'Tiles Unloaded';
48
+ const TILES_LOAD_FAILED = 'Failed Tile Loads';
49
+ const POINTS_COUNT = 'Points/Vertices';
50
+ const TILES_GPU_MEMORY = 'Tile Memory Use';
51
+ export class Tileset3D {
52
+ constructor(tileset, options) {
53
+ _defineProperty(this, "options", void 0);
54
+ _defineProperty(this, "loadOptions", void 0);
55
+ _defineProperty(this, "type", void 0);
56
+ _defineProperty(this, "tileset", void 0);
57
+ _defineProperty(this, "loader", void 0);
58
+ _defineProperty(this, "url", void 0);
59
+ _defineProperty(this, "basePath", void 0);
60
+ _defineProperty(this, "modelMatrix", void 0);
61
+ _defineProperty(this, "ellipsoid", void 0);
62
+ _defineProperty(this, "lodMetricType", void 0);
63
+ _defineProperty(this, "lodMetricValue", void 0);
64
+ _defineProperty(this, "refine", void 0);
65
+ _defineProperty(this, "root", null);
66
+ _defineProperty(this, "roots", {});
67
+ _defineProperty(this, "asset", {});
68
+ _defineProperty(this, "description", '');
69
+ _defineProperty(this, "properties", void 0);
70
+ _defineProperty(this, "extras", null);
71
+ _defineProperty(this, "attributions", {});
72
+ _defineProperty(this, "credits", {});
73
+ _defineProperty(this, "stats", void 0);
74
+ _defineProperty(this, "contentFormats", {
75
+ draco: false,
76
+ meshopt: false,
77
+ dds: false,
78
+ ktx2: false
79
+ });
80
+ _defineProperty(this, "cartographicCenter", null);
81
+ _defineProperty(this, "cartesianCenter", null);
82
+ _defineProperty(this, "zoom", 1);
83
+ _defineProperty(this, "boundingVolume", null);
84
+ _defineProperty(this, "dynamicScreenSpaceErrorComputedDensity", 0.0);
85
+ _defineProperty(this, "maximumMemoryUsage", 32);
86
+ _defineProperty(this, "gpuMemoryUsageInBytes", 0);
87
+ _defineProperty(this, "_frameNumber", 0);
88
+ _defineProperty(this, "_queryParams", {});
89
+ _defineProperty(this, "_extensionsUsed", []);
90
+ _defineProperty(this, "_tiles", {});
91
+ _defineProperty(this, "_pendingCount", 0);
92
+ _defineProperty(this, "selectedTiles", []);
93
+ _defineProperty(this, "traverseCounter", 0);
94
+ _defineProperty(this, "geometricError", 0);
95
+ _defineProperty(this, "lastUpdatedVieports", null);
96
+ _defineProperty(this, "_requestedTiles", []);
97
+ _defineProperty(this, "_emptyTiles", []);
98
+ _defineProperty(this, "frameStateData", {});
99
+ _defineProperty(this, "_traverser", void 0);
100
+ _defineProperty(this, "_cache", new TilesetCache());
101
+ _defineProperty(this, "_requestScheduler", void 0);
102
+ _defineProperty(this, "updatePromise", null);
103
+ _defineProperty(this, "tilesetInitializationPromise", void 0);
104
+ this.options = {
105
+ ...DEFAULT_PROPS,
106
+ ...options
107
+ };
108
+ this.tileset = tileset;
109
+ this.loader = tileset.loader;
110
+ this.type = tileset.type;
111
+ this.url = tileset.url;
112
+ this.basePath = tileset.basePath || path.dirname(this.url);
113
+ this.modelMatrix = this.options.modelMatrix;
114
+ this.ellipsoid = this.options.ellipsoid;
115
+ this.lodMetricType = tileset.lodMetricType;
116
+ this.lodMetricValue = tileset.lodMetricValue;
117
+ this.refine = tileset.root.refine;
118
+ this.loadOptions = this.options.loadOptions || {};
119
+ this._traverser = this._initializeTraverser();
120
+ this._requestScheduler = new RequestScheduler({
121
+ throttleRequests: this.options.throttleRequests,
122
+ maxRequests: this.options.maxRequests
123
+ });
124
+ this.stats = new Stats({
125
+ id: this.url
126
+ });
127
+ this._initializeStats();
128
+ this.tilesetInitializationPromise = this._initializeTileSet(tileset);
129
+ }
130
+ destroy() {
131
+ this._destroy();
132
+ }
133
+ isLoaded() {
134
+ return this._pendingCount === 0 && this._frameNumber !== 0 && this._requestedTiles.length === 0;
135
+ }
136
+ get tiles() {
137
+ return Object.values(this._tiles);
138
+ }
139
+ get frameNumber() {
140
+ return this._frameNumber;
141
+ }
142
+ get queryParams() {
143
+ return new URLSearchParams(this._queryParams).toString();
144
+ }
145
+ setProps(props) {
146
+ this.options = {
147
+ ...this.options,
148
+ ...props
149
+ };
150
+ }
151
+ setOptions(options) {
152
+ this.options = {
153
+ ...this.options,
154
+ ...options
155
+ };
156
+ }
157
+ getTileUrl(tilePath) {
158
+ const isDataUrl = tilePath.startsWith('data:');
159
+ if (isDataUrl) {
160
+ return tilePath;
161
+ }
162
+ return "".concat(tilePath).concat(tilePath.includes('?') ? '&' : '?').concat(this.queryParams);
163
+ }
164
+ hasExtension(extensionName) {
165
+ return Boolean(this._extensionsUsed.indexOf(extensionName) > -1);
166
+ }
167
+ update() {
168
+ let viewports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
169
+ this.tilesetInitializationPromise.then(() => {
170
+ if (!viewports && this.lastUpdatedVieports) {
171
+ viewports = this.lastUpdatedVieports;
172
+ } else {
173
+ this.lastUpdatedVieports = viewports;
174
+ }
175
+ if (viewports) {
176
+ this.doUpdate(viewports);
177
+ }
178
+ });
179
+ }
180
+ async selectTiles() {
181
+ let viewports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
182
+ await this.tilesetInitializationPromise;
183
+ if (viewports) {
184
+ this.lastUpdatedVieports = viewports;
185
+ }
186
+ if (!this.updatePromise) {
187
+ this.updatePromise = new Promise(resolve => {
188
+ setTimeout(() => {
189
+ if (this.lastUpdatedVieports) {
190
+ this.doUpdate(this.lastUpdatedVieports);
191
+ }
192
+ resolve(this._frameNumber);
193
+ this.updatePromise = null;
194
+ }, this.options.debounceTime);
195
+ });
196
+ }
197
+ return this.updatePromise;
198
+ }
199
+ doUpdate(viewports) {
200
+ if ('loadTiles' in this.options && !this.options.loadTiles) {
201
+ return;
202
+ }
203
+ if (this.traverseCounter > 0) {
204
+ return;
205
+ }
206
+ const preparedViewports = viewports instanceof Array ? viewports : [viewports];
207
+ this._cache.reset();
208
+ this._frameNumber++;
209
+ this.traverseCounter = preparedViewports.length;
210
+ const viewportsToTraverse = [];
211
+ for (const viewport of preparedViewports) {
212
+ const id = viewport.id;
213
+ if (this._needTraverse(id)) {
214
+ viewportsToTraverse.push(id);
215
+ } else {
216
+ this.traverseCounter--;
217
+ }
218
+ }
219
+ for (const viewport of preparedViewports) {
220
+ const id = viewport.id;
221
+ if (!this.roots[id]) {
222
+ this.roots[id] = this._initializeTileHeaders(this.tileset, null);
223
+ }
224
+ if (!viewportsToTraverse.includes(id)) {
225
+ continue;
226
+ }
227
+ const frameState = getFrameState(viewport, this._frameNumber);
228
+ this._traverser.traverse(this.roots[id], frameState, this.options);
229
+ }
230
+ }
231
+ _needTraverse(viewportId) {
232
+ let traverserId = viewportId;
233
+ if (this.options.viewportTraversersMap) {
234
+ traverserId = this.options.viewportTraversersMap[viewportId];
235
+ }
236
+ if (traverserId !== viewportId) {
237
+ return false;
238
+ }
239
+ return true;
240
+ }
241
+ _onTraversalEnd(frameState) {
242
+ const id = frameState.viewport.id;
243
+ if (!this.frameStateData[id]) {
244
+ this.frameStateData[id] = {
245
+ selectedTiles: [],
246
+ _requestedTiles: [],
247
+ _emptyTiles: []
248
+ };
249
+ }
250
+ const currentFrameStateData = this.frameStateData[id];
251
+ const selectedTiles = Object.values(this._traverser.selectedTiles);
252
+ const [filteredSelectedTiles, unselectedTiles] = limitSelectedTiles(selectedTiles, frameState, this.options.maximumTilesSelected);
253
+ currentFrameStateData.selectedTiles = filteredSelectedTiles;
254
+ for (const tile of unselectedTiles) {
255
+ tile.unselect();
256
+ }
257
+ currentFrameStateData._requestedTiles = Object.values(this._traverser.requestedTiles);
258
+ currentFrameStateData._emptyTiles = Object.values(this._traverser.emptyTiles);
259
+ this.traverseCounter--;
260
+ if (this.traverseCounter > 0) {
261
+ return;
262
+ }
263
+ this._updateTiles();
264
+ }
265
+ _updateTiles() {
266
+ this.selectedTiles = [];
267
+ this._requestedTiles = [];
268
+ this._emptyTiles = [];
269
+ for (const frameStateKey in this.frameStateData) {
270
+ const frameStateDataValue = this.frameStateData[frameStateKey];
271
+ this.selectedTiles = this.selectedTiles.concat(frameStateDataValue.selectedTiles);
272
+ this._requestedTiles = this._requestedTiles.concat(frameStateDataValue._requestedTiles);
273
+ this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);
274
+ }
275
+ this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);
276
+ for (const tile of this.selectedTiles) {
277
+ this._tiles[tile.id] = tile;
278
+ }
279
+ this._loadTiles();
280
+ this._unloadTiles();
281
+ this._updateStats();
282
+ }
283
+ _tilesChanged(oldSelectedTiles, selectedTiles) {
284
+ if (oldSelectedTiles.length !== selectedTiles.length) {
285
+ return true;
286
+ }
287
+ const set1 = new Set(oldSelectedTiles.map(t => t.id));
288
+ const set2 = new Set(selectedTiles.map(t => t.id));
289
+ let changed = oldSelectedTiles.filter(x => !set2.has(x.id)).length > 0;
290
+ changed = changed || selectedTiles.filter(x => !set1.has(x.id)).length > 0;
291
+ return changed;
292
+ }
293
+ _loadTiles() {
294
+ for (const tile of this._requestedTiles) {
295
+ if (tile.contentUnloaded) {
296
+ this._loadTile(tile);
297
+ }
298
+ }
299
+ }
300
+ _unloadTiles() {
301
+ this._cache.unloadTiles(this, (tileset, tile) => tileset._unloadTile(tile));
302
+ }
303
+ _updateStats() {
304
+ let tilesRenderable = 0;
305
+ let pointsRenderable = 0;
306
+ for (const tile of this.selectedTiles) {
307
+ if (tile.contentAvailable && tile.content) {
308
+ tilesRenderable++;
309
+ if (tile.content.pointCount) {
310
+ pointsRenderable += tile.content.pointCount;
311
+ } else {
312
+ pointsRenderable += tile.content.vertexCount;
313
+ }
314
+ }
315
+ }
316
+ this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;
317
+ this.stats.get(TILES_RENDERABLE).count = tilesRenderable;
318
+ this.stats.get(POINTS_COUNT).count = pointsRenderable;
319
+ }
320
+ async _initializeTileSet(tilesetJson) {
321
+ if (this.type === TILESET_TYPE.I3S) {
322
+ this.calculateViewPropsI3S();
323
+ tilesetJson.root = await tilesetJson.root;
324
+ }
325
+ this.root = this._initializeTileHeaders(tilesetJson, null);
326
+ if (this.type === TILESET_TYPE.TILES3D) {
327
+ this._initializeTiles3DTileset(tilesetJson);
328
+ this.calculateViewPropsTiles3D();
329
+ }
330
+ if (this.type === TILESET_TYPE.I3S) {
331
+ this._initializeI3STileset();
332
+ }
333
+ }
334
+ calculateViewPropsI3S() {
335
+ var _this$tileset$store;
336
+ const fullExtent = this.tileset.fullExtent;
337
+ if (fullExtent) {
338
+ const {
339
+ xmin,
340
+ xmax,
341
+ ymin,
342
+ ymax,
343
+ zmin,
344
+ zmax
345
+ } = fullExtent;
346
+ this.cartographicCenter = new Vector3(xmin + (xmax - xmin) / 2, ymin + (ymax - ymin) / 2, zmin + (zmax - zmin) / 2);
347
+ this.cartesianCenter = Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, new Vector3());
348
+ this.zoom = getZoomFromFullExtent(fullExtent, this.cartographicCenter, this.cartesianCenter);
349
+ return;
350
+ }
351
+ const extent = (_this$tileset$store = this.tileset.store) === null || _this$tileset$store === void 0 ? void 0 : _this$tileset$store.extent;
352
+ if (extent) {
353
+ const [xmin, ymin, xmax, ymax] = extent;
354
+ this.cartographicCenter = new Vector3(xmin + (xmax - xmin) / 2, ymin + (ymax - ymin) / 2, 0);
355
+ this.cartesianCenter = Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, new Vector3());
356
+ this.zoom = getZoomFromExtent(extent, this.cartographicCenter, this.cartesianCenter);
357
+ return;
358
+ }
359
+ console.warn('Extent is not defined in the tileset header');
360
+ this.cartographicCenter = new Vector3();
361
+ this.zoom = 1;
362
+ return;
363
+ }
364
+ calculateViewPropsTiles3D() {
365
+ const root = this.root;
366
+ const {
367
+ center
368
+ } = root.boundingVolume;
369
+ if (!center) {
370
+ console.warn('center was not pre-calculated for the root tile');
371
+ this.cartographicCenter = new Vector3();
372
+ this.zoom = 1;
373
+ return;
374
+ }
375
+ if (center[0] !== 0 || center[1] !== 0 || center[2] !== 0) {
376
+ this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3());
377
+ } else {
378
+ this.cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);
379
+ }
380
+ this.cartesianCenter = center;
381
+ this.zoom = getZoomFromBoundingVolume(root.boundingVolume, this.cartographicCenter);
382
+ }
383
+ _initializeStats() {
384
+ this.stats.get(TILES_TOTAL);
385
+ this.stats.get(TILES_LOADING);
386
+ this.stats.get(TILES_IN_MEMORY);
387
+ this.stats.get(TILES_IN_VIEW);
388
+ this.stats.get(TILES_RENDERABLE);
389
+ this.stats.get(TILES_LOADED);
390
+ this.stats.get(TILES_UNLOADED);
391
+ this.stats.get(TILES_LOAD_FAILED);
392
+ this.stats.get(POINTS_COUNT);
393
+ this.stats.get(TILES_GPU_MEMORY, 'memory');
394
+ }
395
+ _initializeTileHeaders(tilesetJson, parentTileHeader) {
396
+ const rootTile = new Tile3D(this, tilesetJson.root, parentTileHeader);
397
+ if (parentTileHeader) {
398
+ parentTileHeader.children.push(rootTile);
399
+ rootTile.depth = parentTileHeader.depth + 1;
400
+ }
401
+ if (this.type === TILESET_TYPE.TILES3D) {
402
+ const stack = [];
403
+ stack.push(rootTile);
404
+ while (stack.length > 0) {
405
+ const tile = stack.pop();
406
+ this.stats.get(TILES_TOTAL).incrementCount();
407
+ const children = tile.header.children || [];
408
+ for (const childHeader of children) {
409
+ var _childTile$contentUrl;
410
+ const childTile = new Tile3D(this, childHeader, tile);
411
+ if ((_childTile$contentUrl = childTile.contentUrl) !== null && _childTile$contentUrl !== void 0 && _childTile$contentUrl.includes('?session=')) {
412
+ const url = new URL(childTile.contentUrl);
413
+ const session = url.searchParams.get('session');
414
+ if (session) {
415
+ this._queryParams.session = session;
416
+ }
417
+ }
418
+ tile.children.push(childTile);
419
+ childTile.depth = tile.depth + 1;
420
+ stack.push(childTile);
421
+ }
422
+ }
423
+ }
424
+ return rootTile;
425
+ }
426
+ _initializeTraverser() {
427
+ let TraverserClass;
428
+ const type = this.type;
429
+ switch (type) {
430
+ case TILESET_TYPE.TILES3D:
431
+ TraverserClass = Tileset3DTraverser;
432
+ break;
433
+ case TILESET_TYPE.I3S:
434
+ TraverserClass = I3STilesetTraverser;
435
+ break;
436
+ default:
437
+ TraverserClass = TilesetTraverser;
438
+ }
439
+ return new TraverserClass({
440
+ basePath: this.basePath,
441
+ onTraversalEnd: this._onTraversalEnd.bind(this)
442
+ });
443
+ }
444
+ _destroyTileHeaders(parentTile) {
445
+ this._destroySubtree(parentTile);
446
+ }
447
+ async _loadTile(tile) {
448
+ let loaded;
449
+ try {
450
+ this._onStartTileLoading();
451
+ loaded = await tile.loadContent();
452
+ } catch (error) {
453
+ this._onTileLoadError(tile, error instanceof Error ? error : new Error('load failed'));
454
+ } finally {
455
+ this._onEndTileLoading();
456
+ this._onTileLoad(tile, loaded);
457
+ }
458
+ }
459
+ _onTileLoadError(tile, error) {
460
+ this.stats.get(TILES_LOAD_FAILED).incrementCount();
461
+ const message = error.message || error.toString();
462
+ const url = tile.url;
463
+ console.error("A 3D tile failed to load: ".concat(tile.url, " ").concat(message));
464
+ this.options.onTileError(tile, message, url);
465
+ }
466
+ _onTileLoad(tile, loaded) {
467
+ if (!loaded) {
468
+ return;
469
+ }
470
+ if (this.type === TILESET_TYPE.I3S) {
471
+ var _this$tileset, _this$tileset$nodePag;
472
+ const nodesInNodePages = ((_this$tileset = this.tileset) === null || _this$tileset === void 0 ? void 0 : (_this$tileset$nodePag = _this$tileset.nodePagesTile) === null || _this$tileset$nodePag === void 0 ? void 0 : _this$tileset$nodePag.nodesInNodePages) || 0;
473
+ this.stats.get(TILES_TOTAL).reset();
474
+ this.stats.get(TILES_TOTAL).addCount(nodesInNodePages);
475
+ }
476
+ if (tile && tile.content) {
477
+ calculateTransformProps(tile, tile.content);
478
+ }
479
+ this.updateContentTypes(tile);
480
+ this._addTileToCache(tile);
481
+ this.options.onTileLoad(tile);
482
+ }
483
+ updateContentTypes(tile) {
484
+ if (this.type === TILESET_TYPE.I3S) {
485
+ if (tile.header.isDracoGeometry) {
486
+ this.contentFormats.draco = true;
487
+ }
488
+ switch (tile.header.textureFormat) {
489
+ case 'dds':
490
+ this.contentFormats.dds = true;
491
+ break;
492
+ case 'ktx2':
493
+ this.contentFormats.ktx2 = true;
494
+ break;
495
+ default:
496
+ }
497
+ } else if (this.type === TILESET_TYPE.TILES3D) {
498
+ var _tile$content;
499
+ const {
500
+ extensionsRemoved = []
501
+ } = ((_tile$content = tile.content) === null || _tile$content === void 0 ? void 0 : _tile$content.gltf) || {};
502
+ if (extensionsRemoved.includes('KHR_draco_mesh_compression')) {
503
+ this.contentFormats.draco = true;
504
+ }
505
+ if (extensionsRemoved.includes('EXT_meshopt_compression')) {
506
+ this.contentFormats.meshopt = true;
507
+ }
508
+ if (extensionsRemoved.includes('KHR_texture_basisu')) {
509
+ this.contentFormats.ktx2 = true;
510
+ }
511
+ }
512
+ }
513
+ _onStartTileLoading() {
514
+ this._pendingCount++;
515
+ this.stats.get(TILES_LOADING).incrementCount();
516
+ }
517
+ _onEndTileLoading() {
518
+ this._pendingCount--;
519
+ this.stats.get(TILES_LOADING).decrementCount();
520
+ }
521
+ _addTileToCache(tile) {
522
+ this._cache.add(this, tile, tileset => tileset._updateCacheStats(tile));
523
+ }
524
+ _updateCacheStats(tile) {
525
+ this.stats.get(TILES_LOADED).incrementCount();
526
+ this.stats.get(TILES_IN_MEMORY).incrementCount();
527
+ this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;
528
+ this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
529
+ }
530
+ _unloadTile(tile) {
531
+ this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;
532
+ this.stats.get(TILES_IN_MEMORY).decrementCount();
533
+ this.stats.get(TILES_UNLOADED).incrementCount();
534
+ this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
535
+ this.options.onTileUnload(tile);
536
+ tile.unloadContent();
537
+ }
538
+ _destroy() {
539
+ const stack = [];
540
+ if (this.root) {
541
+ stack.push(this.root);
542
+ }
543
+ while (stack.length > 0) {
544
+ const tile = stack.pop();
545
+ for (const child of tile.children) {
546
+ stack.push(child);
547
+ }
548
+ this._destroyTile(tile);
549
+ }
550
+ this.root = null;
551
+ }
552
+ _destroySubtree(tile) {
553
+ const root = tile;
554
+ const stack = [];
555
+ stack.push(root);
556
+ while (stack.length > 0) {
557
+ tile = stack.pop();
558
+ for (const child of tile.children) {
559
+ stack.push(child);
560
+ }
561
+ if (tile !== root) {
562
+ this._destroyTile(tile);
563
+ }
564
+ }
565
+ root.children = [];
566
+ }
567
+ _destroyTile(tile) {
568
+ this._cache.unloadTile(this, tile);
569
+ this._unloadTile(tile);
570
+ tile.destroy();
571
+ }
572
+ _initializeTiles3DTileset(tilesetJson) {
573
+ if (tilesetJson.queryString) {
574
+ const searchParams = new URLSearchParams(tilesetJson.queryString);
575
+ const queryParams = Object.fromEntries(searchParams.entries());
576
+ this._queryParams = {
577
+ ...this._queryParams,
578
+ ...queryParams
579
+ };
580
+ }
581
+ this.asset = tilesetJson.asset;
582
+ if (!this.asset) {
583
+ throw new Error('Tileset must have an asset property.');
584
+ }
585
+ if (this.asset.version !== '0.0' && this.asset.version !== '1.0' && this.asset.version !== '1.1') {
586
+ throw new Error('The tileset must be 3D Tiles version 0.0 or 1.0.');
587
+ }
588
+ if ('tilesetVersion' in this.asset) {
589
+ this._queryParams.v = this.asset.tilesetVersion;
590
+ }
591
+ this.credits = {
592
+ attributions: this.options.attributions || []
593
+ };
594
+ this.description = this.options.description || '';
595
+ this.properties = tilesetJson.properties;
596
+ this.geometricError = tilesetJson.geometricError;
597
+ this._extensionsUsed = tilesetJson.extensionsUsed || [];
598
+ this.extras = tilesetJson.extras;
599
+ }
600
+ _initializeI3STileset() {
601
+ if (this.loadOptions.i3s && 'token' in this.loadOptions.i3s) {
602
+ this._queryParams.token = this.loadOptions.i3s.token;
603
+ }
604
+ }
605
+ }
606
+ //# sourceMappingURL=tileset-3d.js.map