@loaders.gl/tiles 3.2.12 → 3.3.0-alpha.10

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 (106) hide show
  1. package/dist/dist.min.js +951 -1387
  2. package/dist/es5/bundle.js +0 -1
  3. package/dist/es5/bundle.js.map +1 -1
  4. package/dist/es5/constants.js +2 -1
  5. package/dist/es5/constants.js.map +1 -1
  6. package/dist/es5/index.js +26 -36
  7. package/dist/es5/index.js.map +1 -1
  8. package/dist/es5/tileset/helpers/3d-tiles-options.js +0 -1
  9. package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -1
  10. package/dist/es5/tileset/helpers/bounding-volume.js +7 -26
  11. package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -1
  12. package/dist/es5/tileset/helpers/frame-state.js +22 -42
  13. package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
  14. package/dist/es5/tileset/helpers/i3s-lod.js +0 -13
  15. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
  16. package/dist/es5/tileset/helpers/tiles-3d-lod.js +7 -16
  17. package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -1
  18. package/dist/es5/tileset/helpers/transform-utils.js +2 -11
  19. package/dist/es5/tileset/helpers/transform-utils.js.map +1 -1
  20. package/dist/es5/tileset/helpers/zoom.js +6 -16
  21. package/dist/es5/tileset/helpers/zoom.js.map +1 -1
  22. package/dist/es5/tileset/tile-3d.js +119 -96
  23. package/dist/es5/tileset/tile-3d.js.map +1 -1
  24. package/dist/es5/tileset/tileset-3d.js +119 -185
  25. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  26. package/dist/es5/tileset/tileset-cache.js +1 -14
  27. package/dist/es5/tileset/tileset-cache.js.map +1 -1
  28. package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js +8 -13
  29. package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -1
  30. package/dist/es5/tileset/traversers/i3s-tile-manager.js +20 -24
  31. package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
  32. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +8 -50
  33. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  34. package/dist/es5/tileset/traversers/tileset-3d-traverser.js +0 -22
  35. package/dist/es5/tileset/traversers/tileset-3d-traverser.js.map +1 -1
  36. package/dist/es5/tileset/traversers/tileset-traverser.js +53 -76
  37. package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
  38. package/dist/es5/types.js.map +1 -1
  39. package/dist/es5/utils/doubly-linked-list-node.js +3 -7
  40. package/dist/es5/utils/doubly-linked-list-node.js.map +1 -1
  41. package/dist/es5/utils/doubly-linked-list.js +9 -17
  42. package/dist/es5/utils/doubly-linked-list.js.map +1 -1
  43. package/dist/es5/utils/managed-array.js +29 -30
  44. package/dist/es5/utils/managed-array.js.map +1 -1
  45. package/dist/esm/bundle.js +1 -1
  46. package/dist/esm/bundle.js.map +1 -1
  47. package/dist/esm/constants.js +3 -0
  48. package/dist/esm/constants.js.map +1 -1
  49. package/dist/esm/index.js.map +1 -1
  50. package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -1
  51. package/dist/esm/tileset/helpers/bounding-volume.js +4 -10
  52. package/dist/esm/tileset/helpers/bounding-volume.js.map +1 -1
  53. package/dist/esm/tileset/helpers/frame-state.js +16 -16
  54. package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
  55. package/dist/esm/tileset/helpers/i3s-lod.js +4 -4
  56. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
  57. package/dist/esm/tileset/helpers/tiles-3d-lod.js +11 -8
  58. package/dist/esm/tileset/helpers/tiles-3d-lod.js.map +1 -1
  59. package/dist/esm/tileset/helpers/transform-utils.js +1 -3
  60. package/dist/esm/tileset/helpers/transform-utils.js.map +1 -1
  61. package/dist/esm/tileset/helpers/zoom.js +3 -2
  62. package/dist/esm/tileset/helpers/zoom.js.map +1 -1
  63. package/dist/esm/tileset/tile-3d.js +55 -108
  64. package/dist/esm/tileset/tile-3d.js.map +1 -1
  65. package/dist/esm/tileset/tileset-3d.js +58 -154
  66. package/dist/esm/tileset/tileset-3d.js.map +1 -1
  67. package/dist/esm/tileset/tileset-cache.js +2 -18
  68. package/dist/esm/tileset/tileset-cache.js.map +1 -1
  69. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +0 -5
  70. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -1
  71. package/dist/esm/tileset/traversers/i3s-tile-manager.js +2 -4
  72. package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
  73. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +5 -19
  74. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  75. package/dist/esm/tileset/traversers/tileset-3d-traverser.js +2 -9
  76. package/dist/esm/tileset/traversers/tileset-3d-traverser.js.map +1 -1
  77. package/dist/esm/tileset/traversers/tileset-traverser.js +18 -57
  78. package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
  79. package/dist/esm/types.js.map +1 -1
  80. package/dist/esm/utils/doubly-linked-list-node.js +1 -4
  81. package/dist/esm/utils/doubly-linked-list-node.js.map +1 -1
  82. package/dist/esm/utils/doubly-linked-list.js +2 -11
  83. package/dist/esm/utils/doubly-linked-list.js.map +1 -1
  84. package/dist/esm/utils/managed-array.js +4 -22
  85. package/dist/esm/utils/managed-array.js.map +1 -1
  86. package/dist/tileset/helpers/frame-state.d.ts +1 -1
  87. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  88. package/dist/tileset/helpers/frame-state.js +1 -1
  89. package/dist/tileset/tile-3d.d.ts +24 -5
  90. package/dist/tileset/tile-3d.d.ts.map +1 -1
  91. package/dist/tileset/tile-3d.js +27 -2
  92. package/dist/tileset/tileset-3d.d.ts +14 -2
  93. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  94. package/dist/tileset/tileset-3d.js +35 -0
  95. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
  96. package/dist/tileset/traversers/i3s-tileset-traverser.js +5 -6
  97. package/dist/tileset/traversers/tileset-traverser.d.ts +2 -2
  98. package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
  99. package/dist/tileset/traversers/tileset-traverser.js +3 -3
  100. package/dist/types.d.ts +3 -3
  101. package/dist/types.d.ts.map +1 -1
  102. package/package.json +4 -4
  103. package/src/tileset/helpers/frame-state.ts +1 -1
  104. package/src/tileset/tile-3d.ts +31 -4
  105. package/src/tileset/tileset-3d.ts +36 -0
  106. package/src/tileset/traversers/i3s-tileset-traverser.ts +1 -2
@@ -1,32 +1,20 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.DEFAULT_PROPS = void 0;
9
-
10
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
11
  var _managedArray = _interopRequireDefault(require("../../utils/managed-array"));
17
-
18
12
  var _constants = require("../../constants");
19
-
20
13
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
21
-
22
14
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
-
24
15
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
-
26
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
27
-
28
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
29
-
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
30
18
  var DEFAULT_PROPS = {
31
19
  loadSiblings: false,
32
20
  skipLevelOfDetail: false,
@@ -37,7 +25,6 @@ var DEFAULT_PROPS = {
37
25
  basePath: ''
38
26
  };
39
27
  exports.DEFAULT_PROPS = DEFAULT_PROPS;
40
-
41
28
  var TilesetTraverser = function () {
42
29
  function TilesetTraverser(options) {
43
30
  (0, _classCallCheck2.default)(this, TilesetTraverser);
@@ -54,8 +41,11 @@ var TilesetTraverser = function () {
54
41
  this.options = _objectSpread(_objectSpread({}, DEFAULT_PROPS), options);
55
42
  this._traversalStack = new _managedArray.default();
56
43
  this._emptyTraversalStack = new _managedArray.default();
44
+
57
45
  this._frameNumber = null;
46
+
58
47
  this.root = null;
48
+
59
49
  this.selectedTiles = {};
60
50
  this.requestedTiles = {};
61
51
  this.emptyTiles = {};
@@ -66,12 +56,16 @@ var TilesetTraverser = function () {
66
56
  value: function traversalFinished(frameState) {
67
57
  return true;
68
58
  }
59
+
69
60
  }, {
70
61
  key: "traverse",
71
- value: function traverse(root, frameState, options) {
62
+ value:
63
+ function traverse(root, frameState, options) {
72
64
  this.root = root;
73
65
  this.options = _objectSpread(_objectSpread({}, this.options), options);
66
+
74
67
  this.reset();
68
+
75
69
  this.updateTile(root, frameState);
76
70
  this._frameNumber = frameState.frameNumber;
77
71
  this.executeTraversal(root, frameState);
@@ -82,22 +76,21 @@ var TilesetTraverser = function () {
82
76
  this.requestedTiles = {};
83
77
  this.selectedTiles = {};
84
78
  this.emptyTiles = {};
85
-
86
79
  this._traversalStack.reset();
87
-
88
80
  this._emptyTraversalStack.reset();
89
81
  }
82
+
90
83
  }, {
91
84
  key: "executeTraversal",
92
- value: function executeTraversal(root, frameState) {
85
+ value:
86
+ function executeTraversal(root, frameState) {
93
87
  var stack = this._traversalStack;
94
88
  root._selectionDepth = 1;
95
89
  stack.push(root);
96
-
97
90
  while (stack.length > 0) {
98
91
  var tile = stack.pop();
99
- var shouldRefine = false;
100
92
 
93
+ var shouldRefine = false;
101
94
  if (this.canTraverse(tile, frameState)) {
102
95
  this.updateChildTiles(tile, frameState);
103
96
  shouldRefine = this.updateAndPushChildren(tile, frameState, stack, tile.hasRenderContent ? tile._selectionDepth + 1 : tile._selectionDepth);
@@ -106,31 +99,28 @@ var TilesetTraverser = function () {
106
99
  var parent = tile.parent;
107
100
  var parentRefines = Boolean(!parent || parent._shouldRefine);
108
101
  var stoppedRefining = !shouldRefine;
109
-
110
102
  if (!tile.hasRenderContent) {
111
103
  this.emptyTiles[tile.id] = tile;
112
104
  this.loadTile(tile, frameState);
113
-
114
105
  if (stoppedRefining) {
115
106
  this.selectTile(tile, frameState);
116
107
  }
117
108
  } else if (tile.refine === _constants.TILE_REFINEMENT.ADD) {
118
109
  this.loadTile(tile, frameState);
119
110
  this.selectTile(tile, frameState);
111
+
120
112
  } else if (tile.refine === _constants.TILE_REFINEMENT.REPLACE) {
121
113
  this.loadTile(tile, frameState);
122
-
123
114
  if (stoppedRefining) {
124
115
  this.selectTile(tile, frameState);
125
116
  }
126
117
  }
127
118
 
128
119
  this.touchTile(tile, frameState);
120
+
129
121
  tile._shouldRefine = shouldRefine && parentRefines;
130
122
  }
131
-
132
123
  var newTime = new Date().getTime();
133
-
134
124
  if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {
135
125
  this.lastUpdate = newTime;
136
126
  this.options.onTraversalEnd(frameState);
@@ -140,10 +130,8 @@ var TilesetTraverser = function () {
140
130
  key: "updateChildTiles",
141
131
  value: function updateChildTiles(tile, frameState) {
142
132
  var children = tile.children;
143
-
144
133
  var _iterator = _createForOfIteratorHelper(children),
145
- _step;
146
-
134
+ _step;
147
135
  try {
148
136
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
149
137
  var child = _step.value;
@@ -154,44 +142,41 @@ var TilesetTraverser = function () {
154
142
  } finally {
155
143
  _iterator.f();
156
144
  }
157
-
158
145
  return true;
159
146
  }
147
+
160
148
  }, {
161
149
  key: "updateAndPushChildren",
162
- value: function updateAndPushChildren(tile, frameState, stack, depth) {
150
+ value:
151
+ function updateAndPushChildren(tile, frameState, stack, depth) {
163
152
  var _this$options = this.options,
164
- loadSiblings = _this$options.loadSiblings,
165
- skipLevelOfDetail = _this$options.skipLevelOfDetail;
153
+ loadSiblings = _this$options.loadSiblings,
154
+ skipLevelOfDetail = _this$options.skipLevelOfDetail;
166
155
  var children = tile.children;
156
+
167
157
  children.sort(this.compareDistanceToCamera.bind(this));
158
+
168
159
  var checkRefines = tile.refine === _constants.TILE_REFINEMENT.REPLACE && tile.hasRenderContent && !skipLevelOfDetail;
169
160
  var hasVisibleChild = false;
170
161
  var refines = true;
171
-
172
162
  var _iterator2 = _createForOfIteratorHelper(children),
173
- _step2;
174
-
163
+ _step2;
175
164
  try {
176
165
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
177
166
  var child = _step2.value;
178
167
  child._selectionDepth = depth;
179
-
180
168
  if (child.isVisibleAndInRequestVolume) {
181
169
  if (stack.find(child)) {
182
170
  stack.delete(child);
183
171
  }
184
-
185
172
  stack.push(child);
186
173
  hasVisibleChild = true;
187
174
  } else if (checkRefines || loadSiblings) {
188
175
  this.loadTile(child, frameState);
189
176
  this.touchTile(child, frameState);
190
177
  }
191
-
192
178
  if (checkRefines) {
193
179
  var childRefines = void 0;
194
-
195
180
  if (!child._inRequestVolume) {
196
181
  childRefines = false;
197
182
  } else if (!child.hasRenderContent) {
@@ -199,9 +184,7 @@ var TilesetTraverser = function () {
199
184
  } else {
200
185
  childRefines = child.contentAvailable;
201
186
  }
202
-
203
187
  refines = refines && childRefines;
204
-
205
188
  if (!refines) {
206
189
  return false;
207
190
  }
@@ -212,48 +195,54 @@ var TilesetTraverser = function () {
212
195
  } finally {
213
196
  _iterator2.f();
214
197
  }
215
-
216
198
  if (!hasVisibleChild) {
217
199
  refines = false;
218
200
  }
219
-
220
201
  return refines;
221
202
  }
222
203
  }, {
223
204
  key: "updateTile",
224
- value: function updateTile(tile, frameState) {
205
+ value:
206
+
207
+ function updateTile(tile, frameState) {
225
208
  this.updateTileVisibility(tile, frameState);
226
209
  }
210
+
227
211
  }, {
228
212
  key: "selectTile",
229
- value: function selectTile(tile, frameState) {
213
+ value:
214
+ function selectTile(tile, frameState) {
230
215
  if (this.shouldSelectTile(tile)) {
231
216
  tile._selectedFrame = frameState.frameNumber;
232
217
  this.selectedTiles[tile.id] = tile;
233
218
  }
234
219
  }
220
+
235
221
  }, {
236
222
  key: "loadTile",
237
- value: function loadTile(tile, frameState) {
223
+ value:
224
+ function loadTile(tile, frameState) {
238
225
  if (this.shouldLoadTile(tile)) {
239
226
  tile._requestedFrame = frameState.frameNumber;
240
227
  tile._priority = tile._getPriority();
241
228
  this.requestedTiles[tile.id] = tile;
242
229
  }
243
230
  }
231
+
244
232
  }, {
245
233
  key: "touchTile",
246
- value: function touchTile(tile, frameState) {
234
+ value:
235
+ function touchTile(tile, frameState) {
247
236
  tile.tileset._cache.touch(tile);
248
-
249
237
  tile._touchedFrame = frameState.frameNumber;
250
238
  }
239
+
251
240
  }, {
252
241
  key: "canTraverse",
253
- value: function canTraverse(tile, frameState) {
242
+ value:
243
+ function canTraverse(tile, frameState) {
254
244
  var useParentMetric = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
255
245
  var ignoreVisibility = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
256
-
257
246
  if (!tile.hasChildren) {
258
247
  return false;
259
248
  }
@@ -261,11 +250,9 @@ var TilesetTraverser = function () {
261
250
  if (tile.hasTilesetContent) {
262
251
  return !tile.contentExpired;
263
252
  }
264
-
265
253
  if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {
266
254
  return false;
267
255
  }
268
-
269
256
  return this.shouldRefine(tile, frameState, useParentMetric);
270
257
  }
271
258
  }, {
@@ -278,26 +265,24 @@ var TilesetTraverser = function () {
278
265
  value: function shouldSelectTile(tile) {
279
266
  return tile.contentAvailable && !this.options.skipLevelOfDetail;
280
267
  }
268
+
281
269
  }, {
282
270
  key: "shouldRefine",
283
- value: function shouldRefine(tile, frameState, useParentMetric) {
271
+ value:
272
+ function shouldRefine(tile, frameState, useParentMetric) {
284
273
  var screenSpaceError = tile._screenSpaceError;
285
-
286
274
  if (useParentMetric) {
287
275
  screenSpaceError = tile.getScreenSpaceError(frameState, true);
288
276
  }
289
-
290
277
  return screenSpaceError > this.options.maximumScreenSpaceError;
291
278
  }
292
279
  }, {
293
280
  key: "updateTileVisibility",
294
281
  value: function updateTileVisibility(tile, frameState) {
295
282
  var viewportIds = [];
296
-
297
283
  if (this.options.viewportTraversersMap) {
298
284
  for (var _key in this.options.viewportTraversersMap) {
299
285
  var value = this.options.viewportTraversersMap[_key];
300
-
301
286
  if (value === frameState.viewport.id) {
302
287
  viewportIds.push(_key);
303
288
  }
@@ -305,22 +290,22 @@ var TilesetTraverser = function () {
305
290
  } else {
306
291
  viewportIds.push(frameState.viewport.id);
307
292
  }
308
-
309
293
  tile.updateVisibility(frameState, viewportIds);
310
294
  }
295
+
311
296
  }, {
312
297
  key: "compareDistanceToCamera",
313
- value: function compareDistanceToCamera(b, a) {
298
+ value:
299
+
300
+ function compareDistanceToCamera(b, a) {
314
301
  return b._distanceToCamera - a._distanceToCamera;
315
302
  }
316
303
  }, {
317
304
  key: "anyChildrenVisible",
318
305
  value: function anyChildrenVisible(tile, frameState) {
319
306
  var anyVisible = false;
320
-
321
307
  var _iterator3 = _createForOfIteratorHelper(tile.children),
322
- _step3;
323
-
308
+ _step3;
324
309
  try {
325
310
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
326
311
  var child = _step3.value;
@@ -332,41 +317,35 @@ var TilesetTraverser = function () {
332
317
  } finally {
333
318
  _iterator3.f();
334
319
  }
335
-
336
320
  return anyVisible;
337
321
  }
322
+
338
323
  }, {
339
324
  key: "executeEmptyTraversal",
340
- value: function executeEmptyTraversal(root, frameState) {
325
+ value:
326
+ function executeEmptyTraversal(root, frameState) {
341
327
  var allDescendantsLoaded = true;
342
328
  var stack = this._emptyTraversalStack;
343
329
  stack.push(root);
344
-
345
330
  while (stack.length > 0 && allDescendantsLoaded) {
346
331
  var tile = stack.pop();
347
332
  this.updateTile(tile, frameState);
348
-
349
333
  if (!tile.isVisibleAndInRequestVolume) {
350
334
  this.loadTile(tile, frameState);
351
335
  }
352
-
353
336
  this.touchTile(tile, frameState);
354
- var traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, true);
355
337
 
338
+ var traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, true);
356
339
  if (traverse) {
357
340
  var children = tile.children;
358
-
359
341
  var _iterator4 = _createForOfIteratorHelper(children),
360
- _step4;
361
-
342
+ _step4;
362
343
  try {
363
344
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
364
345
  var child = _step4.value;
365
-
366
346
  if (stack.find(child)) {
367
347
  stack.delete(child);
368
348
  }
369
-
370
349
  stack.push(child);
371
350
  }
372
351
  } catch (err) {
@@ -378,12 +357,10 @@ var TilesetTraverser = function () {
378
357
  allDescendantsLoaded = false;
379
358
  }
380
359
  }
381
-
382
360
  return allDescendantsLoaded;
383
361
  }
384
362
  }]);
385
363
  return TilesetTraverser;
386
364
  }();
387
-
388
365
  exports.default = TilesetTraverser;
389
366
  //# sourceMappingURL=tileset-traverser.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/tileset/traversers/tileset-traverser.ts"],"names":["DEFAULT_PROPS","loadSiblings","skipLevelOfDetail","maximumScreenSpaceError","updateTransforms","onTraversalEnd","viewportTraversersMap","basePath","TilesetTraverser","options","Date","getTime","_traversalStack","ManagedArray","_emptyTraversalStack","_frameNumber","root","selectedTiles","requestedTiles","emptyTiles","frameState","reset","updateTile","frameNumber","executeTraversal","stack","_selectionDepth","push","length","tile","pop","shouldRefine","canTraverse","updateChildTiles","updateAndPushChildren","hasRenderContent","parent","parentRefines","Boolean","_shouldRefine","stoppedRefining","id","loadTile","selectTile","refine","TILE_REFINEMENT","ADD","REPLACE","touchTile","newTime","traversalFinished","lastUpdate","updateDebounceTime","children","child","depth","sort","compareDistanceToCamera","bind","checkRefines","hasVisibleChild","refines","isVisibleAndInRequestVolume","find","delete","childRefines","_inRequestVolume","executeEmptyTraversal","contentAvailable","updateTileVisibility","shouldSelectTile","_selectedFrame","shouldLoadTile","_requestedFrame","_priority","_getPriority","tileset","_cache","touch","_touchedFrame","useParentMetric","ignoreVisibility","hasChildren","hasTilesetContent","contentExpired","hasUnloadedContent","screenSpaceError","_screenSpaceError","getScreenSpaceError","viewportIds","key","value","viewport","updateVisibility","b","a","_distanceToCamera","anyVisible","allDescendantsLoaded","traverse"],"mappings":"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","sourcesContent":["import ManagedArray from '../../utils/managed-array';\nimport {TILE_REFINEMENT} from '../../constants';\nimport {FrameState} from '../helpers/frame-state';\n\nexport type TilesetTraverserProps = {\n loadSiblings?: boolean;\n skipLevelOfDetail?: boolean;\n maximumScreenSpaceError?: number;\n onTraversalEnd?: (frameState) => any;\n viewportTraversersMap?: {[key: string]: any};\n basePath?: string;\n};\n\nexport type Props = {\n loadSiblings: boolean;\n skipLevelOfDetail: boolean;\n updateTransforms: boolean;\n maximumScreenSpaceError: number;\n onTraversalEnd: (frameState) => any;\n viewportTraversersMap: {[key: string]: any};\n basePath: string;\n};\n\nexport const DEFAULT_PROPS: Props = {\n loadSiblings: false,\n skipLevelOfDetail: false,\n maximumScreenSpaceError: 2,\n updateTransforms: true,\n onTraversalEnd: () => {},\n viewportTraversersMap: {},\n basePath: ''\n};\n\nexport default class TilesetTraverser {\n options: Props;\n\n root: any;\n requestedTiles: object;\n selectedTiles: object;\n emptyTiles: object;\n\n protected lastUpdate: number = new Date().getTime();\n protected readonly updateDebounceTime = 1000;\n protected _traversalStack: ManagedArray;\n protected _emptyTraversalStack: ManagedArray;\n protected _frameNumber: number | null;\n\n protected traversalFinished(frameState: FrameState): boolean {\n return true;\n }\n\n // TODO nested props\n constructor(options: TilesetTraverserProps) {\n this.options = {...DEFAULT_PROPS, ...options};\n // TRAVERSAL\n // temporary storage to hold the traversed tiles during a traversal\n this._traversalStack = new ManagedArray();\n this._emptyTraversalStack = new ManagedArray();\n\n // set in every traverse cycle\n this._frameNumber = null;\n\n // fulfill in traverse call\n this.root = null;\n\n // RESULT\n // tiles should be rendered\n this.selectedTiles = {};\n // tiles should be loaded from server\n this.requestedTiles = {};\n // tiles does not have render content\n this.emptyTiles = {};\n }\n\n // tiles should be visible\n traverse(root, frameState, options) {\n this.root = root; // for root screen space error\n this.options = {...this.options, ...options};\n\n // reset result\n this.reset();\n\n // update tile (visibility and expiration)\n this.updateTile(root, frameState);\n\n this._frameNumber = frameState.frameNumber;\n this.executeTraversal(root, frameState);\n }\n\n reset() {\n this.requestedTiles = {};\n this.selectedTiles = {};\n this.emptyTiles = {};\n this._traversalStack.reset();\n this._emptyTraversalStack.reset();\n }\n\n // execute traverse\n // Depth-first traversal that traverses all visible tiles and marks tiles for selection.\n // If skipLevelOfDetail is off then a tile does not refine until all children are loaded.\n // This is the traditional replacement refinement approach and is called the base traversal.\n // Tiles that have a greater screen space error than the base screen space error are part of the base traversal,\n // all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree\n // and rendering children and parent tiles simultaneously.\n /* eslint-disable-next-line complexity, max-statements */\n executeTraversal(root, frameState: FrameState) {\n // stack to store traversed tiles, only visible tiles should be added to stack\n // visible: visible in the current view frustum\n const stack = this._traversalStack;\n root._selectionDepth = 1;\n\n stack.push(root);\n while (stack.length > 0) {\n // 1. pop tile\n const tile = stack.pop();\n\n // 2. check if tile needs to be refine, needs refine if a tile's LoD is not sufficient and tile has available children (available content)\n let shouldRefine = false;\n if (this.canTraverse(tile, frameState)) {\n this.updateChildTiles(tile, frameState);\n shouldRefine = this.updateAndPushChildren(\n tile,\n frameState,\n stack,\n tile.hasRenderContent ? tile._selectionDepth + 1 : tile._selectionDepth\n );\n }\n\n // 3. decide if should render (select) this tile\n // - tile does not have render content\n // - tile has render content and tile is `add` type (pointcloud)\n // - tile has render content and tile is `replace` type (photogrammetry) and can't refine any further\n const parent = tile.parent;\n const parentRefines = Boolean(!parent || parent._shouldRefine);\n const stoppedRefining = !shouldRefine;\n\n if (!tile.hasRenderContent) {\n this.emptyTiles[tile.id] = tile;\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n // additive tiles\n } else if (tile.refine === TILE_REFINEMENT.ADD) {\n // Additive tiles are always loaded and selected\n this.loadTile(tile, frameState);\n this.selectTile(tile, frameState);\n\n // replace tiles\n } else if (tile.refine === TILE_REFINEMENT.REPLACE) {\n // Always load tiles in the base traversal\n // Select tiles that can't refine further\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n }\n\n // 3. update cache, most recent touched tiles have higher priority to be fetched from server\n this.touchTile(tile, frameState);\n\n // 4. update tile refine prop and parent refinement status to trickle down to the descendants\n tile._shouldRefine = shouldRefine && parentRefines;\n }\n\n const newTime = new Date().getTime();\n if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {\n this.lastUpdate = newTime;\n this.options.onTraversalEnd(frameState);\n }\n }\n\n updateChildTiles(tile, frameState) {\n const children = tile.children;\n for (const child of children) {\n this.updateTile(child, frameState);\n }\n return true;\n }\n\n /* eslint-disable complexity, max-statements */\n updateAndPushChildren(tile, frameState, stack, depth) {\n const {loadSiblings, skipLevelOfDetail} = this.options;\n\n const children = tile.children;\n\n // sort children tiles\n children.sort(this.compareDistanceToCamera.bind(this));\n\n // For traditional replacement refinement only refine if all children are loaded.\n // Empty tiles are exempt since it looks better if children stream in as they are loaded to fill the empty space.\n const checkRefines =\n tile.refine === TILE_REFINEMENT.REPLACE && tile.hasRenderContent && !skipLevelOfDetail;\n\n let hasVisibleChild = false;\n let refines = true;\n\n for (const child of children) {\n child._selectionDepth = depth;\n if (child.isVisibleAndInRequestVolume) {\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n hasVisibleChild = true;\n } else if (checkRefines || loadSiblings) {\n // Keep non-visible children loaded since they are still needed before the parent can refine.\n // Or loadSiblings is true so always load tiles regardless of visibility.\n this.loadTile(child, frameState);\n this.touchTile(child, frameState);\n }\n\n if (checkRefines) {\n let childRefines;\n if (!child._inRequestVolume) {\n childRefines = false;\n } else if (!child.hasRenderContent) {\n childRefines = this.executeEmptyTraversal(child, frameState);\n } else {\n childRefines = child.contentAvailable;\n }\n refines = refines && childRefines;\n\n if (!refines) {\n return false;\n }\n }\n }\n\n if (!hasVisibleChild) {\n refines = false;\n }\n return refines;\n }\n /* eslint-enable complexity, max-statements */\n\n updateTile(tile, frameState) {\n this.updateTileVisibility(tile, frameState);\n }\n\n // tile to render in the browser\n selectTile(tile, frameState) {\n if (this.shouldSelectTile(tile)) {\n // The tile can be selected right away and does not require traverseAndSelect\n tile._selectedFrame = frameState.frameNumber;\n this.selectedTiles[tile.id] = tile;\n }\n }\n\n // tile to load from server\n loadTile(tile, frameState) {\n if (this.shouldLoadTile(tile)) {\n tile._requestedFrame = frameState.frameNumber;\n tile._priority = tile._getPriority();\n this.requestedTiles[tile.id] = tile;\n }\n }\n\n // cache tile\n touchTile(tile, frameState) {\n tile.tileset._cache.touch(tile);\n tile._touchedFrame = frameState.frameNumber;\n }\n\n // tile should be visible\n // tile should have children\n // tile LoD (level of detail) is not sufficient under current viewport\n canTraverse(tile, frameState, useParentMetric = false, ignoreVisibility = false) {\n if (!tile.hasChildren) {\n return false;\n }\n\n // cesium specific\n if (tile.hasTilesetContent) {\n // Traverse external this to visit its root tile\n // Don't traverse if the subtree is expired because it will be destroyed\n return !tile.contentExpired;\n }\n\n if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {\n return false;\n }\n\n return this.shouldRefine(tile, frameState, useParentMetric);\n }\n\n shouldLoadTile(tile) {\n // if request tile is in current frame\n // and has unexpired render content\n return tile.hasUnloadedContent || tile.contentExpired;\n }\n\n shouldSelectTile(tile) {\n // if select tile is in current frame\n // and content available\n return tile.contentAvailable && !this.options.skipLevelOfDetail;\n }\n\n // Decide if tile LoD (level of detail) is not sufficient under current viewport\n shouldRefine(tile, frameState, useParentMetric) {\n let screenSpaceError = tile._screenSpaceError;\n if (useParentMetric) {\n screenSpaceError = tile.getScreenSpaceError(frameState, true);\n }\n\n return screenSpaceError > this.options.maximumScreenSpaceError;\n }\n\n updateTileVisibility(tile, frameState) {\n const viewportIds: string[] = [];\n if (this.options.viewportTraversersMap) {\n for (const key in this.options.viewportTraversersMap) {\n const value = this.options.viewportTraversersMap[key];\n if (value === frameState.viewport.id) {\n viewportIds.push(key);\n }\n }\n } else {\n viewportIds.push(frameState.viewport.id);\n }\n tile.updateVisibility(frameState, viewportIds);\n }\n\n // UTILITIES\n\n compareDistanceToCamera(b, a) {\n return b._distanceToCamera - a._distanceToCamera;\n }\n\n anyChildrenVisible(tile, frameState) {\n let anyVisible = false;\n for (const child of tile.children) {\n child.updateVisibility(frameState);\n anyVisible = anyVisible || child.isVisibleAndInRequestVolume;\n }\n return anyVisible;\n }\n\n // Depth-first traversal that checks if all nearest descendants with content are loaded.\n // Ignores visibility.\n executeEmptyTraversal(root, frameState) {\n let allDescendantsLoaded = true;\n const stack = this._emptyTraversalStack;\n\n stack.push(root);\n\n while (stack.length > 0 && allDescendantsLoaded) {\n const tile = stack.pop();\n\n this.updateTile(tile, frameState);\n\n if (!tile.isVisibleAndInRequestVolume) {\n // Load tiles that aren't visible since they are still needed for the parent to refine\n this.loadTile(tile, frameState);\n }\n\n this.touchTile(tile, frameState);\n\n // Only traverse if the tile is empty - traversal stop at descendants with content\n const traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, true);\n\n if (traverse) {\n const children = tile.children;\n for (const child of children) {\n // eslint-disable-next-line max-depth\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n }\n } else if (!tile.contentAvailable) {\n allDescendantsLoaded = false;\n }\n }\n\n return allDescendantsLoaded;\n }\n}\n\n// TODO\n// enable expiration\n// enable optimization hint\n"],"file":"tileset-traverser.js"}
1
+ {"version":3,"file":"tileset-traverser.js","names":["DEFAULT_PROPS","loadSiblings","skipLevelOfDetail","maximumScreenSpaceError","updateTransforms","onTraversalEnd","viewportTraversersMap","basePath","TilesetTraverser","options","Date","getTime","_traversalStack","ManagedArray","_emptyTraversalStack","_frameNumber","root","selectedTiles","requestedTiles","emptyTiles","frameState","reset","updateTile","frameNumber","executeTraversal","stack","_selectionDepth","push","length","tile","pop","shouldRefine","canTraverse","updateChildTiles","updateAndPushChildren","hasRenderContent","parent","parentRefines","Boolean","_shouldRefine","stoppedRefining","id","loadTile","selectTile","refine","TILE_REFINEMENT","ADD","REPLACE","touchTile","newTime","traversalFinished","lastUpdate","updateDebounceTime","children","child","depth","sort","compareDistanceToCamera","bind","checkRefines","hasVisibleChild","refines","isVisibleAndInRequestVolume","find","delete","childRefines","_inRequestVolume","executeEmptyTraversal","contentAvailable","updateTileVisibility","shouldSelectTile","_selectedFrame","shouldLoadTile","_requestedFrame","_priority","_getPriority","tileset","_cache","touch","_touchedFrame","useParentMetric","ignoreVisibility","hasChildren","hasTilesetContent","contentExpired","hasUnloadedContent","screenSpaceError","_screenSpaceError","getScreenSpaceError","viewportIds","key","value","viewport","updateVisibility","b","a","_distanceToCamera","anyVisible","allDescendantsLoaded","traverse"],"sources":["../../../../src/tileset/traversers/tileset-traverser.ts"],"sourcesContent":["import ManagedArray from '../../utils/managed-array';\nimport {TILE_REFINEMENT} from '../../constants';\nimport {FrameState} from '../helpers/frame-state';\n\nexport type TilesetTraverserProps = {\n loadSiblings?: boolean;\n skipLevelOfDetail?: boolean;\n maximumScreenSpaceError?: number;\n onTraversalEnd?: (frameState) => any;\n viewportTraversersMap?: {[key: string]: any};\n basePath?: string;\n};\n\nexport type Props = {\n loadSiblings: boolean;\n skipLevelOfDetail: boolean;\n updateTransforms: boolean;\n maximumScreenSpaceError: number;\n onTraversalEnd: (frameState) => any;\n viewportTraversersMap: {[key: string]: any};\n basePath: string;\n};\n\nexport const DEFAULT_PROPS: Props = {\n loadSiblings: false,\n skipLevelOfDetail: false,\n maximumScreenSpaceError: 2,\n updateTransforms: true,\n onTraversalEnd: () => {},\n viewportTraversersMap: {},\n basePath: ''\n};\n\nexport default class TilesetTraverser {\n options: Props;\n\n root: any;\n requestedTiles: object;\n selectedTiles: object;\n emptyTiles: object;\n\n protected lastUpdate: number = new Date().getTime();\n protected readonly updateDebounceTime = 1000;\n protected _traversalStack: ManagedArray;\n protected _emptyTraversalStack: ManagedArray;\n protected _frameNumber: number | null;\n\n protected traversalFinished(frameState: FrameState): boolean {\n return true;\n }\n\n // TODO nested props\n constructor(options: TilesetTraverserProps) {\n this.options = {...DEFAULT_PROPS, ...options};\n // TRAVERSAL\n // temporary storage to hold the traversed tiles during a traversal\n this._traversalStack = new ManagedArray();\n this._emptyTraversalStack = new ManagedArray();\n\n // set in every traverse cycle\n this._frameNumber = null;\n\n // fulfill in traverse call\n this.root = null;\n\n // RESULT\n // tiles should be rendered\n this.selectedTiles = {};\n // tiles should be loaded from server\n this.requestedTiles = {};\n // tiles does not have render content\n this.emptyTiles = {};\n }\n\n // tiles should be visible\n traverse(root, frameState, options) {\n this.root = root; // for root screen space error\n this.options = {...this.options, ...options};\n\n // reset result\n this.reset();\n\n // update tile (visibility and expiration)\n this.updateTile(root, frameState);\n\n this._frameNumber = frameState.frameNumber;\n this.executeTraversal(root, frameState);\n }\n\n reset() {\n this.requestedTiles = {};\n this.selectedTiles = {};\n this.emptyTiles = {};\n this._traversalStack.reset();\n this._emptyTraversalStack.reset();\n }\n\n // execute traverse\n // Depth-first traversal that traverses all visible tiles and marks tiles for selection.\n // If skipLevelOfDetail is off then a tile does not refine until all children are loaded.\n // This is the traditional replacement refinement approach and is called the base traversal.\n // Tiles that have a greater screen space error than the base screen space error are part of the base traversal,\n // all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree\n // and rendering children and parent tiles simultaneously.\n /* eslint-disable-next-line complexity, max-statements */\n executeTraversal(root, frameState: FrameState) {\n // stack to store traversed tiles, only visible tiles should be added to stack\n // visible: visible in the current view frustum\n const stack = this._traversalStack;\n root._selectionDepth = 1;\n\n stack.push(root);\n while (stack.length > 0) {\n // 1. pop tile\n const tile = stack.pop();\n\n // 2. check if tile needs to be refine, needs refine if a tile's LoD is not sufficient and tile has available children (available content)\n let shouldRefine = false;\n if (this.canTraverse(tile, frameState)) {\n this.updateChildTiles(tile, frameState);\n shouldRefine = this.updateAndPushChildren(\n tile,\n frameState,\n stack,\n tile.hasRenderContent ? tile._selectionDepth + 1 : tile._selectionDepth\n );\n }\n\n // 3. decide if should render (select) this tile\n // - tile does not have render content\n // - tile has render content and tile is `add` type (pointcloud)\n // - tile has render content and tile is `replace` type (photogrammetry) and can't refine any further\n const parent = tile.parent;\n const parentRefines = Boolean(!parent || parent._shouldRefine);\n const stoppedRefining = !shouldRefine;\n\n if (!tile.hasRenderContent) {\n this.emptyTiles[tile.id] = tile;\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n // additive tiles\n } else if (tile.refine === TILE_REFINEMENT.ADD) {\n // Additive tiles are always loaded and selected\n this.loadTile(tile, frameState);\n this.selectTile(tile, frameState);\n\n // replace tiles\n } else if (tile.refine === TILE_REFINEMENT.REPLACE) {\n // Always load tiles in the base traversal\n // Select tiles that can't refine further\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n }\n\n // 3. update cache, most recent touched tiles have higher priority to be fetched from server\n this.touchTile(tile, frameState);\n\n // 4. update tile refine prop and parent refinement status to trickle down to the descendants\n tile._shouldRefine = shouldRefine && parentRefines;\n }\n\n const newTime = new Date().getTime();\n if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {\n this.lastUpdate = newTime;\n this.options.onTraversalEnd(frameState);\n }\n }\n\n updateChildTiles(tile, frameState) {\n const children = tile.children;\n for (const child of children) {\n this.updateTile(child, frameState);\n }\n return true;\n }\n\n /* eslint-disable complexity, max-statements */\n updateAndPushChildren(tile, frameState, stack, depth) {\n const {loadSiblings, skipLevelOfDetail} = this.options;\n\n const children = tile.children;\n\n // sort children tiles\n children.sort(this.compareDistanceToCamera.bind(this));\n\n // For traditional replacement refinement only refine if all children are loaded.\n // Empty tiles are exempt since it looks better if children stream in as they are loaded to fill the empty space.\n const checkRefines =\n tile.refine === TILE_REFINEMENT.REPLACE && tile.hasRenderContent && !skipLevelOfDetail;\n\n let hasVisibleChild = false;\n let refines = true;\n\n for (const child of children) {\n child._selectionDepth = depth;\n if (child.isVisibleAndInRequestVolume) {\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n hasVisibleChild = true;\n } else if (checkRefines || loadSiblings) {\n // Keep non-visible children loaded since they are still needed before the parent can refine.\n // Or loadSiblings is true so always load tiles regardless of visibility.\n this.loadTile(child, frameState);\n this.touchTile(child, frameState);\n }\n\n if (checkRefines) {\n let childRefines;\n if (!child._inRequestVolume) {\n childRefines = false;\n } else if (!child.hasRenderContent) {\n childRefines = this.executeEmptyTraversal(child, frameState);\n } else {\n childRefines = child.contentAvailable;\n }\n refines = refines && childRefines;\n\n if (!refines) {\n return false;\n }\n }\n }\n\n if (!hasVisibleChild) {\n refines = false;\n }\n return refines;\n }\n /* eslint-enable complexity, max-statements */\n\n updateTile(tile, frameState) {\n this.updateTileVisibility(tile, frameState);\n }\n\n // tile to render in the browser\n selectTile(tile, frameState) {\n if (this.shouldSelectTile(tile)) {\n // The tile can be selected right away and does not require traverseAndSelect\n tile._selectedFrame = frameState.frameNumber;\n this.selectedTiles[tile.id] = tile;\n }\n }\n\n // tile to load from server\n loadTile(tile, frameState) {\n if (this.shouldLoadTile(tile)) {\n tile._requestedFrame = frameState.frameNumber;\n tile._priority = tile._getPriority();\n this.requestedTiles[tile.id] = tile;\n }\n }\n\n // cache tile\n touchTile(tile, frameState) {\n tile.tileset._cache.touch(tile);\n tile._touchedFrame = frameState.frameNumber;\n }\n\n // tile should be visible\n // tile should have children\n // tile LoD (level of detail) is not sufficient under current viewport\n canTraverse(tile, frameState, useParentMetric = false, ignoreVisibility = false) {\n if (!tile.hasChildren) {\n return false;\n }\n\n // cesium specific\n if (tile.hasTilesetContent) {\n // Traverse external this to visit its root tile\n // Don't traverse if the subtree is expired because it will be destroyed\n return !tile.contentExpired;\n }\n\n if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {\n return false;\n }\n\n return this.shouldRefine(tile, frameState, useParentMetric);\n }\n\n shouldLoadTile(tile) {\n // if request tile is in current frame\n // and has unexpired render content\n return tile.hasUnloadedContent || tile.contentExpired;\n }\n\n shouldSelectTile(tile) {\n // if select tile is in current frame\n // and content available\n return tile.contentAvailable && !this.options.skipLevelOfDetail;\n }\n\n // Decide if tile LoD (level of detail) is not sufficient under current viewport\n shouldRefine(tile, frameState, useParentMetric) {\n let screenSpaceError = tile._screenSpaceError;\n if (useParentMetric) {\n screenSpaceError = tile.getScreenSpaceError(frameState, true);\n }\n\n return screenSpaceError > this.options.maximumScreenSpaceError;\n }\n\n updateTileVisibility(tile, frameState) {\n const viewportIds: string[] = [];\n if (this.options.viewportTraversersMap) {\n for (const key in this.options.viewportTraversersMap) {\n const value = this.options.viewportTraversersMap[key];\n if (value === frameState.viewport.id) {\n viewportIds.push(key);\n }\n }\n } else {\n viewportIds.push(frameState.viewport.id);\n }\n tile.updateVisibility(frameState, viewportIds);\n }\n\n // UTILITIES\n\n compareDistanceToCamera(b, a) {\n return b._distanceToCamera - a._distanceToCamera;\n }\n\n anyChildrenVisible(tile, frameState) {\n let anyVisible = false;\n for (const child of tile.children) {\n child.updateVisibility(frameState);\n anyVisible = anyVisible || child.isVisibleAndInRequestVolume;\n }\n return anyVisible;\n }\n\n // Depth-first traversal that checks if all nearest descendants with content are loaded.\n // Ignores visibility.\n executeEmptyTraversal(root, frameState) {\n let allDescendantsLoaded = true;\n const stack = this._emptyTraversalStack;\n\n stack.push(root);\n\n while (stack.length > 0 && allDescendantsLoaded) {\n const tile = stack.pop();\n\n this.updateTile(tile, frameState);\n\n if (!tile.isVisibleAndInRequestVolume) {\n // Load tiles that aren't visible since they are still needed for the parent to refine\n this.loadTile(tile, frameState);\n }\n\n this.touchTile(tile, frameState);\n\n // Only traverse if the tile is empty - traversal stop at descendants with content\n const traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, true);\n\n if (traverse) {\n const children = tile.children;\n for (const child of children) {\n // eslint-disable-next-line max-depth\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n }\n } else if (!tile.contentAvailable) {\n allDescendantsLoaded = false;\n }\n }\n\n return allDescendantsLoaded;\n }\n}\n\n// TODO\n// enable expiration\n// enable optimization hint\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/types.ts"],"sourcesContent":["import {Vector3} from '@math.gl/core';\n\nexport type BoundingRectangle = {\n width: number;\n height: number;\n};\n\n/** Deck.gl Viewport instance type.\n * We can't import it from Deck.gl to avoid circular reference */\nexport type Viewport = {\n id: string;\n cameraPosition: number[] | Vector3;\n height: number;\n width: number;\n zoom: number;\n distanceScales: {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n };\n center: number[] | Vector3;\n unprojectPosition: (position: number[] | Vector3) => [number, number, number];\n project: (coorinates: number[] | Vector3) => number[];\n};\n\n/**\n * Contain extra fields from WebMercatorViewport and FirstPersonViewport\n */\nexport type GeospatialViewport = Viewport & {\n /** @todo This field is not represented in Deck.gl viewports. Can be removed in the next version */\n cameraDirection: [number, number, number];\n /** @todo This field is not represented in Deck.gl viewports. Can be removed in the next version */\n cameraUp: [number, number, number];\n longitude: number;\n latitude: number;\n bearing: number;\n};\n"],"mappings":""}
@@ -1,17 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
8
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
9
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
-
14
- var DoublyLinkedListNode = function DoublyLinkedListNode(item, previous, next) {
11
+ var DoublyLinkedListNode = (0, _createClass2.default)(function DoublyLinkedListNode(item, previous, next) {
15
12
  (0, _classCallCheck2.default)(this, DoublyLinkedListNode);
16
13
  (0, _defineProperty2.default)(this, "item", void 0);
17
14
  (0, _defineProperty2.default)(this, "previous", void 0);
@@ -19,7 +16,6 @@ var DoublyLinkedListNode = function DoublyLinkedListNode(item, previous, next) {
19
16
  this.item = item;
20
17
  this.previous = previous;
21
18
  this.next = next;
22
- };
23
-
19
+ });
24
20
  exports.default = DoublyLinkedListNode;
25
21
  //# sourceMappingURL=doubly-linked-list-node.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/doubly-linked-list-node.ts"],"names":["DoublyLinkedListNode","item","previous","next"],"mappings":";;;;;;;;;;;;;IAQqBA,oB,GAKnB,8BAAYC,IAAZ,EAAkBC,QAAlB,EAA4BC,IAA5B,EAAkC;AAAA;AAAA;AAAA;AAAA;AAChC,OAAKF,IAAL,GAAYA,IAAZ;AACA,OAAKC,QAAL,GAAgBA,QAAhB;AACA,OAAKC,IAAL,GAAYA,IAAZ;AACD,C","sourcesContent":["// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\n/**\n * Doubly linked list node\n *\n * @private\n */\nexport default class DoublyLinkedListNode {\n item;\n previous;\n next;\n\n constructor(item, previous, next) {\n this.item = item;\n this.previous = previous;\n this.next = next;\n }\n}\n"],"file":"doubly-linked-list-node.js"}
1
+ {"version":3,"file":"doubly-linked-list-node.js","names":["DoublyLinkedListNode","item","previous","next"],"sources":["../../../src/utils/doubly-linked-list-node.ts"],"sourcesContent":["// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\n/**\n * Doubly linked list node\n *\n * @private\n */\nexport default class DoublyLinkedListNode {\n item;\n previous;\n next;\n\n constructor(item, previous, next) {\n this.item = item;\n this.previous = previous;\n this.next = next;\n }\n}\n"],"mappings":";;;;;;;;;;IAQqBA,oBAAoB,8BAKvC,8BAAYC,IAAI,EAAEC,QAAQ,EAAEC,IAAI,EAAE;EAAA;EAAA;EAAA;EAAA;EAChC,IAAI,CAACF,IAAI,GAAGA,IAAI;EAChB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;EACxB,IAAI,CAACC,IAAI,GAAGA,IAAI;AAClB,CAAC;AAAA"}
@@ -1,20 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
11
  var _doublyLinkedListNode = _interopRequireDefault(require("../utils/doubly-linked-list-node"));
17
-
18
12
  var DoublyLinkedList = function () {
19
13
  function DoublyLinkedList() {
20
14
  (0, _classCallCheck2.default)(this, DoublyLinkedList);
@@ -22,17 +16,17 @@ var DoublyLinkedList = function () {
22
16
  (0, _defineProperty2.default)(this, "tail", null);
23
17
  (0, _defineProperty2.default)(this, "_length", 0);
24
18
  }
25
-
26
19
  (0, _createClass2.default)(DoublyLinkedList, [{
27
20
  key: "length",
28
21
  get: function get() {
29
22
  return this._length;
30
23
  }
24
+
31
25
  }, {
32
26
  key: "add",
33
- value: function add(item) {
27
+ value:
28
+ function add(item) {
34
29
  var node = new _doublyLinkedListNode.default(item, this.tail, null);
35
-
36
30
  if (this.tail) {
37
31
  this.tail.next = node;
38
32
  this.tail = node;
@@ -40,17 +34,17 @@ var DoublyLinkedList = function () {
40
34
  this.head = node;
41
35
  this.tail = node;
42
36
  }
43
-
44
37
  ++this._length;
45
38
  return node;
46
39
  }
40
+
47
41
  }, {
48
42
  key: "remove",
49
- value: function remove(node) {
43
+ value:
44
+ function remove(node) {
50
45
  if (!node) {
51
46
  return;
52
47
  }
53
-
54
48
  if (node.previous && node.next) {
55
49
  node.previous.next = node.next;
56
50
  node.next.previous = node.previous;
@@ -64,20 +58,20 @@ var DoublyLinkedList = function () {
64
58
  this.head = null;
65
59
  this.tail = null;
66
60
  }
67
-
68
61
  node.next = null;
69
62
  node.previous = null;
70
63
  --this._length;
71
64
  }
65
+
72
66
  }, {
73
67
  key: "splice",
74
- value: function splice(node, nextNode) {
68
+ value:
69
+ function splice(node, nextNode) {
75
70
  if (node === nextNode) {
76
71
  return;
77
72
  }
78
73
 
79
74
  this.remove(nextNode);
80
-
81
75
  this._insert(node, nextNode);
82
76
  }
83
77
  }, {
@@ -91,7 +85,6 @@ var DoublyLinkedList = function () {
91
85
  } else {
92
86
  oldNodeNext.previous = nextNode;
93
87
  }
94
-
95
88
  nextNode.next = oldNodeNext;
96
89
  nextNode.previous = node;
97
90
  ++this._length;
@@ -99,6 +92,5 @@ var DoublyLinkedList = function () {
99
92
  }]);
100
93
  return DoublyLinkedList;
101
94
  }();
102
-
103
95
  exports.default = DoublyLinkedList;
104
96
  //# sourceMappingURL=doubly-linked-list.js.map