@tangram.gl/tangram-renderer 0.0.0-stage → 0.0.1
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.
- package/README.md +60 -2
- package/dist/core.js +36923 -0
- package/dist/core.js.map +6 -0
- package/dist/index.js +32 -0
- package/dist/loaders-gl-worker.js +82 -0
- package/dist/loaders-gl-worker.js.map +6 -0
- package/dist/map-logic.js +2 -0
- package/dist/map-logic.js.map +6 -0
- package/dist/projected-basemaps-worker.js +3 -0
- package/dist/projected-basemaps-worker.js.map +6 -0
- package/dist/shader-modules.js +141 -0
- package/dist/shader-modules.js.map +6 -0
- package/dist/style-schema.js +126 -0
- package/dist/style-schema.js.map +6 -0
- package/dist/tangram-style.schema.json +882 -0
- package/dist/tangram.debug.mjs +37139 -0
- package/dist/tangram.debug.mjs.map +6 -0
- package/dist/tangram.min.mjs +4950 -0
- package/dist/types/builders/earcut.d.ts +15 -0
- package/dist/types/core.d.ts +29 -0
- package/dist/types/gl/constants.d.ts +2 -0
- package/dist/types/gl/globe_mesh.d.ts +48 -0
- package/dist/types/gl/glsl.d.ts +17 -0
- package/dist/types/gl/vertex-constants.d.ts +4 -0
- package/dist/types/gl/vertex-types.d.ts +34 -0
- package/dist/types/gl/vertex_data.d.ts +32 -0
- package/dist/types/gl/vertex_elements.d.ts +8 -0
- package/dist/types/gl/vertex_layout.d.ts +32 -0
- package/dist/types/glsl.d.ts +14 -0
- package/dist/types/gpu/luma_device_renderer.d.ts +66 -0
- package/dist/types/gpu/resource_lifecycle.d.ts +4 -0
- package/dist/types/gpu/tangram_gpu_backend.d.ts +151 -0
- package/dist/types/index.d.ts +155 -0
- package/dist/types/lights/light-definitions.d.ts +121 -0
- package/dist/types/map-logic/draped-terrain-bounds.d.ts +41 -0
- package/dist/types/map-logic/globe-terrain-preparation.d.ts +85 -0
- package/dist/types/map-logic/globe-terrain.d.ts +54 -0
- package/dist/types/map-logic/index.d.ts +33 -0
- package/dist/types/map-logic/label-identity.d.ts +22 -0
- package/dist/types/map-logic/label-placement.d.ts +32 -0
- package/dist/types/map-logic/screen-bounds.d.ts +15 -0
- package/dist/types/map-logic/terrain-data.d.ts +55 -0
- package/dist/types/map-logic/terrain-error.d.ts +51 -0
- package/dist/types/map-logic/terrain-ground-topology.d.ts +26 -0
- package/dist/types/map-logic/terrain-height-field.d.ts +59 -0
- package/dist/types/map-logic/terrain-navigation.d.ts +27 -0
- package/dist/types/map-logic/terrain-neighborhood.d.ts +5 -0
- package/dist/types/map-logic/terrain-query.d.ts +33 -0
- package/dist/types/map-logic/terrain-resource-budget.d.ts +51 -0
- package/dist/types/map-logic/terrain-transition-topology.d.ts +23 -0
- package/dist/types/map-logic/tile-build-queue.d.ts +51 -0
- package/dist/types/map-logic/tile-cache-policy.d.ts +46 -0
- package/dist/types/map-logic/tile-residency.d.ts +17 -0
- package/dist/types/map-logic/triangle-query-index.d.ts +87 -0
- package/dist/types/procedures/js-yaml.d.ts +15 -0
- package/dist/types/procedures/mesh-projector.d.ts +107 -0
- package/dist/types/procedures/mvt-dependencies.d.ts +20 -0
- package/dist/types/procedures/projected-coordinate-transform.d.ts +27 -0
- package/dist/types/procedures/projection-batch-executor.d.ts +53 -0
- package/dist/types/procedures/scene-yaml-legacy.d.ts +6 -0
- package/dist/types/procedures/terrain-draping.d.ts +165 -0
- package/dist/types/procedures/terrain-globe.d.ts +6 -0
- package/dist/types/procedures/terrain-styled-topology.d.ts +34 -0
- package/dist/types/procedures/web-mercator-legacy.d.ts +4 -0
- package/dist/types/procedures/web-mercator-math.d.ts +4 -0
- package/dist/types/scene/globals.d.ts +11 -0
- package/dist/types/scene/ground_footprint.d.ts +16 -0
- package/dist/types/scene/host_frame.d.ts +54 -0
- package/dist/types/scene/projection_math.d.ts +52 -0
- package/dist/types/scene/scene-resource-types.d.ts +177 -0
- package/dist/types/scene/scene_bundle.d.ts +69 -0
- package/dist/types/scene/visibility_adapter.d.ts +106 -0
- package/dist/types/selection/draped-terrain-surface.d.ts +78 -0
- package/dist/types/selection/terrain_surface.d.ts +149 -0
- package/dist/types/shader-modules/globe-horizon.d.ts +15 -0
- package/dist/types/shader-modules/height-decode.d.ts +13 -0
- package/dist/types/shader-modules/hillshade.d.ts +13 -0
- package/dist/types/shader-modules/index.d.ts +6 -0
- package/dist/types/shader-modules/planar.d.ts +12 -0
- package/dist/types/shader-modules/sphere-map.d.ts +13 -0
- package/dist/types/shader-modules/triplanar.d.ts +15 -0
- package/dist/types/sources/decoded_tile_store.d.ts +95 -0
- package/dist/types/sources/tile_source_metadata.d.ts +32 -0
- package/dist/types/styles/text/fontfaceobserver.d.ts +10 -0
- package/dist/types/tile/tile_id.d.ts +37 -0
- package/dist/types/tile/tile_traversal_adapter.d.ts +63 -0
- package/dist/types/types.d.ts +293 -0
- package/dist/types/utils/geo.d.ts +57 -0
- package/dist/types/utils/hash.d.ts +1 -0
- package/dist/types/utils/log.d.ts +27 -0
- package/dist/types/utils/props.d.ts +6 -0
- package/dist/types/utils/subscribe.d.ts +10 -0
- package/dist/types/utils/thread.d.ts +6 -0
- package/dist/types/utils/urls.d.ts +26 -0
- package/dist/types/utils/utils.d.ts +26 -0
- package/dist/types/utils/version.d.ts +2 -0
- package/dist/types/utils/worker-types.d.ts +68 -0
- package/dist/types/utils/worker_broker.d.ts +3 -0
- package/package.json +103 -3
- package/src/builders/common.ts +41 -0
- package/src/builders/earcut.d.ts +15 -0
- package/src/builders/geometry-types.ts +60 -0
- package/src/builders/points.ts +115 -0
- package/src/builders/polygons.ts +225 -0
- package/src/builders/polylines.ts +682 -0
- package/src/builders/wireframe.ts +31 -0
- package/src/core.d.ts +29 -0
- package/src/core.ts +33 -0
- package/src/experimental/loaders-gl-worker.ts +19 -0
- package/src/experimental/projected-basemaps-worker.ts +13 -0
- package/src/experimental/projected-mesh-cache.ts +137 -0
- package/src/experimental/projected-mesh-domain.ts +110 -0
- package/src/experimental/projected-mesh-refinement.ts +193 -0
- package/src/experimental/projected-mesh.ts +399 -0
- package/src/experimental/projected-normal.ts +26 -0
- package/src/experimental/projected-symbol-mesh.ts +74 -0
- package/src/gl/constants.ts +18 -0
- package/src/gl/context.ts +103 -0
- package/src/gl/extensions.ts +30 -0
- package/src/gl/globe_mesh.ts +285 -0
- package/src/gl/glsl.ts +257 -0
- package/src/gl/mesh-types.ts +56 -0
- package/src/gl/render_state.ts +111 -0
- package/src/gl/shader_program.ts +1310 -0
- package/src/gl/texture.ts +814 -0
- package/src/gl/uniform_buffer.ts +340 -0
- package/src/gl/vao.ts +154 -0
- package/src/gl/vbo_mesh.ts +349 -0
- package/src/gl/vertex-constants.ts +19 -0
- package/src/gl/vertex-types.ts +35 -0
- package/src/gl/vertex_data.ts +126 -0
- package/src/gl/vertex_elements.ts +54 -0
- package/src/gl/vertex_layout.ts +241 -0
- package/src/glsl.d.ts +14 -0
- package/src/gpu/luma_device_renderer.ts +579 -0
- package/src/gpu/pixel_readback.ts +51 -0
- package/src/gpu/resource_lifecycle.ts +32 -0
- package/src/gpu/tangram_gpu_backend.ts +195 -0
- package/src/index.d.ts +155 -0
- package/src/index.ts +105 -0
- package/src/labels/collision-types.ts +94 -0
- package/src/labels/collision.ts +273 -0
- package/src/labels/collision_grid.ts +61 -0
- package/src/labels/intersect.ts +30 -0
- package/src/labels/label-types.ts +91 -0
- package/src/labels/label.ts +207 -0
- package/src/labels/label_line.ts +801 -0
- package/src/labels/label_point.ts +131 -0
- package/src/labels/main-pass-types.ts +73 -0
- package/src/labels/main_pass.ts +221 -0
- package/src/labels/point_anchor.ts +100 -0
- package/src/labels/point_placement.ts +150 -0
- package/src/labels/projected-pass.ts +259 -0
- package/src/labels/repeat_group.ts +72 -0
- package/src/lights/ambient_light.glsl +18 -0
- package/src/lights/directional_light.glsl +39 -0
- package/src/lights/geographic-lights.ts +21 -0
- package/src/lights/light-definitions.ts +285 -0
- package/src/lights/light.ts +590 -0
- package/src/lights/lighting-uniforms.ts +80 -0
- package/src/lights/lighting-wgsl.ts +116 -0
- package/src/lights/material.glsl +237 -0
- package/src/lights/material.ts +145 -0
- package/src/lights/native-falloff.ts +37 -0
- package/src/lights/point_light.glsl +96 -0
- package/src/lights/spot_light.glsl +111 -0
- package/src/map-logic/draped-terrain-bounds.ts +71 -0
- package/src/map-logic/globe-terrain-preparation.ts +217 -0
- package/src/map-logic/globe-terrain.ts +296 -0
- package/src/map-logic/index.ts +37 -0
- package/src/map-logic/label-identity.ts +36 -0
- package/src/map-logic/label-placement.ts +117 -0
- package/src/map-logic/screen-bounds.ts +34 -0
- package/src/map-logic/terrain-data.ts +107 -0
- package/src/map-logic/terrain-error.ts +134 -0
- package/src/map-logic/terrain-ground-topology.ts +164 -0
- package/src/map-logic/terrain-height-field.ts +254 -0
- package/src/map-logic/terrain-navigation.ts +50 -0
- package/src/map-logic/terrain-neighborhood.ts +43 -0
- package/src/map-logic/terrain-query.ts +51 -0
- package/src/map-logic/terrain-resource-budget.ts +124 -0
- package/src/map-logic/terrain-transition-topology.ts +164 -0
- package/src/map-logic/tile-build-queue.ts +110 -0
- package/src/map-logic/tile-cache-policy.ts +89 -0
- package/src/map-logic/tile-residency.ts +50 -0
- package/src/map-logic/triangle-query-index.ts +265 -0
- package/src/procedures/js-yaml.d.ts +15 -0
- package/src/procedures/mesh-projector.ts +191 -0
- package/src/procedures/mlt-loaders.ts +55 -0
- package/src/procedures/mvt-dependencies.d.ts +20 -0
- package/src/procedures/mvt-legacy.ts +150 -0
- package/src/procedures/mvt-loaders.ts +53 -0
- package/src/procedures/mvt-parser.ts +48 -0
- package/src/procedures/mvt-properties.ts +36 -0
- package/src/procedures/mvt-tile-provider.ts +72 -0
- package/src/procedures/pmtiles-loader.ts +75 -0
- package/src/procedures/projected-coordinate-transform.ts +79 -0
- package/src/procedures/projection-batch-executor.ts +140 -0
- package/src/procedures/scene-yaml-legacy.ts +16 -0
- package/src/procedures/scene-yaml-loaders.ts +10 -0
- package/src/procedures/terrain-draping.ts +713 -0
- package/src/procedures/terrain-globe.ts +32 -0
- package/src/procedures/terrain-styled-topology.ts +184 -0
- package/src/procedures/web-mercator-legacy.ts +24 -0
- package/src/procedures/web-mercator-math.ts +50 -0
- package/src/scene/camera.ts +298 -0
- package/src/scene/camera_base.ts +116 -0
- package/src/scene/classic_scene.ts +20 -0
- package/src/scene/external_camera.ts +101 -0
- package/src/scene/globals.ts +120 -0
- package/src/scene/ground_footprint.ts +139 -0
- package/src/scene/host_frame.ts +326 -0
- package/src/scene/projected_tile_lod.ts +125 -0
- package/src/scene/projection_math.ts +142 -0
- package/src/scene/projection_shaders.ts +183 -0
- package/src/scene/renderer.ts +516 -0
- package/src/scene/scene-resource-types.ts +174 -0
- package/src/scene/scene.ts +2378 -0
- package/src/scene/scene_bundle.ts +304 -0
- package/src/scene/scene_debug.ts +129 -0
- package/src/scene/scene_loader.ts +402 -0
- package/src/scene/scene_worker.ts +528 -0
- package/src/scene/view.ts +683 -0
- package/src/scene/visibility_adapter.ts +319 -0
- package/src/scene/worker_url.ts +15 -0
- package/src/selection/draped-terrain-surface.ts +377 -0
- package/src/selection/selection-types.ts +79 -0
- package/src/selection/selection.ts +542 -0
- package/src/selection/selection_fragment.glsl +18 -0
- package/src/selection/selection_globals.glsl +9 -0
- package/src/selection/selection_pixels.ts +59 -0
- package/src/selection/selection_vertex.glsl +15 -0
- package/src/selection/terrain_surface.ts +298 -0
- package/src/shader-modules/globe-horizon.ts +52 -0
- package/src/shader-modules/height-decode.ts +41 -0
- package/src/shader-modules/hillshade.ts +70 -0
- package/src/shader-modules/index.ts +10 -0
- package/src/shader-modules/planar.ts +24 -0
- package/src/shader-modules/sphere-map.ts +38 -0
- package/src/shader-modules/triplanar.ts +45 -0
- package/src/sources/aligned_tile_source.ts +122 -0
- package/src/sources/data_source.ts +655 -0
- package/src/sources/decoded_tile_store.ts +245 -0
- package/src/sources/geojson.ts +300 -0
- package/src/sources/mvt.ts +247 -0
- package/src/sources/raster.ts +341 -0
- package/src/sources/shared_tile_source_adapter.ts +117 -0
- package/src/sources/sources.ts +10 -0
- package/src/sources/tile_source_adapter.ts +84 -0
- package/src/sources/tile_source_metadata.ts +65 -0
- package/src/sources/tile_source_state.ts +112 -0
- package/src/sources/topojson.ts +90 -0
- package/src/styles/feature_annotations.ts +16 -0
- package/src/styles/filter.ts +190 -0
- package/src/styles/geometry-style-types.ts +209 -0
- package/src/styles/globe_visibility_wgsl.ts +22 -0
- package/src/styles/layer-types.ts +45 -0
- package/src/styles/layer.ts +586 -0
- package/src/styles/lines/dasharray.ts +49 -0
- package/src/styles/lines/lines.ts +707 -0
- package/src/styles/lines/lines_wgsl.ts +224 -0
- package/src/styles/points/point-runtime-types.ts +125 -0
- package/src/styles/points/points.ts +1079 -0
- package/src/styles/points/points_fragment.glsl +126 -0
- package/src/styles/points/points_vertex.glsl +230 -0
- package/src/styles/points/points_wgsl.ts +189 -0
- package/src/styles/polygons/polygons.ts +268 -0
- package/src/styles/polygons/polygons_fragment.glsl +173 -0
- package/src/styles/polygons/polygons_vertex.glsl +213 -0
- package/src/styles/polygons/polygons_wgsl.ts +127 -0
- package/src/styles/property-types.ts +125 -0
- package/src/styles/raster/raster.ts +33 -0
- package/src/styles/raster/raster_globals.glsl +46 -0
- package/src/styles/style-mixing-types.ts +101 -0
- package/src/styles/style-runtime-types.ts +220 -0
- package/src/styles/style-schema.ts +133 -0
- package/src/styles/style.ts +1033 -0
- package/src/styles/style_globals.glsl +69 -0
- package/src/styles/style_manager.ts +464 -0
- package/src/styles/style_parser.ts +620 -0
- package/src/styles/text/font_manager.ts +180 -0
- package/src/styles/text/fontfaceobserver.d.ts +10 -0
- package/src/styles/text/text-types.ts +220 -0
- package/src/styles/text/text.ts +378 -0
- package/src/styles/text/text_canvas.ts +773 -0
- package/src/styles/text/text_labels.ts +436 -0
- package/src/styles/text/text_segments.ts +142 -0
- package/src/styles/text/text_settings.ts +228 -0
- package/src/styles/text/text_wgsl.ts +159 -0
- package/src/styles/text/text_wrap.ts +194 -0
- package/src/tile/globe_tile_preload.ts +40 -0
- package/src/tile/tangram_tileset_2d.ts +108 -0
- package/src/tile/tile-build-types.ts +155 -0
- package/src/tile/tile.ts +807 -0
- package/src/tile/tile_id.ts +172 -0
- package/src/tile/tile_manager.ts +889 -0
- package/src/tile/tile_pyramid.ts +119 -0
- package/src/tile/tile_resource_cache.ts +91 -0
- package/src/tile/tile_traversal_adapter.ts +132 -0
- package/src/types.ts +332 -0
- package/src/utils/debounce.ts +17 -0
- package/src/utils/debug_settings.ts +43 -0
- package/src/utils/errors.ts +12 -0
- package/src/utils/functions.ts +95 -0
- package/src/utils/geo.ts +364 -0
- package/src/utils/hash.ts +14 -0
- package/src/utils/log.ts +108 -0
- package/src/utils/media_capture.ts +193 -0
- package/src/utils/merge.ts +44 -0
- package/src/utils/obb.ts +134 -0
- package/src/utils/props.ts +43 -0
- package/src/utils/slice.ts +14 -0
- package/src/utils/subscribe.ts +58 -0
- package/src/utils/task.ts +154 -0
- package/src/utils/thread.ts +26 -0
- package/src/utils/urls.ts +223 -0
- package/src/utils/utils.ts +310 -0
- package/src/utils/vector.ts +197 -0
- package/src/utils/version.ts +8 -0
- package/src/utils/worker-types.ts +79 -0
- package/src/utils/worker_broker.ts +523 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// tangram-layers
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import Geo, {type Bounds, type Meters, type Tile} from '../utils/geo';
|
|
6
|
+
import {TileID, type TileCoordinate} from '../tile/tile_id';
|
|
7
|
+
import type {HostCamera} from '../types';
|
|
8
|
+
import {Matrix4} from '@math.gl/core';
|
|
9
|
+
import {PROJECTION_CONSTANTS, projectGeographicVector} from './projection_math';
|
|
10
|
+
|
|
11
|
+
/** State consumed by a renderer-owned visibility and LOD adapter. */
|
|
12
|
+
export interface VisibilityViewState {
|
|
13
|
+
/** Optional host matrices for policies selecting a precise per-eye footprint. */
|
|
14
|
+
readonly camera?: HostCamera;
|
|
15
|
+
readonly center: {readonly lng: number; readonly lat: number};
|
|
16
|
+
/** Scene/style zoom used to calculate meter scale, independent of data detail. */
|
|
17
|
+
readonly zoom: number;
|
|
18
|
+
/** Requested data-tile level, before source normalization. */
|
|
19
|
+
readonly tile_zoom: number;
|
|
20
|
+
readonly size: {readonly css: {readonly width: number; readonly height: number}};
|
|
21
|
+
readonly bounds: Bounds | null;
|
|
22
|
+
readonly buffer: number;
|
|
23
|
+
readonly wrap: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Bounds and LOD state calculated for a Tangram view. */
|
|
27
|
+
export interface CalculatedViewBounds {
|
|
28
|
+
/** Data-tile zoom selected for the current view. */
|
|
29
|
+
tileZoom: number;
|
|
30
|
+
metersPerPixel: number;
|
|
31
|
+
sizeMeters: Meters;
|
|
32
|
+
centerMeters: Meters;
|
|
33
|
+
centerTile: Tile;
|
|
34
|
+
bounds: Bounds;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Renderer-facing visibility and level-of-detail policy.
|
|
39
|
+
*
|
|
40
|
+
* Implementations consume Tangram geographic view state and return Tangram
|
|
41
|
+
* tile coordinates. They do not depend on deck.gl or a specific host camera.
|
|
42
|
+
*/
|
|
43
|
+
export interface VisibilityLODAdapter {
|
|
44
|
+
/** Calculates the current Web Mercator bounds and derived tile LOD state. */
|
|
45
|
+
calculateBounds(view: VisibilityViewState): CalculatedViewBounds;
|
|
46
|
+
/** Returns visible tiles for the current Web Mercator view. */
|
|
47
|
+
findVisibleTileCoordinates(view: VisibilityViewState): TileCoordinate[];
|
|
48
|
+
/** Conservative candidate visits before allocation; required only for automatic host LOD. */
|
|
49
|
+
countTileCoordinates?(view: VisibilityViewState): number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Geographic state required to select tiles for a globe viewport. */
|
|
53
|
+
export interface GlobeVisibilityViewState {
|
|
54
|
+
/** Tile zoom selected for the current host view. */
|
|
55
|
+
readonly tile_zoom: number;
|
|
56
|
+
/** Number of neighboring tiles included around the geographic bounds. */
|
|
57
|
+
readonly buffer: number;
|
|
58
|
+
/** Host-visible geographic bounds in west, south, east, north order. */
|
|
59
|
+
readonly visibleBounds: readonly [number, number, number, number];
|
|
60
|
+
/** Camera position in the globe's common-space coordinates, when available. */
|
|
61
|
+
readonly cameraPosition?: readonly [number, number, number];
|
|
62
|
+
/** Maximum rendered elevation in geographic meters; omitted means unknown, not zero. */
|
|
63
|
+
readonly maxElevation?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Projection-specific tile visibility policy for globe views. */
|
|
67
|
+
export interface GlobeVisibilityLODAdapter {
|
|
68
|
+
/** Returns visible tiles for the geographic bounds of a globe viewport. */
|
|
69
|
+
findVisibleTileCoordinates(view: GlobeVisibilityViewState): TileCoordinate[];
|
|
70
|
+
/** Candidate visits before deduplication/horizon rejection; required only for automatic host LOD. */
|
|
71
|
+
countTileCoordinates?(view: GlobeVisibilityViewState): number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Default visibility policy preserving Tangram's rectangular Web Mercator
|
|
76
|
+
* viewport bounds and buffered tile-range behavior.
|
|
77
|
+
*/
|
|
78
|
+
export class WebMercatorVisibilityAdapter implements VisibilityLODAdapter {
|
|
79
|
+
/**
|
|
80
|
+
* Calculates meter-space viewport bounds and the center tile.
|
|
81
|
+
* @param view Tangram's current geographic view state.
|
|
82
|
+
* @returns Bounds, center, and LOD state used by View.
|
|
83
|
+
*/
|
|
84
|
+
calculateBounds(view: VisibilityViewState): CalculatedViewBounds {
|
|
85
|
+
const tileZoom = view.tile_zoom;
|
|
86
|
+
const metersPerPixel = Geo.metersPerPixel(view.zoom);
|
|
87
|
+
const sizeMeters = {
|
|
88
|
+
x: view.size.css.width * metersPerPixel,
|
|
89
|
+
y: view.size.css.height * metersPerPixel
|
|
90
|
+
};
|
|
91
|
+
const centerCoordinate = Geo.latLngToMeters([view.center.lng, view.center.lat]);
|
|
92
|
+
const centerMeters = {x: centerCoordinate[0], y: centerCoordinate[1]};
|
|
93
|
+
const centerTile = Geo.tileForMeters([centerMeters.x, centerMeters.y], tileZoom);
|
|
94
|
+
const bounds = (view.camera && getGroundBounds(view.camera)) || {
|
|
95
|
+
sw: {
|
|
96
|
+
x: centerMeters.x - sizeMeters.x / 2,
|
|
97
|
+
y: centerMeters.y - sizeMeters.y / 2
|
|
98
|
+
},
|
|
99
|
+
ne: {
|
|
100
|
+
x: centerMeters.x + sizeMeters.x / 2,
|
|
101
|
+
y: centerMeters.y + sizeMeters.y / 2
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
return {tileZoom, metersPerPixel, sizeMeters, centerMeters, centerTile, bounds};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Selects the buffered tile rectangle intersecting the current view.
|
|
110
|
+
* @param view Tangram's current geographic view state.
|
|
111
|
+
* @returns Visible tile coordinates at the current tile zoom.
|
|
112
|
+
*/
|
|
113
|
+
findVisibleTileCoordinates(view: VisibilityViewState): TileCoordinate[] {
|
|
114
|
+
const range = getPlanarTileRange(view);
|
|
115
|
+
if (!range) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const zoom = view.tile_zoom;
|
|
120
|
+
const coordinates: TileCoordinate[] = [];
|
|
121
|
+
for (let x = range[0]; x <= range[1]; x++) {
|
|
122
|
+
for (let y = range[2]; y <= range[3]; y++) {
|
|
123
|
+
coordinates.push(TileID.coord({x, y, z: zoom}));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return coordinates;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Counts the same buffered range as enumeration without creating tile objects. */
|
|
130
|
+
countTileCoordinates(view: VisibilityViewState): number {
|
|
131
|
+
const range = getPlanarTileRange(view);
|
|
132
|
+
return range ? countTileRange(range) : 0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Shared enumeration bounds keep the allocation budget consistent with selection. */
|
|
137
|
+
function getPlanarTileRange(view: VisibilityViewState): number[] | null {
|
|
138
|
+
if (!view.bounds) return null;
|
|
139
|
+
const southwest = Geo.tileForMeters([view.bounds.sw.x, view.bounds.sw.y], view.tile_zoom);
|
|
140
|
+
const northeast = Geo.tileForMeters([view.bounds.ne.x, view.bounds.ne.y], view.tile_zoom);
|
|
141
|
+
const range = [southwest.x - view.buffer, northeast.x + view.buffer,
|
|
142
|
+
northeast.y - view.buffer, southwest.y + view.buffer];
|
|
143
|
+
const maxTile = 2 ** view.tile_zoom - 1;
|
|
144
|
+
return view.wrap ? range : range.map(value => Math.min(Math.max(0, value), maxTile));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Counts loop visits, including wrapped duplicates and fractional buffer origins. */
|
|
148
|
+
function countTileRange(range: number[]): number {
|
|
149
|
+
return Math.max(0, Math.floor(range[1] - range[0]) + 1) *
|
|
150
|
+
Math.max(0, Math.floor(range[3] - range[2]) + 1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Intersects a planar host frustum with EPSG:3857 ground, retaining the legacy fallback near the horizon. */
|
|
154
|
+
function getGroundBounds(camera: HostCamera): Bounds | null {
|
|
155
|
+
const matrix = new Matrix4().copy(camera.projection).multiplyRight(camera.view);
|
|
156
|
+
const determinant = matrix.determinant();
|
|
157
|
+
if (!Number.isFinite(determinant) || determinant === 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
matrix.invert();
|
|
161
|
+
const points: number[][] = [];
|
|
162
|
+
for (const [horizontal, vertical] of [[-1, -1], [1, -1], [-1, 1], [1, 1]]) {
|
|
163
|
+
const near = matrix.transformAsPoint([horizontal, vertical, -1]);
|
|
164
|
+
const far = matrix.transformAsPoint([horizontal, vertical, 1]);
|
|
165
|
+
const parameter = -near[2] / (far[2] - near[2]);
|
|
166
|
+
if (!Number.isFinite(parameter) || parameter < 0 || parameter > 1) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const point = [near[0] + (far[0] - near[0]) * parameter, near[1] + (far[1] - near[1]) * parameter];
|
|
170
|
+
if (!point.every(Number.isFinite)) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
points.push(point);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
sw: {x: Math.min(...points.map(point => point[0])), y: Math.min(...points.map(point => point[1]))},
|
|
177
|
+
ne: {x: Math.max(...points.map(point => point[0])), y: Math.max(...points.map(point => point[1]))}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Selects Web Mercator tiles intersecting geographic bounds on a globe.
|
|
183
|
+
* Antimeridian-crossing bounds are split into two ranges and duplicate tiles
|
|
184
|
+
* are removed while preserving traversal order. Horizon rejection requires both
|
|
185
|
+
* a host camera and an explicit conservative elevation bound. Geographic bounds
|
|
186
|
+
* must already enclose elevated content; this policy does not infer a frustum footprint.
|
|
187
|
+
*/
|
|
188
|
+
export class WebMercatorGlobeVisibilityAdapter implements GlobeVisibilityLODAdapter {
|
|
189
|
+
/**
|
|
190
|
+
* Returns buffered tiles intersecting host bounds and the visible globe hemisphere.
|
|
191
|
+
* @param view Tile zoom, buffer, geographic bounds, and optional camera position.
|
|
192
|
+
* @returns Visible tile coordinates.
|
|
193
|
+
*/
|
|
194
|
+
findVisibleTileCoordinates(view: GlobeVisibilityViewState): TileCoordinate[] {
|
|
195
|
+
if (view.maxElevation !== undefined &&
|
|
196
|
+
(!Number.isFinite(view.maxElevation) || view.maxElevation < 0)) {
|
|
197
|
+
throw new Error('Globe visibility maxElevation must be a finite non-negative number');
|
|
198
|
+
}
|
|
199
|
+
const zoom = view.tile_zoom;
|
|
200
|
+
const tileCount = Math.pow(2, zoom);
|
|
201
|
+
const coordinates: TileCoordinate[] = [];
|
|
202
|
+
const seen = new Set<string>();
|
|
203
|
+
|
|
204
|
+
for (const [xStart, xEnd, yStart, yEnd] of getGlobeTileRanges(view)) {
|
|
205
|
+
for (let x = xStart; x <= xEnd; x++) {
|
|
206
|
+
const wrappedX = ((x % tileCount) + tileCount) % tileCount;
|
|
207
|
+
for (let y = yStart; y <= yEnd; y++) {
|
|
208
|
+
const key = `${wrappedX}/${y}/${zoom}`;
|
|
209
|
+
if (!seen.has(key) && isTileVisibleFromCamera(wrappedX, y, zoom, view.cameraPosition, view.maxElevation)) {
|
|
210
|
+
seen.add(key);
|
|
211
|
+
coordinates.push(TileID.coord({x: wrappedX, y, z: zoom}));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return coordinates;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Bounds raw traversal work, not just the smaller visible/deduplicated result. */
|
|
220
|
+
countTileCoordinates(view: GlobeVisibilityViewState): number {
|
|
221
|
+
return getGlobeTileRanges(view).reduce((count, range) => count + countTileRange(range), 0);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Shared globe ranges account for antimeridian splitting and wrapped buffers. */
|
|
226
|
+
function getGlobeTileRanges(view: GlobeVisibilityViewState): number[][] {
|
|
227
|
+
const [west, south, east, north] = view.visibleBounds;
|
|
228
|
+
const zoom = view.tile_zoom;
|
|
229
|
+
const northY = latitudeToTileY(north, zoom);
|
|
230
|
+
const southY = latitudeToTileY(south, zoom);
|
|
231
|
+
const yStart = Math.max(0, Math.min(northY, southY) - view.buffer);
|
|
232
|
+
const yEnd = Math.min(2 ** zoom - 1, Math.max(northY, southY) + view.buffer);
|
|
233
|
+
return splitLongitudeRange(west, east).map(([rangeWest, rangeEast]) => [
|
|
234
|
+
longitudeToTileX(rangeWest, zoom) - view.buffer,
|
|
235
|
+
longitudeToTileX(rangeEast, zoom) + view.buffer, yStart, yEnd
|
|
236
|
+
]);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const GLOBE_RADIUS = PROJECTION_CONSTANTS.globeRadius;
|
|
240
|
+
// Must match the geographic altitude scale used by deck.gl and Tangram's globe shaders.
|
|
241
|
+
const GLOBE_EARTH_RADIUS = PROJECTION_CONSTANTS.earthRadius;
|
|
242
|
+
|
|
243
|
+
function isTileVisibleFromCamera(
|
|
244
|
+
x: number,
|
|
245
|
+
y: number,
|
|
246
|
+
zoom: number,
|
|
247
|
+
cameraPosition?: readonly [number, number, number],
|
|
248
|
+
maxElevation?: number
|
|
249
|
+
): boolean {
|
|
250
|
+
if (maxElevation === undefined || !cameraPosition || cameraPosition.length !== 3 ||
|
|
251
|
+
cameraPosition.some(value => !Number.isFinite(value))) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const cameraDistance = Math.hypot(...cameraPosition);
|
|
256
|
+
if (cameraDistance <= GLOBE_RADIUS) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const tileCount = Math.pow(2, zoom);
|
|
261
|
+
const west = x / tileCount * 360 - 180;
|
|
262
|
+
const east = (x + 1) / tileCount * 360 - 180;
|
|
263
|
+
const north = tileYToLatitude(y, zoom);
|
|
264
|
+
const south = tileYToLatitude(y + 1, zoom);
|
|
265
|
+
const center = geographicUnitVector((west + east) / 2, (north + south) / 2);
|
|
266
|
+
const cameraDirection = cameraPosition.map(value => value / cameraDistance);
|
|
267
|
+
const centerDotCamera = center[0] * cameraDirection[0] +
|
|
268
|
+
center[1] * cameraDirection[1] + center[2] * cameraDirection[2];
|
|
269
|
+
// A meridian-then-parallel path bounds every point in the tile, including
|
|
270
|
+
// curved edges and very coarse tiles whose antipode is not a corner.
|
|
271
|
+
const tileAngularRadius = Math.min(Math.PI,
|
|
272
|
+
((north - south) / 2 + (east - west) / 2) * Math.PI / 180
|
|
273
|
+
);
|
|
274
|
+
const horizonAngle = Math.acos(GLOBE_RADIUS / cameraDistance);
|
|
275
|
+
// A tangent line to the reference sphere can see elevated points beyond the
|
|
276
|
+
// ground horizon by acos(R / (R + height)). The bound is radial, not eye altitude.
|
|
277
|
+
const elevationAngle = Math.acos(1 / (1 + maxElevation / GLOBE_EARTH_RADIUS));
|
|
278
|
+
return centerDotCamera + 1e-12 >=
|
|
279
|
+
Math.cos(Math.min(Math.PI, horizonAngle + elevationAngle + tileAngularRadius));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function geographicUnitVector(longitude: number, latitude: number): [number, number, number] {
|
|
283
|
+
return projectGeographicVector([longitude, latitude, 0], [0, 0, 1], 'globe');
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function tileYToLatitude(y: number, zoom: number): number {
|
|
287
|
+
const tileCount = Math.pow(2, zoom);
|
|
288
|
+
const mercatorY = Math.PI * (1 - 2 * y / tileCount);
|
|
289
|
+
return Math.atan(Math.sinh(mercatorY)) * 180 / Math.PI;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function splitLongitudeRange(west: number, east: number): [number, number][] {
|
|
293
|
+
if (east - west >= 360) {
|
|
294
|
+
return [[-180, 180 - Number.EPSILON]];
|
|
295
|
+
}
|
|
296
|
+
const normalizedWest = normalizeLongitude(west);
|
|
297
|
+
const normalizedEast = normalizeLongitude(east);
|
|
298
|
+
return normalizedWest <= normalizedEast
|
|
299
|
+
? [[normalizedWest, normalizedEast]]
|
|
300
|
+
: [[normalizedWest, 180 - Number.EPSILON], [-180, normalizedEast]];
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function normalizeLongitude(longitude: number): number {
|
|
304
|
+
return ((longitude + 180) % 360 + 360) % 360 - 180;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function longitudeToTileX(longitude: number, zoom: number): number {
|
|
308
|
+
const tileCount = Math.pow(2, zoom);
|
|
309
|
+
return Math.min(tileCount - 1, Math.max(0,
|
|
310
|
+
Math.floor(((longitude + 180) / 360) * tileCount)));
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function latitudeToTileY(latitude: number, zoom: number): number {
|
|
314
|
+
const tileCount = Math.pow(2, zoom);
|
|
315
|
+
const clampedLatitude = Math.max(-85.05112878, Math.min(85.05112878, latitude));
|
|
316
|
+
const radians = clampedLatitude * Math.PI / 180;
|
|
317
|
+
const y = (1 - Math.asinh(Math.tan(radians)) / Math.PI) / 2;
|
|
318
|
+
return Math.min(tileCount - 1, Math.max(0, Math.floor(y * tileCount)));
|
|
319
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// tangram-layers
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
let workerURL: string | undefined;
|
|
6
|
+
|
|
7
|
+
/** Installs the bundled worker URL without exposing a global Tangram object. */
|
|
8
|
+
export function setWorkerURL(url: string): void {
|
|
9
|
+
workerURL = url;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Returns the core bundle's default worker URL; explicit scene options take precedence. */
|
|
13
|
+
export function getWorkerURL(): string | undefined {
|
|
14
|
+
return workerURL;
|
|
15
|
+
}
|