@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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The drawing stages of a frame
|
|
3
|
+
*
|
|
4
|
+
* Every slot draws its segment (`renderSegment`: the analytic drape of the segment, then the
|
|
5
|
+
* per-layer rendering once per copy of the world), and the last slot draws the foreground pass
|
|
6
|
+
* (`renderForeground`: the selection UI, the tentative geometry being drawn and the overlays).
|
|
7
|
+
* The state of the frame is built beforehand by frame-state.ts, and the GL state of the slot is
|
|
8
|
+
* set and restored through gl-state.ts.
|
|
9
|
+
*/
|
|
10
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
11
|
+
import type { CustomFeatureHandler } from '../../extension/index.js';
|
|
12
|
+
import type { Store } from '../../store/store.js';
|
|
13
|
+
import type { FeatureCompanionRegistry } from '../feature-companion.js';
|
|
14
|
+
import type { TerrainContext } from '../terrain/context.js';
|
|
15
|
+
import type { SelectionScope } from '../ui/selection-scope.js';
|
|
16
|
+
import type { DrapePlanner } from './drape-planner.js';
|
|
17
|
+
import type { FrameState } from './frame-state.js';
|
|
18
|
+
import { renderLayers } from './render.js';
|
|
19
|
+
import type { Renderers } from './renderers.js';
|
|
20
|
+
import type { StoreRetainedCache } from './store-retained.js';
|
|
21
|
+
/**
|
|
22
|
+
* The datasets as the per-layer rendering takes them (the type is owned by
|
|
23
|
+
* render.ts, so this file does not read a type from display/)
|
|
24
|
+
*/
|
|
25
|
+
type RenderedDatasets = Parameters<typeof renderLayers>[10];
|
|
26
|
+
/** What the drawing of a frame reads (the engine of the layer, while its GPU side exists) */
|
|
27
|
+
export interface FrameRenderDeps {
|
|
28
|
+
gl: WebGL2RenderingContext;
|
|
29
|
+
renderers: Renderers;
|
|
30
|
+
map: MapLibreMap;
|
|
31
|
+
store: Store;
|
|
32
|
+
terrainContext: TerrainContext;
|
|
33
|
+
drape: DrapePlanner;
|
|
34
|
+
customRenderers: Map<string, CustomFeatureHandler['renderer']>;
|
|
35
|
+
featureCompanions: FeatureCompanionRegistry;
|
|
36
|
+
datasets?: RenderedDatasets;
|
|
37
|
+
storeRetainedCache: StoreRetainedCache | null;
|
|
38
|
+
selectionScope: SelectionScope;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The range [from, to) of the drape elements that corresponds to the segment of a slot
|
|
42
|
+
*
|
|
43
|
+
* The index of the pack being drawn (entryStarts) refers to the stacking order at the moment it
|
|
44
|
+
* was collected. Right after the order changes, the old pack keeps being drawn until the index
|
|
45
|
+
* of the new pack is built, so an entry of the current order may be missing from the index. In
|
|
46
|
+
* that case null is returned and the first slot draws every element (for a few frames they all
|
|
47
|
+
* come out below the external layers).
|
|
48
|
+
*/
|
|
49
|
+
export declare function drapeRangeOf(f: Pick<FrameState, 'segments' | 'layerOrder' | 'drapeEntryStarts' | 'drapeAboveStoreStart' | 'drapeElementsTotal'>, index: number): {
|
|
50
|
+
from: number;
|
|
51
|
+
to: number;
|
|
52
|
+
} | null;
|
|
53
|
+
/** One slot (the drape of its segment and the layer rendering) */
|
|
54
|
+
export declare function renderSegment(deps: FrameRenderDeps, f: FrameState, index: number): void;
|
|
55
|
+
/** The foreground pass (drawn by the last slot) */
|
|
56
|
+
export declare function renderForeground(deps: FrameRenderDeps, f: FrameState): void;
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { isInteractionBlocked } from '../../store/lock.js';
|
|
4
|
+
import { setDrapePaintedDatasets, setQuadDrapeFrame, setTerrainRenderState, setTerrainShadeLight, setTerrainSurfacesFlattened, } from '../terrain/state.js';
|
|
5
|
+
import { renderFollowedVertices, renderSelectionUI } from '../ui/selection-ui-drawer.js';
|
|
6
|
+
import { applyDrapeGlState, applySegmentDepthState, applySegmentGlState, enterSymbolGlState, restoreSegmentGlState, resumeDrapeGlState, } from './gl-state.js';
|
|
7
|
+
import { renderLayers } from './render.js';
|
|
8
|
+
/** Makes the renderers draw on one copy of the world */
|
|
9
|
+
function applyCopy(deps, copy) {
|
|
10
|
+
const r = deps.renderers;
|
|
11
|
+
r.shaderInitializer.setProjectionData(copy.projectionData);
|
|
12
|
+
r.shaderInitializer.applyOffsetUniforms(copy.offsetUniforms);
|
|
13
|
+
if (deps.terrainContext.renderState !== copy.terrainState) {
|
|
14
|
+
setTerrainRenderState(deps.terrainContext, copy.terrainState);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The range [from, to) of the drape elements that corresponds to the segment of a slot
|
|
19
|
+
*
|
|
20
|
+
* The index of the pack being drawn (entryStarts) refers to the stacking order at the moment it
|
|
21
|
+
* was collected. Right after the order changes, the old pack keeps being drawn until the index
|
|
22
|
+
* of the new pack is built, so an entry of the current order may be missing from the index. In
|
|
23
|
+
* that case null is returned and the first slot draws every element (for a few frames they all
|
|
24
|
+
* come out below the external layers).
|
|
25
|
+
*/
|
|
26
|
+
export function drapeRangeOf(f, index) {
|
|
27
|
+
const segment = f.segments[index];
|
|
28
|
+
const first = index === 0;
|
|
29
|
+
const last = index === f.segments.length - 1;
|
|
30
|
+
const order = f.layerOrder;
|
|
31
|
+
const startOf = (position) => position < order.length ? f.drapeEntryStarts.get(order[position]) : f.drapeAboveStoreStart;
|
|
32
|
+
let from = first ? 0 : startOf(segment.from);
|
|
33
|
+
let to = last ? f.drapeElementsTotal : startOf(segment.to);
|
|
34
|
+
if (from === undefined || to === undefined)
|
|
35
|
+
return null;
|
|
36
|
+
if (segment.from >= segment.to) {
|
|
37
|
+
// An empty segment (an order with nothing drawn by us). If it is both first and last, every
|
|
38
|
+
// element is drawn
|
|
39
|
+
from = first ? 0 : from;
|
|
40
|
+
to = last ? f.drapeElementsTotal : from;
|
|
41
|
+
}
|
|
42
|
+
return { from, to: Math.max(from, to) };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sectioned drawing of the analytic drape (the element range of this slot, and the images
|
|
46
|
+
* interleaved into that range)
|
|
47
|
+
*/
|
|
48
|
+
function drawDrapeSegment(deps, f, index) {
|
|
49
|
+
const { gl, renderers: r, store, drape } = deps;
|
|
50
|
+
const drapeRenderer = drape.renderer;
|
|
51
|
+
if (!drapeRenderer || !f.drapeUsable)
|
|
52
|
+
return;
|
|
53
|
+
const first = index === 0;
|
|
54
|
+
const last = index === f.segments.length - 1;
|
|
55
|
+
if (!f.drapeReady) {
|
|
56
|
+
// The images that were to be interleaved between the sections are drawn here (the first
|
|
57
|
+
// slot only)
|
|
58
|
+
if (first) {
|
|
59
|
+
f.restoreBlendState();
|
|
60
|
+
for (const quadFeature of f.drapeFallbackQuads) {
|
|
61
|
+
r.featureDrawer.drawFeature(quadFeature, f.defaultProjectionData, f.zoom, store.getLayer(quadFeature.layerId) ?? undefined);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let range = drapeRangeOf(f, index);
|
|
67
|
+
if (range === null) {
|
|
68
|
+
// A transient state where the index does not fit the current order. The first slot draws
|
|
69
|
+
// every element
|
|
70
|
+
if (!first)
|
|
71
|
+
return;
|
|
72
|
+
range = { from: 0, to: f.drapeElementsTotal };
|
|
73
|
+
}
|
|
74
|
+
const { from, to } = range;
|
|
75
|
+
applyDrapeGlState(gl);
|
|
76
|
+
const drawSegment = (paintFrom, paintTo, emitSelection) => {
|
|
77
|
+
for (const tileDraw of f.drapeTileDraws) {
|
|
78
|
+
drapeRenderer.drawTile(tileDraw.draw, tileDraw.projection, f.drapeLight, f.zoom, drape.sourceFactors, f.dpr, 1, { paintFrom, paintTo, emitSelection });
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
// Pick only the images that fall into the range of this slot (an image whose position equals
|
|
82
|
+
// the start of the range belongs to this slot; one that equals the end is picked only by the
|
|
83
|
+
// last slot)
|
|
84
|
+
let paintCursor = from;
|
|
85
|
+
for (const pendingQuad of f.pendingQuads) {
|
|
86
|
+
const inRange = pendingQuad.at >= from && (last ? pendingQuad.at <= to : pendingQuad.at < to);
|
|
87
|
+
if (!inRange)
|
|
88
|
+
continue;
|
|
89
|
+
if (pendingQuad.at > paintCursor) {
|
|
90
|
+
drawSegment(paintCursor, pendingQuad.at, false);
|
|
91
|
+
paintCursor = pendingQuad.at;
|
|
92
|
+
}
|
|
93
|
+
// Interleave the image. The quad drape draws with normal compositing (not premultiplied),
|
|
94
|
+
// so the blending is restored, and the depth test is left raised for the next section
|
|
95
|
+
// (keepDepthTest is true until the foreground). Afterwards the assumptions of the drape are
|
|
96
|
+
// established again.
|
|
97
|
+
f.restoreBlendState();
|
|
98
|
+
r.featureDrawer.drawFeature(pendingQuad.feature, f.defaultProjectionData, f.zoom, store.getLayer(pendingQuad.feature.layerId) ?? undefined);
|
|
99
|
+
resumeDrapeGlState(gl);
|
|
100
|
+
}
|
|
101
|
+
// The final section. The remaining elements, and on the last slot the selection highlight of
|
|
102
|
+
// every element, are drawn on top (the coverage of the selection accumulates regardless of
|
|
103
|
+
// the range, so raising it once is enough). Nothing is drawn when no element is left and
|
|
104
|
+
// there is no selection either (this skips a pointless evaluation of every pixel)
|
|
105
|
+
const hasDrapeSelection = last && drape.hasSelection;
|
|
106
|
+
if (to > paintCursor || hasDrapeSelection) {
|
|
107
|
+
drawSegment(paintCursor, to, last);
|
|
108
|
+
}
|
|
109
|
+
f.restoreBlendState();
|
|
110
|
+
// Back to the depth state of the layer rendering. What the drape could not paint (dashed
|
|
111
|
+
// lines, polygons with a dashed outline, the geometry being drawn, the features of
|
|
112
|
+
// extensions) is drawn next, by the vertex displacement path, and the terrain must hide it
|
|
113
|
+
// as it does in a frame without the drape. Symbols switch the depth test off themselves.
|
|
114
|
+
applySegmentDepthState(gl, deps.terrainContext, f);
|
|
115
|
+
}
|
|
116
|
+
/** One slot (the drape of its segment and the layer rendering) */
|
|
117
|
+
export function renderSegment(deps, f, index) {
|
|
118
|
+
const { gl, renderers: r, store } = deps;
|
|
119
|
+
const segment = f.segments[index];
|
|
120
|
+
const first = index === 0;
|
|
121
|
+
const last = index === f.segments.length - 1;
|
|
122
|
+
applySegmentGlState(gl, deps.terrainContext, f);
|
|
123
|
+
applyCopy(deps, f.baseCopy);
|
|
124
|
+
drawDrapeSegment(deps, f, index);
|
|
125
|
+
// Per-layer rendering (only the segment of this slot), once per copy of the world in view
|
|
126
|
+
for (const copy of f.copies) {
|
|
127
|
+
applyCopy(deps, copy);
|
|
128
|
+
renderLayers(r, store, copy.features, f.selectedIdSet, copy.projectionData, f.zoom, deps.customRenderers, copy.customRendererContext, deps.featureCompanions, f.layerAwareRenderers, deps.datasets, f.useRetained ? (deps.storeRetainedCache ?? undefined) : undefined, f.restoreBlendState, { from: segment.from, to: segment.to, first, last }, copy.view);
|
|
129
|
+
}
|
|
130
|
+
applyCopy(deps, f.baseCopy);
|
|
131
|
+
if (!last)
|
|
132
|
+
restoreSegmentGlState(gl, f);
|
|
133
|
+
}
|
|
134
|
+
/** The foreground pass (drawn by the last slot) */
|
|
135
|
+
export function renderForeground(deps, f) {
|
|
136
|
+
const { gl, renderers: r, store, map, terrainContext } = deps;
|
|
137
|
+
// From the selection UI onwards it is always drawn without depth (the symbols and the UI are
|
|
138
|
+
// not buried in the terrain)
|
|
139
|
+
enterSymbolGlState(gl);
|
|
140
|
+
// The depth is not restored even if a quad is drawn from here on
|
|
141
|
+
if (f.quadDrapeFrame)
|
|
142
|
+
f.quadDrapeFrame.keepDepthTest = false;
|
|
143
|
+
// Selection UI
|
|
144
|
+
// When the editing interaction is blocked (an effective lock, an interaction lock or
|
|
145
|
+
// read-only), only the selection box is drawn and no handles appear (the same look as
|
|
146
|
+
// locked). The box is shown even in read-only or under an interaction lock (so that a viewer
|
|
147
|
+
// also gets the on-map feedback of "what is selected", in the same grammar as the read-only
|
|
148
|
+
// mode of someone with edit permission).
|
|
149
|
+
const selectionLocked = f.selectedFeatures.some((feature) => isInteractionBlocked(feature, store));
|
|
150
|
+
const selectionUIDeps = {
|
|
151
|
+
selectionUIRenderer: r.selectionUIRenderer,
|
|
152
|
+
selectionHandlesRenderer: r.selectionHandlesRenderer,
|
|
153
|
+
pointInstanceRenderer: r.pointInstanceRenderer,
|
|
154
|
+
map,
|
|
155
|
+
scope: deps.selectionScope,
|
|
156
|
+
};
|
|
157
|
+
const tentative = store.getTentative();
|
|
158
|
+
const boxSelection = store.getBoxSelection();
|
|
159
|
+
// Once per copy of the world in view (the selection UI of a feature on the other side of the
|
|
160
|
+
// antimeridian is drawn on the copy the feature is drawn on)
|
|
161
|
+
for (const copy of f.copies) {
|
|
162
|
+
applyCopy(deps, copy);
|
|
163
|
+
renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getSelectedVertices(), selectionLocked);
|
|
164
|
+
// The vertices that follow along when a shared vertex is moved (raised only during a
|
|
165
|
+
// drag). The features that follow are not selected, so they are drawn separately from the
|
|
166
|
+
// selection UI.
|
|
167
|
+
renderFollowedVertices(store.getFollowedVertices?.() ?? null, store, f.zoom, copy.projectionData, selectionUIDeps);
|
|
168
|
+
// Draw the vertices of the tentative in the foreground
|
|
169
|
+
if (tentative) {
|
|
170
|
+
r.tentativeRenderer.drawVertices(tentative, f.zoom);
|
|
171
|
+
}
|
|
172
|
+
// Draw the vertices of the layer-aware renderers in the foreground
|
|
173
|
+
for (const renderer of f.layerAwareRenderers) {
|
|
174
|
+
if (renderer.drawVertices) {
|
|
175
|
+
renderer.drawVertices(copy.projectionData, f.zoom, copy.customRendererContext);
|
|
176
|
+
f.restoreBlendState();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Box selection UI (on the stored copy: its corners come from unproject around the
|
|
180
|
+
// camera)
|
|
181
|
+
//
|
|
182
|
+
// This is a rubber band on the screen, so pinning it to the ground would stop it from
|
|
183
|
+
// being a rectangle. Its renderers are built without the terrain (box-selection.ts), so it
|
|
184
|
+
// is drawn flat.
|
|
185
|
+
if (boxSelection && copy.lngShift === 0) {
|
|
186
|
+
r.boxSelectionRenderer.draw(boxSelection, f.defaultProjectionData, f.zoom);
|
|
187
|
+
}
|
|
188
|
+
// Drawing of the overlays that are not layer-aware
|
|
189
|
+
for (const renderer of f.otherRenderers) {
|
|
190
|
+
if (renderer.order === 'overlay' || renderer.order === 'foreground') {
|
|
191
|
+
renderer.draw(copy.projectionData, f.zoom, copy.customRendererContext);
|
|
192
|
+
f.restoreBlendState();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
applyCopy(deps, f.baseCopy);
|
|
197
|
+
restoreSegmentGlState(gl, f);
|
|
198
|
+
// The report of the datasets being painted also lasts only for this frame
|
|
199
|
+
setDrapePaintedDatasets(terrainContext, null);
|
|
200
|
+
// The contract to draw flat lasts only for this frame (it is always restored so that it is
|
|
201
|
+
// not read from outside the rendering)
|
|
202
|
+
setTerrainSurfacesFlattened(terrainContext, false);
|
|
203
|
+
// The light lasts only for this frame as well
|
|
204
|
+
setTerrainShadeLight(terrainContext, null);
|
|
205
|
+
// The entry point of the quads lasts only for this frame (it is always removed so that it is
|
|
206
|
+
// not read from outside the rendering)
|
|
207
|
+
if (f.quadDrapeFrame)
|
|
208
|
+
setQuadDrapeFrame(terrainContext, null);
|
|
209
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The state of one frame
|
|
3
|
+
*
|
|
4
|
+
* The first slot of a frame builds a `FrameState` (`buildFrameState`) and every slot of the
|
|
5
|
+
* frame reads it. It holds only results that do not depend on GL (maplibre resets the GL state
|
|
6
|
+
* for every slot): the zoom, the terrain state, the drape plan of the frame, the features of the
|
|
7
|
+
* immediate path, the selection, the overlay renderers and the copies of the world in view. The
|
|
8
|
+
* drawing of the slots is in frame-render.ts.
|
|
9
|
+
*/
|
|
10
|
+
import type { CustomRenderMethodInput, Map as MapLibreMap } from 'maplibre-gl';
|
|
11
|
+
import type { CustomOverlayRenderer, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
|
|
12
|
+
import type { Store } from '../../store/store.js';
|
|
13
|
+
import type { Feature } from '../../store/types.js';
|
|
14
|
+
import { type OffsetUniforms } from '../shaders/helpers.js';
|
|
15
|
+
import type { TerrainContext, TerrainRenderState } from '../terrain/context.js';
|
|
16
|
+
import type { QuadDrapeFrame } from '../terrain/drape/quad.js';
|
|
17
|
+
import { type DrapeLight } from '../terrain/drape/renderer.js';
|
|
18
|
+
import type { DisplayListCache } from './display-list.js';
|
|
19
|
+
import { type DrapePlanner, type DrapeTileDrawEntry, type MapTerrain, type PendingQuad } from './drape-planner.js';
|
|
20
|
+
import type { RenderLayersView } from './render.js';
|
|
21
|
+
import type { Renderers } from './renderers.js';
|
|
22
|
+
import type { RenderSegment } from './slots.js';
|
|
23
|
+
/**
|
|
24
|
+
* One copy of the world drawn in this frame
|
|
25
|
+
*
|
|
26
|
+
* Away from the antimeridian a frame draws one copy, the stored one (lngShift 0). A view
|
|
27
|
+
* across the antimeridian draws a second copy: the features stored on the other side of the
|
|
28
|
+
* line, moved by 360 degrees, through a virtual camera (the center moved by -lngShift and the
|
|
29
|
+
* matrix by +lngShift; `translateMatrixByLongitude` in shaders/helpers.ts). Everything that
|
|
30
|
+
* is not pinned per terrain tile goes through it: the layers, the datasets, the
|
|
31
|
+
* selection UI and the overlays. The analytic drape is drawn per terrain tile with the matrix
|
|
32
|
+
* maplibre gives each tile (the tiles carry their wrap), so it is drawn once.
|
|
33
|
+
*/
|
|
34
|
+
export interface CopyPass {
|
|
35
|
+
readonly lngShift: number;
|
|
36
|
+
/** The part of the view on this copy (undefined = the expanded viewport, one copy) */
|
|
37
|
+
readonly view: RenderLayersView | undefined;
|
|
38
|
+
readonly projectionData: CustomRenderMethodInput['defaultProjectionData'];
|
|
39
|
+
readonly offsetUniforms: OffsetUniforms;
|
|
40
|
+
readonly customRendererContext: CustomRendererDrawContext;
|
|
41
|
+
/** The features drawn in immediate mode on this copy */
|
|
42
|
+
readonly features: Feature[];
|
|
43
|
+
/** The selected features whose selection UI is drawn on this copy */
|
|
44
|
+
readonly selectedFeatures: Feature[];
|
|
45
|
+
/** The terrain state with the DEM atlas placed in the frame of the virtual camera */
|
|
46
|
+
readonly terrainState: TerrainRenderState;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Shared state of one frame
|
|
50
|
+
*
|
|
51
|
+
* The first slot builds it in the preparation and the following slots read it. maplibre resets
|
|
52
|
+
* the GL state for every slot, so only results that do not depend on GL are put here.
|
|
53
|
+
*/
|
|
54
|
+
export interface FrameState {
|
|
55
|
+
readonly segments: readonly RenderSegment[];
|
|
56
|
+
readonly layerOrder: readonly string[];
|
|
57
|
+
/** Number of the slot drawn most recently (a new frame when the next slot is at most this) */
|
|
58
|
+
lastIndex: number;
|
|
59
|
+
readonly shaderData: CustomRenderMethodInput['shaderData'];
|
|
60
|
+
readonly defaultProjectionData: CustomRenderMethodInput['defaultProjectionData'];
|
|
61
|
+
readonly getProjectionData: CustomRenderMethodInput['getProjectionData'];
|
|
62
|
+
readonly zoom: number;
|
|
63
|
+
readonly rawZoom: number;
|
|
64
|
+
readonly dpr: number;
|
|
65
|
+
readonly terrainState: TerrainRenderState;
|
|
66
|
+
readonly mapTerrain: MapTerrain;
|
|
67
|
+
readonly centerLngLat: [number, number];
|
|
68
|
+
readonly mainMatrixArray: number[];
|
|
69
|
+
readonly drapeUsable: boolean;
|
|
70
|
+
readonly wideFallback: boolean;
|
|
71
|
+
readonly useRetained: boolean;
|
|
72
|
+
readonly features: Feature[];
|
|
73
|
+
readonly selectedIdSet: Set<string>;
|
|
74
|
+
readonly selectedFeatures: Feature[];
|
|
75
|
+
readonly customRendererContext: CustomRendererDrawContext;
|
|
76
|
+
readonly layerAwareRenderers: LayerAwareOverlayRenderer[];
|
|
77
|
+
readonly otherRenderers: CustomOverlayRenderer[];
|
|
78
|
+
readonly quadDrapeFrame: QuadDrapeFrame | null;
|
|
79
|
+
readonly restoreBlendState: () => void;
|
|
80
|
+
/** Whether the drape can be drawn (the shaders and the plan are ready) */
|
|
81
|
+
readonly drapeReady: boolean;
|
|
82
|
+
readonly drapeLight: DrapeLight;
|
|
83
|
+
readonly drapeTileDraws: DrapeTileDrawEntry[];
|
|
84
|
+
readonly drapeElementsTotal: number;
|
|
85
|
+
readonly drapeAboveStoreStart: number;
|
|
86
|
+
readonly drapeEntryStarts: ReadonlyMap<string, number>;
|
|
87
|
+
readonly pendingQuads: PendingQuad[];
|
|
88
|
+
/**
|
|
89
|
+
* When the drape could not be built, a slot is needed to draw the images that were to be
|
|
90
|
+
* interleaved between the sections
|
|
91
|
+
*/
|
|
92
|
+
readonly drapeFallbackQuads: Feature[];
|
|
93
|
+
/** The stored copy (lngShift 0); what everything outside the copies is drawn with */
|
|
94
|
+
readonly baseCopy: CopyPass;
|
|
95
|
+
/** The copies of the world in view (one, or two across the antimeridian) */
|
|
96
|
+
readonly copies: readonly CopyPass[];
|
|
97
|
+
}
|
|
98
|
+
/** The position of the camera: mercator x and y (0..1) and the altitude in meters */
|
|
99
|
+
export type CameraPosition = readonly [number, number, number];
|
|
100
|
+
/** What building a frame reads */
|
|
101
|
+
export interface FrameBuildInput {
|
|
102
|
+
gl: WebGL2RenderingContext;
|
|
103
|
+
renderers: Renderers;
|
|
104
|
+
map: MapLibreMap;
|
|
105
|
+
store: Store;
|
|
106
|
+
terrainContext: TerrainContext;
|
|
107
|
+
displayList: DisplayListCache;
|
|
108
|
+
drape: DrapePlanner;
|
|
109
|
+
renderOptions: CustomRenderMethodInput;
|
|
110
|
+
/** The style zoom of the frame */
|
|
111
|
+
zoom: number;
|
|
112
|
+
/** The real zoom of the camera */
|
|
113
|
+
rawZoom: number;
|
|
114
|
+
dpr: number;
|
|
115
|
+
/** The terrain state of the frame (already set on the terrain context) */
|
|
116
|
+
terrainState: TerrainRenderState;
|
|
117
|
+
/** Whether the retained batches of the Store rendering exist */
|
|
118
|
+
retainedAvailable: boolean;
|
|
119
|
+
overlayRenderers: readonly CustomOverlayRenderer[];
|
|
120
|
+
segments: readonly RenderSegment[];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Builds the state of a frame (done once by the first slot)
|
|
124
|
+
*
|
|
125
|
+
* It sets up the shaders and the anchor projection of the frame, plans the analytic drape,
|
|
126
|
+
* picks the features of the immediate path and the selection, and plans the copies of the world.
|
|
127
|
+
*/
|
|
128
|
+
export declare function buildFrameState(input: FrameBuildInput): FrameState;
|
|
129
|
+
/**
|
|
130
|
+
* Plans the copies of the world drawn in this frame
|
|
131
|
+
*
|
|
132
|
+
* One copy (the base one, unchanged) unless the view crosses the antimeridian. Across it,
|
|
133
|
+
* each copy gets its range of the view, the features of that range, the virtual camera
|
|
134
|
+
* (center and matrix moved by the copy's shift, computed in 64 bits) and the DEM atlas in the
|
|
135
|
+
* frame of that camera. The globe draws with maplibre's projectTile, which has no seam, so it
|
|
136
|
+
* keeps one copy.
|
|
137
|
+
*/
|
|
138
|
+
export declare function planCopies(baseCopy: CopyPass, options: {
|
|
139
|
+
renderers: Renderers | null;
|
|
140
|
+
displayList: DisplayListCache;
|
|
141
|
+
center: [number, number];
|
|
142
|
+
mainMatrixArray: number[];
|
|
143
|
+
useRetained: boolean;
|
|
144
|
+
excluded: Set<string> | null;
|
|
145
|
+
interleavedQuadIds: Set<string>;
|
|
146
|
+
transition: number;
|
|
147
|
+
}): CopyPass[];
|