@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared parts of the analytic drape
|
|
3
|
+
*
|
|
4
|
+
* There are two passes that draw the ground (`renderer.ts`, which paints the polygons and
|
|
5
|
+
* lines of features, and `quad.ts`, which pastes textured quads). Both are completely
|
|
6
|
+
* identical up to "drawing a terrain mesh with the same rules as MapLibre, with the same DEM
|
|
7
|
+
* and the same projection"; the only difference is what they solve in the fragment. The common
|
|
8
|
+
* part is placed here, which structurally guarantees that the two passes sit on the same
|
|
9
|
+
* ground.
|
|
10
|
+
*/
|
|
11
|
+
import type { ProjectionData } from 'maplibre-gl';
|
|
12
|
+
/**
|
|
13
|
+
* The GLSL that samples the DEM (used in both the vertex and the fragment stage)
|
|
14
|
+
*
|
|
15
|
+
* It does what the #ifdef TERRAIN3D section of MapLibre's vertex prelude does (the prelude
|
|
16
|
+
* handed to a CustomLayer contains only the projection part and not this section). The layout
|
|
17
|
+
* of the DEM texture is maplibre's and is copied once, in `upstream-terrain.ts`. Since the
|
|
18
|
+
* elevation is looked up the same way, with the same DEM and the same grid, our own mesh
|
|
19
|
+
* agrees with MapLibre's terrain surface.
|
|
20
|
+
*/
|
|
21
|
+
export declare const TERRAIN_SAMPLE_GLSL: string;
|
|
22
|
+
/**
|
|
23
|
+
* The GLSL of the terrain shading (an aid to reading the map)
|
|
24
|
+
*
|
|
25
|
+
* It builds the gradient from differences between neighboring DEM samples and hands it to the
|
|
26
|
+
* shared formula (`TERRAIN_SHADE_CORE_GLSL` in `terrain/shade.ts`). All this takes charge of
|
|
27
|
+
* is how the samples are taken. The vertex displacement path
|
|
28
|
+
* (`shaders/terrain-shade.ts`) hands samples taken from the atlas to the same formula.
|
|
29
|
+
*
|
|
30
|
+
* The caller must declare `u_light_dir` (east, north and up in the map coordinate system),
|
|
31
|
+
* `u_shade_strength` and `u_tile_meters` (the ground size of that tile). It goes after
|
|
32
|
+
* TERRAIN_SAMPLE_GLSL.
|
|
33
|
+
*/
|
|
34
|
+
export declare const TERRAIN_SHADE_GLSL: string;
|
|
35
|
+
/**
|
|
36
|
+
* The width of the samples taken for the shading gradient (in tile coordinates)
|
|
37
|
+
*
|
|
38
|
+
* The authority for the implementation is TERRAIN_SHADE_GLSL, but the formula itself is also
|
|
39
|
+
* placed here as a pure function so that it can be verified. The DEM texels exist only in
|
|
40
|
+
* [0, demLastTexel(dim)] of coord space (the border texels at both ends are copied from the
|
|
41
|
+
* neighboring tiles, `upstream-terrain.ts`), so a width that goes outside that cannot be used.
|
|
42
|
+
*
|
|
43
|
+
* @param coord The coord of the current position (in texel space)
|
|
44
|
+
* @param coordPerUnit The advance of coord per 1 tile coordinate
|
|
45
|
+
* @param want The width one wants to use (in tile coordinates)
|
|
46
|
+
* @param dim The dimension of the DEM
|
|
47
|
+
*/
|
|
48
|
+
export declare function drapeShadeWindow(coord: number, coordPerUnit: number, want: number, dim: number): {
|
|
49
|
+
back: number;
|
|
50
|
+
forward: number;
|
|
51
|
+
};
|
|
52
|
+
/** The names of the projection uniforms (declared by the prelude) */
|
|
53
|
+
export declare const DRAPE_PROJECTION_UNIFORMS: readonly ["u_projection_matrix", "u_projection_tile_mercator_coords", "u_projection_clipping_plane", "u_projection_transition", "u_projection_fallback_matrix"];
|
|
54
|
+
/** The names of the DEM uniforms (declared by TERRAIN_SAMPLE_GLSL) */
|
|
55
|
+
export declare const DRAPE_TERRAIN_UNIFORMS: readonly ["u_terrain", "u_terrain_dim", "u_terrain_matrix", "u_terrain_unpack", "u_terrain_exaggeration"];
|
|
56
|
+
/** The index of uniform locations */
|
|
57
|
+
export type UniformSet = Record<string, WebGLUniformLocation | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Writes that tile's ProjectionData into the uniforms
|
|
60
|
+
*/
|
|
61
|
+
export declare function applyDrapeProjectionUniforms(gl: WebGL2RenderingContext, set: UniformSet, projectionData: ProjectionData): void;
|
|
62
|
+
/** The parts of a DEM texture set that are needed */
|
|
63
|
+
export interface DrapeTerrainTexture {
|
|
64
|
+
texture: WebGLTexture;
|
|
65
|
+
matrix: ArrayLike<number>;
|
|
66
|
+
unpack: ArrayLike<number>;
|
|
67
|
+
dim: number;
|
|
68
|
+
/** The vertical exaggeration of the terrain (the same factor MapLibre's mesh uses) */
|
|
69
|
+
exaggeration: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Binds the DEM and writes it into the uniforms (bound the same way as MapLibre's terrain
|
|
73
|
+
* prelude)
|
|
74
|
+
*
|
|
75
|
+
* The exaggeration is the one MapLibre applies to its own terrain mesh, so the drape surface
|
|
76
|
+
* stays on the map's ground surface (`getTerrainExaggeration` in `detect.ts`).
|
|
77
|
+
*/
|
|
78
|
+
export declare function applyDrapeTerrainUniforms(gl: WebGL2RenderingContext, set: UniformSet, terrain: DrapeTerrainTexture, unit: number): void;
|
|
79
|
+
/** ArrayLike into a 4x4 Float32Array */
|
|
80
|
+
export declare function toFloat32Matrix(source: ArrayLike<number>): Float32Array;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only AND BSD-3-Clause
|
|
3
|
+
import { TERRAIN_SHADE_CORE_GLSL } from '../shade.js';
|
|
4
|
+
import { demLastTexel, UPSTREAM_DEM_GLSL } from '../upstream-terrain.js';
|
|
5
|
+
import { TILE_EXTENT } from './mesh.js';
|
|
6
|
+
/**
|
|
7
|
+
* The GLSL that samples the DEM (used in both the vertex and the fragment stage)
|
|
8
|
+
*
|
|
9
|
+
* It does what the #ifdef TERRAIN3D section of MapLibre's vertex prelude does (the prelude
|
|
10
|
+
* handed to a CustomLayer contains only the projection part and not this section). The layout
|
|
11
|
+
* of the DEM texture is maplibre's and is copied once, in `upstream-terrain.ts`. Since the
|
|
12
|
+
* elevation is looked up the same way, with the same DEM and the same grid, our own mesh
|
|
13
|
+
* agrees with MapLibre's terrain surface.
|
|
14
|
+
*/
|
|
15
|
+
export const TERRAIN_SAMPLE_GLSL = `
|
|
16
|
+
uniform sampler2D u_terrain;
|
|
17
|
+
uniform float u_terrain_dim;
|
|
18
|
+
uniform mat4 u_terrain_matrix;
|
|
19
|
+
uniform vec4 u_terrain_unpack;
|
|
20
|
+
uniform float u_terrain_exaggeration;
|
|
21
|
+
${UPSTREAM_DEM_GLSL}
|
|
22
|
+
// The texel coordinate of a tile position in this tile's DEM
|
|
23
|
+
vec2 drape_dem_coord(vec2 pos) {
|
|
24
|
+
return upstream_dem_coord((u_terrain_matrix * vec4(pos, 0.0, 1.0)).xy, u_terrain_dim);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
float drape_get_elevation(vec2 pos) {
|
|
28
|
+
return upstream_dem_bilinear(u_terrain, u_terrain_unpack, drape_dem_coord(pos)) *
|
|
29
|
+
u_terrain_exaggeration;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
/**
|
|
33
|
+
* The GLSL of the terrain shading (an aid to reading the map)
|
|
34
|
+
*
|
|
35
|
+
* It builds the gradient from differences between neighboring DEM samples and hands it to the
|
|
36
|
+
* shared formula (`TERRAIN_SHADE_CORE_GLSL` in `terrain/shade.ts`). All this takes charge of
|
|
37
|
+
* is how the samples are taken. The vertex displacement path
|
|
38
|
+
* (`shaders/terrain-shade.ts`) hands samples taken from the atlas to the same formula.
|
|
39
|
+
*
|
|
40
|
+
* The caller must declare `u_light_dir` (east, north and up in the map coordinate system),
|
|
41
|
+
* `u_shade_strength` and `u_tile_meters` (the ground size of that tile). It goes after
|
|
42
|
+
* TERRAIN_SAMPLE_GLSL.
|
|
43
|
+
*/
|
|
44
|
+
export const TERRAIN_SHADE_GLSL = TERRAIN_SHADE_CORE_GLSL +
|
|
45
|
+
`
|
|
46
|
+
float terrainShade(vec2 tilePos) {
|
|
47
|
+
if (u_shade_strength <= 0.0) return 1.0;
|
|
48
|
+
float texel = ${TILE_EXTENT}.0 / max(u_terrain_dim, 1.0);
|
|
49
|
+
vec2 pos = tilePos * ${TILE_EXTENT}.0;
|
|
50
|
+
|
|
51
|
+
// The samples for the gradient are kept within the range where DEM texels exist.
|
|
52
|
+
//
|
|
53
|
+
// A render tile reads only a part of its DEM tile (deltaZoom = 1), and at the far end of
|
|
54
|
+
// the DEM texture the forward sample may run past the last texel. Reading outside the
|
|
55
|
+
// range makes the clamp in upstream_dem_bilinear return the border value, the sample
|
|
56
|
+
// freezes and the gradient becomes too small. The band where it shrinks fails to receive
|
|
57
|
+
// its shading, floats brightly and shows up as a streak of 1 to 2 pixels along the tile
|
|
58
|
+
// boundary.
|
|
59
|
+
//
|
|
60
|
+
// What is kept in is only the place where the texels really run out. Everywhere else real
|
|
61
|
+
// data continues both forward and backward, so the width stays at its full value.
|
|
62
|
+
vec2 coord = drape_dem_coord(pos);
|
|
63
|
+
// The advance of coord per 1 tile coordinate (the diagonal of the DEM matrix x the DEM
|
|
64
|
+
// dimension)
|
|
65
|
+
vec2 perUnit = max(
|
|
66
|
+
vec2(u_terrain_matrix[0].x, u_terrain_matrix[1].y) * u_terrain_dim,
|
|
67
|
+
vec2(1e-9));
|
|
68
|
+
vec2 forward = clamp(
|
|
69
|
+
(vec2(upstream_dem_last_texel(u_terrain_dim)) - coord) / perUnit, vec2(0.0), vec2(texel));
|
|
70
|
+
vec2 backward = clamp(coord / perUnit, vec2(0.0), vec2(texel));
|
|
71
|
+
|
|
72
|
+
float ex1 = drape_get_elevation(vec2(pos.x + forward.x, pos.y));
|
|
73
|
+
float ex0 = drape_get_elevation(vec2(pos.x - backward.x, pos.y));
|
|
74
|
+
float ey1 = drape_get_elevation(vec2(pos.x, pos.y + forward.y));
|
|
75
|
+
float ey0 = drape_get_elevation(vec2(pos.x, pos.y - backward.y));
|
|
76
|
+
// 1.0 in within-tile coordinates corresponds to u_tile_meters. y points south, so north is
|
|
77
|
+
// flipped. What it is divided by is "the width actually used" (dividing by anything other
|
|
78
|
+
// than the shrunk width makes the gradient too thin)
|
|
79
|
+
vec2 span =
|
|
80
|
+
max(forward + backward, vec2(1e-4)) / ${TILE_EXTENT}.0 * max(u_tile_meters, 1.0);
|
|
81
|
+
float dzdEast = (ex1 - ex0) / span.x;
|
|
82
|
+
float dzdNorth = -(ey1 - ey0) / span.y;
|
|
83
|
+
return terrainShadeFromGradient(dzdEast, dzdNorth);
|
|
84
|
+
}
|
|
85
|
+
`;
|
|
86
|
+
/**
|
|
87
|
+
* The width of the samples taken for the shading gradient (in tile coordinates)
|
|
88
|
+
*
|
|
89
|
+
* The authority for the implementation is TERRAIN_SHADE_GLSL, but the formula itself is also
|
|
90
|
+
* placed here as a pure function so that it can be verified. The DEM texels exist only in
|
|
91
|
+
* [0, demLastTexel(dim)] of coord space (the border texels at both ends are copied from the
|
|
92
|
+
* neighboring tiles, `upstream-terrain.ts`), so a width that goes outside that cannot be used.
|
|
93
|
+
*
|
|
94
|
+
* @param coord The coord of the current position (in texel space)
|
|
95
|
+
* @param coordPerUnit The advance of coord per 1 tile coordinate
|
|
96
|
+
* @param want The width one wants to use (in tile coordinates)
|
|
97
|
+
* @param dim The dimension of the DEM
|
|
98
|
+
*/
|
|
99
|
+
export function drapeShadeWindow(coord, coordPerUnit, want, dim) {
|
|
100
|
+
const perUnit = Math.max(coordPerUnit, 1e-9);
|
|
101
|
+
const clampWidth = (value) => Math.min(Math.max(value, 0), want);
|
|
102
|
+
return {
|
|
103
|
+
back: clampWidth(coord / perUnit),
|
|
104
|
+
forward: clampWidth((demLastTexel(dim) - coord) / perUnit),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** The names of the projection uniforms (declared by the prelude) */
|
|
108
|
+
export const DRAPE_PROJECTION_UNIFORMS = [
|
|
109
|
+
'u_projection_matrix',
|
|
110
|
+
'u_projection_tile_mercator_coords',
|
|
111
|
+
'u_projection_clipping_plane',
|
|
112
|
+
'u_projection_transition',
|
|
113
|
+
'u_projection_fallback_matrix',
|
|
114
|
+
];
|
|
115
|
+
/** The names of the DEM uniforms (declared by TERRAIN_SAMPLE_GLSL) */
|
|
116
|
+
export const DRAPE_TERRAIN_UNIFORMS = [
|
|
117
|
+
'u_terrain',
|
|
118
|
+
'u_terrain_dim',
|
|
119
|
+
'u_terrain_matrix',
|
|
120
|
+
'u_terrain_unpack',
|
|
121
|
+
'u_terrain_exaggeration',
|
|
122
|
+
];
|
|
123
|
+
/**
|
|
124
|
+
* Writes that tile's ProjectionData into the uniforms
|
|
125
|
+
*/
|
|
126
|
+
export function applyDrapeProjectionUniforms(gl, set, projectionData) {
|
|
127
|
+
if (set.u_projection_matrix) {
|
|
128
|
+
gl.uniformMatrix4fv(set.u_projection_matrix, false, projectionData.mainMatrix);
|
|
129
|
+
}
|
|
130
|
+
if (set.u_projection_tile_mercator_coords && projectionData.tileMercatorCoords) {
|
|
131
|
+
gl.uniform4fv(set.u_projection_tile_mercator_coords, projectionData.tileMercatorCoords);
|
|
132
|
+
}
|
|
133
|
+
if (set.u_projection_clipping_plane && projectionData.clippingPlane) {
|
|
134
|
+
gl.uniform4fv(set.u_projection_clipping_plane, projectionData.clippingPlane);
|
|
135
|
+
}
|
|
136
|
+
if (set.u_projection_transition) {
|
|
137
|
+
gl.uniform1f(set.u_projection_transition, projectionData.projectionTransition ?? 0);
|
|
138
|
+
}
|
|
139
|
+
if (set.u_projection_fallback_matrix && projectionData.fallbackMatrix) {
|
|
140
|
+
gl.uniformMatrix4fv(set.u_projection_fallback_matrix, false, projectionData.fallbackMatrix);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Binds the DEM and writes it into the uniforms (bound the same way as MapLibre's terrain
|
|
145
|
+
* prelude)
|
|
146
|
+
*
|
|
147
|
+
* The exaggeration is the one MapLibre applies to its own terrain mesh, so the drape surface
|
|
148
|
+
* stays on the map's ground surface (`getTerrainExaggeration` in `detect.ts`).
|
|
149
|
+
*/
|
|
150
|
+
export function applyDrapeTerrainUniforms(gl, set, terrain, unit) {
|
|
151
|
+
gl.activeTexture(gl.TEXTURE0 + unit);
|
|
152
|
+
gl.bindTexture(gl.TEXTURE_2D, terrain.texture);
|
|
153
|
+
if (set.u_terrain)
|
|
154
|
+
gl.uniform1i(set.u_terrain, unit);
|
|
155
|
+
if (set.u_terrain_dim)
|
|
156
|
+
gl.uniform1f(set.u_terrain_dim, terrain.dim);
|
|
157
|
+
if (set.u_terrain_matrix) {
|
|
158
|
+
gl.uniformMatrix4fv(set.u_terrain_matrix, false, toFloat32Matrix(terrain.matrix));
|
|
159
|
+
}
|
|
160
|
+
if (set.u_terrain_unpack) {
|
|
161
|
+
const u = terrain.unpack;
|
|
162
|
+
gl.uniform4f(set.u_terrain_unpack, u[0], u[1], u[2], u[3]);
|
|
163
|
+
}
|
|
164
|
+
if (set.u_terrain_exaggeration)
|
|
165
|
+
gl.uniform1f(set.u_terrain_exaggeration, terrain.exaggeration);
|
|
166
|
+
}
|
|
167
|
+
/** ArrayLike into a 4x4 Float32Array */
|
|
168
|
+
export function toFloat32Matrix(source) {
|
|
169
|
+
const out = new Float32Array(16);
|
|
170
|
+
for (let i = 0; i < 16; i++)
|
|
171
|
+
out[i] = source[i];
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/** Tile identity (the minimum) */
|
|
2
|
+
export interface StitchTile {
|
|
3
|
+
readonly x: number;
|
|
4
|
+
readonly y: number;
|
|
5
|
+
readonly z: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The constraint step per edge (tile coordinates)
|
|
9
|
+
*
|
|
10
|
+
* 0 means no constraint (the neighbor is at the same zoom, or finer, or is not
|
|
11
|
+
* drawn). top = the edge at y 0, bottom = the edge at y EXTENT, left = the edge
|
|
12
|
+
* at x 0, right = the edge at x EXTENT.
|
|
13
|
+
*/
|
|
14
|
+
export interface TileEdgeSteps {
|
|
15
|
+
readonly top: number;
|
|
16
|
+
readonly bottom: number;
|
|
17
|
+
readonly left: number;
|
|
18
|
+
readonly right: number;
|
|
19
|
+
}
|
|
20
|
+
/** The stitching of a single edge */
|
|
21
|
+
export interface EdgeStitch {
|
|
22
|
+
/** The constraint step (tile coordinates). 0 means no constraint */
|
|
23
|
+
readonly step: number;
|
|
24
|
+
/**
|
|
25
|
+
* The neighboring tile on the coarser side (null when not constraining)
|
|
26
|
+
*
|
|
27
|
+
* x is expressed "in the same wrap as this tile" (a neighbor reached by
|
|
28
|
+
* wrapping the world in the longitude direction becomes a negative value or
|
|
29
|
+
* 2^z or more). This is so that the coordinate transform can be built from
|
|
30
|
+
* this value just as it is.
|
|
31
|
+
*/
|
|
32
|
+
readonly tile: StitchTile | null;
|
|
33
|
+
}
|
|
34
|
+
/** The stitching of the four edges of a tile */
|
|
35
|
+
export interface TileEdgeStitch {
|
|
36
|
+
readonly top: EdgeStitch;
|
|
37
|
+
readonly bottom: EdgeStitch;
|
|
38
|
+
readonly left: EdgeStitch;
|
|
39
|
+
readonly right: EdgeStitch;
|
|
40
|
+
}
|
|
41
|
+
/** No constraint */
|
|
42
|
+
export declare const NO_EDGE_STEPS: TileEdgeSteps;
|
|
43
|
+
/** Four edges with no constraint */
|
|
44
|
+
export declare const NO_EDGE_STITCH: TileEdgeStitch;
|
|
45
|
+
/**
|
|
46
|
+
* The key of a tile (folding the wrap in the longitude direction)
|
|
47
|
+
*
|
|
48
|
+
* `computeEdgeStitch` returns the neighbor in the frame before wrapping so that
|
|
49
|
+
* the coordinate transform can be built, so fold it here when looking up the
|
|
50
|
+
* set.
|
|
51
|
+
*/
|
|
52
|
+
export declare function wrappedTileKey(tile: StitchTile): string;
|
|
53
|
+
/**
|
|
54
|
+
* Build the set of keys from the set of tiles in view
|
|
55
|
+
*
|
|
56
|
+
* What is passed is "the tiles actually drawn in this frame". Putting in tiles
|
|
57
|
+
* that are not drawn would mean constraining onto the polyline of a counterpart
|
|
58
|
+
* that is not drawn.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildTileKeySet(tiles: readonly StitchTile[]): Set<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Obtain the stitching of the four edges of this tile
|
|
63
|
+
*
|
|
64
|
+
* @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
|
|
65
|
+
*/
|
|
66
|
+
export declare function computeEdgeStitch(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number): TileEdgeStitch;
|
|
67
|
+
/** Take only the steps out of the stitching */
|
|
68
|
+
export declare function edgeStepsOf(stitch: TileEdgeStitch): TileEdgeSteps;
|
|
69
|
+
/**
|
|
70
|
+
* Obtain the constraint steps of the four edges of this tile
|
|
71
|
+
*
|
|
72
|
+
* @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
|
|
73
|
+
*/
|
|
74
|
+
export declare function computeEdgeSteps(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number): TileEdgeSteps;
|
|
75
|
+
/** The similarity transform mapping one own tile coordinates to the neighbor tile coordinates */
|
|
76
|
+
export interface NeighborTileTransform {
|
|
77
|
+
/** The scale factor (a power of 2; less than 1 because the neighbor is coarser) */
|
|
78
|
+
readonly scale: number;
|
|
79
|
+
readonly offsetX: number;
|
|
80
|
+
readonly offsetY: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One own tile coordinates -> the tile coordinates of the neighbor (the coarser
|
|
84
|
+
* side)
|
|
85
|
+
*
|
|
86
|
+
* It is `q = p * scale + offset`. The scale factor is a power of 2 and the
|
|
87
|
+
* translation is an integer multiple of one mesh cell, so the mapping is exact
|
|
88
|
+
* even in float. That is, the nodes of the step land exactly on the mesh nodes
|
|
89
|
+
* of the coarser side, and read the same DEM texels with the same weights as the
|
|
90
|
+
* coarser side reads at its own vertices. This is the ground for "the edge
|
|
91
|
+
* vertices of the finer side lying exactly on the line segments of the coarser
|
|
92
|
+
* side".
|
|
93
|
+
*/
|
|
94
|
+
export declare function neighborTileTransform(fine: StitchTile, coarse: StitchTile, extent?: number): NeighborTileTransform;
|
|
95
|
+
/**
|
|
96
|
+
* The constraint for a single edge (holding the step, the coordinate transform
|
|
97
|
+
* and the DEM of the constraint target as one set)
|
|
98
|
+
*
|
|
99
|
+
* The point is that the three are gathered into a single value. It is a shape
|
|
100
|
+
* that makes a state where only the step is new and the DEM is old (or the
|
|
101
|
+
* other way around) impossible to create, so that applying the constraint and
|
|
102
|
+
* holding the constraint target become one and the same fact.
|
|
103
|
+
*/
|
|
104
|
+
export interface ResolvedEdge<T> {
|
|
105
|
+
/** The constraint step (tile coordinates). It never becomes 0 */
|
|
106
|
+
readonly step: number;
|
|
107
|
+
/** The tile on the coarser side (x in the frame before wrapping) */
|
|
108
|
+
readonly tile: StitchTile;
|
|
109
|
+
/** One own tile coordinates -> the tile coordinates of the coarser side */
|
|
110
|
+
readonly transform: NeighborTileTransform;
|
|
111
|
+
/** The DEM of the coarser side (looked up at the same point in time as the step) */
|
|
112
|
+
readonly terrain: T;
|
|
113
|
+
}
|
|
114
|
+
/** The constraints of the four edges of a tile (an edge that is not constrained is null) */
|
|
115
|
+
export interface ResolvedTileEdges<T> {
|
|
116
|
+
readonly top: ResolvedEdge<T> | null;
|
|
117
|
+
readonly bottom: ResolvedEdge<T> | null;
|
|
118
|
+
readonly left: ResolvedEdge<T> | null;
|
|
119
|
+
readonly right: ResolvedEdge<T> | null;
|
|
120
|
+
}
|
|
121
|
+
/** No edge is constrained */
|
|
122
|
+
export declare const NO_RESOLVED_EDGES: ResolvedTileEdges<never>;
|
|
123
|
+
/**
|
|
124
|
+
* Derive the constraints of the four edges of this tile wholly from the current
|
|
125
|
+
* tile state
|
|
126
|
+
*
|
|
127
|
+
* The level difference (Δz), the coordinate transform, the step and the DEM of
|
|
128
|
+
* the constraint target are all brought together in a single call. The step is
|
|
129
|
+
* not baked into the vertex data (the mesh is a single one independent of the
|
|
130
|
+
* tile, and the step can only be passed as a uniform), so merely passing through
|
|
131
|
+
* here again every frame structurally prevents the mismatch "the DEM is new but
|
|
132
|
+
* the level difference is old".
|
|
133
|
+
*
|
|
134
|
+
* An edge for which `resolve` returns null is not constrained. Leaving only the
|
|
135
|
+
* step when the DEM of the constraint target cannot be held would mean
|
|
136
|
+
* constraining onto a polyline that steps one own DEM coarsely, and the crack
|
|
137
|
+
* that was supposed to be fixed would come back just there.
|
|
138
|
+
*
|
|
139
|
+
* @param keys The set of keys of the tiles actually drawn in this frame
|
|
140
|
+
* @param resolve Look up the DEM from the tile on the coarser side (null if it
|
|
141
|
+
* cannot be looked up)
|
|
142
|
+
*/
|
|
143
|
+
export declare function resolveTileEdges<T>(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number, resolve: (neighbor: StitchTile) => T | null): ResolvedTileEdges<T>;
|
|
144
|
+
/**
|
|
145
|
+
* The elevation after constraining (the same expression as drape_constrain in
|
|
146
|
+
* the vertex shader)
|
|
147
|
+
*
|
|
148
|
+
* The shader is the authority for the implementation, but the expression itself
|
|
149
|
+
* is placed here as a pure function so that it can be verified. `sample` returns
|
|
150
|
+
* the elevation of a node of the polyline on the coarser side.
|
|
151
|
+
*
|
|
152
|
+
* @param along The position along the edge (in this tile coordinates)
|
|
153
|
+
* @param step The node spacing of the coarser side (in this tile coordinates)
|
|
154
|
+
*/
|
|
155
|
+
export declare function constrainEdgeElevation(along: number, step: number, sample: (at: number) => number, extent?: number): number;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Stitching tile boundaries (resolving T-junctions)
|
|
5
|
+
*
|
|
6
|
+
* MapLibre chooses the zoom of terrain tiles by distance, so tiles of different
|
|
7
|
+
* zooms coexist within a single screen (in a pitched view z6 and z9 sit side by
|
|
8
|
+
* side). The difference is not necessarily a single level.
|
|
9
|
+
*
|
|
10
|
+
* When tiles of different zooms are adjacent, nodes that the coarser side does
|
|
11
|
+
* not have are lined up along the boundary of the finer side. The finer side
|
|
12
|
+
* takes the elevation of its own DEM at those nodes, but the coarser side joins
|
|
13
|
+
* node to node with a straight line, so the two surfaces separate in between (a
|
|
14
|
+
* T-junction). The basemap below shows through the gap that opens, and it looks
|
|
15
|
+
* like a dotted gap running along the tile boundary.
|
|
16
|
+
*
|
|
17
|
+
* The way to fix it is to "constrain the elevation of the finer side boundary
|
|
18
|
+
* onto the polyline of the coarser side". The boundary itself is a straight line
|
|
19
|
+
* in tile coordinates, so only the elevation has to be moved. Taking the node
|
|
20
|
+
* spacing of the coarser side (`delta * 2^Δz` in this tile coordinates) as the
|
|
21
|
+
* step, and using the value obtained by linearly interpolating the elevations at
|
|
22
|
+
* both ends of that step, the gap becomes structurally zero whatever the level
|
|
23
|
+
* difference Δz is.
|
|
24
|
+
*
|
|
25
|
+
* However, "the polyline of the coarser side" is decided by the DEM of the
|
|
26
|
+
* coarser side. MapLibre reads the DEM one level coarser than the render tile
|
|
27
|
+
* (`deltaZoom = 1`), so adjacent tiles of different zooms always read DEMs of
|
|
28
|
+
* different resolutions. Taking the node elevations from one own DEM yields not
|
|
29
|
+
* the polyline of the coarser side but "a polyline that steps one own DEM
|
|
30
|
+
* coarsely", and the two stay apart by the difference in DEM resolution. This is
|
|
31
|
+
* the true identity of the thin line that remains at tile boundaries.
|
|
32
|
+
*
|
|
33
|
+
* Therefore the constraint uses the DEM of the coarser side itself. Here, for
|
|
34
|
+
* each edge, we obtain the "step" and the "tile on the coarser side", and
|
|
35
|
+
* further produce the transform that maps one own tile coordinates to the tile
|
|
36
|
+
* coordinates of the coarser side. The actual constraining is done by the vertex
|
|
37
|
+
* shader (drape_constrain in renderer.ts).
|
|
38
|
+
*/
|
|
39
|
+
import { TILE_EXTENT } from './mesh.js';
|
|
40
|
+
/** No constraint */
|
|
41
|
+
export const NO_EDGE_STEPS = { top: 0, bottom: 0, left: 0, right: 0 };
|
|
42
|
+
/** Four edges with no constraint */
|
|
43
|
+
export const NO_EDGE_STITCH = {
|
|
44
|
+
top: { step: 0, tile: null },
|
|
45
|
+
bottom: { step: 0, tile: null },
|
|
46
|
+
left: { step: 0, tile: null },
|
|
47
|
+
right: { step: 0, tile: null },
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* The key of a tile (folding the wrap in the longitude direction)
|
|
51
|
+
*
|
|
52
|
+
* `computeEdgeStitch` returns the neighbor in the frame before wrapping so that
|
|
53
|
+
* the coordinate transform can be built, so fold it here when looking up the
|
|
54
|
+
* set.
|
|
55
|
+
*/
|
|
56
|
+
export function wrappedTileKey(tile) {
|
|
57
|
+
const span = 2 ** tile.z;
|
|
58
|
+
return `${tile.z}/${((tile.x % span) + span) % span}/${tile.y}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build the set of keys from the set of tiles in view
|
|
62
|
+
*
|
|
63
|
+
* What is passed is "the tiles actually drawn in this frame". Putting in tiles
|
|
64
|
+
* that are not drawn would mean constraining onto the polyline of a counterpart
|
|
65
|
+
* that is not drawn.
|
|
66
|
+
*/
|
|
67
|
+
export function buildTileKeySet(tiles) {
|
|
68
|
+
const set = new Set();
|
|
69
|
+
for (const tile of tiles)
|
|
70
|
+
set.add(wrappedTileKey(tile));
|
|
71
|
+
return set;
|
|
72
|
+
}
|
|
73
|
+
/** Floor division that holds even for negative values (x goes negative with the wrap) */
|
|
74
|
+
function floorShift(value, shift) {
|
|
75
|
+
return Math.floor(value / 2 ** shift);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Look up the neighboring tile
|
|
79
|
+
*
|
|
80
|
+
* Walking up the ancestors in order starting from the same zoom, the first one
|
|
81
|
+
* found is the neighbor (drawn tiles do not overlap, so at most one is found).
|
|
82
|
+
*
|
|
83
|
+
* The lookup uses the key wrapped in the longitude direction, but the x that is
|
|
84
|
+
* returned is expressed in the frame before wrapping. Doing so lets the caller
|
|
85
|
+
* build the transform "one own tile coordinates -> the neighbor tile
|
|
86
|
+
* coordinates" out of a difference and a ratio alone (`neighborTileTransform`).
|
|
87
|
+
*
|
|
88
|
+
* @returns The neighboring tile. null if it is not found
|
|
89
|
+
*/
|
|
90
|
+
function neighborTile(keys, z, x, y) {
|
|
91
|
+
const span = 2 ** z;
|
|
92
|
+
if (y < 0 || y >= span)
|
|
93
|
+
return null;
|
|
94
|
+
// The longitude direction wraps around the world
|
|
95
|
+
const wrapped = ((x % span) + span) % span;
|
|
96
|
+
for (let nz = z; nz >= 0; nz--) {
|
|
97
|
+
const shift = z - nz;
|
|
98
|
+
if (keys.has(`${nz}/${wrapped >> shift}/${y >> shift}`)) {
|
|
99
|
+
return { z: nz, x: floorShift(x, shift), y: y >> shift };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Obtain the stitching of the four edges of this tile
|
|
106
|
+
*
|
|
107
|
+
* @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
|
|
108
|
+
*/
|
|
109
|
+
export function computeEdgeStitch(keys, tile, meshSize) {
|
|
110
|
+
const delta = TILE_EXTENT / meshSize;
|
|
111
|
+
const edgeFor = (nx, ny) => {
|
|
112
|
+
const neighbor = neighborTile(keys, tile.z, nx, ny);
|
|
113
|
+
if (!neighbor || neighbor.z >= tile.z)
|
|
114
|
+
return { step: 0, tile: null };
|
|
115
|
+
return { step: delta * 2 ** (tile.z - neighbor.z), tile: neighbor };
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
top: edgeFor(tile.x, tile.y - 1),
|
|
119
|
+
bottom: edgeFor(tile.x, tile.y + 1),
|
|
120
|
+
left: edgeFor(tile.x - 1, tile.y),
|
|
121
|
+
right: edgeFor(tile.x + 1, tile.y),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Take only the steps out of the stitching */
|
|
125
|
+
export function edgeStepsOf(stitch) {
|
|
126
|
+
return {
|
|
127
|
+
top: stitch.top.step,
|
|
128
|
+
bottom: stitch.bottom.step,
|
|
129
|
+
left: stitch.left.step,
|
|
130
|
+
right: stitch.right.step,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Obtain the constraint steps of the four edges of this tile
|
|
135
|
+
*
|
|
136
|
+
* @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
|
|
137
|
+
*/
|
|
138
|
+
export function computeEdgeSteps(keys, tile, meshSize) {
|
|
139
|
+
return edgeStepsOf(computeEdgeStitch(keys, tile, meshSize));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* One own tile coordinates -> the tile coordinates of the neighbor (the coarser
|
|
143
|
+
* side)
|
|
144
|
+
*
|
|
145
|
+
* It is `q = p * scale + offset`. The scale factor is a power of 2 and the
|
|
146
|
+
* translation is an integer multiple of one mesh cell, so the mapping is exact
|
|
147
|
+
* even in float. That is, the nodes of the step land exactly on the mesh nodes
|
|
148
|
+
* of the coarser side, and read the same DEM texels with the same weights as the
|
|
149
|
+
* coarser side reads at its own vertices. This is the ground for "the edge
|
|
150
|
+
* vertices of the finer side lying exactly on the line segments of the coarser
|
|
151
|
+
* side".
|
|
152
|
+
*/
|
|
153
|
+
export function neighborTileTransform(fine, coarse, extent = TILE_EXTENT) {
|
|
154
|
+
const scale = 2 ** (coarse.z - fine.z);
|
|
155
|
+
return {
|
|
156
|
+
scale,
|
|
157
|
+
offsetX: (fine.x * scale - coarse.x) * extent,
|
|
158
|
+
offsetY: (fine.y * scale - coarse.y) * extent,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** No edge is constrained */
|
|
162
|
+
export const NO_RESOLVED_EDGES = {
|
|
163
|
+
top: null,
|
|
164
|
+
bottom: null,
|
|
165
|
+
left: null,
|
|
166
|
+
right: null,
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Derive the constraints of the four edges of this tile wholly from the current
|
|
170
|
+
* tile state
|
|
171
|
+
*
|
|
172
|
+
* The level difference (Δz), the coordinate transform, the step and the DEM of
|
|
173
|
+
* the constraint target are all brought together in a single call. The step is
|
|
174
|
+
* not baked into the vertex data (the mesh is a single one independent of the
|
|
175
|
+
* tile, and the step can only be passed as a uniform), so merely passing through
|
|
176
|
+
* here again every frame structurally prevents the mismatch "the DEM is new but
|
|
177
|
+
* the level difference is old".
|
|
178
|
+
*
|
|
179
|
+
* An edge for which `resolve` returns null is not constrained. Leaving only the
|
|
180
|
+
* step when the DEM of the constraint target cannot be held would mean
|
|
181
|
+
* constraining onto a polyline that steps one own DEM coarsely, and the crack
|
|
182
|
+
* that was supposed to be fixed would come back just there.
|
|
183
|
+
*
|
|
184
|
+
* @param keys The set of keys of the tiles actually drawn in this frame
|
|
185
|
+
* @param resolve Look up the DEM from the tile on the coarser side (null if it
|
|
186
|
+
* cannot be looked up)
|
|
187
|
+
*/
|
|
188
|
+
export function resolveTileEdges(keys, tile, meshSize, resolve) {
|
|
189
|
+
const stitch = computeEdgeStitch(keys, tile, meshSize);
|
|
190
|
+
const resolveEdge = (edge) => {
|
|
191
|
+
if (!edge.tile || edge.step <= 0)
|
|
192
|
+
return null;
|
|
193
|
+
const terrain = resolve(edge.tile);
|
|
194
|
+
if (terrain === null)
|
|
195
|
+
return null;
|
|
196
|
+
return {
|
|
197
|
+
step: edge.step,
|
|
198
|
+
tile: edge.tile,
|
|
199
|
+
transform: neighborTileTransform(tile, edge.tile),
|
|
200
|
+
terrain,
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
top: resolveEdge(stitch.top),
|
|
205
|
+
bottom: resolveEdge(stitch.bottom),
|
|
206
|
+
left: resolveEdge(stitch.left),
|
|
207
|
+
right: resolveEdge(stitch.right),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The elevation after constraining (the same expression as drape_constrain in
|
|
212
|
+
* the vertex shader)
|
|
213
|
+
*
|
|
214
|
+
* The shader is the authority for the implementation, but the expression itself
|
|
215
|
+
* is placed here as a pure function so that it can be verified. `sample` returns
|
|
216
|
+
* the elevation of a node of the polyline on the coarser side.
|
|
217
|
+
*
|
|
218
|
+
* @param along The position along the edge (in this tile coordinates)
|
|
219
|
+
* @param step The node spacing of the coarser side (in this tile coordinates)
|
|
220
|
+
*/
|
|
221
|
+
export function constrainEdgeElevation(along, step, sample, extent = TILE_EXTENT) {
|
|
222
|
+
const t0 = Math.floor(along / step) * step;
|
|
223
|
+
const t1 = Math.min(t0 + step, extent);
|
|
224
|
+
const e0 = sample(t0);
|
|
225
|
+
const e1 = sample(t1);
|
|
226
|
+
const w = t1 > t0 ? (along - t0) / (t1 - t0) : 0;
|
|
227
|
+
return e0 + (e1 - e0) * w;
|
|
228
|
+
}
|