@sakuzu/maplibre-gl-draw 1.0.0
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/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Position computation for UI anchors (the single source for rendering and hit testing)
|
|
3
|
+
*
|
|
4
|
+
* When the terrain is enabled, the position of "UI decided by a single point" such as points,
|
|
5
|
+
* vertex handles, midpoint handles, scale handles and rotation handles necessarily disagrees
|
|
6
|
+
* unless the following two things are upheld.
|
|
7
|
+
*
|
|
8
|
+
* 1. An anchor is "longitude/latitude + ground elevation" (longitude/latitude alone drops it
|
|
9
|
+
* to sea level 0)
|
|
10
|
+
* 2. Rendering and hit testing share the result of putting the same elevation through the same
|
|
11
|
+
* projection
|
|
12
|
+
*
|
|
13
|
+
* Previously 2 was not upheld. The vertex shader looked the elevation up in the DEM atlas
|
|
14
|
+
* while hit testing called MapLibre's `map.project`. With two sources, fixing only one of them
|
|
15
|
+
* lets the problem come back. So this module was made the single source, in the following
|
|
16
|
+
* shape.
|
|
17
|
+
*
|
|
18
|
+
* - The hit testing side arrives here through the injection point in `shared/math/transform.ts`
|
|
19
|
+
* - The rendering side has the point renderer receive the elevation computed here as a vertex
|
|
20
|
+
* attribute
|
|
21
|
+
*
|
|
22
|
+
* Both the elevation value and the projection formula become single, so they agree
|
|
23
|
+
* structurally.
|
|
24
|
+
*
|
|
25
|
+
* The source of the elevation is the surface MapLibre draws: `map.queryTerrainElevation`,
|
|
26
|
+
* which samples the terrain tile drawn at the point (`ground.ts`). `map.project` reads the same
|
|
27
|
+
* function, and the value includes the exaggeration. It is a different path from the DEM atlas
|
|
28
|
+
* and the drape (the GPU-side elevation used by polygons and lines), but those read the same
|
|
29
|
+
* DEM textures with the same placement (`upstream-terrain.ts`), so they agree; the end-to-end test
|
|
30
|
+
* `src/e2e/terrain.e2e.test.ts` holds all of them to `map.queryTerrainElevation`. For anchors
|
|
31
|
+
* alone the CPU-side value is authoritative and is handed to the GPU.
|
|
32
|
+
*
|
|
33
|
+
* The projection formula is a copy of the vertex shader's (OFFSET_MODE_GLSL in
|
|
34
|
+
* `shaders/helpers.ts`). It goes through the same branch, including the condition for
|
|
35
|
+
* switching to offset mode (zoom >= 12). The lift (liftMeters) is not added. That exists for
|
|
36
|
+
* rendering reasons, to avoid Z-fighting with the terrain mesh; anchors are drawn without a
|
|
37
|
+
* depth test so they do not need it, and adding it would make them disagree with
|
|
38
|
+
* `map.project`.
|
|
39
|
+
*
|
|
40
|
+
* `map.project` itself is not used for hit testing, although with the same elevation it lands
|
|
41
|
+
* within hundredths of a pixel of this projection. Hit testing must follow what the shader
|
|
42
|
+
* draws, and `map.project` is fast only where a drawn tile covers the point: measured on
|
|
43
|
+
* maplibre 6.11.1 with 10 000 points it takes 2.6 ms (pitch 0) to 4.2 ms (pitch 60) inside
|
|
44
|
+
* the view, but 36 to 46 us a point outside it, where it walks the covering tiles for every
|
|
45
|
+
* call. Hit testing and bounding boxes project vertices outside the view, so that would stall.
|
|
46
|
+
*/
|
|
47
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
48
|
+
import type { OffsetUniforms } from '../shaders/helpers.js';
|
|
49
|
+
import { type TerrainContext } from './context.js';
|
|
50
|
+
import { type TerrainLike } from './detect.js';
|
|
51
|
+
import { type TerrainElevationQuery } from './ground.js';
|
|
52
|
+
/**
|
|
53
|
+
* Returns a number that changes whenever the elevations {@link anchorElevationMeters} returns
|
|
54
|
+
* may have changed (the DEM coverage changed).
|
|
55
|
+
*
|
|
56
|
+
* Compare it between frames to know when positions baked with elevations must be rebuilt.
|
|
57
|
+
*
|
|
58
|
+
* @param context The terrain state of the draw instance
|
|
59
|
+
* @returns The generation number
|
|
60
|
+
*/
|
|
61
|
+
export declare function getAnchorElevationGeneration(context: TerrainContext): number;
|
|
62
|
+
/**
|
|
63
|
+
* Establishes the anchor projection for this frame (custom-layer calls it every frame)
|
|
64
|
+
*
|
|
65
|
+
* When the terrain is disabled, call `clearAnchorFrame` instead.
|
|
66
|
+
*/
|
|
67
|
+
export declare function setAnchorFrame(context: TerrainContext, options: {
|
|
68
|
+
terrain: TerrainLike | null;
|
|
69
|
+
/**
|
|
70
|
+
* The map the ground elevation is asked from (`map.queryTerrainElevation`). Without it the
|
|
71
|
+
* elevation of the current zoom level is used
|
|
72
|
+
*/
|
|
73
|
+
elevationQuery?: TerrainElevationQuery | null;
|
|
74
|
+
zoom: number;
|
|
75
|
+
elevationScale: number;
|
|
76
|
+
mainMatrix: number[];
|
|
77
|
+
offsetUniforms: OffsetUniforms;
|
|
78
|
+
width: number;
|
|
79
|
+
height: number;
|
|
80
|
+
/** Camera position (Mercator). null when it cannot be obtained */
|
|
81
|
+
cameraMercator?: readonly [number, number, number] | null;
|
|
82
|
+
}): void;
|
|
83
|
+
/**
|
|
84
|
+
* Returns the anchor projection to the inactive state (a frame with no terrain, or when the
|
|
85
|
+
* layer is destroyed)
|
|
86
|
+
*
|
|
87
|
+
* From then on `projectAnchor` returns null and hit testing falls back to MapLibre's project
|
|
88
|
+
* (exactly the same path as before the terrain was introduced).
|
|
89
|
+
*/
|
|
90
|
+
export declare function clearAnchorFrame(context: TerrainContext): void;
|
|
91
|
+
/**
|
|
92
|
+
* Returns the ground elevation of a point in meters, as the terrain of the current frame
|
|
93
|
+
* gives it (exaggeration included).
|
|
94
|
+
*
|
|
95
|
+
* Where the terrain is drawn this is the value of `map.queryTerrainElevation`, the elevation
|
|
96
|
+
* of the surface maplibre draws. Outside the drawn tiles it is read from the DEM tile of the
|
|
97
|
+
* current zoom level, which is cheaper and may differ slightly (nothing is drawn there).
|
|
98
|
+
* Values are cached for the frame; when the drawn tiles change,
|
|
99
|
+
* {@link getAnchorElevationGeneration} advances.
|
|
100
|
+
*
|
|
101
|
+
* Inside a plugin, prefer `PluginContext.anchorElevationMeters`, which is bound to the draw
|
|
102
|
+
* instance.
|
|
103
|
+
*
|
|
104
|
+
* @param context The terrain state of the draw instance
|
|
105
|
+
* @param lng The longitude in degrees
|
|
106
|
+
* @param lat The latitude in degrees
|
|
107
|
+
* @returns The elevation in meters. 0 when the terrain is disabled (0 means "add no
|
|
108
|
+
* elevation")
|
|
109
|
+
*/
|
|
110
|
+
export declare function anchorElevationMeters(context: TerrainContext, lng: number, lat: number): number;
|
|
111
|
+
/**
|
|
112
|
+
* Injects the anchor projection into the hit testing side (once when the layer is created)
|
|
113
|
+
*
|
|
114
|
+
* It is bound per map. When a page has several rendering instances (the screen + a thumbnail +
|
|
115
|
+
* a preview + printing), keeping only one globally would make hit testing run against
|
|
116
|
+
* the frame of the instance created last.
|
|
117
|
+
*
|
|
118
|
+
* @param map The map to inject into
|
|
119
|
+
* @param context That map's terrain state
|
|
120
|
+
*/
|
|
121
|
+
export declare function installAnchorProjector(map: MapLibreMap, context: TerrainContext): void;
|
|
122
|
+
/**
|
|
123
|
+
* Removes the injection (when the layer is destroyed)
|
|
124
|
+
*/
|
|
125
|
+
export declare function uninstallAnchorProjector(map: MapLibreMap): void;
|
|
126
|
+
/**
|
|
127
|
+
* Helper that looks at the terrain the map holds and decides whether anchors are usable
|
|
128
|
+
*
|
|
129
|
+
* Keeping an entry point that takes `map` directly makes it easy to assemble the frame state
|
|
130
|
+
* from outside custom-layer (from tests, for example).
|
|
131
|
+
*/
|
|
132
|
+
export declare function anchorViewportOf(map: MapLibreMap): {
|
|
133
|
+
width: number;
|
|
134
|
+
height: number;
|
|
135
|
+
};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { setAnchorProjector, } from '../../shared/math/index.js';
|
|
4
|
+
import { nearestLongitude } from '../../shared/math/longitude.js';
|
|
5
|
+
import { INACTIVE_ANCHOR_FRAME } from './context.js';
|
|
6
|
+
import { getRenderableTerrainTiles } from './detect.js';
|
|
7
|
+
import { groundElevationMeters } from './ground.js';
|
|
8
|
+
/**
|
|
9
|
+
* The zoom at which offset mode is switched on
|
|
10
|
+
*
|
|
11
|
+
* It must be the same value as the check on the vertex shader side (each renderer raises
|
|
12
|
+
* u_use_offset_mode at `zoom >= 12`).
|
|
13
|
+
*/
|
|
14
|
+
const OFFSET_MODE_MIN_ZOOM = 12;
|
|
15
|
+
/**
|
|
16
|
+
* Returns a number that changes whenever the elevations {@link anchorElevationMeters} returns
|
|
17
|
+
* may have changed (the DEM coverage changed).
|
|
18
|
+
*
|
|
19
|
+
* Compare it between frames to know when positions baked with elevations must be rebuilt.
|
|
20
|
+
*
|
|
21
|
+
* @param context The terrain state of the draw instance
|
|
22
|
+
* @returns The generation number
|
|
23
|
+
*/
|
|
24
|
+
export function getAnchorElevationGeneration(context) {
|
|
25
|
+
return context.elevationGeneration;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Advances the generation by looking at whether the DEM coverage changed
|
|
29
|
+
*
|
|
30
|
+
* The comparison uses a string listing the identifiers of the tile set. The number of tiles
|
|
31
|
+
* per frame is a few dozen, so building it every frame is negligible.
|
|
32
|
+
*/
|
|
33
|
+
function syncCoverage(context, terrain) {
|
|
34
|
+
const changed = terrain
|
|
35
|
+
? context.coverage.update(getRenderableTerrainTiles(terrain))
|
|
36
|
+
: context.coverage.clear();
|
|
37
|
+
if (changed)
|
|
38
|
+
context.elevationGeneration++;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Establishes the anchor projection for this frame (custom-layer calls it every frame)
|
|
42
|
+
*
|
|
43
|
+
* When the terrain is disabled, call `clearAnchorFrame` instead.
|
|
44
|
+
*/
|
|
45
|
+
export function setAnchorFrame(context, options) {
|
|
46
|
+
const { terrain, zoom, elevationScale, mainMatrix, offsetUniforms, width, height } = options;
|
|
47
|
+
context.anchorFrame = {
|
|
48
|
+
terrain,
|
|
49
|
+
elevationQuery: options.elevationQuery ?? null,
|
|
50
|
+
tileZoom: Math.floor(zoom),
|
|
51
|
+
elevationScale,
|
|
52
|
+
mainMatrix,
|
|
53
|
+
offsetUniforms,
|
|
54
|
+
useOffsetMode: zoom >= OFFSET_MODE_MIN_ZOOM,
|
|
55
|
+
width,
|
|
56
|
+
height,
|
|
57
|
+
cameraMercator: options.cameraMercator ?? null,
|
|
58
|
+
};
|
|
59
|
+
context.elevationCache.clear();
|
|
60
|
+
context.occlusionCache.clear();
|
|
61
|
+
syncCoverage(context, terrain);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the anchor projection to the inactive state (a frame with no terrain, or when the
|
|
65
|
+
* layer is destroyed)
|
|
66
|
+
*
|
|
67
|
+
* From then on `projectAnchor` returns null and hit testing falls back to MapLibre's project
|
|
68
|
+
* (exactly the same path as before the terrain was introduced).
|
|
69
|
+
*/
|
|
70
|
+
export function clearAnchorFrame(context) {
|
|
71
|
+
context.anchorFrame = INACTIVE_ANCHOR_FRAME;
|
|
72
|
+
if (context.elevationCache.size > 0)
|
|
73
|
+
context.elevationCache = new Map();
|
|
74
|
+
if (context.occlusionCache.size > 0)
|
|
75
|
+
context.occlusionCache = new Map();
|
|
76
|
+
syncCoverage(context, null);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether the anchor is active (the terrain is enabled and the frame state is established)
|
|
80
|
+
*
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
export function isAnchorActive(context) {
|
|
84
|
+
const frame = context.anchorFrame;
|
|
85
|
+
return frame.terrain !== null && frame.mainMatrix !== null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Returns the ground elevation of a point in meters, as the terrain of the current frame
|
|
89
|
+
* gives it (exaggeration included).
|
|
90
|
+
*
|
|
91
|
+
* Where the terrain is drawn this is the value of `map.queryTerrainElevation`, the elevation
|
|
92
|
+
* of the surface maplibre draws. Outside the drawn tiles it is read from the DEM tile of the
|
|
93
|
+
* current zoom level, which is cheaper and may differ slightly (nothing is drawn there).
|
|
94
|
+
* Values are cached for the frame; when the drawn tiles change,
|
|
95
|
+
* {@link getAnchorElevationGeneration} advances.
|
|
96
|
+
*
|
|
97
|
+
* Inside a plugin, prefer `PluginContext.anchorElevationMeters`, which is bound to the draw
|
|
98
|
+
* instance.
|
|
99
|
+
*
|
|
100
|
+
* @param context The terrain state of the draw instance
|
|
101
|
+
* @param lng The longitude in degrees
|
|
102
|
+
* @param lat The latitude in degrees
|
|
103
|
+
* @returns The elevation in meters. 0 when the terrain is disabled (0 means "add no
|
|
104
|
+
* elevation")
|
|
105
|
+
*/
|
|
106
|
+
export function anchorElevationMeters(context, lng, lat) {
|
|
107
|
+
const frame = context.anchorFrame;
|
|
108
|
+
const terrain = frame.terrain;
|
|
109
|
+
if (!terrain)
|
|
110
|
+
return 0;
|
|
111
|
+
const key = `${lng},${lat}`;
|
|
112
|
+
const cached = context.elevationCache.get(key);
|
|
113
|
+
if (cached !== undefined)
|
|
114
|
+
return cached;
|
|
115
|
+
const elevation = groundElevationMeters(frame.elevationQuery, terrain, context.coverage, drawnLongitude(context, lng), lat, frame.tileZoom);
|
|
116
|
+
context.elevationCache.set(key, elevation);
|
|
117
|
+
return elevation;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The longitude of the copy of the world a point is drawn on: the copy nearest to the camera
|
|
121
|
+
* (across the antimeridian the view draws the other side as a second copy)
|
|
122
|
+
*
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
export function drawnLongitude(context, lng) {
|
|
126
|
+
const offsetUniforms = context.anchorFrame.offsetUniforms;
|
|
127
|
+
return offsetUniforms ? nearestLongitude(lng, offsetUniforms.centerLngLat64[0]) : lng;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Maps an anchor (longitude/latitude + ground elevation) to screen coordinates
|
|
131
|
+
*
|
|
132
|
+
* It goes through the same branch, the same matrix and the same elevation as the vertex
|
|
133
|
+
* shader. It returns null when the terrain is disabled or the frame state has not been
|
|
134
|
+
* established (the caller then falls back to MapLibre's project).
|
|
135
|
+
*
|
|
136
|
+
* The context is that of the draw instance whose map the point is projected onto, so several
|
|
137
|
+
* rendering instances on a page (the screen + a thumbnail + a preview + printing) are
|
|
138
|
+
* never mixed up.
|
|
139
|
+
*
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
export function projectAnchor(context, lng, lat) {
|
|
143
|
+
const frame = context.anchorFrame;
|
|
144
|
+
const { mainMatrix: m, offsetUniforms, terrain, width, height } = frame;
|
|
145
|
+
if (!m || !terrain || width <= 0 || height <= 0)
|
|
146
|
+
return null;
|
|
147
|
+
const elevationMercator = anchorElevationMeters(context, lng, lat) * frame.elevationScale;
|
|
148
|
+
// The anchor is projected on the copy of the world it is drawn on
|
|
149
|
+
const drawnLng = drawnLongitude(context, lng);
|
|
150
|
+
let clipX;
|
|
151
|
+
let clipY;
|
|
152
|
+
let clipW;
|
|
153
|
+
if (frame.useOffsetMode && offsetUniforms) {
|
|
154
|
+
// Offset mode: linearize relative to the center
|
|
155
|
+
// (the same formula as project_offset_to_clipspace in the shader)
|
|
156
|
+
const { centerLngLat, projectionCenter, unitsPerDegree, unitsPerDegree2 } = offsetUniforms;
|
|
157
|
+
const lngOffset = drawnLng - centerLngLat[0];
|
|
158
|
+
const latOffset = lat - centerLngLat[1];
|
|
159
|
+
const mercX = lngOffset * (unitsPerDegree[0] + unitsPerDegree2[0] * latOffset);
|
|
160
|
+
const mercY = latOffset * (unitsPerDegree[1] + unitsPerDegree2[1] * latOffset);
|
|
161
|
+
// offset.w = 0, so the fourth column of the matrix has no effect. The translation comes
|
|
162
|
+
// from projectionCenter
|
|
163
|
+
clipX = m[0] * mercX + m[4] * mercY + m[8] * elevationMercator + projectionCenter[0];
|
|
164
|
+
clipY = m[1] * mercX + m[5] * mercY + m[9] * elevationMercator + projectionCenter[1];
|
|
165
|
+
clipW = m[3] * mercX + m[7] * mercY + m[11] * elevationMercator + projectionCenter[3];
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Low zoom: put the absolute Mercator coordinates through the matrix as they are
|
|
169
|
+
// (the same formula as projectTileWithElevation in the shader)
|
|
170
|
+
const mercX = (drawnLng + 180) / 360;
|
|
171
|
+
const latRad = (lat * Math.PI) / 180;
|
|
172
|
+
const mercY = (1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2;
|
|
173
|
+
clipX = m[0] * mercX + m[4] * mercY + m[8] * elevationMercator + m[12];
|
|
174
|
+
clipY = m[1] * mercX + m[5] * mercY + m[9] * elevationMercator + m[13];
|
|
175
|
+
clipW = m[3] * mercX + m[7] * mercY + m[11] * elevationMercator + m[15];
|
|
176
|
+
}
|
|
177
|
+
// clipW <= 0 means behind the camera. Dividing by it as is produces coordinates folded over
|
|
178
|
+
// to the opposite side of the screen, and hit testing hits "a point that is not visible". It
|
|
179
|
+
// is returned as unusable (the caller either falls back to MapLibre's project or drops it
|
|
180
|
+
// from the candidates).
|
|
181
|
+
if (!Number.isFinite(clipW) || clipW <= 0)
|
|
182
|
+
return null;
|
|
183
|
+
const ndcX = clipX / clipW;
|
|
184
|
+
const ndcY = clipY / clipW;
|
|
185
|
+
return {
|
|
186
|
+
x: (ndcX * 0.5 + 0.5) * width,
|
|
187
|
+
y: (1 - (ndcY * 0.5 + 0.5)) * height,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Injects the anchor projection into the hit testing side (once when the layer is created)
|
|
192
|
+
*
|
|
193
|
+
* It is bound per map. When a page has several rendering instances (the screen + a thumbnail +
|
|
194
|
+
* a preview + printing), keeping only one globally would make hit testing run against
|
|
195
|
+
* the frame of the instance created last.
|
|
196
|
+
*
|
|
197
|
+
* @param map The map to inject into
|
|
198
|
+
* @param context That map's terrain state
|
|
199
|
+
*/
|
|
200
|
+
export function installAnchorProjector(map, context) {
|
|
201
|
+
const projector = {
|
|
202
|
+
project: (lng, lat) => projectAnchor(context, lng, lat),
|
|
203
|
+
};
|
|
204
|
+
setAnchorProjector(map, projector);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Removes the injection (when the layer is destroyed)
|
|
208
|
+
*/
|
|
209
|
+
export function uninstallAnchorProjector(map) {
|
|
210
|
+
setAnchorProjector(map, null);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Helper that looks at the terrain the map holds and decides whether anchors are usable
|
|
214
|
+
*
|
|
215
|
+
* Keeping an entry point that takes `map` directly makes it easy to assemble the frame state
|
|
216
|
+
* from outside custom-layer (from tests, for example).
|
|
217
|
+
*/
|
|
218
|
+
export function anchorViewportOf(map) {
|
|
219
|
+
const canvas = map.getCanvas();
|
|
220
|
+
// Returned in CSS pixels (the same unit as map.project). Where clientWidth becomes 0 (when
|
|
221
|
+
// hidden, or in tests) it falls back to the attribute value
|
|
222
|
+
return {
|
|
223
|
+
width: canvas.clientWidth || canvas.width,
|
|
224
|
+
height: canvas.clientHeight || canvas.height,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { OffsetUniforms } from '../shaders/helpers.js';
|
|
2
|
+
import type { TerrainLike } from './detect.js';
|
|
3
|
+
import { type TerrainElevationQuery } from './ground.js';
|
|
4
|
+
/**
|
|
5
|
+
* The terrain state of one frame: whether the terrain is drawn and the DEM atlas the shaders
|
|
6
|
+
* read elevations from.
|
|
7
|
+
*/
|
|
8
|
+
export interface TerrainRenderState {
|
|
9
|
+
/** Whether the terrain is enabled and the DEM atlas is usable */
|
|
10
|
+
readonly active: boolean;
|
|
11
|
+
/** The DEM atlas (not terrarium, but RGBA8 packing the elevation as 24-bit fixed point) */
|
|
12
|
+
readonly atlasTexture: WebGLTexture | null;
|
|
13
|
+
/** The Mercator rectangle the atlas covers, [x0, y0, 1/width, 1/height] */
|
|
14
|
+
readonly atlasRect: readonly [number, number, number, number];
|
|
15
|
+
/** The number of texels of the atlas, [width, height] */
|
|
16
|
+
readonly atlasSize: readonly [number, number];
|
|
17
|
+
/** The conversion factor from meters to Mercator z (represented by the latitude of the
|
|
18
|
+
* screen center) */
|
|
19
|
+
readonly elevationScale: number;
|
|
20
|
+
/** The lift above the ground (in meters). A rendering implementation value to avoid
|
|
21
|
+
* Z-fighting */
|
|
22
|
+
readonly liftMeters: number;
|
|
23
|
+
/** The subdivision step (in meters). 0 means no subdivision */
|
|
24
|
+
readonly stepMeters: number;
|
|
25
|
+
/**
|
|
26
|
+
* The grid spacing of the subdivision (in Mercator units)
|
|
27
|
+
*
|
|
28
|
+
* The node spacing 1/(2^z * meshSize) of MapLibre's terrain mesh. Placing the subdivision
|
|
29
|
+
* points on this grid makes our own polygons agree with MapLibre's terrain surface at the
|
|
30
|
+
* nodes.
|
|
31
|
+
*/
|
|
32
|
+
readonly stepGrid: number;
|
|
33
|
+
/**
|
|
34
|
+
* The generation of the subdivision
|
|
35
|
+
*
|
|
36
|
+
* When the step changes, the subdivision baked on the CPU side (the fill and outline of
|
|
37
|
+
* polygons) becomes stale. Retained batches rebuild on a change of this value. It is counted
|
|
38
|
+
* per instance, so it is never compared with another instance's generation.
|
|
39
|
+
*/
|
|
40
|
+
readonly generation: number;
|
|
41
|
+
}
|
|
42
|
+
/** The state when the terrain is disabled */
|
|
43
|
+
export declare const INACTIVE_TERRAIN_STATE: TerrainRenderState;
|
|
44
|
+
/**
|
|
45
|
+
* Which drape path drew the quads of the last frame, for diagnostics.
|
|
46
|
+
*
|
|
47
|
+
* It exists so that hands-on verification can confirm "which of the paths is running on the
|
|
48
|
+
* screen right now". It is not used for rendering.
|
|
49
|
+
*/
|
|
50
|
+
export interface TerrainDrapeDebug {
|
|
51
|
+
/** Whether the analytic drape was used */
|
|
52
|
+
used: boolean;
|
|
53
|
+
/** The reason it was not used */
|
|
54
|
+
reason: string;
|
|
55
|
+
/** The number of features put on the drape */
|
|
56
|
+
featureCount: number;
|
|
57
|
+
/** The total number of edges */
|
|
58
|
+
edgeCount: number;
|
|
59
|
+
/** The number of tiles drawn */
|
|
60
|
+
tileCount: number;
|
|
61
|
+
/** The maximum number of runs per cell */
|
|
62
|
+
maxRunsPerCell: number;
|
|
63
|
+
/** The maximum number of edges per cell */
|
|
64
|
+
maxEdgesPerCell: number;
|
|
65
|
+
/** The maximum number of edges involved in a single tile of the view */
|
|
66
|
+
maxTileEdges: number;
|
|
67
|
+
/** The number of cells truncated for exceeding the budget (a local degradation) */
|
|
68
|
+
truncatedCells: number;
|
|
69
|
+
/** The number of tiles that could not be put through the analytic evaluation and were not
|
|
70
|
+
* drawn */
|
|
71
|
+
unfitTiles: number;
|
|
72
|
+
/** The number of runs whose cell origin was inside the feature */
|
|
73
|
+
insideRuns: number;
|
|
74
|
+
/** The number of features that did not go on the drape and were routed to the previous
|
|
75
|
+
* path */
|
|
76
|
+
excluded: number;
|
|
77
|
+
/** The number of features actually handed to the previous path */
|
|
78
|
+
immediate: number;
|
|
79
|
+
}
|
|
80
|
+
/** The initial diagnostic values */
|
|
81
|
+
export declare const INITIAL_DRAPE_DEBUG: TerrainDrapeDebug;
|
|
82
|
+
/**
|
|
83
|
+
* The values needed for this frame's anchor projection
|
|
84
|
+
*/
|
|
85
|
+
export interface AnchorFrame {
|
|
86
|
+
terrain: TerrainLike | null;
|
|
87
|
+
/**
|
|
88
|
+
* The map the ground elevation is asked from (`map.queryTerrainElevation`, `ground.ts`).
|
|
89
|
+
* null where there is none (tests); then the elevation of the current zoom level is used
|
|
90
|
+
*/
|
|
91
|
+
elevationQuery: TerrainElevationQuery | null;
|
|
92
|
+
/** The same value as MapLibre's transform.tileZoom (the zoom level of the fallback) */
|
|
93
|
+
tileZoom: number;
|
|
94
|
+
/** The factor from meters to Mercator z (represented by the latitude of the screen
|
|
95
|
+
* center) */
|
|
96
|
+
elevationScale: number;
|
|
97
|
+
/** The projection matrix being handed to the vertex shader */
|
|
98
|
+
mainMatrix: number[] | null;
|
|
99
|
+
/** The uniforms of offset mode (the center of the linearization) */
|
|
100
|
+
offsetUniforms: OffsetUniforms | null;
|
|
101
|
+
/** Whether offset mode is used (the same as the shader's u_use_offset_mode) */
|
|
102
|
+
useOffsetMode: boolean;
|
|
103
|
+
/** The viewport (in CSS pixels, the same unit as map.project) */
|
|
104
|
+
width: number;
|
|
105
|
+
height: number;
|
|
106
|
+
/**
|
|
107
|
+
* The camera position (Mercator; z is meters converted into Mercator)
|
|
108
|
+
*
|
|
109
|
+
* Used to decide whether a symbol is occluded by the terrain, along the segment from the
|
|
110
|
+
* camera to the anchor (`occlusion.ts`). It is null in environments where it cannot be
|
|
111
|
+
* obtained, and is then treated as not occluded.
|
|
112
|
+
*/
|
|
113
|
+
cameraMercator: readonly [number, number, number] | null;
|
|
114
|
+
}
|
|
115
|
+
/** The frame used when the anchor projection is unavailable */
|
|
116
|
+
export declare const INACTIVE_ANCHOR_FRAME: AnchorFrame;
|
|
117
|
+
/**
|
|
118
|
+
* The terrain state of one draw instance.
|
|
119
|
+
*
|
|
120
|
+
* Treat it as an opaque handle: a custom renderer receives it as
|
|
121
|
+
* `CustomRendererDrawContext.terrain` and passes it to the renderers and to the terrain
|
|
122
|
+
* functions (such as {@link anchorElevationMeters} and {@link drawQuadSurfaceOnTerrain}).
|
|
123
|
+
* Constructing one gives a state with no terrain.
|
|
124
|
+
*/
|
|
125
|
+
export declare class TerrainContext {
|
|
126
|
+
/** This frame's terrain state (read by the shaders' projection uniforms) */
|
|
127
|
+
renderState: TerrainRenderState;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Releases an instance's terrain state (when the layer is destroyed)
|
|
131
|
+
*/
|
|
132
|
+
export declare function releaseTerrainContext(context: TerrainContext): void;
|