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

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 (68) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/constants.d.ts +32 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/dist.min.js +8204 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/tileset/helpers/3d-tiles-options.d.ts +4 -0
  11. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +1 -0
  12. package/dist/tileset/helpers/bounding-volume.d.ts +9 -0
  13. package/dist/tileset/helpers/bounding-volume.d.ts.map +1 -0
  14. package/dist/tileset/helpers/frame-state.d.ts +17 -0
  15. package/dist/tileset/helpers/frame-state.d.ts.map +1 -0
  16. package/dist/tileset/helpers/frame-state.js +1 -1
  17. package/dist/tileset/helpers/frame-state.js.map +1 -1
  18. package/dist/tileset/helpers/i3s-lod.d.ts +20 -0
  19. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -0
  20. package/dist/tileset/helpers/i3s-lod.js +45 -86
  21. package/dist/tileset/helpers/i3s-lod.js.map +1 -1
  22. package/dist/tileset/helpers/tiles-3d-lod.d.ts +8 -0
  23. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +1 -0
  24. package/dist/tileset/helpers/transform-utils.d.ts +2 -0
  25. package/dist/tileset/helpers/transform-utils.d.ts.map +1 -0
  26. package/dist/tileset/helpers/zoom.d.ts +7 -0
  27. package/dist/tileset/helpers/zoom.d.ts.map +1 -0
  28. package/dist/tileset/tile-3d.d.ts +175 -0
  29. package/dist/tileset/tile-3d.d.ts.map +1 -0
  30. package/dist/tileset/tile-3d.js +5 -2
  31. package/dist/tileset/tile-3d.js.map +1 -1
  32. package/dist/tileset/tileset-3d.d.ts +172 -0
  33. package/dist/tileset/tileset-3d.d.ts.map +1 -0
  34. package/dist/tileset/tileset-cache.d.ts +18 -0
  35. package/dist/tileset/tileset-cache.d.ts.map +1 -0
  36. package/dist/tileset/tileset-cache.js.map +1 -1
  37. package/dist/tileset/traversers/i3s-tile-manager.d.ts +8 -0
  38. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -0
  39. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +18 -0
  40. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -0
  41. package/dist/tileset/traversers/i3s-tileset-traverser.js +2 -2
  42. package/dist/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  43. package/dist/tileset/traversers/tileset-3d-traverser.d.ts +7 -0
  44. package/dist/tileset/traversers/tileset-3d-traverser.d.ts.map +1 -0
  45. package/dist/tileset/traversers/tileset-traverser.d.ts +52 -0
  46. package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -0
  47. package/dist/utils/doubly-linked-list-node.d.ts +12 -0
  48. package/dist/utils/doubly-linked-list-node.d.ts.map +1 -0
  49. package/dist/utils/doubly-linked-list-node.js +7 -0
  50. package/dist/utils/doubly-linked-list-node.js.map +1 -1
  51. package/dist/utils/doubly-linked-list.d.ts +31 -0
  52. package/dist/utils/doubly-linked-list.d.ts.map +1 -0
  53. package/dist/utils/doubly-linked-list.js +6 -3
  54. package/dist/utils/doubly-linked-list.js.map +1 -1
  55. package/dist/utils/managed-array.d.ts +85 -0
  56. package/dist/utils/managed-array.d.ts.map +1 -0
  57. package/dist/utils/managed-array.js +7 -1
  58. package/dist/utils/managed-array.js.map +1 -1
  59. package/package.json +8 -8
  60. package/src/index.ts +1 -0
  61. package/src/tileset/helpers/frame-state.ts +1 -1
  62. package/src/tileset/helpers/i3s-lod.ts +72 -96
  63. package/src/tileset/tile-3d.ts +4 -2
  64. package/src/tileset/tileset-cache.ts +2 -0
  65. package/src/tileset/traversers/i3s-tileset-traverser.ts +2 -3
  66. package/src/utils/{doubly-linked-list-node.js → doubly-linked-list-node.ts} +4 -0
  67. package/src/utils/{doubly-linked-list.js → doubly-linked-list.ts} +3 -5
  68. package/src/utils/{managed-array.js → managed-array.ts} +4 -1
@@ -0,0 +1,11 @@
1
+ export type { Tileset3DProps } from './tileset/tileset-3d';
2
+ export { default as Tileset3D } from './tileset/tileset-3d';
3
+ export { default as Tile3D } from './tileset/tile-3d';
4
+ export { default as TilesetTraverser } from './tileset/traversers/tileset-traverser';
5
+ export { default as TilesetCache } from './tileset/tileset-cache';
6
+ export { createBoundingVolume } from './tileset/helpers/bounding-volume';
7
+ export { calculateTransformProps } from './tileset/helpers/transform-utils';
8
+ export { getFrameState } from './tileset/helpers/frame-state';
9
+ export { getLodStatus } from './tileset/helpers/i3s-lod';
10
+ export { TILE_CONTENT_STATE, TILE_REFINEMENT, TILE_TYPE, TILESET_TYPE, LOD_METRIC_TYPE } from './constants';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAC,OAAO,IAAI,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,uBAAuB,EAAC,MAAM,mCAAmC,CAAC;AAE1E,OAAO,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -5,5 +5,6 @@ export { default as TilesetCache } from './tileset/tileset-cache';
5
5
  export { createBoundingVolume } from './tileset/helpers/bounding-volume';
6
6
  export { calculateTransformProps } from './tileset/helpers/transform-utils';
7
7
  export { getFrameState } from './tileset/helpers/frame-state';
8
+ export { getLodStatus } from './tileset/helpers/i3s-lod';
8
9
  export { TILE_CONTENT_STATE, TILE_REFINEMENT, TILE_TYPE, TILESET_TYPE, LOD_METRIC_TYPE } from './constants';
9
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["default","Tileset3D","Tile3D","TilesetTraverser","TilesetCache","createBoundingVolume","calculateTransformProps","getFrameState","TILE_CONTENT_STATE","TILE_REFINEMENT","TILE_TYPE","TILESET_TYPE","LOD_METRIC_TYPE"],"mappings":"AACA,SAAQA,OAAO,IAAIC,SAAnB,QAAmC,sBAAnC;AACA,SAAQD,OAAO,IAAIE,MAAnB,QAAgC,mBAAhC;AAEA,SAAQF,OAAO,IAAIG,gBAAnB,QAA0C,wCAA1C;AACA,SAAQH,OAAO,IAAII,YAAnB,QAAsC,yBAAtC;AAEA,SAAQC,oBAAR,QAAmC,mCAAnC;AACA,SAAQC,uBAAR,QAAsC,mCAAtC;AAEA,SAAQC,aAAR,QAA4B,+BAA5B;AAEA,SACEC,kBADF,EAEEC,eAFF,EAGEC,SAHF,EAIEC,YAJF,EAKEC,eALF,QAMO,aANP","sourcesContent":["export type {Tileset3DProps} from './tileset/tileset-3d';\nexport {default as Tileset3D} from './tileset/tileset-3d';\nexport {default as Tile3D} from './tileset/tile-3d';\n\nexport {default as TilesetTraverser} from './tileset/traversers/tileset-traverser';\nexport {default as TilesetCache} from './tileset/tileset-cache';\n\nexport {createBoundingVolume} from './tileset/helpers/bounding-volume';\nexport {calculateTransformProps} from './tileset/helpers/transform-utils';\n\nexport {getFrameState} from './tileset/helpers/frame-state';\n\nexport {\n TILE_CONTENT_STATE,\n TILE_REFINEMENT,\n TILE_TYPE,\n TILESET_TYPE,\n LOD_METRIC_TYPE\n} from './constants';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["default","Tileset3D","Tile3D","TilesetTraverser","TilesetCache","createBoundingVolume","calculateTransformProps","getFrameState","getLodStatus","TILE_CONTENT_STATE","TILE_REFINEMENT","TILE_TYPE","TILESET_TYPE","LOD_METRIC_TYPE"],"mappings":"AACA,SAAQA,OAAO,IAAIC,SAAnB,QAAmC,sBAAnC;AACA,SAAQD,OAAO,IAAIE,MAAnB,QAAgC,mBAAhC;AAEA,SAAQF,OAAO,IAAIG,gBAAnB,QAA0C,wCAA1C;AACA,SAAQH,OAAO,IAAII,YAAnB,QAAsC,yBAAtC;AAEA,SAAQC,oBAAR,QAAmC,mCAAnC;AACA,SAAQC,uBAAR,QAAsC,mCAAtC;AAEA,SAAQC,aAAR,QAA4B,+BAA5B;AACA,SAAQC,YAAR,QAA2B,2BAA3B;AAEA,SACEC,kBADF,EAEEC,eAFF,EAGEC,SAHF,EAIEC,YAJF,EAKEC,eALF,QAMO,aANP","sourcesContent":["export type {Tileset3DProps} from './tileset/tileset-3d';\nexport {default as Tileset3D} from './tileset/tileset-3d';\nexport {default as Tile3D} from './tileset/tile-3d';\n\nexport {default as TilesetTraverser} from './tileset/traversers/tileset-traverser';\nexport {default as TilesetCache} from './tileset/tileset-cache';\n\nexport {createBoundingVolume} from './tileset/helpers/bounding-volume';\nexport {calculateTransformProps} from './tileset/helpers/transform-utils';\n\nexport {getFrameState} from './tileset/helpers/frame-state';\nexport {getLodStatus} from './tileset/helpers/i3s-lod';\n\nexport {\n TILE_CONTENT_STATE,\n TILE_REFINEMENT,\n TILE_TYPE,\n TILESET_TYPE,\n LOD_METRIC_TYPE\n} from './constants';\n"],"file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export declare function get3dTilesOptions(tileset: any): {
2
+ assetGltfUpAxis: any;
3
+ };
4
+ //# sourceMappingURL=3d-tiles-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3d-tiles-options.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/3d-tiles-options.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,OAAO,KAAA;;EAIxC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Create a bounding volume from the tile's bounding volume header.
3
+ * @param {Object} boundingVolumeHeader The tile's bounding volume header.
4
+ * @param {Matrix4} transform The transform to apply to the bounding volume.
5
+ * @param [result] The object onto which to store the result.
6
+ * @returns The modified result parameter or a new TileBoundingVolume instance if none was provided.
7
+ */
8
+ export declare function createBoundingVolume(boundingVolumeHeader: any, transform: any, result: any): any;
9
+ //# sourceMappingURL=bounding-volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounding-volume.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/bounding-volume.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,oBAAoB,KAAA,EAAE,SAAS,KAAA,EAAE,MAAM,KAAA,OAsC3E"}
@@ -0,0 +1,17 @@
1
+ import { CullingVolume } from '@math.gl/culling';
2
+ export declare type FrameState = {
3
+ camera: {
4
+ position: number[];
5
+ direction: number[];
6
+ up: number[];
7
+ };
8
+ viewport: {
9
+ [key: string]: any;
10
+ };
11
+ height: number;
12
+ cullingVolume: CullingVolume;
13
+ frameNumber: number;
14
+ sseDenominator: number;
15
+ };
16
+ export declare function getFrameState(viewport: any, frameNumber: number): FrameState;
17
+ //# sourceMappingURL=frame-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-state.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/frame-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAQ,MAAM,kBAAkB,CAAC;AAGtD,oBAAY,UAAU,GAAG;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,EAAE,EAAE,MAAM,EAAE,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAeF,wBAAgB,aAAa,CAAC,QAAQ,KAAA,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CA6CvE"}
@@ -13,7 +13,7 @@ export function getFrameState(viewport, frameNumber) {
13
13
  const {
14
14
  metersPerUnit
15
15
  } = viewport.distanceScales;
16
- const viewportCenterCartographic = [viewport.longitude, viewport.latitude, 0];
16
+ const viewportCenterCartographic = viewport.unprojectPosition(viewport.center);
17
17
  const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic, new Vector3());
18
18
  const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
19
19
  const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tileset/helpers/frame-state.ts"],"names":["Vector3","CullingVolume","Plane","Ellipsoid","scratchVector","scratchPosition","cullingVolume","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartographic","longitude","latitude","viewportCenterCartesian","WGS84","cartographicToCartesian","enuToFixedTransform","eastNorthUpToFixedFrame","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","camera","position","direction","up","sseDenominator","frustumPlanes","getFrustumPlanes","i","dir","plane","distanceToCenter","normal","dot","center","copy","distance","add","cartographicPos","cartesianPos","planes","fromPointNormal","subtract"],"mappings":"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","sourcesContent":["import {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: {[key: string]: any};\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, frameNumber: number): FrameState {\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 const viewportCenterCartographic = [viewport.longitude, viewport.latitude, 0];\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n viewportCenterCartographic,\n new Vector3()\n );\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, viewportCenterCartesian);\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 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\nfunction commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n let i = 0;\n for (const dir in frustumPlanes) {\n const plane = frustumPlanes[dir];\n const distanceToCenter = plane.normal.dot(viewport.center);\n scratchPosition\n .copy(plane.normal)\n .scale(plane.distance - distanceToCenter)\n .add(viewport.center);\n const cartographicPos = viewport.unprojectPosition(scratchPosition);\n\n const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());\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(viewportCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n"],"file":"frame-state.js"}
1
+ {"version":3,"sources":["../../../src/tileset/helpers/frame-state.ts"],"names":["Vector3","CullingVolume","Plane","Ellipsoid","scratchVector","scratchPosition","cullingVolume","getFrameState","viewport","frameNumber","cameraDirection","cameraUp","height","metersPerUnit","distanceScales","viewportCenterCartographic","unprojectPosition","center","viewportCenterCartesian","WGS84","cartographicToCartesian","enuToFixedTransform","eastNorthUpToFixedFrame","cameraPositionCartographic","cameraPosition","cameraPositionCartesian","cameraDirectionCartesian","transformAsVector","scale","normalize","cameraUpCartesian","commonSpacePlanesToWGS84","camera","position","direction","up","sseDenominator","frustumPlanes","getFrustumPlanes","i","dir","plane","distanceToCenter","normal","dot","copy","distance","add","cartographicPos","cartesianPos","planes","fromPointNormal","subtract"],"mappings":"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","sourcesContent":["import {Vector3} from '@math.gl/core';\nimport {CullingVolume, Plane} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nexport type FrameState = {\n camera: {\n position: number[];\n direction: number[];\n up: number[];\n };\n viewport: {[key: string]: any};\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, frameNumber: number): FrameState {\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 const viewportCenterCartographic = viewport.unprojectPosition(viewport.center);\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.\n // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?\n const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n viewportCenterCartographic,\n new Vector3()\n );\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, viewportCenterCartesian);\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 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\nfunction commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) {\n // Extract frustum planes based on current view.\n const frustumPlanes = viewport.getFrustumPlanes();\n let i = 0;\n for (const dir in frustumPlanes) {\n const plane = frustumPlanes[dir];\n const distanceToCenter = plane.normal.dot(viewport.center);\n scratchPosition\n .copy(plane.normal)\n .scale(plane.distance - distanceToCenter)\n .add(viewport.center);\n const cartographicPos = viewport.unprojectPosition(scratchPosition);\n\n const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());\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(viewportCenterCartesian).subtract(cartesianPos)\n );\n }\n}\n"],"file":"frame-state.js"}
@@ -0,0 +1,20 @@
1
+ import Tile3D from '../tile-3d';
2
+ import { FrameState } from './frame-state';
3
+ /**
4
+ * For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children
5
+ as soon as the nodes bounding sphere has a screen radius larger than maxError pixels.
6
+ In this sense a value of 0 means you should always load it's children,
7
+ or if it's a leaf node, you should always display it.
8
+ * @param tile
9
+ * @param frameState
10
+ * @returns
11
+ */
12
+ export declare function getLodStatus(tile: Tile3D, frameState: FrameState): 'DIG' | 'OUT' | 'DRAW';
13
+ /**
14
+ * Calculate size of MBS radius projected on the screen plane
15
+ * @param tile
16
+ * @param frameState
17
+ * @returns
18
+ */
19
+ export declare function getProjectedRadius(tile: Tile3D, frameState: FrameState): number;
20
+ //# sourceMappingURL=i3s-lod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i3s-lod.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/i3s-lod.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,YAAY,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAczF;AAED;;;;;GAKG;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAoD/E"}
@@ -1,48 +1,13 @@
1
- import { toRadians } from '@math.gl/core';
2
- const WGS84_RADIUS_X = 6378137.0;
3
- const qualityFactor = Math.PI / 2;
4
- export function lodJudge(tile, frameState) {
5
- const viewport = frameState.viewport;
6
- const metersPerPixel = viewport.metersPerPixel;
7
- const mbsLat = tile.header.mbs[1];
8
- const mbsLon = tile.header.mbs[0];
9
- const mbsZ = tile.header.mbs[2];
10
- const mbsR = tile.header.mbs[3];
11
- const {
12
- height,
13
- width,
14
- latitude,
15
- longitude
16
- } = viewport;
17
- const viewportCenter = [longitude, latitude];
18
- const mbsCenter = [mbsLon, mbsLat, mbsZ];
19
- const mbsLatProjected = [longitude, mbsLat];
20
- const mbsLonProjected = [mbsLon, latitude];
21
- const diagonalInMeters = Math.sqrt(height * height + width * width) * metersPerPixel[0];
22
- const distanceInMeters = getDistanceFromLatLon(viewportCenter, mbsCenter);
23
- const visibleHeight = height * 0.5 + mbsR / WGS84_RADIUS_X;
24
- const visibleWidth = width * 0.5 + mbsR / WGS84_RADIUS_X;
25
-
26
- if (distanceInMeters > diagonalInMeters + mbsR / WGS84_RADIUS_X) {
27
- return 'OUT';
28
- }
29
-
30
- if (getDistanceFromLatLon(viewportCenter, mbsLatProjected) > visibleHeight) {
31
- return 'OUT';
32
- }
33
-
34
- if (getDistanceFromLatLon(viewportCenter, mbsLonProjected) > visibleWidth) {
35
- return 'OUT';
36
- }
37
-
38
- if (tile.lodMetricValue === 0) {
1
+ import { Matrix4, Vector3 } from '@math.gl/core';
2
+ import { Ellipsoid } from '@math.gl/geospatial';
3
+ export function getLodStatus(tile, frameState) {
4
+ if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {
39
5
  return 'DIG';
40
6
  }
41
7
 
42
- let screenSize = getI3ScreenSize(tile, frameState);
43
- screenSize *= qualityFactor;
8
+ const screenSize = 2 * getProjectedRadius(tile, frameState);
44
9
 
45
- if (screenSize < 0.5) {
10
+ if (screenSize < 2) {
46
11
  return 'OUT';
47
12
  }
48
13
 
@@ -54,55 +19,49 @@ export function lodJudge(tile, frameState) {
54
19
 
55
20
  return 'OUT';
56
21
  }
57
-
58
- function projectVertexToSphere([x, y, z]) {
59
- const azim = toRadians(x);
60
- const incl = toRadians(y);
61
- const radius = 1.0 + z / WGS84_RADIUS_X;
62
- const radCosInc = radius * Math.cos(incl);
63
- x = radCosInc * Math.cos(azim);
64
- y = radCosInc * Math.sin(azim);
65
- z = radius * Math.sin(incl);
66
- return [x, y, z];
67
- }
68
-
69
- function getDistanceFromLatLon(observer, center) {
70
- const [observerLon, observerLat, observerZ = 0.0] = observer;
71
- const [centerLon, centerLat, centerZ = 0.0] = center;
72
- const projectedCenter = projectVertexToSphere([centerLon, centerLat, centerZ]);
73
- const projectedObserver = projectVertexToSphere([observerLon, observerLat, observerZ]);
74
- const dx = projectedObserver[0] - projectedCenter[0];
75
- const dy = projectedObserver[1] - projectedCenter[1];
76
- const dz = projectedObserver[2] - projectedCenter[2];
77
- return dx * dx + dy * dy + dz * dz;
78
- }
79
-
80
- export function getI3ScreenSize(tile, frameState) {
81
- const viewport = frameState.viewport;
22
+ export function getProjectedRadius(tile, frameState) {
23
+ const originalViewport = frameState.viewport;
24
+ const ViewportClass = originalViewport.constructor;
25
+ const {
26
+ longitude,
27
+ latitude,
28
+ height,
29
+ width,
30
+ bearing,
31
+ zoom
32
+ } = originalViewport;
33
+ const viewport = new ViewportClass({
34
+ longitude,
35
+ latitude,
36
+ height,
37
+ width,
38
+ bearing,
39
+ zoom,
40
+ pitch: 0
41
+ });
82
42
  const mbsLat = tile.header.mbs[1];
83
43
  const mbsLon = tile.header.mbs[0];
84
44
  const mbsZ = tile.header.mbs[2];
85
45
  const mbsR = tile.header.mbs[3];
86
- const mbsCenter = [mbsLon, mbsLat, mbsZ];
46
+ const mbsCenterCartesian = [...tile.boundingVolume.center];
87
47
  const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
88
- const dSquared = getDistanceFromLatLon(cameraPositionCartographic, mbsCenter);
89
- const mbsRNormalized = mbsR / WGS84_RADIUS_X;
90
- const d = dSquared - mbsRNormalized * mbsRNormalized;
91
- const fltMax = 3.4028235e38;
92
-
93
- if (d <= 0.0) {
94
- return 0.5 * fltMax;
95
- }
96
-
97
- const screenSizeFactor = getTanOfHalfVFAngle(frameState) * mbsRNormalized / Math.sqrt(d) * 300;
98
- return screenSizeFactor;
99
- }
100
-
101
- function getTanOfHalfVFAngle(frameState) {
102
- const {
103
- projectionMatrix
104
- } = frameState.viewport;
105
- const t = projectionMatrix[5];
106
- return t;
48
+ const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new Vector3());
49
+ const toEye = new Vector3(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();
50
+ const enuToCartesianMatrix = new Matrix4();
51
+ Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);
52
+ const cartesianToEnuMatrix = new Matrix4(enuToCartesianMatrix).invert();
53
+ const cameraPositionEnu = new Vector3(cameraPositionCartesian).transform(cartesianToEnuMatrix);
54
+ const projection = Math.sqrt(cameraPositionEnu[0] * cameraPositionEnu[0] + cameraPositionEnu[1] * cameraPositionEnu[1]);
55
+ const extraZ = projection * projection / cameraPositionEnu[2];
56
+ const extraVertexEnu = new Vector3([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);
57
+ const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);
58
+ const extraVectorCartesian = new Vector3(extraVertexCartesian).subtract(mbsCenterCartesian).normalize();
59
+ const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);
60
+ const sphereMbsBorderVertexCartesian = new Vector3(mbsCenterCartesian).add(radiusVector);
61
+ const sphereMbsBorderVertexCartographic = Ellipsoid.WGS84.cartesianToCartographic(sphereMbsBorderVertexCartesian);
62
+ const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);
63
+ const projectedMbsBorderVertex = viewport.project(sphereMbsBorderVertexCartographic);
64
+ const projectedRadius = new Vector3(projectedOrigin).subtract(projectedMbsBorderVertex).magnitude();
65
+ return projectedRadius;
107
66
  }
108
67
  //# sourceMappingURL=i3s-lod.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tileset/helpers/i3s-lod.ts"],"names":["toRadians","WGS84_RADIUS_X","qualityFactor","Math","PI","lodJudge","tile","frameState","viewport","metersPerPixel","mbsLat","header","mbs","mbsLon","mbsZ","mbsR","height","width","latitude","longitude","viewportCenter","mbsCenter","mbsLatProjected","mbsLonProjected","diagonalInMeters","sqrt","distanceInMeters","getDistanceFromLatLon","visibleHeight","visibleWidth","lodMetricValue","screenSize","getI3ScreenSize","children","projectVertexToSphere","x","y","z","azim","incl","radius","radCosInc","cos","sin","observer","center","observerLon","observerLat","observerZ","centerLon","centerLat","centerZ","projectedCenter","projectedObserver","dx","dy","dz","cameraPositionCartographic","unprojectPosition","cameraPosition","dSquared","mbsRNormalized","d","fltMax","screenSizeFactor","getTanOfHalfVFAngle","projectionMatrix","t"],"mappings":"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","sourcesContent":["import {toRadians} from '@math.gl/core';\n\nconst WGS84_RADIUS_X = 6378137.0;\n// use this to bias the lod switching (1+ results in increasing the LOD quality)\nconst qualityFactor = Math.PI / 2; // empirical derived bias factor\n/* eslint-disable max-statements */\nexport function lodJudge(tile, frameState) {\n const viewport = frameState.viewport;\n const metersPerPixel = viewport.metersPerPixel;\n\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\n const {height, width, latitude, longitude} = viewport;\n\n const viewportCenter = [longitude, latitude];\n const mbsCenter = [mbsLon, mbsLat, mbsZ];\n const mbsLatProjected = [longitude, mbsLat];\n const mbsLonProjected = [mbsLon, latitude];\n\n const diagonalInMeters = Math.sqrt(height * height + width * width) * metersPerPixel[0];\n const distanceInMeters = getDistanceFromLatLon(viewportCenter, mbsCenter);\n\n const visibleHeight = height * 0.5 + mbsR / WGS84_RADIUS_X;\n const visibleWidth = width * 0.5 + mbsR / WGS84_RADIUS_X;\n\n if (distanceInMeters > diagonalInMeters + mbsR / WGS84_RADIUS_X) {\n return 'OUT';\n }\n if (getDistanceFromLatLon(viewportCenter, mbsLatProjected) > visibleHeight) {\n return 'OUT';\n }\n if (getDistanceFromLatLon(viewportCenter, mbsLonProjected) > visibleWidth) {\n return 'OUT';\n }\n\n if (tile.lodMetricValue === 0) {\n return 'DIG';\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 let screenSize = getI3ScreenSize(tile, frameState); // in pixels\n screenSize *= qualityFactor;\n if (screenSize < 0.5) {\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/* eslint-enable max-statements */\n\nfunction projectVertexToSphere([x, y, z]) {\n const azim = toRadians(x);\n const incl = toRadians(y);\n const radius = 1.0 + z / WGS84_RADIUS_X;\n const radCosInc = radius * Math.cos(incl);\n x = radCosInc * Math.cos(azim);\n y = radCosInc * Math.sin(azim);\n z = radius * Math.sin(incl);\n return [x, y, z];\n}\n\nfunction getDistanceFromLatLon(observer: number[], center: number[]) {\n const [observerLon, observerLat, observerZ = 0.0] = observer;\n const [centerLon, centerLat, centerZ = 0.0] = center;\n\n const projectedCenter = projectVertexToSphere([centerLon, centerLat, centerZ]);\n const projectedObserver = projectVertexToSphere([observerLon, observerLat, observerZ]);\n const dx = projectedObserver[0] - projectedCenter[0];\n const dy = projectedObserver[1] - projectedCenter[1];\n const dz = projectedObserver[2] - projectedCenter[2];\n return dx * dx + dy * dy + dz * dz;\n}\n\nexport function getI3ScreenSize(tile, frameState) {\n const viewport = frameState.viewport;\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\n const mbsCenter = [mbsLon, mbsLat, mbsZ];\n const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);\n const dSquared = getDistanceFromLatLon(cameraPositionCartographic, mbsCenter);\n const mbsRNormalized = mbsR / WGS84_RADIUS_X;\n const d = dSquared - mbsRNormalized * mbsRNormalized;\n const fltMax = 3.4028235e38; // convert from 0x7f7fffff which is the maximum\n if (d <= 0.0) {\n return 0.5 * fltMax;\n }\n // https://stackoverflow.com/questions/21648630/radius-of-projected-sphere-in-screen-space\n // There is a formula there to calculate projected radius:\n // return 1.0 / Math.tan(fov) * r / Math.sqrt(d * d - r * r); // Right\n // Hack: 300 is a Magic number to get the correct LoD. Possibly, d and r are calculated in a wrong way.\n const screenSizeFactor =\n ((getTanOfHalfVFAngle(frameState) * mbsRNormalized) / Math.sqrt(d)) * 300;\n return screenSizeFactor;\n}\n\nfunction getTanOfHalfVFAngle(frameState) {\n const {projectionMatrix} = frameState.viewport;\n const t = projectionMatrix[5];\n return t;\n}\n"],"file":"i3s-lod.js"}
1
+ {"version":3,"sources":["../../../src/tileset/helpers/i3s-lod.ts"],"names":["Matrix4","Vector3","Ellipsoid","getLodStatus","tile","frameState","lodMetricValue","isNaN","screenSize","getProjectedRadius","header","children","originalViewport","viewport","ViewportClass","constructor","longitude","latitude","height","width","bearing","zoom","pitch","mbsLat","mbs","mbsLon","mbsZ","mbsR","mbsCenterCartesian","boundingVolume","center","cameraPositionCartographic","unprojectPosition","cameraPosition","cameraPositionCartesian","WGS84","cartographicToCartesian","toEye","subtract","normalize","enuToCartesianMatrix","eastNorthUpToFixedFrame","cartesianToEnuMatrix","invert","cameraPositionEnu","transform","projection","Math","sqrt","extraZ","extraVertexEnu","extraVertexCartesian","extraVectorCartesian","radiusVector","cross","scale","sphereMbsBorderVertexCartesian","add","sphereMbsBorderVertexCartographic","cartesianToCartographic","projectedOrigin","project","projectedMbsBorderVertex","projectedRadius","magnitude"],"mappings":"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","sourcesContent":["import {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport Tile3D from '../tile-3d';\nimport {FrameState} from './frame-state';\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 originalViewport = frameState.viewport;\n const ViewportClass = originalViewport.constructor;\n const {longitude, latitude, height, width, bearing, zoom} = originalViewport;\n // @ts-ignore\n const viewport = new ViewportClass({longitude, latitude, height, width, bearing, zoom, pitch: 0});\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 const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(\n cameraPositionCartographic,\n new Vector3()\n );\n\n // ---------------------------\n // Calculate mbs border vertex\n // ---------------------------\n const toEye = new Vector3(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();\n // Add extra vector to form plane\n const enuToCartesianMatrix = new Matrix4();\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian, enuToCartesianMatrix);\n const cartesianToEnuMatrix = new Matrix4(enuToCartesianMatrix).invert();\n const cameraPositionEnu = new Vector3(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 const extraVertexEnu = new Vector3([cameraPositionEnu[0], cameraPositionEnu[1], extraZ]);\n const extraVertexCartesian = extraVertexEnu.transform(enuToCartesianMatrix);\n const extraVectorCartesian = new Vector3(extraVertexCartesian)\n .subtract(mbsCenterCartesian)\n .normalize();\n // We need radius vector orthogonal to toEye vector\n const radiusVector = toEye.cross(extraVectorCartesian).normalize().scale(mbsR);\n const sphereMbsBorderVertexCartesian = new Vector3(mbsCenterCartesian).add(radiusVector);\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(sphereMbsBorderVertexCartographic);\n const projectedRadius = new Vector3(projectedOrigin)\n .subtract(projectedMbsBorderVertex)\n .magnitude();\n return projectedRadius;\n}\n"],"file":"i3s-lod.js"}
@@ -0,0 +1,8 @@
1
+ export declare function calculateDynamicScreenSpaceError(root: any, { camera, mapProjection }: {
2
+ camera: any;
3
+ mapProjection: any;
4
+ }, options?: {}): number;
5
+ export declare function fog(distanceToCamera: any, density: any): number;
6
+ export declare function getDynamicScreenSpaceError(tileset: any, distanceToCamera: any): number;
7
+ export declare function getTiles3DScreenSpaceError(tile: any, frameState: any, useParentLodMetric: any): number;
8
+ //# sourceMappingURL=tiles-3d-lod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiles-3d-lod.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/tiles-3d-lod.ts"],"names":[],"mappings":"AAkBA,wBAAgB,gCAAgC,CAAC,IAAI,KAAA,EAAE,EAAC,MAAM,EAAE,aAAa,EAAC;;;CAAA,EAAE,OAAO,KAAK,UAqF3F;AAED,wBAAgB,GAAG,CAAC,gBAAgB,KAAA,EAAE,OAAO,KAAA,UAG5C;AAED,wBAAgB,0BAA0B,CAAC,OAAO,KAAA,EAAE,gBAAgB,KAAA,UAUnE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,kBAAkB,KAAA,UAsB9E"}
@@ -0,0 +1,2 @@
1
+ export declare function calculateTransformProps(tileHeader: any, tile: any): void;
2
+ //# sourceMappingURL=transform-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-utils.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/transform-utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,uBAAuB,CAAC,UAAU,KAAA,EAAE,IAAI,KAAA,QA4DvD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Calculate appropriate zoom value for a particular boundingVolume
3
+ * @param {BoundingSphere, OrientedBoundingBox} boundingVolume - the instance of bounding volume
4
+ * @returns {number} - zoom value
5
+ */
6
+ export declare function getZoomFromBoundingVolume(boundingVolume: any): number;
7
+ //# sourceMappingURL=zoom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/tileset/helpers/zoom.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,KAAA,UAoBvD"}
@@ -0,0 +1,175 @@
1
+ import { Matrix4 } from '@math.gl/core';
2
+ import { FrameState } from './helpers/frame-state';
3
+ import type Tileset3D from './tileset-3d';
4
+ /**
5
+ * @param tileset - Tileset3D instance
6
+ * @param header - tile header - JSON loaded from a dataset
7
+ * @param parentHeader - parent TileHeader instance
8
+ * @param extendedId - optional ID to separate copies of a tile for different viewports.
9
+ * const extendedId = `${tile.id}-${frameState.viewport.id}`;
10
+ */
11
+ export declare type TileHeaderProps = {
12
+ tileset: Tileset3D;
13
+ header: Object;
14
+ parentHeader: TileHeader;
15
+ extendedId: string;
16
+ };
17
+ /**
18
+ * A Tile3DHeader represents a tile as Tileset3D. When a tile is first created, its content is not loaded;
19
+ * the content is loaded on-demand when needed based on the view.
20
+ * Do not construct this directly, instead access tiles through {@link Tileset3D#tileVisible}.
21
+ */
22
+ export default class TileHeader {
23
+ tileset: Tileset3D;
24
+ header: any;
25
+ id: string;
26
+ url: string;
27
+ parent: TileHeader;
28
+ refine: number;
29
+ type: string;
30
+ contentUrl: string;
31
+ lodMetricType: string;
32
+ lodMetricValue: number;
33
+ boundingVolume: any;
34
+ content: any;
35
+ contentState: any;
36
+ gpuMemoryUsageInBytes: number;
37
+ children: TileHeader[];
38
+ depth: number;
39
+ viewportIds: any[];
40
+ transform: Matrix4;
41
+ extensions: any;
42
+ userData: {
43
+ [key: string]: any;
44
+ };
45
+ computedTransform: any;
46
+ hasEmptyContent: boolean;
47
+ hasTilesetContent: boolean;
48
+ traverser: object;
49
+ private _cacheNode;
50
+ private _frameNumber;
51
+ private _lodJudge;
52
+ private _expireDate;
53
+ private _expiredContent;
54
+ private _shouldRefine;
55
+ private _distanceToCamera;
56
+ private _centerZDepth;
57
+ private _screenSpaceError;
58
+ private _visibilityPlaneMask;
59
+ private _visible?;
60
+ private _inRequestVolume;
61
+ private _stackLength;
62
+ private _selectionDepth;
63
+ private _touchedFrame;
64
+ private _visitedFrame;
65
+ private _selectedFrame;
66
+ private _requestedFrame;
67
+ private _priority;
68
+ private _contentBoundingVolume;
69
+ private _viewerRequestVolume;
70
+ _initialTransform: Matrix4;
71
+ /**
72
+ * @constructs
73
+ * Create a TileHeader instance
74
+ * @param tileset - Tileset3D instance
75
+ * @param header - tile header - JSON loaded from a dataset
76
+ * @param parentHeader - parent TileHeader instance
77
+ * @param extendedId - optional ID to separate copies of a tile for different viewports.
78
+ * const extendedId = `${tile.id}-${frameState.viewport.id}`;
79
+ */
80
+ constructor(tileset: Tileset3D, header: {
81
+ [key: string]: any;
82
+ }, parentHeader?: TileHeader, extendedId?: string);
83
+ destroy(): void;
84
+ isDestroyed(): boolean;
85
+ get selected(): boolean;
86
+ get isVisible(): boolean | undefined;
87
+ get isVisibleAndInRequestVolume(): boolean | undefined;
88
+ /** Returns true if tile is not an empty tile and not an external tileset */
89
+ get hasRenderContent(): boolean;
90
+ /** Returns true if tile has children */
91
+ get hasChildren(): any;
92
+ /**
93
+ * Determines if the tile's content is ready. This is automatically `true` for
94
+ * tiles with empty content.
95
+ */
96
+ get contentReady(): boolean;
97
+ /**
98
+ * Determines if the tile has available content to render. `true` if the tile's
99
+ * content is ready or if it has expired content this renders while new content loads; otherwise,
100
+ */
101
+ get contentAvailable(): boolean;
102
+ /** Returns true if tile has renderable content but it's unloaded */
103
+ get hasUnloadedContent(): boolean;
104
+ /**
105
+ * Determines if the tile's content has not be requested. `true` if tile's
106
+ * content has not be requested; otherwise, `false`.
107
+ */
108
+ get contentUnloaded(): boolean;
109
+ /**
110
+ * Determines if the tile's content is expired. `true` if tile's
111
+ * content is expired; otherwise, `false`.
112
+ */
113
+ get contentExpired(): boolean;
114
+ get contentFailed(): boolean;
115
+ /** Get the tile's screen space error. */
116
+ getScreenSpaceError(frameState: any, useParentLodMetric: any): number;
117
+ _getPriority(): number;
118
+ /**
119
+ * Requests the tile's content.
120
+ * The request may not be made if the Request Scheduler can't prioritize it.
121
+ */
122
+ loadContent(): Promise<boolean>;
123
+ unloadContent(): boolean;
124
+ /**
125
+ * Update the tile's visibility
126
+ * @param {Object} frameState - frame state for tile culling
127
+ * @param {string[]} viewportIds - a list of viewport ids that show this tile
128
+ * @return {void}
129
+ */
130
+ updateVisibility(frameState: any, viewportIds: any): void;
131
+ visibility(frameState: any, parentVisibilityPlaneMask: any): any;
132
+ contentVisibility(): boolean;
133
+ /**
134
+ * Computes the (potentially approximate) distance from the closest point of the tile's bounding volume to the camera.
135
+ * @param frameState The frame state.
136
+ * @returns {Number} The distance, in meters, or zero if the camera is inside the bounding volume.
137
+ */
138
+ distanceToTile(frameState: FrameState): number;
139
+ /**
140
+ * Computes the tile's camera-space z-depth.
141
+ * @param frameState The frame state.
142
+ * @returns The distance, in meters.
143
+ */
144
+ cameraSpaceZDepth({ camera }: {
145
+ camera: any;
146
+ }): number;
147
+ /**
148
+ * Checks if the camera is inside the viewer request volume.
149
+ * @param {FrameState} frameState The frame state.
150
+ * @returns {Boolean} Whether the camera is inside the volume.
151
+ */
152
+ insideViewerRequestVolume(frameState: FrameState): boolean;
153
+ updateExpiration(): void;
154
+ get extras(): any;
155
+ _initializeLodMetric(header: any): void;
156
+ _initializeTransforms(tileHeader: any): void;
157
+ _initializeBoundingVolumes(tileHeader: any): void;
158
+ _initializeContent(tileHeader: any): void;
159
+ _initializeRenderingState(header: any): void;
160
+ _getRefine(refine: any): any;
161
+ _isTileset(): boolean;
162
+ _onContentLoaded(): void;
163
+ _updateBoundingVolume(header: any): void;
164
+ _updateTransform(parentTransform?: Matrix4): void;
165
+ _getLoaderSpecificOptions(loaderId: any): {
166
+ assetGltfUpAxis: any;
167
+ } | {
168
+ tile: any;
169
+ tileset: {
170
+ [key: string]: any;
171
+ };
172
+ isTileHeader: boolean;
173
+ };
174
+ }
175
+ //# sourceMappingURL=tile-3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tile-3d.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,OAAO,EAAC,MAAM,eAAe,CAAC;AAM/C,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAQjD,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAQ1C;;;;;;GAMG;AACH,oBAAY,eAAe,GAAG;IAC5B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,UAAU,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,GAAG,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,GAAG,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC;IAGhB,QAAQ,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC/B,iBAAiB,EAAE,GAAG,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;IAGlB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAM;IAG1B,OAAO,CAAC,SAAS,CAAM;IAEvB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,eAAe,CAAM;IAE7B,OAAO,CAAC,aAAa,CAAU;IAI/B,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAU;IAC3B,OAAO,CAAC,gBAAgB,CAAU;IAGlC,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAS;IAGhC,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,eAAe,CAAS;IAGhC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,oBAAoB,CAAM;IAElC,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;;;;;;OAQG;gBAGD,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,EAC5B,YAAY,CAAC,EAAE,UAAU,EACzB,UAAU,SAAK;IAmFjB,OAAO;IAIP,WAAW;IAIX,IAAI,QAAQ,YAEX;IAED,IAAI,SAAS,wBAEZ;IAED,IAAI,2BAA2B,wBAE9B;IAED,4EAA4E;IAC5E,IAAI,gBAAgB,YAEnB;IAED,wCAAwC;IACxC,IAAI,WAAW,QAEd;IAED;;;OAGG;IACH,IAAI,YAAY,YAEf;IAED;;;OAGG;IACH,IAAI,gBAAgB,YAInB;IAED,oEAAoE;IACpE,IAAI,kBAAkB,YAErB;IAED;;;OAGG;IACH,IAAI,eAAe,YAElB;IAED;;;OAGG;IACH,IAAI,cAAc,YAEjB;IAID,IAAI,aAAa,YAEhB;IAED,yCAAyC;IACzC,mBAAmB,CAAC,UAAU,KAAA,EAAE,kBAAkB,KAAA;IAiBlD,YAAY;IAsCZ;;;OAGG;IAEG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAmErC,aAAa;IAab;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,KAAA,EAAE,WAAW,KAAA;IA+BxC,UAAU,CAAC,UAAU,KAAA,EAAE,yBAAyB,KAAA;IAyBhD,iBAAiB;IAuCjB;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAK9C;;;;OAIG;IACH,iBAAiB,CAAC,EAAC,MAAM,EAAC;;KAAA,GAAG,MAAM;IAMnC;;;;OAIG;IACH,yBAAyB,CAAC,UAAU,EAAE,UAAU;IAUhD,gBAAgB;IAWhB,IAAI,MAAM,QAET;IAID,oBAAoB,CAAC,MAAM,KAAA;IAsB3B,qBAAqB,CAAC,UAAU,KAAA;IAkBhC,0BAA0B,CAAC,UAAU,KAAA;IAOrC,kBAAkB,CAAC,UAAU,KAAA;IAiB7B,yBAAyB,CAAC,MAAM,KAAA;IAwBhC,UAAU,CAAC,MAAM,KAAA;IAKjB,UAAU;IAIV,gBAAgB;IAiBhB,qBAAqB,CAAC,MAAM,KAAA;IAoC5B,gBAAgB,CAAC,eAAe,UAAgB;IAchD,yBAAyB,CAAC,QAAQ,KAAA;;;;;;;;;CAenC"}