@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /package/dist/{display → dataset}/selection.js +0 -0
|
@@ -14,7 +14,7 @@ import { buildFrameState, StyleZoom } from './frame-state.js';
|
|
|
14
14
|
import { createRenderScope } from './render-scope.js';
|
|
15
15
|
import { disposeRenderers, initRenderers } from './renderers.js';
|
|
16
16
|
import { SlotManager } from './slot-manager.js';
|
|
17
|
-
import {
|
|
17
|
+
import { slotLayerId } from './slots.js';
|
|
18
18
|
import { StoreRetainedCache } from './store-retained.js';
|
|
19
19
|
import { isOpacityOnlyLayersChange } from './store-retained-invalidation.js';
|
|
20
20
|
import { TerrainResolver } from './terrain-resolver.js';
|
|
@@ -66,7 +66,10 @@ export function createCustomLayer(deps) {
|
|
|
66
66
|
store,
|
|
67
67
|
terrain: terrainContext,
|
|
68
68
|
datasets,
|
|
69
|
-
|
|
69
|
+
// Read at each build, so a change of the rendering switches applies to the next one
|
|
70
|
+
get timeSlicing() {
|
|
71
|
+
return renderingConfig.timeSlicing;
|
|
72
|
+
},
|
|
70
73
|
});
|
|
71
74
|
const styleZoom = new StyleZoom();
|
|
72
75
|
const slots = new SlotManager({
|
|
@@ -94,6 +97,14 @@ export function createCustomLayer(deps) {
|
|
|
94
97
|
// Changes made while the layer was off the map were not seen
|
|
95
98
|
displayList.invalidate();
|
|
96
99
|
engine.unsubscribeStore = store.subscribe((changes) => {
|
|
100
|
+
// A replacement of the whole document drops every cache of the features, whatever the
|
|
101
|
+
// notification lists (the new document can reuse an ID with another shape)
|
|
102
|
+
if (changes.reset === true) {
|
|
103
|
+
renderScope.earcut.clear();
|
|
104
|
+
renderScope.styleRules.clear();
|
|
105
|
+
terrainContext.fillCache.clear();
|
|
106
|
+
engine.storeRetainedCache?.invalidateAll();
|
|
107
|
+
}
|
|
97
108
|
engine.storeRetainedCache?.applyChanges(changes);
|
|
98
109
|
displayList.applyChanges(changes);
|
|
99
110
|
// The binning of the analytic drape is rebuilt only on a change of the geometry, the style,
|
|
@@ -293,7 +304,7 @@ export function createCustomLayer(deps) {
|
|
|
293
304
|
// renderer; see shaders/frame.ts)
|
|
294
305
|
beginRenderFrame();
|
|
295
306
|
// While the camera is moving, the re-baking of the retained batches is deferred (read by
|
|
296
|
-
//
|
|
307
|
+
// dataset/chunk-set.ts)
|
|
297
308
|
setTerrainCameraMoving(terrainContext, map?.isMoving?.() === true || map?.isZooming?.() === true);
|
|
298
309
|
// The zoom that the rendering reads is the style zoom (a value that absorbs the steps of the
|
|
299
310
|
// elevation settlement; frame-state.ts). The position of the camera (the altitude in meters)
|
|
@@ -319,7 +330,7 @@ export function createCustomLayer(deps) {
|
|
|
319
330
|
// The cells the globe cuts the geometry into (none on a flat map; globe-subdivision.ts)
|
|
320
331
|
updateGlobeSubdivision(terrainContext, renderOptions.defaultProjectionData.projectionTransition ?? 0, rawZoom);
|
|
321
332
|
// Follow the changes of the rendering pixel ratio (moving to another display, or
|
|
322
|
-
// draw.
|
|
333
|
+
// draw.setScaleFactor()). The widths of the already baked retained batches no longer match
|
|
323
334
|
// when the ratio changes, so they are discarded.
|
|
324
335
|
const dpr = resolvePixelRatio(pixelRatio);
|
|
325
336
|
if (engine.builtPixelRatio !== dpr) {
|
|
@@ -389,7 +400,7 @@ export function createCustomLayer(deps) {
|
|
|
389
400
|
/** Creates the CustomLayer of the slot at `index` (the first one is customLayer itself) */
|
|
390
401
|
function makeSlotLayer(index) {
|
|
391
402
|
return {
|
|
392
|
-
id:
|
|
403
|
+
id: slotLayerId(index),
|
|
393
404
|
type: 'custom',
|
|
394
405
|
renderingMode: '3d',
|
|
395
406
|
onAdd(mapInstance, glContext) {
|
|
@@ -412,7 +423,7 @@ export function createCustomLayer(deps) {
|
|
|
412
423
|
return false;
|
|
413
424
|
}
|
|
414
425
|
const customLayer = {
|
|
415
|
-
id:
|
|
426
|
+
id: slotLayerId(0),
|
|
416
427
|
type: 'custom',
|
|
417
428
|
renderingMode: '3d',
|
|
418
429
|
onAdd(mapInstance, glContext) {
|
|
@@ -436,7 +447,7 @@ export function createCustomLayer(deps) {
|
|
|
436
447
|
onRemove() {
|
|
437
448
|
engineRemove();
|
|
438
449
|
},
|
|
439
|
-
|
|
450
|
+
addOverlay(renderer) {
|
|
440
451
|
dynamicOverlayRenderers.push(renderer);
|
|
441
452
|
// An element involved in the rendering was added, so the prepared retained batches are
|
|
442
453
|
// rebuilt
|
|
@@ -445,9 +456,9 @@ export function createCustomLayer(deps) {
|
|
|
445
456
|
if (engine.renderers && engine.gl && engine.mapInstance) {
|
|
446
457
|
renderer.onAdd(engine.gl, engine.mapInstance);
|
|
447
458
|
}
|
|
448
|
-
return () => customLayer.
|
|
459
|
+
return () => customLayer.removeOverlay(renderer);
|
|
449
460
|
},
|
|
450
|
-
|
|
461
|
+
removeOverlay(renderer) {
|
|
451
462
|
const index = dynamicOverlayRenderers.indexOf(renderer);
|
|
452
463
|
if (index === -1)
|
|
453
464
|
return;
|
|
@@ -481,8 +492,8 @@ export function createCustomLayer(deps) {
|
|
|
481
492
|
engine.mapInstance?.triggerRepaint();
|
|
482
493
|
};
|
|
483
494
|
},
|
|
484
|
-
|
|
485
|
-
return slots.
|
|
495
|
+
getStackSlots() {
|
|
496
|
+
return slots.getStackSlots();
|
|
486
497
|
},
|
|
487
498
|
getSlotLayers() {
|
|
488
499
|
return slots.getSlotLayers();
|
|
@@ -490,6 +501,9 @@ export function createCustomLayer(deps) {
|
|
|
490
501
|
getTerrainContext() {
|
|
491
502
|
return terrainContext;
|
|
492
503
|
},
|
|
504
|
+
getGL() {
|
|
505
|
+
return engine.renderers ? engine.gl : null;
|
|
506
|
+
},
|
|
493
507
|
hasPendingWork() {
|
|
494
508
|
if (drape.hasPendingWork)
|
|
495
509
|
return true;
|
|
@@ -501,6 +515,21 @@ export function createCustomLayer(deps) {
|
|
|
501
515
|
}
|
|
502
516
|
return false;
|
|
503
517
|
},
|
|
518
|
+
refresh() {
|
|
519
|
+
renderScope.earcut.clear();
|
|
520
|
+
renderScope.styleRules.clear();
|
|
521
|
+
displayList.invalidate();
|
|
522
|
+
drape.invalidate();
|
|
523
|
+
if (!engine.mapInstance)
|
|
524
|
+
return;
|
|
525
|
+
// The renderers and the retained batches read the configuration when they are built
|
|
526
|
+
if (engine.renderers) {
|
|
527
|
+
releaseGpuResources();
|
|
528
|
+
buildGpuResources();
|
|
529
|
+
}
|
|
530
|
+
slots.sync();
|
|
531
|
+
engine.mapInstance.triggerRepaint();
|
|
532
|
+
},
|
|
504
533
|
};
|
|
505
534
|
// The first slot is customLayer itself. When there are separators, the following slots are
|
|
506
535
|
// prepared here (the host adds them to the map in order from the first)
|
|
@@ -90,7 +90,8 @@ export class DisplayListCache {
|
|
|
90
90
|
changes.groups !== undefined ||
|
|
91
91
|
changes.layerReorder !== undefined ||
|
|
92
92
|
changes.groupReorder !== undefined ||
|
|
93
|
-
changes.uiStateChanged === true
|
|
93
|
+
changes.uiStateChanged === true ||
|
|
94
|
+
changes.reset === true) {
|
|
94
95
|
this.invalidate();
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -92,8 +92,8 @@ export interface DrapePlannerDataset extends DrapeDatasetSource {
|
|
|
92
92
|
/**
|
|
93
93
|
* The datasets as the planner sees them
|
|
94
94
|
*
|
|
95
|
-
* The manager in `
|
|
96
|
-
* so that the planner does not read a type from
|
|
95
|
+
* The manager in `dataset/manager.ts` satisfies this shape. Only the structure is declared here,
|
|
96
|
+
* so that the planner does not read a type from dataset/ (which sits above view/).
|
|
97
97
|
*/
|
|
98
98
|
export interface DrapePlannerDatasets {
|
|
99
99
|
listInternal(): readonly DrapePlannerDataset[];
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* set and restored through gl-state.ts.
|
|
9
9
|
*/
|
|
10
10
|
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
11
|
-
import type {
|
|
11
|
+
import type { FeatureTypeHandler } from '../../extension/index.js';
|
|
12
12
|
import type { Store } from '../../store/store.js';
|
|
13
13
|
import type { FeatureCompanionRegistry } from '../feature-companion.js';
|
|
14
14
|
import type { TerrainContext } from '../terrain/context.js';
|
|
@@ -20,7 +20,7 @@ import type { Renderers } from './renderers.js';
|
|
|
20
20
|
import type { StoreRetainedCache } from './store-retained.js';
|
|
21
21
|
/**
|
|
22
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
|
|
23
|
+
* render.ts, so this file does not read a type from dataset/)
|
|
24
24
|
*/
|
|
25
25
|
type RenderedDatasets = Parameters<typeof renderLayers>[10];
|
|
26
26
|
/** What the drawing of a frame reads (the engine of the layer, while its GPU side exists) */
|
|
@@ -31,7 +31,7 @@ export interface FrameRenderDeps {
|
|
|
31
31
|
store: Store;
|
|
32
32
|
terrainContext: TerrainContext;
|
|
33
33
|
drape: DrapePlanner;
|
|
34
|
-
customRenderers: Map<string,
|
|
34
|
+
customRenderers: Map<string, FeatureTypeHandler['renderer']>;
|
|
35
35
|
featureCompanions: FeatureCompanionRegistry;
|
|
36
36
|
datasets?: RenderedDatasets;
|
|
37
37
|
storeRetainedCache: StoreRetainedCache | null;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
import { isInteractionBlocked } from '../../store/lock.js';
|
|
4
4
|
import { setDrapePaintedDatasets, setQuadDrapeFrame, setTerrainRenderState, setTerrainShadeLight, setTerrainSurfacesFlattened, } from '../terrain/state.js';
|
|
5
|
-
import { renderFollowedVertices, renderSelectionUI } from '../ui/selection-ui-drawer.js';
|
|
5
|
+
import { renderFollowedVertices, renderGlobalAuxiliaryHandles, renderSelectionUI, } from '../ui/selection-ui-drawer.js';
|
|
6
6
|
import { applyDrapeGlState, applySegmentDepthState, applySegmentGlState, enterSymbolGlState, restoreSegmentGlState, resumeDrapeGlState, } from './gl-state.js';
|
|
7
7
|
import { renderLayers } from './render.js';
|
|
8
8
|
/** Makes the renderers draw on one copy of the world */
|
|
@@ -156,11 +156,16 @@ export function renderForeground(deps, f) {
|
|
|
156
156
|
};
|
|
157
157
|
const tentative = store.getTentative();
|
|
158
158
|
const boxSelection = store.getBoxSelection();
|
|
159
|
+
const globalHandlesShown = store.getMode() === 'select' && !store.isReadOnly() && !store.isInteractionLocked();
|
|
159
160
|
// Once per copy of the world in view (the selection UI of a feature on the other side of the
|
|
160
161
|
// antimeridian is drawn on the copy the feature is drawn on)
|
|
161
162
|
for (const copy of f.copies) {
|
|
162
163
|
applyCopy(deps, copy);
|
|
163
|
-
renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.
|
|
164
|
+
renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getVertexSelection(), selectionLocked);
|
|
165
|
+
// The handles of the extensions that belong to no feature, while they can be grabbed
|
|
166
|
+
if (globalHandlesShown) {
|
|
167
|
+
renderGlobalAuxiliaryHandles(f.zoom, copy.projectionData, selectionUIDeps, store.getDragState());
|
|
168
|
+
}
|
|
164
169
|
// The vertices that follow along when a shared vertex is moved (raised only during a
|
|
165
170
|
// drag). The features that follow are not selected, so they are drawn separately from the
|
|
166
171
|
// selection UI.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* drawing of the slots is in frame-render.ts.
|
|
9
9
|
*/
|
|
10
10
|
import type { CustomRenderMethodInput, Map as MapLibreMap } from 'maplibre-gl';
|
|
11
|
-
import type {
|
|
11
|
+
import type { EngineOverlayRenderer, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
|
|
12
12
|
import type { Store } from '../../store/store.js';
|
|
13
13
|
import type { Feature } from '../../store/types.js';
|
|
14
14
|
import { type OffsetUniforms } from '../shaders/helpers.js';
|
|
@@ -37,7 +37,7 @@ export interface CopyPass {
|
|
|
37
37
|
readonly view: RenderLayersView | undefined;
|
|
38
38
|
readonly projectionData: CustomRenderMethodInput['defaultProjectionData'];
|
|
39
39
|
readonly offsetUniforms: OffsetUniforms;
|
|
40
|
-
readonly customRendererContext:
|
|
40
|
+
readonly customRendererContext: FrameDrawContext;
|
|
41
41
|
/** The features drawn in immediate mode on this copy */
|
|
42
42
|
readonly features: Feature[];
|
|
43
43
|
/** The selected features whose selection UI is drawn on this copy */
|
|
@@ -72,9 +72,9 @@ export interface FrameState {
|
|
|
72
72
|
readonly features: Feature[];
|
|
73
73
|
readonly selectedIdSet: Set<string>;
|
|
74
74
|
readonly selectedFeatures: Feature[];
|
|
75
|
-
readonly customRendererContext:
|
|
76
|
-
readonly layerAwareRenderers:
|
|
77
|
-
readonly otherRenderers:
|
|
75
|
+
readonly customRendererContext: FrameDrawContext;
|
|
76
|
+
readonly layerAwareRenderers: LayeredOverlayRenderer[];
|
|
77
|
+
readonly otherRenderers: EngineOverlayRenderer[];
|
|
78
78
|
readonly quadDrapeFrame: QuadDrapeFrame | null;
|
|
79
79
|
readonly restoreBlendState: () => void;
|
|
80
80
|
/** Whether the drape can be drawn (the shaders and the plan are ready) */
|
|
@@ -116,7 +116,7 @@ export interface FrameBuildInput {
|
|
|
116
116
|
terrainState: TerrainRenderState;
|
|
117
117
|
/** Whether the retained batches of the Store rendering exist */
|
|
118
118
|
retainedAvailable: boolean;
|
|
119
|
-
overlayRenderers: readonly
|
|
119
|
+
overlayRenderers: readonly EngineOverlayRenderer[];
|
|
120
120
|
segments: readonly RenderSegment[];
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
@@ -2,5 +2,5 @@ export type { BlendCapableGL } from './blend.js';
|
|
|
2
2
|
export { applyDrawBlendState } from './blend.js';
|
|
3
3
|
export type { CustomLayerDeps, CustomLayerInterface } from './custom-layer.js';
|
|
4
4
|
export { createCustomLayer } from './custom-layer.js';
|
|
5
|
-
export type { RenderSegment,
|
|
6
|
-
export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder,
|
|
5
|
+
export type { RenderSegment, StackSlot } from './slots.js';
|
|
6
|
+
export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
|
package/dist/view/layer/index.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
export { applyDrawBlendState } from './blend.js';
|
|
4
4
|
export { createCustomLayer } from './custom-layer.js';
|
|
5
|
-
export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder,
|
|
5
|
+
export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* The per-layer rendering loop called from CustomLayer's render()
|
|
5
5
|
*/
|
|
6
6
|
import type { ProjectionData } from 'maplibre-gl';
|
|
7
|
-
import type { DatasetManager } from '../../
|
|
8
|
-
import type {
|
|
7
|
+
import type { DatasetManager } from '../../dataset/manager.js';
|
|
8
|
+
import type { FeatureTypeHandler, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
|
|
9
9
|
import type { Store } from '../../store/store.js';
|
|
10
10
|
import type { BoundingBox, Feature, Layer } from '../../store/types.js';
|
|
11
11
|
import type { FeatureCompanionRegistry } from '../feature-companion.js';
|
|
@@ -55,7 +55,7 @@ import type { StoreRetainedCache } from './store-retained.js';
|
|
|
55
55
|
* of the ViewportFilter when omitted). A view across the antimeridian is drawn once per
|
|
56
56
|
* copy, each with its own range
|
|
57
57
|
*/
|
|
58
|
-
export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string,
|
|
58
|
+
export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, FeatureTypeHandler['renderer']>, customRendererContext: FrameDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayeredOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
|
|
59
59
|
/**
|
|
60
60
|
* The context of the custom renderers for one layer (the context of the frame with the opacity
|
|
61
61
|
* of the layer)
|
|
@@ -63,7 +63,7 @@ export declare function renderLayers(r: Renderers, store: Store, features: Featu
|
|
|
63
63
|
* The same object is returned when the opacity is already the one of the context, so a map whose
|
|
64
64
|
* layers are all opaque allocates nothing per layer.
|
|
65
65
|
*/
|
|
66
|
-
export declare function layerRendererContext(base:
|
|
66
|
+
export declare function layerRendererContext(base: FrameDrawContext, layer: Layer): FrameDrawContext;
|
|
67
67
|
/**
|
|
68
68
|
* The part of the view one rendering covers (one copy of the world)
|
|
69
69
|
*/
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
import { drawFeatureCompanionsInFrame } from '../feature-companion.js';
|
|
4
4
|
import { layerDrawFactors } from '../renderers/draw-factors.js';
|
|
5
|
+
import { customRendererOf } from './store-retained-classify.js';
|
|
5
6
|
/**
|
|
6
7
|
* Draw features and overlays layer by layer
|
|
7
8
|
*
|
|
@@ -131,20 +132,14 @@ export function renderLayers(r, store, features, selectedIdSet, defaultProjectio
|
|
|
131
132
|
// Companion drawing (feature companion): drawn right before the feature itself, that is,
|
|
132
133
|
// one z below it. If no provider at all is registered, not even has is called.
|
|
133
134
|
drawFeatureCompanionsInFrame(companions, feature, r.batchManager, defaultProjectionData, zoom, layer, layerContext, restoreBlendState);
|
|
134
|
-
const customRenderer = customRenderers
|
|
135
|
+
const customRenderer = customRendererOf(customRenderers, feature);
|
|
135
136
|
if (customRenderer) {
|
|
136
137
|
// To keep the draw order (painter's algorithm), the core batch that has accumulated is
|
|
137
138
|
// flushed first and only then the custom feature is drawn immediately.
|
|
138
139
|
// A batch is not painted until endFrame, so without flushing here a custom feature
|
|
139
140
|
// would ignore layer.order and be drawn before the core features of the same layer.
|
|
140
141
|
r.batchManager.endFrame();
|
|
141
|
-
customRenderer.draw(
|
|
142
|
-
id: feature.id,
|
|
143
|
-
type: feature.type,
|
|
144
|
-
coordinates: feature.coordinates,
|
|
145
|
-
properties: feature.properties,
|
|
146
|
-
style: feature.style,
|
|
147
|
-
}, defaultProjectionData, zoom, layerContext);
|
|
142
|
+
customRenderer.draw(feature, defaultProjectionData, zoom, layerContext);
|
|
148
143
|
// Re-establish the blend state that the external renderer may have rewritten.
|
|
149
144
|
restoreBlendState?.();
|
|
150
145
|
// Restart the batch for the core features that follow.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Lifecycle management of every renderer that CustomLayer uses
|
|
5
5
|
*/
|
|
6
6
|
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
7
|
-
import type {
|
|
7
|
+
import type { FeatureTypeHandler } from '../../extension/index.js';
|
|
8
8
|
import type { FeatureStyleConfig } from '../../shared/config/feature-style.js';
|
|
9
9
|
import type { RenderingConfig } from '../../shared/config/rendering.js';
|
|
10
10
|
import type { SelectionUIConfig } from '../../shared/config/selection.js';
|
|
@@ -63,7 +63,7 @@ export interface InitRenderersDeps {
|
|
|
63
63
|
featureStyle: FeatureStyleConfig;
|
|
64
64
|
selectionConfig: SelectionUIConfig;
|
|
65
65
|
renderingConfig: RenderingConfig;
|
|
66
|
-
customFeatureHandlers:
|
|
66
|
+
customFeatureHandlers: FeatureTypeHandler[] | undefined;
|
|
67
67
|
/** Injected rendering pixel ratio (when omitted, read from window every time) */
|
|
68
68
|
pixelRatio?: PixelRatioInput;
|
|
69
69
|
/** The state and the caches owned by the draw instance (never shared between instances) */
|
|
@@ -24,7 +24,7 @@ export function initRenderers(deps) {
|
|
|
24
24
|
const { gl, map: mapInstance, store, spatialIndex, featureStyle, selectionConfig, renderingConfig, customFeatureHandlers, pixelRatio, scope, onImageError, } = deps;
|
|
25
25
|
const textureCache = new TextureCache(gl);
|
|
26
26
|
const terrain = scope.terrain;
|
|
27
|
-
const quadShader = new QuadShader(gl
|
|
27
|
+
const quadShader = new QuadShader(gl).useTerrainState(terrain);
|
|
28
28
|
const imageRenderer = new ImageRenderer(mapInstance, gl, textureCache, quadShader, (fileId) => store.getFile(fileId), onImageError);
|
|
29
29
|
const strokeRenderer = new StrokeRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
30
30
|
const sdfLineRenderer = new SDFLineRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* docs/internals/rendering.md ("Slots and separators").
|
|
10
10
|
*/
|
|
11
11
|
import type { CustomLayerInterface, Map as MapLibreMap } from 'maplibre-gl';
|
|
12
|
-
import { type
|
|
12
|
+
import { type StackSlot } from './slots.js';
|
|
13
13
|
/** What the manager needs */
|
|
14
14
|
export interface SlotManagerDeps {
|
|
15
15
|
map: Pick<MapLibreMap, 'getLayer' | 'addLayer' | 'removeLayer'> & {
|
|
@@ -20,7 +20,7 @@ export interface SlotManagerDeps {
|
|
|
20
20
|
/** Predicate that identifies the separators (always false when omitted = a single slot) */
|
|
21
21
|
isExternalEntry?: (entryId: string) => boolean;
|
|
22
22
|
/** Where the changes of the slots and of the segments are notified */
|
|
23
|
-
onSlotsChange?: (slots:
|
|
23
|
+
onSlotsChange?: (slots: StackSlot[]) => void;
|
|
24
24
|
/** Creates the CustomLayer of the slot at `index` (index 1 onwards) */
|
|
25
25
|
createSlotLayer: (index: number) => CustomLayerInterface;
|
|
26
26
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { partitionLayerOrder,
|
|
3
|
+
import { partitionLayerOrder, sameSegments, slotLayerId, } from './slots.js';
|
|
4
4
|
/**
|
|
5
5
|
* The slots of one draw instance
|
|
6
6
|
*
|
|
@@ -77,9 +77,9 @@ export class SlotManager {
|
|
|
77
77
|
return this.added === 0;
|
|
78
78
|
}
|
|
79
79
|
/** The list of slots (public form) */
|
|
80
|
-
|
|
80
|
+
getStackSlots() {
|
|
81
81
|
return this.currentSegments.map((segment, index) => ({
|
|
82
|
-
layerId: this.slotLayers[index]?.id ??
|
|
82
|
+
layerId: this.slotLayers[index]?.id ?? slotLayerId(index),
|
|
83
83
|
from: segment.from,
|
|
84
84
|
to: segment.to,
|
|
85
85
|
}));
|
|
@@ -118,7 +118,7 @@ export class SlotManager {
|
|
|
118
118
|
map.removeLayer(slot.id);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
onSlotsChange?.(this.
|
|
121
|
+
onSlotsChange?.(this.getStackSlots());
|
|
122
122
|
map.triggerRepaint?.();
|
|
123
123
|
}
|
|
124
124
|
/** Whether the map has that layer (always false while the style is not loaded) */
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* a native layer can be placed in between our own rendering only once the slots are split per
|
|
9
9
|
* segment. The design is in docs/internals/rendering.md, "Slots and separators".
|
|
10
10
|
*/
|
|
11
|
-
export type {
|
|
11
|
+
export type { StackSlot } from '../../shared/types/events.js';
|
|
12
12
|
/** A segment ([from, to) in layerOrder) */
|
|
13
13
|
export interface RenderSegment {
|
|
14
14
|
readonly from: number;
|
|
@@ -17,7 +17,7 @@ export interface RenderSegment {
|
|
|
17
17
|
/** Layer id of the first slot (keeps the same id as the single layer used before) */
|
|
18
18
|
export declare const PRIMARY_RENDER_LAYER_ID = "maplibre-gl-draw-layer";
|
|
19
19
|
/** Layer id of the slot at `index` */
|
|
20
|
-
export declare function
|
|
20
|
+
export declare function slotLayerId(index: number): string;
|
|
21
21
|
/**
|
|
22
22
|
* Split the stacking order into segments at the separators
|
|
23
23
|
*
|
package/dist/view/layer/slots.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/** Layer id of the first slot (keeps the same id as the single layer used before) */
|
|
4
4
|
export const PRIMARY_RENDER_LAYER_ID = 'maplibre-gl-draw-layer';
|
|
5
5
|
/** Layer id of the slot at `index` */
|
|
6
|
-
export function
|
|
6
|
+
export function slotLayerId(index) {
|
|
7
7
|
return index === 0 ? PRIMARY_RENDER_LAYER_ID : `${PRIMARY_RENDER_LAYER_ID}:${index}`;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { circleBoundingBox } from '../../geometry/circle.js';
|
|
11
11
|
import { DEFAULT_TILE_SIZE } from '../../shared/math/index.js';
|
|
12
|
+
import { coordinatesOf } from '../../shared/utils/coordinates.js';
|
|
12
13
|
import { getCircleRadius } from '../../shared/utils/property.js';
|
|
13
14
|
import { getBoundingBox } from '../../store/spatial/index.js';
|
|
14
15
|
/**
|
|
@@ -170,7 +171,7 @@ export function computeFeaturesBBox(features, extensions) {
|
|
|
170
171
|
}
|
|
171
172
|
if (feature.type === 'Circle') {
|
|
172
173
|
const radiusMeters = getCircleRadius(feature);
|
|
173
|
-
const center = feature
|
|
174
|
+
const center = coordinatesOf(feature);
|
|
174
175
|
if (radiusMeters && radiusMeters > 0 && typeof center?.[0] === 'number') {
|
|
175
176
|
// The box of the geodesic circle, whose east and west extremes lie poleward of due
|
|
176
177
|
// east and west; it contains the polygon used for drawing (generateCirclePolygon).
|
|
@@ -182,7 +183,7 @@ export function computeFeaturesBBox(features, extensions) {
|
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
|
-
walkCoordinates(feature
|
|
186
|
+
walkCoordinates(coordinatesOf(feature), visit);
|
|
186
187
|
}
|
|
187
188
|
return found ? [minLng, minLat, maxLng, maxLat] : null;
|
|
188
189
|
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Classification of the Store features into runs
|
|
3
|
-
*
|
|
4
|
-
* A run is a sequence of features that the BatchManager of immediate mode would draw in one
|
|
5
|
-
* batch. Cutting the feature list where the kind changes keeps the z-order of retained mode
|
|
6
|
-
* identical to immediate mode.
|
|
7
|
-
*/
|
|
8
1
|
import type { Feature, Layer } from '../../store/types.js';
|
|
9
2
|
import type { FeatureCompanionRegistry } from '../feature-companion.js';
|
|
10
3
|
import { type PointShape } from '../renderers/point/point-instance.js';
|
|
@@ -16,6 +9,11 @@ import type { RetainedStyleResolver } from '../renderers/retained.js';
|
|
|
16
9
|
* batch kind and the point shape). A position where the kind changes becomes a run boundary.
|
|
17
10
|
*/
|
|
18
11
|
export type RunKind = 'polygon' | 'line' | `point-${PointShape}` | 'immediate';
|
|
12
|
+
/**
|
|
13
|
+
* The custom renderer that draws a feature: the one registered for its type, unless it
|
|
14
|
+
* refuses the feature, which the built-in drawing of the type then draws
|
|
15
|
+
*/
|
|
16
|
+
export declare function customRendererOf<R>(customTypes: ReadonlyMap<string, R>, feature: Feature): R | undefined;
|
|
19
17
|
/**
|
|
20
18
|
* Classifies a feature into the kind of its run
|
|
21
19
|
*
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { coordinatesOf } from '../../shared/utils/coordinates.js';
|
|
3
4
|
import { toInstancedPointShape } from '../renderers/point/point-instance.js';
|
|
5
|
+
/**
|
|
6
|
+
* The custom renderer that draws a feature: the one registered for its type, unless it
|
|
7
|
+
* refuses the feature, which the built-in drawing of the type then draws
|
|
8
|
+
*/
|
|
9
|
+
export function customRendererOf(customTypes, feature) {
|
|
10
|
+
const renderer = customTypes.get(feature.type);
|
|
11
|
+
if (renderer === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
const { appliesTo } = renderer;
|
|
14
|
+
return appliesTo && !appliesTo.call(renderer, feature) ? undefined : renderer;
|
|
15
|
+
}
|
|
4
16
|
/**
|
|
5
17
|
* Classifies a feature into the kind of its run
|
|
6
18
|
*
|
|
@@ -13,7 +25,7 @@ import { toInstancedPointShape } from '../renderers/point/point-instance.js';
|
|
|
13
25
|
*/
|
|
14
26
|
export function classifyFeature(feature, styles, customTypes, companions, layer) {
|
|
15
27
|
// A custom type is drawn immediately (it cannot go on a core batch)
|
|
16
|
-
if (customTypes
|
|
28
|
+
if (customRendererOf(customTypes, feature))
|
|
17
29
|
return 'immediate';
|
|
18
30
|
// A feature that has a companion (feature companion) needs a hook right before it, so it cannot
|
|
19
31
|
// go on a retained batch. It is split out into an immediate chunk and drawn one at a time (on
|
|
@@ -59,29 +71,29 @@ export function featureOrigin(feature) {
|
|
|
59
71
|
return [0, 0];
|
|
60
72
|
switch (feature.type) {
|
|
61
73
|
case 'MultiPoint': {
|
|
62
|
-
const coord = feature
|
|
74
|
+
const coord = coordinatesOf(feature)[0];
|
|
63
75
|
return coord ? [coord[0], coord[1]] : [0, 0];
|
|
64
76
|
}
|
|
65
77
|
case 'LineString':
|
|
66
78
|
case 'Freehand': {
|
|
67
|
-
const coord = feature
|
|
79
|
+
const coord = coordinatesOf(feature)[0];
|
|
68
80
|
return coord ? [coord[0], coord[1]] : [0, 0];
|
|
69
81
|
}
|
|
70
82
|
case 'MultiLineString': {
|
|
71
|
-
const coord = feature
|
|
83
|
+
const coord = coordinatesOf(feature)[0]?.[0];
|
|
72
84
|
return coord ? [coord[0], coord[1]] : [0, 0];
|
|
73
85
|
}
|
|
74
86
|
case 'Polygon': {
|
|
75
|
-
const coord = feature
|
|
87
|
+
const coord = coordinatesOf(feature)[0]?.[0];
|
|
76
88
|
return coord ? [coord[0], coord[1]] : [0, 0];
|
|
77
89
|
}
|
|
78
90
|
case 'MultiPolygon': {
|
|
79
|
-
const coord = feature
|
|
91
|
+
const coord = coordinatesOf(feature)[0]?.[0]?.[0];
|
|
80
92
|
return coord ? [coord[0], coord[1]] : [0, 0];
|
|
81
93
|
}
|
|
82
94
|
default: {
|
|
83
95
|
// A single coordinate, such as Point / Circle
|
|
84
|
-
const coord = feature
|
|
96
|
+
const coord = coordinatesOf(feature);
|
|
85
97
|
return Array.isArray(coord) && typeof coord[0] === 'number' ? [coord[0], coord[1]] : [0, 0];
|
|
86
98
|
}
|
|
87
99
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* and the result is baked into the vertex or instance data of the batch.
|
|
8
8
|
*/
|
|
9
9
|
import { generateCirclePolygon } from '../../shared/math/index.js';
|
|
10
|
+
import { coordinatesOf } from '../../shared/utils/coordinates.js';
|
|
10
11
|
import { getCircleRadius, getCreatedZoom } from '../../shared/utils/property.js';
|
|
11
12
|
import { toLineBatchItem, toPointInstanceData } from '../renderers/batch-manager.js';
|
|
12
13
|
/**
|
|
@@ -37,11 +38,11 @@ export function collectLineItems(features, styles, layer) {
|
|
|
37
38
|
items.push(item);
|
|
38
39
|
};
|
|
39
40
|
if (feature.type === 'MultiLineString') {
|
|
40
|
-
for (const part of feature
|
|
41
|
+
for (const part of coordinatesOf(feature))
|
|
41
42
|
push(part);
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
44
|
-
push(feature
|
|
45
|
+
push(coordinatesOf(feature));
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
return items;
|
|
@@ -85,7 +86,7 @@ export function collectPolygons(features, styles, layer) {
|
|
|
85
86
|
});
|
|
86
87
|
};
|
|
87
88
|
if (feature.type === 'MultiPolygon') {
|
|
88
|
-
const parts = feature
|
|
89
|
+
const parts = coordinatesOf(feature);
|
|
89
90
|
for (let i = 0; i < parts.length; i++)
|
|
90
91
|
push(parts[i], i);
|
|
91
92
|
}
|
|
@@ -93,10 +94,10 @@ export function collectPolygons(features, styles, layer) {
|
|
|
93
94
|
const radiusMeters = getCircleRadius(feature);
|
|
94
95
|
if (!radiusMeters || radiusMeters <= 0)
|
|
95
96
|
continue;
|
|
96
|
-
push([generateCirclePolygon(feature
|
|
97
|
+
push([generateCirclePolygon(coordinatesOf(feature), radiusMeters)], 0);
|
|
97
98
|
}
|
|
98
99
|
else {
|
|
99
|
-
push(feature
|
|
100
|
+
push(coordinatesOf(feature), 0);
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
return polygons;
|
|
@@ -109,12 +110,12 @@ export function collectPoints(features, styles, layer) {
|
|
|
109
110
|
for (const feature of features) {
|
|
110
111
|
const style = styles.getPointStyle(feature, layer);
|
|
111
112
|
if (feature.type === 'MultiPoint') {
|
|
112
|
-
for (const coord of feature
|
|
113
|
+
for (const coord of coordinatesOf(feature)) {
|
|
113
114
|
points.push(toPointInstanceData(coord, style));
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
else {
|
|
117
|
-
points.push(toPointInstanceData(feature
|
|
118
|
+
points.push(toPointInstanceData(coordinatesOf(feature), style));
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
return points;
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Incremental update of the coordinate texture of a retained line chunk
|
|
3
|
-
*
|
|
4
|
-
* A vertex drag moves only a few vertices. Rebuilding a line chunk with many vertices every frame
|
|
5
|
-
* would overflow the frame, so the diff of the vertices that moved is queued on the chunk and,
|
|
6
|
-
* right before drawing, only the corresponding texels of the coordinate texture are rewritten
|
|
7
|
-
* (see SDFLineRenderer.patchRetainedBatchCoords).
|
|
8
|
-
*/
|
|
9
1
|
import type { Coordinate, Feature } from '../../store/types.js';
|
|
10
2
|
import type { RetainedLineBatch } from '../renderers/line/line-types.js';
|
|
11
3
|
import type { SDFLineRenderer } from '../renderers/line/sdf-line.js';
|