@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,336 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* PolygonBatchRenderer
|
|
5
|
+
*
|
|
6
|
+
* A renderer that draws multiple polygon fills in a single draw call.
|
|
7
|
+
* By using per-vertex color, polygons of different colors can also be drawn in one go.
|
|
8
|
+
* The draw order is preserved by the order in which the vertices are laid out.
|
|
9
|
+
*/
|
|
10
|
+
import earcut from 'earcut';
|
|
11
|
+
import { EarcutCache } from '../../cache/earcut.js';
|
|
12
|
+
import { getSurfaceTessellationStep, tessellateSurfaceFill } from '../../globe-subdivision.js';
|
|
13
|
+
import { calculateLngLatOffset, createProgram, getProjectionTransitionUniform, OFFSET_MODE_GLSL, } from '../../shaders/helpers.js';
|
|
14
|
+
import { ProjectionUniformManager } from '../../shaders/projection.js';
|
|
15
|
+
import { TERRAIN_SHADE_FRAGMENT_GLSL, TERRAIN_SHADE_VERTEX_GLSL, } from '../../shaders/terrain-shade.js';
|
|
16
|
+
import { TerrainContext } from '../../terrain/context.js';
|
|
17
|
+
import { TERRAIN_MAX_TILED_COARSEN } from '../../terrain/metrics.js';
|
|
18
|
+
import { batchTessellationFactor, ringBoundingCells } from '../../terrain/polygon.js';
|
|
19
|
+
import { reportTerrainCoarsening } from '../../terrain/state.js';
|
|
20
|
+
import { buildEarcutInput } from './earcut-input.js';
|
|
21
|
+
import { drawFillWithTerrainCull } from './terrain-cull.js';
|
|
22
|
+
/** @internal */
|
|
23
|
+
export class PolygonBatchRenderer {
|
|
24
|
+
constructor(gl, scope = {}) {
|
|
25
|
+
Object.defineProperty(this, "gl", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
/** The terrain state of the draw instance */
|
|
32
|
+
Object.defineProperty(this, "terrain", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: void 0
|
|
37
|
+
});
|
|
38
|
+
/** Triangulation results of the draw instance, keyed by feature id */
|
|
39
|
+
Object.defineProperty(this, "earcutCache", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: void 0
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "program", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: null
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(this, "variantName", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: ''
|
|
56
|
+
});
|
|
57
|
+
// Projection uniform management
|
|
58
|
+
Object.defineProperty(this, "projectionUniformManager", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true,
|
|
62
|
+
value: void 0
|
|
63
|
+
});
|
|
64
|
+
// Stores the offset uniforms
|
|
65
|
+
Object.defineProperty(this, "offsetUniforms", {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: null
|
|
70
|
+
});
|
|
71
|
+
// Buffers for the batch
|
|
72
|
+
Object.defineProperty(this, "vertexBuffer", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
configurable: true,
|
|
75
|
+
writable: true,
|
|
76
|
+
value: null
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(this, "indexBuffer", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
configurable: true,
|
|
81
|
+
writable: true,
|
|
82
|
+
value: null
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(this, "vao", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
configurable: true,
|
|
87
|
+
writable: true,
|
|
88
|
+
value: null
|
|
89
|
+
});
|
|
90
|
+
this.gl = gl;
|
|
91
|
+
this.terrain = scope.terrain ?? new TerrainContext();
|
|
92
|
+
this.earcutCache = scope.earcut ?? new EarcutCache();
|
|
93
|
+
this.projectionUniformManager = new ProjectionUniformManager(gl, {
|
|
94
|
+
surface: true,
|
|
95
|
+
terrain: this.terrain,
|
|
96
|
+
});
|
|
97
|
+
this.vertexBuffer = gl.createBuffer();
|
|
98
|
+
this.indexBuffer = gl.createBuffer();
|
|
99
|
+
this.vao = gl.createVertexArray();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Ensures the shader (recreating it when necessary)
|
|
103
|
+
*/
|
|
104
|
+
ensureShader(shaderData) {
|
|
105
|
+
if (this.variantName !== shaderData.variantName) {
|
|
106
|
+
if (this.program) {
|
|
107
|
+
this.gl.deleteProgram(this.program);
|
|
108
|
+
}
|
|
109
|
+
this.program = this.createShaderProgram(shaderData.vertexShaderPrelude, shaderData.define);
|
|
110
|
+
this.variantName = shaderData.variantName;
|
|
111
|
+
// Get the projection uniform locations
|
|
112
|
+
this.projectionUniformManager.getLocations(this.program);
|
|
113
|
+
// Set up the VAO
|
|
114
|
+
this.setupVAO();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Sets the uniforms for offset mode
|
|
119
|
+
*/
|
|
120
|
+
setOffsetUniforms(uniforms) {
|
|
121
|
+
this.offsetUniforms = uniforms;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Creates the shader program (supporting per-vertex color, offset mode)
|
|
125
|
+
*/
|
|
126
|
+
createShaderProgram(prelude, define) {
|
|
127
|
+
const projTransitionUniform = getProjectionTransitionUniform(prelude);
|
|
128
|
+
const vertexSource = `#version 300 es
|
|
129
|
+
${prelude}
|
|
130
|
+
${define}
|
|
131
|
+
${projTransitionUniform}${OFFSET_MODE_GLSL}${TERRAIN_SHADE_VERTEX_GLSL}
|
|
132
|
+
layout(location = 0) in vec2 a_pos; // relative coords (64-bit precision on the CPU)
|
|
133
|
+
layout(location = 1) in vec4 a_color; // per-vertex color
|
|
134
|
+
|
|
135
|
+
out vec4 v_color;
|
|
136
|
+
|
|
137
|
+
void main() {
|
|
138
|
+
// High precision version: uses relative coords computed at 64-bit precision on the CPU
|
|
139
|
+
gl_Position = project_position_to_clipspace_from_offset(a_pos, u_projection_matrix);
|
|
140
|
+
v_color = a_color;
|
|
141
|
+
emitShadeOffset(a_pos);
|
|
142
|
+
}`;
|
|
143
|
+
// The fill gets the same terrain shading as the ground (factor 1.0 when there is no terrain)
|
|
144
|
+
const fragmentSource = `#version 300 es
|
|
145
|
+
precision highp float;
|
|
146
|
+
|
|
147
|
+
in vec4 v_color;
|
|
148
|
+
out vec4 fragColor;
|
|
149
|
+
${TERRAIN_SHADE_FRAGMENT_GLSL}
|
|
150
|
+
void main() {
|
|
151
|
+
fragColor = vec4(v_color.rgb * terrainFillShade(), v_color.a);
|
|
152
|
+
}`;
|
|
153
|
+
return createProgram(this.gl, vertexSource, fragmentSource);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Sets up the VAO
|
|
157
|
+
*/
|
|
158
|
+
setupVAO() {
|
|
159
|
+
const gl = this.gl;
|
|
160
|
+
gl.bindVertexArray(this.vao);
|
|
161
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
162
|
+
// stride: pos(2) + color(4) = 6 floats = 24 bytes
|
|
163
|
+
const stride = 24;
|
|
164
|
+
// a_pos: location 0
|
|
165
|
+
gl.enableVertexAttribArray(0);
|
|
166
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, stride, 0);
|
|
167
|
+
// a_color: location 1
|
|
168
|
+
gl.enableVertexAttribArray(1);
|
|
169
|
+
gl.vertexAttribPointer(1, 4, gl.FLOAT, false, stride, 8);
|
|
170
|
+
// The ELEMENT_ARRAY_BUFFER binding is part of the VAO state
|
|
171
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
|
|
172
|
+
gl.bindVertexArray(null);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Sets the projection uniforms (supporting offset mode + globe mode)
|
|
176
|
+
* @param projectionData MapLibre's ProjectionData
|
|
177
|
+
* @param zoom The current zoom level (used for switching offset mode)
|
|
178
|
+
*/
|
|
179
|
+
setProjectionUniforms(projectionData, zoom) {
|
|
180
|
+
this.projectionUniformManager.setUniforms(projectionData, zoom, this.offsetUniforms);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Batch-draws multiple polygon fills
|
|
184
|
+
*
|
|
185
|
+
* @param polygons The array of polygon data (in draw order)
|
|
186
|
+
* @param projectionData MapLibre's ProjectionData
|
|
187
|
+
* @param zoom The current zoom level
|
|
188
|
+
* @returns The number of indices drawn (for debugging)
|
|
189
|
+
*/
|
|
190
|
+
drawBatch(polygons, projectionData, zoom) {
|
|
191
|
+
if (!this.program || polygons.length === 0)
|
|
192
|
+
return 0;
|
|
193
|
+
const gl = this.gl;
|
|
194
|
+
// Compute relative coordinates on the CPU side (offset mode: computed at 64-bit precision)
|
|
195
|
+
const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
|
|
196
|
+
const { vertexData, indexData } = this.buildGeometry(polygons, centerLngLat);
|
|
197
|
+
if (indexData.length === 0)
|
|
198
|
+
return 0;
|
|
199
|
+
// Transfer the vertex data
|
|
200
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
201
|
+
gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.DYNAMIC_DRAW);
|
|
202
|
+
// Draw
|
|
203
|
+
gl.useProgram(this.program);
|
|
204
|
+
this.setProjectionUniforms(projectionData, zoom);
|
|
205
|
+
gl.bindVertexArray(this.vao);
|
|
206
|
+
// The ELEMENT_ARRAY_BUFFER binding is VAO state, so the transfer is done after
|
|
207
|
+
// binding the VAO
|
|
208
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexData, gl.DYNAMIC_DRAW);
|
|
209
|
+
drawFillWithTerrainCull(gl, this.terrain, () => {
|
|
210
|
+
gl.drawElements(gl.TRIANGLES, indexData.length, gl.UNSIGNED_INT, 0);
|
|
211
|
+
});
|
|
212
|
+
gl.bindVertexArray(null);
|
|
213
|
+
return indexData.length;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Builds the vertex array and index array of the batch
|
|
217
|
+
*
|
|
218
|
+
* The indices are laid out in the order of the input polygons, so the draw order
|
|
219
|
+
* (z-order) is preserved.
|
|
220
|
+
*/
|
|
221
|
+
buildGeometry(polygons, centerLngLat) {
|
|
222
|
+
// Pass 1: collect the triangulation results and count the required array lengths
|
|
223
|
+
const records = [];
|
|
224
|
+
let totalPoints = 0;
|
|
225
|
+
let totalIndices = 0;
|
|
226
|
+
// Subdivide on a grid only while terrain is active or the globe is drawn (on a flat map
|
|
227
|
+
// without terrain it passes through as null)
|
|
228
|
+
// The step is decided from the total across all features (the same criterion as
|
|
229
|
+
// sdf-polygon)
|
|
230
|
+
const terrainStep = getSurfaceTessellationStep(this.terrain, 'fill');
|
|
231
|
+
let batchFactor = 1;
|
|
232
|
+
if (terrainStep) {
|
|
233
|
+
let totalCells = 0;
|
|
234
|
+
for (const polygon of polygons) {
|
|
235
|
+
const outer = polygon.coordinates[0];
|
|
236
|
+
if (outer)
|
|
237
|
+
totalCells += ringBoundingCells(outer, terrainStep.grid, terrainStep.region);
|
|
238
|
+
}
|
|
239
|
+
batchFactor = batchTessellationFactor(totalCells);
|
|
240
|
+
reportTerrainCoarsening(this.terrain, batchFactor);
|
|
241
|
+
}
|
|
242
|
+
for (const polygon of polygons) {
|
|
243
|
+
// Flatten all rings to build the earcut input (inner rings are treated as holes)
|
|
244
|
+
const { flatCoords, holeIndices, rings } = buildEarcutInput(polygon.coordinates);
|
|
245
|
+
if (rings.length === 0)
|
|
246
|
+
continue;
|
|
247
|
+
// Triangulate with earcut (making use of the cache)
|
|
248
|
+
let indices;
|
|
249
|
+
if (polygon.featureId) {
|
|
250
|
+
// Try to get it from the cache
|
|
251
|
+
const partIndex = polygon.partIndex ?? 0;
|
|
252
|
+
const cached = this.earcutCache.get(polygon.featureId, partIndex);
|
|
253
|
+
if (cached) {
|
|
254
|
+
indices = cached;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
indices = earcut(flatCoords, holeIndices);
|
|
258
|
+
this.earcutCache.set(polygon.featureId, indices, partIndex);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// When there is no featureId, run it without the cache
|
|
263
|
+
indices = earcut(flatCoords, holeIndices);
|
|
264
|
+
}
|
|
265
|
+
if (indices.length === 0)
|
|
266
|
+
continue;
|
|
267
|
+
const tessellated = terrainStep
|
|
268
|
+
? tessellateSurfaceFill(this.terrain, polygon.featureId, polygon.partIndex ?? 0, flatCoords, indices, {
|
|
269
|
+
// While aligned to the actual tile mesh, do not move the step and pass only
|
|
270
|
+
// the coarsening factor (so it keeps riding on a subset of the mesh nodes)
|
|
271
|
+
grid: terrainStep.tiling ? terrainStep.grid : terrainStep.grid * batchFactor,
|
|
272
|
+
maxPoints: terrainStep.maxPoints,
|
|
273
|
+
region: terrainStep.region,
|
|
274
|
+
tiling: terrainStep.tiling,
|
|
275
|
+
coarsen: terrainStep.tiling
|
|
276
|
+
? Math.min(batchFactor, TERRAIN_MAX_TILED_COARSEN)
|
|
277
|
+
: undefined,
|
|
278
|
+
})
|
|
279
|
+
: { flatCoords, indices };
|
|
280
|
+
records.push({
|
|
281
|
+
flatCoords: tessellated.flatCoords,
|
|
282
|
+
indices: tessellated.indices,
|
|
283
|
+
color: polygon.color,
|
|
284
|
+
});
|
|
285
|
+
totalPoints += tessellated.flatCoords.length / 2;
|
|
286
|
+
totalIndices += tessellated.indices.length;
|
|
287
|
+
}
|
|
288
|
+
// Pass 2: write directly into the typed arrays
|
|
289
|
+
const vertexData = new Float32Array(totalPoints * 6);
|
|
290
|
+
const indexData = new Uint32Array(totalIndices);
|
|
291
|
+
let base = 0;
|
|
292
|
+
let indexOffset = 0;
|
|
293
|
+
for (const { flatCoords, indices, color } of records) {
|
|
294
|
+
const pointCount = flatCoords.length / 2;
|
|
295
|
+
for (let i = 0; i < pointCount; i++) {
|
|
296
|
+
// Compute the offset from the center at 64-bit precision
|
|
297
|
+
const offset = calculateLngLatOffset([flatCoords[i * 2], flatCoords[i * 2 + 1]], centerLngLat);
|
|
298
|
+
const at = (base + i) * 6;
|
|
299
|
+
vertexData[at] = offset[0];
|
|
300
|
+
vertexData[at + 1] = offset[1];
|
|
301
|
+
vertexData[at + 2] = color[0];
|
|
302
|
+
vertexData[at + 3] = color[1];
|
|
303
|
+
vertexData[at + 4] = color[2];
|
|
304
|
+
vertexData[at + 5] = color[3];
|
|
305
|
+
}
|
|
306
|
+
for (let i = 0; i < indices.length; i++) {
|
|
307
|
+
indexData[indexOffset + i] = indices[i] + base;
|
|
308
|
+
}
|
|
309
|
+
base += pointCount;
|
|
310
|
+
indexOffset += indices.length;
|
|
311
|
+
}
|
|
312
|
+
return { vertexData, indexData };
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Disposes of the resources
|
|
316
|
+
*/
|
|
317
|
+
dispose() {
|
|
318
|
+
const gl = this.gl;
|
|
319
|
+
if (this.program) {
|
|
320
|
+
gl.deleteProgram(this.program);
|
|
321
|
+
this.program = null;
|
|
322
|
+
}
|
|
323
|
+
if (this.vertexBuffer) {
|
|
324
|
+
gl.deleteBuffer(this.vertexBuffer);
|
|
325
|
+
this.vertexBuffer = null;
|
|
326
|
+
}
|
|
327
|
+
if (this.indexBuffer) {
|
|
328
|
+
gl.deleteBuffer(this.indexBuffer);
|
|
329
|
+
this.indexBuffer = null;
|
|
330
|
+
}
|
|
331
|
+
if (this.vao) {
|
|
332
|
+
gl.deleteVertexArray(this.vao);
|
|
333
|
+
this.vao = null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Building the earcut input
|
|
3
|
+
*
|
|
4
|
+
* Provides a pure function that converts a polygon with holes (an array of rings)
|
|
5
|
+
* into the "flattened coordinate sequence + start indices of the inner rings" that
|
|
6
|
+
* earcut requires. Following the coordinate format convention, rings[0] is the outer
|
|
7
|
+
* ring and rings[1..] are the inner rings.
|
|
8
|
+
*/
|
|
9
|
+
import type { Coordinate } from '../../../store/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* The input to earcut
|
|
12
|
+
*/
|
|
13
|
+
export interface EarcutInput {
|
|
14
|
+
/** Coordinate sequence flattened over all rings ([lng, lat, lng, lat, ...]) */
|
|
15
|
+
flatCoords: number[];
|
|
16
|
+
/** Start vertex indices of the inner rings (earcut's holeIndices) */
|
|
17
|
+
holeIndices: number[];
|
|
18
|
+
/**
|
|
19
|
+
* Array of rings with the closing point removed (rings[0] is the outer ring,
|
|
20
|
+
* rings[1..] are the inner rings)
|
|
21
|
+
*
|
|
22
|
+
* Rings that have no area have already been excluded, so it can also be used for
|
|
23
|
+
* drawing the outline (stroke).
|
|
24
|
+
*/
|
|
25
|
+
rings: Coordinate[][];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the earcut input from an array of rings
|
|
29
|
+
*
|
|
30
|
+
* - The closing point of each ring is removed
|
|
31
|
+
* - A ring with fewer than 3 vertices has no area, so it is ignored
|
|
32
|
+
* - If the outer ring is invalid, an empty input is returned (the caller skips drawing)
|
|
33
|
+
*
|
|
34
|
+
* @param rings Array of rings (rings[0] is the outer ring, rings[1..] are the inner rings)
|
|
35
|
+
* @returns The flattened coordinate sequence and the start indices of the inner rings
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildEarcutInput(rings: Coordinate[][]): EarcutInput;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Removes the closing point at the end of a ring (the same coordinate as the first)
|
|
5
|
+
*
|
|
6
|
+
* Neither earcut nor outline drawing needs the closing point, so it is normalized at
|
|
7
|
+
* the entrance.
|
|
8
|
+
*/
|
|
9
|
+
function openRing(ring) {
|
|
10
|
+
if (ring.length < 2)
|
|
11
|
+
return ring;
|
|
12
|
+
const first = ring[0];
|
|
13
|
+
const last = ring[ring.length - 1];
|
|
14
|
+
if (first[0] === last[0] && first[1] === last[1]) {
|
|
15
|
+
return ring.slice(0, -1);
|
|
16
|
+
}
|
|
17
|
+
return ring;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Builds the earcut input from an array of rings
|
|
21
|
+
*
|
|
22
|
+
* - The closing point of each ring is removed
|
|
23
|
+
* - A ring with fewer than 3 vertices has no area, so it is ignored
|
|
24
|
+
* - If the outer ring is invalid, an empty input is returned (the caller skips drawing)
|
|
25
|
+
*
|
|
26
|
+
* @param rings Array of rings (rings[0] is the outer ring, rings[1..] are the inner rings)
|
|
27
|
+
* @returns The flattened coordinate sequence and the start indices of the inner rings
|
|
28
|
+
*/
|
|
29
|
+
export function buildEarcutInput(rings) {
|
|
30
|
+
if (rings.length === 0) {
|
|
31
|
+
return { flatCoords: [], holeIndices: [], rings: [] };
|
|
32
|
+
}
|
|
33
|
+
const outerRing = openRing(rings[0]);
|
|
34
|
+
if (outerRing.length < 3) {
|
|
35
|
+
return { flatCoords: [], holeIndices: [], rings: [] };
|
|
36
|
+
}
|
|
37
|
+
const flatCoords = [];
|
|
38
|
+
const holeIndices = [];
|
|
39
|
+
const openRings = [outerRing];
|
|
40
|
+
for (const [lng, lat] of outerRing) {
|
|
41
|
+
flatCoords.push(lng, lat);
|
|
42
|
+
}
|
|
43
|
+
for (let i = 1; i < rings.length; i++) {
|
|
44
|
+
const holeRing = openRing(rings[i]);
|
|
45
|
+
if (holeRing.length < 3)
|
|
46
|
+
continue;
|
|
47
|
+
// Start vertex index of the inner ring (coordinate count = flatCoords.length / 2)
|
|
48
|
+
holeIndices.push(flatCoords.length / 2);
|
|
49
|
+
for (const [lng, lat] of holeRing) {
|
|
50
|
+
flatCoords.push(lng, lat);
|
|
51
|
+
}
|
|
52
|
+
openRings.push(holeRing);
|
|
53
|
+
}
|
|
54
|
+
return { flatCoords, holeIndices, rings: openRings };
|
|
55
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The number of ear clipping loop iterations run in a single step
|
|
3
|
+
*
|
|
4
|
+
* The caller checks the clock at this granularity, so this determines "how far the
|
|
5
|
+
* budget can be overrun". The measurements on a million-vertex water body are as
|
|
6
|
+
* follows.
|
|
7
|
+
*
|
|
8
|
+
* | slice | average per step | p99 | max | total CPU of the triangulation |
|
|
9
|
+
* | --- | --- | --- | --- | --- |
|
|
10
|
+
* | 16 | 0.14ms | 5.1ms | 23ms | 15.0s |
|
|
11
|
+
* | 32 | 0.28ms | 10.3ms | 35ms | 15.3s |
|
|
12
|
+
* | 64 | 0.52ms | 19.5ms | 55ms | 14.2s |
|
|
13
|
+
*
|
|
14
|
+
* Since the total hardly changes even when the slice is made finer (the cost of slicing
|
|
15
|
+
* is negligible), 16 is adopted because it keeps within the budget. A long step appears
|
|
16
|
+
* rarely because the recovery performed when no more ears can be found (the full sweep
|
|
17
|
+
* of filterPoints) runs within a single iteration.
|
|
18
|
+
*/
|
|
19
|
+
export declare const EARCUT_SLICE_ITERATIONS = 16;
|
|
20
|
+
/**
|
|
21
|
+
* Time-sliceable earcut
|
|
22
|
+
*
|
|
23
|
+
* If `step()` is called repeatedly until completion (true), `triangles` ends up holding
|
|
24
|
+
* the same index sequence as the `earcut(data, holeIndices, dim)` dependency.
|
|
25
|
+
*/
|
|
26
|
+
export declare class SlicedEarcut {
|
|
27
|
+
private readonly data;
|
|
28
|
+
private readonly holeIndices;
|
|
29
|
+
private readonly dim;
|
|
30
|
+
/** The triangulation result (partial progress until it finishes) */
|
|
31
|
+
readonly triangles: number[];
|
|
32
|
+
private phase;
|
|
33
|
+
private ear;
|
|
34
|
+
private stop;
|
|
35
|
+
private cured;
|
|
36
|
+
private minX;
|
|
37
|
+
private minY;
|
|
38
|
+
private invSize;
|
|
39
|
+
/** The steiner points of this job (swapped into the module variable at step's entrance) */
|
|
40
|
+
private readonly ownSteiners;
|
|
41
|
+
/** The filteredOut of this job (same as above) */
|
|
42
|
+
private ownFilteredOut;
|
|
43
|
+
constructor(data: ArrayLike<number>, holeIndices?: ArrayLike<number> | null, dim?: number);
|
|
44
|
+
/** Whether it has finished */
|
|
45
|
+
get done(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Advances the triangulation a little
|
|
48
|
+
*
|
|
49
|
+
* @param iterations The upper bound on ear clipping loop iterations (the default slice
|
|
50
|
+
* when omitted)
|
|
51
|
+
* @returns true once it has finished
|
|
52
|
+
*/
|
|
53
|
+
step(iterations?: number): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Preprocessing (building the linked list, bridging the holes, bbox, z-order indexing)
|
|
56
|
+
*
|
|
57
|
+
* This part is not sliced. It takes only tens of milliseconds even at a million
|
|
58
|
+
* vertices, so fidelity to the port is preferred over the value of slicing it.
|
|
59
|
+
*/
|
|
60
|
+
private runSetup;
|
|
61
|
+
/**
|
|
62
|
+
* The main ear clipping loop (identical to upstream's earcutLinked; breaks out on the
|
|
63
|
+
* iteration count)
|
|
64
|
+
*
|
|
65
|
+
* splitEarcut, the last resort, is recursive, so it is not sliced (it is a path that
|
|
66
|
+
* runs only once against the remaining polygon and is not taken for ordinary inputs).
|
|
67
|
+
*/
|
|
68
|
+
private runClip;
|
|
69
|
+
}
|