@loaders.gl/tiles 3.4.13 → 3.4.15

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 (41) hide show
  1. package/dist/dist.min.js +122 -338
  2. package/dist/es5/bundle.js +1 -1
  3. package/dist/es5/bundle.js.map +1 -1
  4. package/dist/es5/constants.js +6 -6
  5. package/dist/es5/constants.js.map +1 -1
  6. package/dist/es5/index.js +13 -13
  7. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js +32 -53
  8. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -1
  9. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js +21 -32
  10. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -1
  11. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js +66 -63
  12. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js.map +1 -1
  13. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js +54 -121
  14. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -1
  15. package/dist/es5/tileset/helpers/bounding-volume.js +48 -62
  16. package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -1
  17. package/dist/es5/tileset/helpers/frame-state.js +67 -80
  18. package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
  19. package/dist/es5/tileset/helpers/i3s-lod.js +27 -27
  20. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
  21. package/dist/es5/tileset/helpers/tiles-3d-lod.js +51 -45
  22. package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -1
  23. package/dist/es5/tileset/helpers/transform-utils.js +17 -11
  24. package/dist/es5/tileset/helpers/transform-utils.js.map +1 -1
  25. package/dist/es5/tileset/helpers/zoom.js +28 -28
  26. package/dist/es5/tileset/helpers/zoom.js.map +1 -1
  27. package/dist/es5/tileset/tile-3d.js +316 -430
  28. package/dist/es5/tileset/tile-3d.js.map +1 -1
  29. package/dist/es5/tileset/tileset-3d.js +460 -701
  30. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  31. package/dist/es5/tileset/tileset-cache.js +41 -58
  32. package/dist/es5/tileset/tileset-cache.js.map +1 -1
  33. package/dist/es5/tileset/tileset-traverser.js +189 -264
  34. package/dist/es5/tileset/tileset-traverser.js.map +1 -1
  35. package/dist/es5/utils/doubly-linked-list-node.js +10 -11
  36. package/dist/es5/utils/doubly-linked-list-node.js.map +1 -1
  37. package/dist/es5/utils/doubly-linked-list.js +53 -68
  38. package/dist/es5/utils/doubly-linked-list.js.map +1 -1
  39. package/dist/es5/utils/managed-array.js +69 -100
  40. package/dist/es5/utils/managed-array.js.map +1 -1
  41. package/package.json +5 -5
@@ -1,46 +1,47 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.getFrameState = getFrameState;
8
7
  exports.limitSelectedTiles = limitSelectedTiles;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
8
  var _core = require("@math.gl/core");
11
9
  var _culling = require("@math.gl/culling");
12
10
  var _geospatial = require("@math.gl/geospatial");
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; } } }; }
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); }
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; }
16
- var scratchVector = new _core.Vector3();
17
- var scratchPosition = new _core.Vector3();
18
- var cullingVolume = new _culling.CullingVolume([new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane()]);
11
+ const scratchVector = new _core.Vector3();
12
+ const scratchPosition = new _core.Vector3();
13
+ const cullingVolume = new _culling.CullingVolume([new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane(), new _culling.Plane()]);
19
14
  function getFrameState(viewport, frameNumber) {
20
- var cameraDirection = viewport.cameraDirection,
21
- cameraUp = viewport.cameraUp,
22
- height = viewport.height;
23
- var metersPerUnit = viewport.distanceScales.metersPerUnit;
24
- var viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
25
- var enuToFixedTransform = _geospatial.Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
26
- var cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
27
- var cameraPositionCartesian = _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new _core.Vector3());
28
- var cameraDirectionCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraDirection).scale(metersPerUnit))).normalize();
29
- var cameraUpCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraUp).scale(metersPerUnit))).normalize();
15
+ const {
16
+ cameraDirection,
17
+ cameraUp,
18
+ height
19
+ } = viewport;
20
+ const {
21
+ metersPerUnit
22
+ } = viewport.distanceScales;
23
+ const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
24
+ const enuToFixedTransform = _geospatial.Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
25
+ const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
26
+ const cameraPositionCartesian = _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new _core.Vector3());
27
+ const cameraDirectionCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraDirection).scale(metersPerUnit))).normalize();
28
+ const cameraUpCartesian = new _core.Vector3(enuToFixedTransform.transformAsVector(new _core.Vector3(cameraUp).scale(metersPerUnit))).normalize();
30
29
  commonSpacePlanesToWGS84(viewport);
31
- var ViewportClass = viewport.constructor;
32
- var longitude = viewport.longitude,
33
- latitude = viewport.latitude,
34
- width = viewport.width,
35
- bearing = viewport.bearing,
36
- zoom = viewport.zoom;
37
- var topDownViewport = new ViewportClass({
38
- longitude: longitude,
39
- latitude: latitude,
40
- height: height,
41
- width: width,
42
- bearing: bearing,
43
- zoom: zoom,
30
+ const ViewportClass = viewport.constructor;
31
+ const {
32
+ longitude,
33
+ latitude,
34
+ width,
35
+ bearing,
36
+ zoom
37
+ } = viewport;
38
+ const topDownViewport = new ViewportClass({
39
+ longitude,
40
+ latitude,
41
+ height,
42
+ width,
43
+ bearing,
44
+ zoom,
44
45
  pitch: 0
45
46
  });
46
47
  return {
@@ -49,11 +50,11 @@ function getFrameState(viewport, frameNumber) {
49
50
  direction: cameraDirectionCartesian,
50
51
  up: cameraUpCartesian
51
52
  },
52
- viewport: viewport,
53
- topDownViewport: topDownViewport,
54
- height: height,
55
- cullingVolume: cullingVolume,
56
- frameNumber: frameNumber,
53
+ viewport,
54
+ topDownViewport,
55
+ height,
56
+ cullingVolume,
57
+ frameNumber,
57
58
  sseDenominator: 1.15
58
59
  };
59
60
  }
@@ -61,69 +62,55 @@ function limitSelectedTiles(tiles, frameState, maximumTilesSelected) {
61
62
  if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {
62
63
  return [tiles, []];
63
64
  }
64
- var tuples = [];
65
- var _frameState$viewport = frameState.viewport,
66
- viewportLongitude = _frameState$viewport.longitude,
67
- viewportLatitude = _frameState$viewport.latitude;
68
- var _iterator = _createForOfIteratorHelper(tiles.entries()),
69
- _step;
70
- try {
71
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
72
- var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
73
- index = _step$value[0],
74
- tile = _step$value[1];
75
- var _tile$header$mbs = (0, _slicedToArray2.default)(tile.header.mbs, 2),
76
- longitude = _tile$header$mbs[0],
77
- latitude = _tile$header$mbs[1];
78
- var deltaLon = Math.abs(viewportLongitude - longitude);
79
- var deltaLat = Math.abs(viewportLatitude - latitude);
80
- var distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);
81
- tuples.push([index, distance]);
82
- }
83
- } catch (err) {
84
- _iterator.e(err);
85
- } finally {
86
- _iterator.f();
65
+ const tuples = [];
66
+ const {
67
+ longitude: viewportLongitude,
68
+ latitude: viewportLatitude
69
+ } = frameState.viewport;
70
+ for (const [index, tile] of tiles.entries()) {
71
+ const [longitude, latitude] = tile.header.mbs;
72
+ const deltaLon = Math.abs(viewportLongitude - longitude);
73
+ const deltaLat = Math.abs(viewportLatitude - latitude);
74
+ const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);
75
+ tuples.push([index, distance]);
87
76
  }
88
- var tuplesSorted = tuples.sort(function (a, b) {
89
- return a[1] - b[1];
90
- });
91
- var selectedTiles = [];
92
- for (var i = 0; i < maximumTilesSelected; i++) {
77
+ const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);
78
+ const selectedTiles = [];
79
+ for (let i = 0; i < maximumTilesSelected; i++) {
93
80
  selectedTiles.push(tiles[tuplesSorted[i][0]]);
94
81
  }
95
- var unselectedTiles = [];
96
- for (var _i = maximumTilesSelected; _i < tuplesSorted.length; _i++) {
97
- unselectedTiles.push(tiles[tuplesSorted[_i][0]]);
82
+ const unselectedTiles = [];
83
+ for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {
84
+ unselectedTiles.push(tiles[tuplesSorted[i][0]]);
98
85
  }
99
86
  return [selectedTiles, unselectedTiles];
100
87
  }
101
88
  function commonSpacePlanesToWGS84(viewport) {
102
- var frustumPlanes = viewport.getFrustumPlanes();
103
- var nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
104
- var nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
105
- var cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);
106
- var i = 0;
89
+ const frustumPlanes = viewport.getFrustumPlanes();
90
+ const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
91
+ const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
92
+ const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);
93
+ let i = 0;
107
94
  cullingVolume.planes[i++].fromPointNormal(nearCenterCartesian, scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian));
108
- for (var dir in frustumPlanes) {
95
+ for (const dir in frustumPlanes) {
109
96
  if (dir === 'near') {
110
97
  continue;
111
98
  }
112
- var plane = frustumPlanes[dir];
113
- var posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);
114
- var cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);
99
+ const plane = frustumPlanes[dir];
100
+ const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);
101
+ const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);
115
102
  cullingVolume.planes[i++].fromPointNormal(cartesianPos, scratchVector.copy(nearCenterCartesian).subtract(cartesianPos));
116
103
  }
117
104
  }
118
105
  function closestPointOnPlane(plane, refPoint) {
119
- var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
120
- var distanceToRef = plane.normal.dot(refPoint);
106
+ let out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
107
+ const distanceToRef = plane.normal.dot(refPoint);
121
108
  out.copy(plane.normal).scale(plane.distance - distanceToRef).add(refPoint);
122
109
  return out;
123
110
  }
124
111
  function worldToCartesian(viewport, point) {
125
- var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
126
- var cartographicPos = viewport.unprojectPosition(point);
112
+ let out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _core.Vector3();
113
+ const cartographicPos = viewport.unprojectPosition(point);
127
114
  return _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
128
115
  }
129
116
  //# sourceMappingURL=frame-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frame-state.js","names":["_core","require","_culling","_geospatial","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartesian","worldToCartesian","center","enuToFixedTransform","Ellipsoid","WGS84","eastNorthUpToFixedFrame","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","cartographicToCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","tuples","_frameState$viewport","viewportLongitude","viewportLatitude","_iterator","entries","_step","_step$value","_slicedToArray2","default","index","tile","_tile$header$mbs","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","unselectedTiles","frustumPlanes","getFrustumPlanes","nearCenterCommon","closestPointOnPlane","near","nearCenterCartesian","cameraCartesian","planes","fromPointNormal","copy","subtract","dir","plane","posCommon","cartesianPos","refPoint","out","arguments","undefined","distanceToRef","normal","dot","add","point","cartographicPos"],"sources":["../../../../src/tileset/helpers/frame-state.ts"],"sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GeospatialViewport, Viewport} from '../../types';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: GeospatialViewport;\n topDownViewport: GeospatialViewport; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport: GeospatialViewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n\n // Get the near/far plane centers\n const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);\n const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);\n const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);\n\n let i = 0;\n cullingVolume.planes[i++].fromPointNormal(\n nearCenterCartesian,\n scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian)\n );\n\n for (const dir in frustumPlanes) {\n if (dir === 'near') {\n continue; // eslint-disable-line no-continue\n }\n const plane = frustumPlanes[dir];\n const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);\n const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(nearCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n\nfunction closestPointOnPlane(\n plane: {distance: number; normal: Vector3},\n refPoint: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const distanceToRef = plane.normal.dot(refPoint);\n out\n .copy(plane.normal)\n .scale(plane.distance - distanceToRef)\n .add(refPoint);\n return out;\n}\n\nfunction worldToCartesian(\n viewport: Viewport,\n point: number[] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const cartographicPos = viewport.unprojectPosition(point);\n return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"frame-state.js","names":["_core","require","_culling","_geospatial","scratchVector","Vector3","scratchPosition","cullingVolume","CullingVolume","Plane","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartesian","worldToCartesian","center","enuToFixedTransform","Ellipsoid","WGS84","eastNorthUpToFixedFrame","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","cartographicToCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","ViewportClass","constructor","longitude","latitude","width","bearing","zoom","topDownViewport","pitch","camera","position","direction","up","sseDenominator","limitSelectedTiles","tiles","frameState","maximumTilesSelected","length","tuples","viewportLongitude","viewportLatitude","index","tile","entries","header","mbs","deltaLon","Math","abs","deltaLat","distance","sqrt","push","tuplesSorted","sort","a","b","selectedTiles","i","unselectedTiles","frustumPlanes","getFrustumPlanes","nearCenterCommon","closestPointOnPlane","near","nearCenterCartesian","cameraCartesian","planes","fromPointNormal","copy","subtract","dir","plane","posCommon","cartesianPos","refPoint","out","arguments","undefined","distanceToRef","normal","dot","add","point","cartographicPos"],"sources":["../../../../src/tileset/helpers/frame-state.ts"],"sourcesContent":["import {Tile3D} from '@loaders.gl/tiles';\nimport {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GeospatialViewport, Viewport} from '../../types';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: GeospatialViewport;\n topDownViewport: GeospatialViewport; // Use it to calculate projected radius for a tile\n height: number;\n cullingVolume: CullingVolume;\n frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: number; // Assumes fovy = 60 degrees\n};\n\nconst scratchVector = new Vector3();\nconst scratchPosition = new Vector3();\nconst cullingVolume = new CullingVolume([\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane(),\n new Plane()\n]);\n\n// Extracts a frame state appropriate for tile culling from a deck.gl viewport\n// TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios\nexport function getFrameState(viewport: GeospatialViewport, frameNumber: number): FrameState {\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n // Traverse and and request. Update _selectedTiles so that we know what to render.\n const {cameraDirection, cameraUp, height} = viewport;\n const {metersPerUnit} = viewport.distanceScales;\n\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);\n const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);\n\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // These should still be normalized as the transform has scale 1 (goes from meters to meters)\n const cameraDirectionCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))\n ).normalize();\n const cameraUpCartesian = new Vector3(\n // @ts-ignore\n enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))\n ).normalize();\n\n commonSpacePlanesToWGS84(viewport);\n\n const ViewportClass = viewport.constructor;\n const {longitude, latitude, width, bearing, zoom} = viewport;\n // @ts-ignore\n const topDownViewport = new ViewportClass({\n longitude,\n latitude,\n height,\n width,\n bearing,\n zoom,\n pitch: 0\n });\n\n // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function\n return {\n camera: {\n position: cameraPositionCartesian,\n direction: cameraDirectionCartesian,\n up: cameraUpCartesian\n },\n viewport,\n topDownViewport,\n height,\n cullingVolume,\n frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?\n sseDenominator: 1.15 // Assumes fovy = 60 degrees\n };\n}\n\n/**\n * Limit `tiles` array length with `maximumTilesSelected` number.\n * The criteria for this filtering is distance of a tile center\n * to the `frameState.viewport`'s longitude and latitude\n * @param tiles - tiles array to filter\n * @param frameState - frameState to calculate distances\n * @param maximumTilesSelected - maximal amount of tiles in the output array\n * @returns new tiles array\n */\nexport function limitSelectedTiles(\n tiles: Tile3D[],\n frameState: FrameState,\n maximumTilesSelected: number\n): [Tile3D[], Tile3D[]] {\n if (maximumTilesSelected === 0 || tiles.length <= maximumTilesSelected) {\n return [tiles, []];\n }\n // Accumulate distances in couples array: [tileIndex: number, distanceToViewport: number]\n const tuples: [number, number][] = [];\n const {longitude: viewportLongitude, latitude: viewportLatitude} = frameState.viewport;\n for (const [index, tile] of tiles.entries()) {\n const [longitude, latitude] = tile.header.mbs;\n const deltaLon = Math.abs(viewportLongitude - longitude);\n const deltaLat = Math.abs(viewportLatitude - latitude);\n const distance = Math.sqrt(deltaLat * deltaLat + deltaLon * deltaLon);\n tuples.push([index, distance]);\n }\n const tuplesSorted = tuples.sort((a, b) => a[1] - b[1]);\n const selectedTiles: Tile3D[] = [];\n for (let i = 0; i < maximumTilesSelected; i++) {\n selectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n const unselectedTiles: Tile3D[] = [];\n for (let i = maximumTilesSelected; i < tuplesSorted.length; i++) {\n unselectedTiles.push(tiles[tuplesSorted[i][0]]);\n }\n\n return [selectedTiles, unselectedTiles];\n}\n\nfunction commonSpacePlanesToWGS84(viewport) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n\n // Get the near/far plane centers\n const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);\n const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);\n const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);\n\n let i = 0;\n cullingVolume.planes[i++].fromPointNormal(\n nearCenterCartesian,\n scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian)\n );\n\n for (const dir in frustumPlanes) {\n if (dir === 'near') {\n continue; // eslint-disable-line no-continue\n }\n const plane = frustumPlanes[dir];\n const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);\n const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);\n\n cullingVolume.planes[i++].fromPointNormal(\n cartesianPos,\n // Want the normal to point into the frustum since that's what culling expects\n scratchVector.copy(nearCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n\nfunction closestPointOnPlane(\n plane: {distance: number; normal: Vector3},\n refPoint: [number, number, number] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const distanceToRef = plane.normal.dot(refPoint);\n out\n .copy(plane.normal)\n .scale(plane.distance - distanceToRef)\n .add(refPoint);\n return out;\n}\n\nfunction worldToCartesian(\n viewport: Viewport,\n point: number[] | Vector3,\n out: Vector3 = new Vector3()\n): Vector3 {\n const cartographicPos = viewport.unprojectPosition(point);\n return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);\n}\n"],"mappings":"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"}
@@ -1,26 +1,24 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.getLodStatus = getLodStatus;
8
7
  exports.getProjectedRadius = getProjectedRadius;
9
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
8
  var _core = require("@math.gl/core");
11
9
  var _geospatial = require("@math.gl/geospatial");
12
- var cameraPositionCartesian = new _core.Vector3();
13
- var toEye = new _core.Vector3();
14
- var cameraPositionEnu = new _core.Vector3();
15
- var extraVertexEnu = new _core.Vector3();
16
- var projectedOriginVector = new _core.Vector3();
17
- var enuToCartesianMatrix = new _core.Matrix4();
18
- var cartesianToEnuMatrix = new _core.Matrix4();
10
+ const cameraPositionCartesian = new _core.Vector3();
11
+ const toEye = new _core.Vector3();
12
+ const cameraPositionEnu = new _core.Vector3();
13
+ const extraVertexEnu = new _core.Vector3();
14
+ const projectedOriginVector = new _core.Vector3();
15
+ const enuToCartesianMatrix = new _core.Matrix4();
16
+ const cartesianToEnuMatrix = new _core.Matrix4();
19
17
  function getLodStatus(tile, frameState) {
20
18
  if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {
21
19
  return 'DIG';
22
20
  }
23
- var screenSize = 2 * getProjectedRadius(tile, frameState);
21
+ const screenSize = 2 * getProjectedRadius(tile, frameState);
24
22
  if (screenSize < 2) {
25
23
  return 'OUT';
26
24
  }
@@ -32,29 +30,31 @@ function getLodStatus(tile, frameState) {
32
30
  return 'OUT';
33
31
  }
34
32
  function getProjectedRadius(tile, frameState) {
35
- var viewport = frameState.topDownViewport;
36
- var mbsLat = tile.header.mbs[1];
37
- var mbsLon = tile.header.mbs[0];
38
- var mbsZ = tile.header.mbs[2];
39
- var mbsR = tile.header.mbs[3];
40
- var mbsCenterCartesian = (0, _toConsumableArray2.default)(tile.boundingVolume.center);
41
- var cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
33
+ const {
34
+ topDownViewport: viewport
35
+ } = frameState;
36
+ const mbsLat = tile.header.mbs[1];
37
+ const mbsLon = tile.header.mbs[0];
38
+ const mbsZ = tile.header.mbs[2];
39
+ const mbsR = tile.header.mbs[3];
40
+ const mbsCenterCartesian = [...tile.boundingVolume.center];
41
+ const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
42
42
  _geospatial.Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);
43
43
  toEye.copy(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();
44
44
  _geospatial.Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);
45
45
  cartesianToEnuMatrix.copy(enuToCartesianMatrix).invert();
46
46
  cameraPositionEnu.copy(cameraPositionCartesian).transform(cartesianToEnuMatrix);
47
- var projection = Math.sqrt(cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]);
48
- var extraZ = projection * projection / cameraPositionEnu[2];
47
+ const projection = Math.sqrt(cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]);
48
+ const extraZ = projection * projection / cameraPositionEnu[2];
49
49
  extraVertexEnu.copy([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);
50
- var extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);
51
- var extraVectorCartesian = extraVertexCartesian.subtract(mbsCenterCartesian).normalize();
52
- var radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);
53
- var sphereMbsBorderVertexCartesian = radiusVector.add(mbsCenterCartesian);
54
- var sphereMbsBorderVertexCartographic = _geospatial.Ellipsoid.WGS84.cartesianToCartographic(sphereMbsBorderVertexCartesian);
55
- var projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);
56
- var projectedMbsBorderVertex = viewport.project(sphereMbsBorderVertexCartographic);
57
- var projectedRadius = projectedOriginVector.copy(projectedOrigin).subtract(projectedMbsBorderVertex).magnitude();
50
+ const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);
51
+ const extraVectorCartesian = extraVertexCartesian.subtract(mbsCenterCartesian).normalize();
52
+ const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);
53
+ const sphereMbsBorderVertexCartesian = radiusVector.add(mbsCenterCartesian);
54
+ const sphereMbsBorderVertexCartographic = _geospatial.Ellipsoid.WGS84.cartesianToCartographic(sphereMbsBorderVertexCartesian);
55
+ const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);
56
+ const projectedMbsBorderVertex = viewport.project(sphereMbsBorderVertexCartographic);
57
+ const projectedRadius = projectedOriginVector.copy(projectedOrigin).subtract(projectedMbsBorderVertex).magnitude();
58
58
  return projectedRadius;
59
59
  }
60
60
  //# sourceMappingURL=i3s-lod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"i3s-lod.js","names":["_core","require","_geospatial","cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","viewport","topDownViewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","_toConsumableArray2","default","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Tile3D} from '../tile-3d';\nimport {FrameState} from './frame-state';\n\nconst cameraPositionCartesian = new Vector3();\nconst toEye = new Vector3();\nconst cameraPositionEnu = new Vector3();\nconst extraVertexEnu = new Vector3();\nconst projectedOriginVector = new Vector3();\nconst enuToCartesianMatrix = new Matrix4();\nconst cartesianToEnuMatrix = new Matrix4();\n\n/**\n * For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children\n as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.\n In this sense a value of 0 means you should always load it's children,\n or if it's a leaf node, you should always display it.\n * @param tile \n * @param frameState \n * @returns \n */\nexport function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT' | 'DRAW' {\n if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {\n return 'DIG';\n }\n const screenSize = 2 * getProjectedRadius(tile, frameState);\n if (screenSize < 2) {\n return 'OUT';\n }\n if (!tile.header.children || screenSize <= tile.lodMetricValue) {\n return 'DRAW';\n } else if (tile.header.children) {\n return 'DIG';\n }\n return 'OUT';\n}\n\n/**\n * Calculate size of MBS radius projected on the screen plane\n * @param tile\n * @param frameState\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport function getProjectedRadius(tile: Tile3D, frameState: FrameState): number {\n const {topDownViewport: viewport} = frameState;\n const mbsLat = tile.header.mbs[1];\n const mbsLon = tile.header.mbs[0];\n const mbsZ = tile.header.mbs[2];\n const mbsR = tile.header.mbs[3];\n const mbsCenterCartesian = [...tile.boundingVolume.center];\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);\n\n // ---------------------------\n // Calculate mbs border vertex\n // ---------------------------\n toEye.copy(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();\n // Add extra vector to form plane\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);\n cartesianToEnuMatrix.copy(enuToCartesianMatrix).invert();\n cameraPositionEnu.copy(cameraPositionCartesian).transform(cartesianToEnuMatrix);\n // Mean Proportionals in Right Triangles - Altitude rule\n // https://mathbitsnotebook.com/Geometry/RightTriangles/RTmeanRight.html\n const projection = Math.sqrt(\n cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]\n );\n const extraZ = (projection * projection) / cameraPositionEnu[2];\n extraVertexEnu.copy([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);\n const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);\n const extraVectorCartesian = extraVertexCartesian.subtract(mbsCenterCartesian).normalize();\n // We need radius vector orthogonal to toEye vector\n const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);\n const sphereMbsBorderVertexCartesian = radiusVector.add(mbsCenterCartesian);\n const sphereMbsBorderVertexCartographic = Ellipsoid.WGS84.cartesianToCartographic(\n sphereMbsBorderVertexCartesian\n );\n // ---------------------------\n\n // Project center vertex and border vertex and calculate projected radius of MBS\n const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);\n const projectedMbsBorderVertex = viewport.project(\n sphereMbsBorderVertexCartographic as [number, number, number]\n );\n const projectedRadius = projectedOriginVector\n .copy(projectedOrigin)\n .subtract(projectedMbsBorderVertex)\n .magnitude();\n return projectedRadius;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"i3s-lod.js","names":["_core","require","_geospatial","cameraPositionCartesian","Vector3","toEye","cameraPositionEnu","extraVertexEnu","projectedOriginVector","enuToCartesianMatrix","Matrix4","cartesianToEnuMatrix","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","topDownViewport","viewport","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","Ellipsoid","WGS84","cartographicToCartesian","copy","subtract","normalize","eastNorthUpToFixedFrame","invert","transform","projection","Math","sqrt","extraZ","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"sources":["../../../../src/tileset/helpers/i3s-lod.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Tile3D} from '../tile-3d';\nimport {FrameState} from './frame-state';\n\nconst cameraPositionCartesian = new Vector3();\nconst toEye = new Vector3();\nconst cameraPositionEnu = new Vector3();\nconst extraVertexEnu = new Vector3();\nconst projectedOriginVector = new Vector3();\nconst enuToCartesianMatrix = new Matrix4();\nconst cartesianToEnuMatrix = new Matrix4();\n\n/**\n * For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children\n as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.\n In this sense a value of 0 means you should always load it's children,\n or if it's a leaf node, you should always display it.\n * @param tile \n * @param frameState \n * @returns \n */\nexport function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT' | 'DRAW' {\n if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {\n return 'DIG';\n }\n const screenSize = 2 * getProjectedRadius(tile, frameState);\n if (screenSize < 2) {\n return 'OUT';\n }\n if (!tile.header.children || screenSize <= tile.lodMetricValue) {\n return 'DRAW';\n } else if (tile.header.children) {\n return 'DIG';\n }\n return 'OUT';\n}\n\n/**\n * Calculate size of MBS radius projected on the screen plane\n * @param tile\n * @param frameState\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport function getProjectedRadius(tile: Tile3D, frameState: FrameState): number {\n const {topDownViewport: viewport} = frameState;\n const mbsLat = tile.header.mbs[1];\n const mbsLon = tile.header.mbs[0];\n const mbsZ = tile.header.mbs[2];\n const mbsR = tile.header.mbs[3];\n const mbsCenterCartesian = [...tile.boundingVolume.center];\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);\n\n // ---------------------------\n // Calculate mbs border vertex\n // ---------------------------\n toEye.copy(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();\n // Add extra vector to form plane\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);\n cartesianToEnuMatrix.copy(enuToCartesianMatrix).invert();\n cameraPositionEnu.copy(cameraPositionCartesian).transform(cartesianToEnuMatrix);\n // Mean Proportionals in Right Triangles - Altitude rule\n // https://mathbitsnotebook.com/Geometry/RightTriangles/RTmeanRight.html\n const projection = Math.sqrt(\n cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]\n );\n const extraZ = (projection * projection) / cameraPositionEnu[2];\n extraVertexEnu.copy([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);\n const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);\n const extraVectorCartesian = extraVertexCartesian.subtract(mbsCenterCartesian).normalize();\n // We need radius vector orthogonal to toEye vector\n const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);\n const sphereMbsBorderVertexCartesian = radiusVector.add(mbsCenterCartesian);\n const sphereMbsBorderVertexCartographic = Ellipsoid.WGS84.cartesianToCartographic(\n sphereMbsBorderVertexCartesian\n );\n // ---------------------------\n\n // Project center vertex and border vertex and calculate projected radius of MBS\n const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);\n const projectedMbsBorderVertex = viewport.project(\n sphereMbsBorderVertexCartographic as [number, number, number]\n );\n const projectedRadius = projectedOriginVector\n .copy(projectedOrigin)\n .subtract(projectedMbsBorderVertex)\n .magnitude();\n return projectedRadius;\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAIA,MAAME,uBAAuB,GAAG,IAAIC,aAAO,CAAC,CAAC;AAC7C,MAAMC,KAAK,GAAG,IAAID,aAAO,CAAC,CAAC;AAC3B,MAAME,iBAAiB,GAAG,IAAIF,aAAO,CAAC,CAAC;AACvC,MAAMG,cAAc,GAAG,IAAIH,aAAO,CAAC,CAAC;AACpC,MAAMI,qBAAqB,GAAG,IAAIJ,aAAO,CAAC,CAAC;AAC3C,MAAMK,oBAAoB,GAAG,IAAIC,aAAO,CAAC,CAAC;AAC1C,MAAMC,oBAAoB,GAAG,IAAID,aAAO,CAAC,CAAC;AAWnC,SAASE,YAAYA,CAACC,IAAY,EAAEC,UAAsB,EAA0B;EACzF,IAAID,IAAI,CAACE,cAAc,KAAK,CAAC,IAAIC,KAAK,CAACH,IAAI,CAACE,cAAc,CAAC,EAAE;IAC3D,OAAO,KAAK;EACd;EACA,MAAME,UAAU,GAAG,CAAC,GAAGC,kBAAkB,CAACL,IAAI,EAAEC,UAAU,CAAC;EAC3D,IAAIG,UAAU,GAAG,CAAC,EAAE;IAClB,OAAO,KAAK;EACd;EACA,IAAI,CAACJ,IAAI,CAACM,MAAM,CAACC,QAAQ,IAAIH,UAAU,IAAIJ,IAAI,CAACE,cAAc,EAAE;IAC9D,OAAO,MAAM;EACf,CAAC,MAAM,IAAIF,IAAI,CAACM,MAAM,CAACC,QAAQ,EAAE;IAC/B,OAAO,KAAK;EACd;EACA,OAAO,KAAK;AACd;AASO,SAASF,kBAAkBA,CAACL,IAAY,EAAEC,UAAsB,EAAU;EAC/E,MAAM;IAACO,eAAe,EAAEC;EAAQ,CAAC,GAAGR,UAAU;EAC9C,MAAMS,MAAM,GAAGV,IAAI,CAACM,MAAM,CAACK,GAAG,CAAC,CAAC,CAAC;EACjC,MAAMC,MAAM,GAAGZ,IAAI,CAACM,MAAM,CAACK,GAAG,CAAC,CAAC,CAAC;EACjC,MAAME,IAAI,GAAGb,IAAI,CAACM,MAAM,CAACK,GAAG,CAAC,CAAC,CAAC;EAC/B,MAAMG,IAAI,GAAGd,IAAI,CAACM,MAAM,CAACK,GAAG,CAAC,CAAC,CAAC;EAC/B,MAAMI,kBAAkB,GAAG,CAAC,GAAGf,IAAI,CAACgB,cAAc,CAACC,MAAM,CAAC;EAC1D,MAAMC,0BAA0B,GAAGT,QAAQ,CAACU,iBAAiB,CAACV,QAAQ,CAACW,cAAc,CAAC;EACtFC,qBAAS,CAACC,KAAK,CAACC,uBAAuB,CAACL,0BAA0B,EAAE5B,uBAAuB,CAAC;EAK5FE,KAAK,CAACgC,IAAI,CAAClC,uBAAuB,CAAC,CAACmC,QAAQ,CAACV,kBAAkB,CAAC,CAACW,SAAS,CAAC,CAAC;EAE5EL,qBAAS,CAACC,KAAK,CAACK,uBAAuB,CAACZ,kBAAkB,EAAEnB,oBAAoB,CAAC;EACjFE,oBAAoB,CAAC0B,IAAI,CAAC5B,oBAAoB,CAAC,CAACgC,MAAM,CAAC,CAAC;EACxDnC,iBAAiB,CAAC+B,IAAI,CAAClC,uBAAuB,CAAC,CAACuC,SAAS,CAAC/B,oBAAoB,CAAC;EAG/E,MAAMgC,UAAU,GAAGC,IAAI,CAACC,IAAI,CAC1BvC,iBAAiB,CAAC,CAAC,CAAC,GAAGA,iBAAiB,CAAC,CAAC,CAAC,GAAGA,iBAAiB,CAAC,CAAC,CAAC,GAAGA,iBAAiB,CAAC,CAAC,CAC1F,CAAC;EACD,MAAMwC,MAAM,GAAIH,UAAU,GAAGA,UAAU,GAAIrC,iBAAiB,CAAC,CAAC,CAAC;EAC/DC,cAAc,CAAC8B,IAAI,CAAC,CAAC/B,iBAAiB,CAAC,CAAC,CAAC,EAAEA,iBAAiB,CAAC,CAAC,CAAC,EAAEwC,MAAM,CAAC,CAAC;EACzE,MAAMC,oBAAoB,GAAGxC,cAAc,CAACmC,SAAS,CAACjC,oBAAoB,CAAC;EAC3E,MAAMuC,oBAAoB,GAAGD,oBAAoB,CAACT,QAAQ,CAACV,kBAAkB,CAAC,CAACW,SAAS,CAAC,CAAC;EAE1F,MAAMU,YAAY,GAAG5C,KAAK,CAAC6C,KAAK,CAACF,oBAAoB,CAAC,CAACT,SAAS,CAAC,CAAC,CAACY,KAAK,CAACxB,IAAI,CAAC;EAC9E,MAAMyB,8BAA8B,GAAGH,YAAY,CAACI,GAAG,CAACzB,kBAAkB,CAAC;EAC3E,MAAM0B,iCAAiC,GAAGpB,qBAAS,CAACC,KAAK,CAACoB,uBAAuB,CAC/EH,8BACF,CAAC;EAID,MAAMI,eAAe,GAAGlC,QAAQ,CAACmC,OAAO,CAAC,CAAChC,MAAM,EAAEF,MAAM,EAAEG,IAAI,CAAC,CAAC;EAChE,MAAMgC,wBAAwB,GAAGpC,QAAQ,CAACmC,OAAO,CAC/CH,iCACF,CAAC;EACD,MAAMK,eAAe,GAAGnD,qBAAqB,CAC1C6B,IAAI,CAACmB,eAAe,CAAC,CACrBlB,QAAQ,CAACoB,wBAAwB,CAAC,CAClCE,SAAS,CAAC,CAAC;EACd,OAAOD,eAAe;AACxB"}
@@ -8,26 +8,28 @@ exports.fog = fog;
8
8
  exports.getDynamicScreenSpaceError = getDynamicScreenSpaceError;
9
9
  exports.getTiles3DScreenSpaceError = getTiles3DScreenSpaceError;
10
10
  var _core = require("@math.gl/core");
11
- var scratchPositionNormal = new _core.Vector3();
12
- var scratchCartographic = new _core.Vector3();
13
- var scratchMatrix = new _core.Matrix4();
14
- var scratchCenter = new _core.Vector3();
15
- var scratchPosition = new _core.Vector3();
16
- var scratchDirection = new _core.Vector3();
11
+ const scratchPositionNormal = new _core.Vector3();
12
+ const scratchCartographic = new _core.Vector3();
13
+ const scratchMatrix = new _core.Matrix4();
14
+ const scratchCenter = new _core.Vector3();
15
+ const scratchPosition = new _core.Vector3();
16
+ const scratchDirection = new _core.Vector3();
17
17
  function calculateDynamicScreenSpaceError(root, _ref) {
18
- var camera = _ref.camera,
19
- mapProjection = _ref.mapProjection;
20
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
21
- var _options$dynamicScree = options.dynamicScreenSpaceErrorHeightFalloff,
22
- dynamicScreenSpaceErrorHeightFalloff = _options$dynamicScree === void 0 ? 0.25 : _options$dynamicScree,
23
- _options$dynamicScree2 = options.dynamicScreenSpaceErrorDensity,
24
- dynamicScreenSpaceErrorDensity = _options$dynamicScree2 === void 0 ? 0.00278 : _options$dynamicScree2;
25
- var up;
26
- var direction;
27
- var height;
28
- var minimumHeight;
29
- var maximumHeight;
30
- var tileBoundingVolume = root.contentBoundingVolume;
18
+ let {
19
+ camera,
20
+ mapProjection
21
+ } = _ref;
22
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
23
+ const {
24
+ dynamicScreenSpaceErrorHeightFalloff = 0.25,
25
+ dynamicScreenSpaceErrorDensity = 0.00278
26
+ } = options;
27
+ let up;
28
+ let direction;
29
+ let height;
30
+ let minimumHeight;
31
+ let maximumHeight;
32
+ const tileBoundingVolume = root.contentBoundingVolume;
31
33
  if (tileBoundingVolume instanceof TileBoundingRegion) {
32
34
  up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);
33
35
  direction = camera.directionWC;
@@ -35,68 +37,72 @@ function calculateDynamicScreenSpaceError(root, _ref) {
35
37
  minimumHeight = tileBoundingVolume.minimumHeight;
36
38
  maximumHeight = tileBoundingVolume.maximumHeight;
37
39
  } else {
38
- var transformLocal = _core.Matrix4.inverseTransformation(root.computedTransform, scratchMatrix);
39
- var ellipsoid = mapProjection.ellipsoid;
40
- var boundingVolume = tileBoundingVolume.boundingVolume;
41
- var centerLocal = _core.Matrix4.multiplyByPoint(transformLocal, boundingVolume.center, scratchCenter);
40
+ const transformLocal = _core.Matrix4.inverseTransformation(root.computedTransform, scratchMatrix);
41
+ const ellipsoid = mapProjection.ellipsoid;
42
+ const boundingVolume = tileBoundingVolume.boundingVolume;
43
+ const centerLocal = _core.Matrix4.multiplyByPoint(transformLocal, boundingVolume.center, scratchCenter);
42
44
  if (Cartesian3.magnitude(centerLocal) > ellipsoid.minimumRadius) {
43
- var centerCartographic = Cartographic.fromCartesian(centerLocal, ellipsoid, scratchCartographic);
45
+ const centerCartographic = Cartographic.fromCartesian(centerLocal, ellipsoid, scratchCartographic);
44
46
  up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);
45
47
  direction = camera.directionWC;
46
48
  height = camera.positionCartographic.height;
47
49
  minimumHeight = 0.0;
48
50
  maximumHeight = centerCartographic.height * 2.0;
49
51
  } else {
50
- var positionLocal = _core.Matrix4.multiplyByPoint(transformLocal, camera.positionWC, scratchPosition);
52
+ const positionLocal = _core.Matrix4.multiplyByPoint(transformLocal, camera.positionWC, scratchPosition);
51
53
  up = Cartesian3.UNIT_Z;
52
54
  direction = _core.Matrix4.multiplyByPointAsVector(transformLocal, camera.directionWC, scratchDirection);
53
55
  direction = Cartesian3.normalize(direction, direction);
54
56
  height = positionLocal.z;
55
57
  if (tileBoundingVolume instanceof TileOrientedBoundingBox) {
56
- var boxHeight = root._header.boundingVolume.box[11];
58
+ const boxHeight = root._header.boundingVolume.box[11];
57
59
  minimumHeight = centerLocal.z - boxHeight;
58
60
  maximumHeight = centerLocal.z + boxHeight;
59
61
  } else if (tileBoundingVolume instanceof TileBoundingSphere) {
60
- var radius = boundingVolume.radius;
62
+ const radius = boundingVolume.radius;
61
63
  minimumHeight = centerLocal.z - radius;
62
64
  maximumHeight = centerLocal.z + radius;
63
65
  }
64
66
  }
65
67
  }
66
- var heightFalloff = dynamicScreenSpaceErrorHeightFalloff;
67
- var heightClose = minimumHeight + (maximumHeight - minimumHeight) * heightFalloff;
68
- var heightFar = maximumHeight;
69
- var t = (0, _core.clamp)((height - heightClose) / (heightFar - heightClose), 0.0, 1.0);
70
- var dot = Math.abs(Cartesian3.dot(direction, up));
71
- var horizonFactor = 1.0 - dot;
68
+ const heightFalloff = dynamicScreenSpaceErrorHeightFalloff;
69
+ const heightClose = minimumHeight + (maximumHeight - minimumHeight) * heightFalloff;
70
+ const heightFar = maximumHeight;
71
+ const t = (0, _core.clamp)((height - heightClose) / (heightFar - heightClose), 0.0, 1.0);
72
+ const dot = Math.abs(Cartesian3.dot(direction, up));
73
+ let horizonFactor = 1.0 - dot;
72
74
  horizonFactor = horizonFactor * (1.0 - t);
73
75
  return dynamicScreenSpaceErrorDensity * horizonFactor;
74
76
  }
75
77
  function fog(distanceToCamera, density) {
76
- var scalar = distanceToCamera * density;
78
+ const scalar = distanceToCamera * density;
77
79
  return 1.0 - Math.exp(-(scalar * scalar));
78
80
  }
79
81
  function getDynamicScreenSpaceError(tileset, distanceToCamera) {
80
82
  if (tileset.dynamicScreenSpaceError && tileset.dynamicScreenSpaceErrorComputedDensity) {
81
- var density = tileset.dynamicScreenSpaceErrorComputedDensity;
82
- var factor = tileset.dynamicScreenSpaceErrorFactor;
83
- var dynamicError = fog(distanceToCamera, density) * factor;
83
+ const density = tileset.dynamicScreenSpaceErrorComputedDensity;
84
+ const factor = tileset.dynamicScreenSpaceErrorFactor;
85
+ const dynamicError = fog(distanceToCamera, density) * factor;
84
86
  return dynamicError;
85
87
  }
86
88
  return 0;
87
89
  }
88
90
  function getTiles3DScreenSpaceError(tile, frameState, useParentLodMetric) {
89
- var tileset = tile.tileset;
90
- var parentLodMetricValue = tile.parent && tile.parent.lodMetricValue || tile.lodMetricValue;
91
- var lodMetricValue = useParentLodMetric ? parentLodMetricValue : tile.lodMetricValue;
91
+ const tileset = tile.tileset;
92
+ const parentLodMetricValue = tile.parent && tile.parent.lodMetricValue || tile.lodMetricValue;
93
+ const lodMetricValue = useParentLodMetric ? parentLodMetricValue : tile.lodMetricValue;
92
94
  if (lodMetricValue === 0.0) {
93
95
  return 0.0;
94
96
  }
95
- var distance = Math.max(tile._distanceToCamera, 1e-7);
96
- var height = frameState.height,
97
- sseDenominator = frameState.sseDenominator;
98
- var viewDistanceScale = tileset.options.viewDistanceScale;
99
- var error = lodMetricValue * height * (viewDistanceScale || 1.0) / (distance * sseDenominator);
97
+ const distance = Math.max(tile._distanceToCamera, 1e-7);
98
+ const {
99
+ height,
100
+ sseDenominator
101
+ } = frameState;
102
+ const {
103
+ viewDistanceScale
104
+ } = tileset.options;
105
+ let error = lodMetricValue * height * (viewDistanceScale || 1.0) / (distance * sseDenominator);
100
106
  error -= getDynamicScreenSpaceError(tileset, distance);
101
107
  return error;
102
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tiles-3d-lod.js","names":["_core","require","scratchPositionNormal","Vector3","scratchCartographic","scratchMatrix","Matrix4","scratchCenter","scratchPosition","scratchDirection","calculateDynamicScreenSpaceError","root","_ref","camera","mapProjection","options","arguments","length","undefined","_options$dynamicScree","dynamicScreenSpaceErrorHeightFalloff","_options$dynamicScree2","dynamicScreenSpaceErrorDensity","up","direction","height","minimumHeight","maximumHeight","tileBoundingVolume","contentBoundingVolume","TileBoundingRegion","Cartesian3","normalize","positionWC","directionWC","positionCartographic","transformLocal","inverseTransformation","computedTransform","ellipsoid","boundingVolume","centerLocal","multiplyByPoint","center","magnitude","minimumRadius","centerCartographic","Cartographic","fromCartesian","positionLocal","UNIT_Z","multiplyByPointAsVector","z","TileOrientedBoundingBox","boxHeight","_header","box","TileBoundingSphere","radius","heightFalloff","heightClose","heightFar","t","clamp","dot","Math","abs","horizonFactor","fog","distanceToCamera","density","scalar","exp","getDynamicScreenSpaceError","tileset","dynamicScreenSpaceError","dynamicScreenSpaceErrorComputedDensity","factor","dynamicScreenSpaceErrorFactor","dynamicError","getTiles3DScreenSpaceError","tile","frameState","useParentLodMetric","parentLodMetricValue","parent","lodMetricValue","distance","max","_distanceToCamera","sseDenominator","viewDistanceScale","error"],"sources":["../../../../src/tileset/helpers/tiles-3d-lod.ts"],"sourcesContent":["// loaders.gl, MIT license\n\n// 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// TODO - Dynamic screen space error provides an optimization when looking at\n// tilesets from above\n\n/* eslint-disable */\n// @ts-nocheck\nimport {Matrix4, Vector3, clamp} from '@math.gl/core';\n\nconst scratchPositionNormal = new Vector3();\nconst scratchCartographic = new Vector3();\nconst scratchMatrix = new Matrix4();\nconst scratchCenter = new Vector3();\nconst scratchPosition = new Vector3();\nconst scratchDirection = new Vector3();\n\n// eslint-disable-next-line max-statements, complexity\nexport function calculateDynamicScreenSpaceError(root, {camera, mapProjection}, options = {}) {\n const {dynamicScreenSpaceErrorHeightFalloff = 0.25, dynamicScreenSpaceErrorDensity = 0.00278} =\n options;\n\n let up;\n let direction;\n let height;\n let minimumHeight;\n let maximumHeight;\n\n const tileBoundingVolume = root.contentBoundingVolume;\n\n if (tileBoundingVolume instanceof TileBoundingRegion) {\n up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);\n direction = camera.directionWC;\n height = camera.positionCartographic.height;\n minimumHeight = tileBoundingVolume.minimumHeight;\n maximumHeight = tileBoundingVolume.maximumHeight;\n } else {\n // Transform camera position and direction into the local coordinate system of the tileset\n const transformLocal = Matrix4.inverseTransformation(root.computedTransform, scratchMatrix);\n const ellipsoid = mapProjection.ellipsoid;\n const boundingVolume = tileBoundingVolume.boundingVolume;\n const centerLocal = Matrix4.multiplyByPoint(\n transformLocal,\n boundingVolume.center,\n scratchCenter\n );\n if (Cartesian3.magnitude(centerLocal) > ellipsoid.minimumRadius) {\n // The tileset is defined in WGS84. Approximate the minimum and maximum height.\n const centerCartographic = Cartographic.fromCartesian(\n centerLocal,\n ellipsoid,\n scratchCartographic\n );\n up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);\n direction = camera.directionWC;\n height = camera.positionCartographic.height;\n minimumHeight = 0.0;\n maximumHeight = centerCartographic.height * 2.0;\n } else {\n // The tileset is defined in local coordinates (z-up)\n const positionLocal = Matrix4.multiplyByPoint(\n transformLocal,\n camera.positionWC,\n scratchPosition\n );\n up = Cartesian3.UNIT_Z;\n direction = Matrix4.multiplyByPointAsVector(\n transformLocal,\n camera.directionWC,\n scratchDirection\n );\n direction = Cartesian3.normalize(direction, direction);\n height = positionLocal.z;\n if (tileBoundingVolume instanceof TileOrientedBoundingBox) {\n // Assuming z-up, the last component stores the half-height of the box\n const boxHeight = root._header.boundingVolume.box[11];\n minimumHeight = centerLocal.z - boxHeight;\n maximumHeight = centerLocal.z + boxHeight;\n } else if (tileBoundingVolume instanceof TileBoundingSphere) {\n const radius = boundingVolume.radius;\n minimumHeight = centerLocal.z - radius;\n maximumHeight = centerLocal.z + radius;\n }\n }\n }\n\n // The range where the density starts to lessen. Start at the quarter height of the tileset.\n const heightFalloff = dynamicScreenSpaceErrorHeightFalloff;\n const heightClose = minimumHeight + (maximumHeight - minimumHeight) * heightFalloff;\n const heightFar = maximumHeight;\n\n const t = clamp((height - heightClose) / (heightFar - heightClose), 0.0, 1.0);\n\n // Increase density as the camera tilts towards the horizon\n const dot = Math.abs(Cartesian3.dot(direction, up));\n\n let horizonFactor = 1.0 - dot;\n\n // Weaken the horizon factor as the camera height increases, implying the camera is further away from the tileset.\n // The goal is to increase density for the \"street view\", not when viewing the tileset from a distance.\n horizonFactor = horizonFactor * (1.0 - t);\n\n return dynamicScreenSpaceErrorDensity * horizonFactor;\n}\n\nexport function fog(distanceToCamera, density) {\n const scalar = distanceToCamera * density;\n return 1.0 - Math.exp(-(scalar * scalar));\n}\n\nexport function getDynamicScreenSpaceError(tileset, distanceToCamera) {\n if (tileset.dynamicScreenSpaceError && tileset.dynamicScreenSpaceErrorComputedDensity) {\n const density = tileset.dynamicScreenSpaceErrorComputedDensity;\n const factor = tileset.dynamicScreenSpaceErrorFactor;\n // TODO: Refined screen space error that minimizes tiles in non-first-person\n const dynamicError = fog(distanceToCamera, density) * factor;\n return dynamicError;\n }\n\n return 0;\n}\n\nexport function getTiles3DScreenSpaceError(tile, frameState, useParentLodMetric) {\n const tileset = tile.tileset;\n const parentLodMetricValue = (tile.parent && tile.parent.lodMetricValue) || tile.lodMetricValue;\n const lodMetricValue = useParentLodMetric ? parentLodMetricValue : tile.lodMetricValue;\n\n // Leaf tiles do not have any error so save the computation\n if (lodMetricValue === 0.0) {\n return 0.0;\n }\n\n // TODO: Orthographic Frustum needs special treatment?\n // this._getOrthograhicScreenSpaceError();\n\n // Avoid divide by zero when viewer is inside the tile\n const distance = Math.max(tile._distanceToCamera, 1e-7);\n const {height, sseDenominator} = frameState;\n const {viewDistanceScale} = tileset.options;\n let error = (lodMetricValue * height * (viewDistanceScale || 1.0)) / (distance * sseDenominator);\n\n error -= getDynamicScreenSpaceError(tileset, distance);\n\n return error;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tiles-3d-lod.js","names":["_core","require","scratchPositionNormal","Vector3","scratchCartographic","scratchMatrix","Matrix4","scratchCenter","scratchPosition","scratchDirection","calculateDynamicScreenSpaceError","root","_ref","camera","mapProjection","options","arguments","length","undefined","dynamicScreenSpaceErrorHeightFalloff","dynamicScreenSpaceErrorDensity","up","direction","height","minimumHeight","maximumHeight","tileBoundingVolume","contentBoundingVolume","TileBoundingRegion","Cartesian3","normalize","positionWC","directionWC","positionCartographic","transformLocal","inverseTransformation","computedTransform","ellipsoid","boundingVolume","centerLocal","multiplyByPoint","center","magnitude","minimumRadius","centerCartographic","Cartographic","fromCartesian","positionLocal","UNIT_Z","multiplyByPointAsVector","z","TileOrientedBoundingBox","boxHeight","_header","box","TileBoundingSphere","radius","heightFalloff","heightClose","heightFar","t","clamp","dot","Math","abs","horizonFactor","fog","distanceToCamera","density","scalar","exp","getDynamicScreenSpaceError","tileset","dynamicScreenSpaceError","dynamicScreenSpaceErrorComputedDensity","factor","dynamicScreenSpaceErrorFactor","dynamicError","getTiles3DScreenSpaceError","tile","frameState","useParentLodMetric","parentLodMetricValue","parent","lodMetricValue","distance","max","_distanceToCamera","sseDenominator","viewDistanceScale","error"],"sources":["../../../../src/tileset/helpers/tiles-3d-lod.ts"],"sourcesContent":["// loaders.gl, MIT license\n\n// 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// TODO - Dynamic screen space error provides an optimization when looking at\n// tilesets from above\n\n/* eslint-disable */\n// @ts-nocheck\nimport {Matrix4, Vector3, clamp} from '@math.gl/core';\n\nconst scratchPositionNormal = new Vector3();\nconst scratchCartographic = new Vector3();\nconst scratchMatrix = new Matrix4();\nconst scratchCenter = new Vector3();\nconst scratchPosition = new Vector3();\nconst scratchDirection = new Vector3();\n\n// eslint-disable-next-line max-statements, complexity\nexport function calculateDynamicScreenSpaceError(root, {camera, mapProjection}, options = {}) {\n const {dynamicScreenSpaceErrorHeightFalloff = 0.25, dynamicScreenSpaceErrorDensity = 0.00278} =\n options;\n\n let up;\n let direction;\n let height;\n let minimumHeight;\n let maximumHeight;\n\n const tileBoundingVolume = root.contentBoundingVolume;\n\n if (tileBoundingVolume instanceof TileBoundingRegion) {\n up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);\n direction = camera.directionWC;\n height = camera.positionCartographic.height;\n minimumHeight = tileBoundingVolume.minimumHeight;\n maximumHeight = tileBoundingVolume.maximumHeight;\n } else {\n // Transform camera position and direction into the local coordinate system of the tileset\n const transformLocal = Matrix4.inverseTransformation(root.computedTransform, scratchMatrix);\n const ellipsoid = mapProjection.ellipsoid;\n const boundingVolume = tileBoundingVolume.boundingVolume;\n const centerLocal = Matrix4.multiplyByPoint(\n transformLocal,\n boundingVolume.center,\n scratchCenter\n );\n if (Cartesian3.magnitude(centerLocal) > ellipsoid.minimumRadius) {\n // The tileset is defined in WGS84. Approximate the minimum and maximum height.\n const centerCartographic = Cartographic.fromCartesian(\n centerLocal,\n ellipsoid,\n scratchCartographic\n );\n up = Cartesian3.normalize(camera.positionWC, scratchPositionNormal);\n direction = camera.directionWC;\n height = camera.positionCartographic.height;\n minimumHeight = 0.0;\n maximumHeight = centerCartographic.height * 2.0;\n } else {\n // The tileset is defined in local coordinates (z-up)\n const positionLocal = Matrix4.multiplyByPoint(\n transformLocal,\n camera.positionWC,\n scratchPosition\n );\n up = Cartesian3.UNIT_Z;\n direction = Matrix4.multiplyByPointAsVector(\n transformLocal,\n camera.directionWC,\n scratchDirection\n );\n direction = Cartesian3.normalize(direction, direction);\n height = positionLocal.z;\n if (tileBoundingVolume instanceof TileOrientedBoundingBox) {\n // Assuming z-up, the last component stores the half-height of the box\n const boxHeight = root._header.boundingVolume.box[11];\n minimumHeight = centerLocal.z - boxHeight;\n maximumHeight = centerLocal.z + boxHeight;\n } else if (tileBoundingVolume instanceof TileBoundingSphere) {\n const radius = boundingVolume.radius;\n minimumHeight = centerLocal.z - radius;\n maximumHeight = centerLocal.z + radius;\n }\n }\n }\n\n // The range where the density starts to lessen. Start at the quarter height of the tileset.\n const heightFalloff = dynamicScreenSpaceErrorHeightFalloff;\n const heightClose = minimumHeight + (maximumHeight - minimumHeight) * heightFalloff;\n const heightFar = maximumHeight;\n\n const t = clamp((height - heightClose) / (heightFar - heightClose), 0.0, 1.0);\n\n // Increase density as the camera tilts towards the horizon\n const dot = Math.abs(Cartesian3.dot(direction, up));\n\n let horizonFactor = 1.0 - dot;\n\n // Weaken the horizon factor as the camera height increases, implying the camera is further away from the tileset.\n // The goal is to increase density for the \"street view\", not when viewing the tileset from a distance.\n horizonFactor = horizonFactor * (1.0 - t);\n\n return dynamicScreenSpaceErrorDensity * horizonFactor;\n}\n\nexport function fog(distanceToCamera, density) {\n const scalar = distanceToCamera * density;\n return 1.0 - Math.exp(-(scalar * scalar));\n}\n\nexport function getDynamicScreenSpaceError(tileset, distanceToCamera) {\n if (tileset.dynamicScreenSpaceError && tileset.dynamicScreenSpaceErrorComputedDensity) {\n const density = tileset.dynamicScreenSpaceErrorComputedDensity;\n const factor = tileset.dynamicScreenSpaceErrorFactor;\n // TODO: Refined screen space error that minimizes tiles in non-first-person\n const dynamicError = fog(distanceToCamera, density) * factor;\n return dynamicError;\n }\n\n return 0;\n}\n\nexport function getTiles3DScreenSpaceError(tile, frameState, useParentLodMetric) {\n const tileset = tile.tileset;\n const parentLodMetricValue = (tile.parent && tile.parent.lodMetricValue) || tile.lodMetricValue;\n const lodMetricValue = useParentLodMetric ? parentLodMetricValue : tile.lodMetricValue;\n\n // Leaf tiles do not have any error so save the computation\n if (lodMetricValue === 0.0) {\n return 0.0;\n }\n\n // TODO: Orthographic Frustum needs special treatment?\n // this._getOrthograhicScreenSpaceError();\n\n // Avoid divide by zero when viewer is inside the tile\n const distance = Math.max(tile._distanceToCamera, 1e-7);\n const {height, sseDenominator} = frameState;\n const {viewDistanceScale} = tileset.options;\n let error = (lodMetricValue * height * (viewDistanceScale || 1.0)) / (distance * sseDenominator);\n\n error -= getDynamicScreenSpaceError(tileset, distance);\n\n return error;\n}\n"],"mappings":"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"}