@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,898 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { generateCirclePolygon } from '../shared/math/index.js';
|
|
4
|
+
import { getCircleRadius, getCreatedZoom } from '../shared/utils/property.js';
|
|
5
|
+
import { toLineBatchItem, toPointInstanceData } from '../view/renderers/batch-manager.js';
|
|
6
|
+
import { NEUTRAL_DRAW_FACTORS } from '../view/renderers/draw-factors.js';
|
|
7
|
+
import { PACKED_POINT_STYLE_STRIDE, toInstancedPointShape, } from '../view/renderers/point/point-instance.js';
|
|
8
|
+
/**
|
|
9
|
+
* Base zoom of the line width (for the features without createdZoom)
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
*
|
|
13
|
+
* Baking in the zoom at build time would change the line width when the zoom changes. Fixing
|
|
14
|
+
* createdZoom at 0 and passing 0 to u_zoom at draw time makes `2^(zoom - createdZoom) = 1`, that
|
|
15
|
+
* is, the line width on screen stays constant. This looks the same as immediate mode (which puts
|
|
16
|
+
* the current zoom into createdZoom every frame).
|
|
17
|
+
*/
|
|
18
|
+
export const FIXED_WIDTH_ZOOM = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Points packed into growing typed arrays (one shape)
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export class PackedPointsBuilder {
|
|
25
|
+
constructor() {
|
|
26
|
+
Object.defineProperty(this, "size", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: 0
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(this, "lngLat", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: new Float64Array(128)
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(this, "style", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: new Float64Array(64 * PACKED_POINT_STYLE_STRIDE)
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** The number of points pushed */
|
|
46
|
+
get count() {
|
|
47
|
+
return this.size;
|
|
48
|
+
}
|
|
49
|
+
/** Pushes a point with its packed style (`toPackedPointStyle`) */
|
|
50
|
+
push(lng, lat, style) {
|
|
51
|
+
const i = this.size;
|
|
52
|
+
if ((i + 1) * 2 > this.lngLat.length) {
|
|
53
|
+
this.lngLat = grow(this.lngLat, (i + 1) * 2);
|
|
54
|
+
this.style = grow(this.style, (i + 1) * PACKED_POINT_STYLE_STRIDE);
|
|
55
|
+
}
|
|
56
|
+
this.lngLat[i * 2] = lng;
|
|
57
|
+
this.lngLat[i * 2 + 1] = lat;
|
|
58
|
+
this.style.set(style, i * PACKED_POINT_STYLE_STRIDE);
|
|
59
|
+
this.size = i + 1;
|
|
60
|
+
}
|
|
61
|
+
/** The points pushed so far */
|
|
62
|
+
view() {
|
|
63
|
+
return { count: this.size, lngLat: this.lngLat, style: this.style };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Lines packed into growing typed arrays; the coordinates stay in the buffer they come from
|
|
68
|
+
*
|
|
69
|
+
* While every line comes from one buffer, the lines are read from it without a copy. When a line
|
|
70
|
+
* comes from another buffer (a table whose rows are read from geometry columns of several types),
|
|
71
|
+
* the coordinates of the lines pushed so far and of every later line are copied into a buffer of
|
|
72
|
+
* the builder, in the same order, so the lines read the same values.
|
|
73
|
+
*
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
export class PackedLinesBuilder {
|
|
77
|
+
constructor() {
|
|
78
|
+
Object.defineProperty(this, "size", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
configurable: true,
|
|
81
|
+
writable: true,
|
|
82
|
+
value: 0
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(this, "start", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
configurable: true,
|
|
87
|
+
writable: true,
|
|
88
|
+
value: new Int32Array(64)
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(this, "end", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
configurable: true,
|
|
93
|
+
writable: true,
|
|
94
|
+
value: new Int32Array(64)
|
|
95
|
+
});
|
|
96
|
+
Object.defineProperty(this, "strokeWidth", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
configurable: true,
|
|
99
|
+
writable: true,
|
|
100
|
+
value: new Float64Array(64)
|
|
101
|
+
});
|
|
102
|
+
Object.defineProperty(this, "createdZoom", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
configurable: true,
|
|
105
|
+
writable: true,
|
|
106
|
+
value: new Float64Array(64)
|
|
107
|
+
});
|
|
108
|
+
Object.defineProperty(this, "color", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
configurable: true,
|
|
111
|
+
writable: true,
|
|
112
|
+
value: new Float64Array(256)
|
|
113
|
+
});
|
|
114
|
+
/** The buffer the lines are read from (null before the first line) */
|
|
115
|
+
Object.defineProperty(this, "coords", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
configurable: true,
|
|
118
|
+
writable: true,
|
|
119
|
+
value: null
|
|
120
|
+
});
|
|
121
|
+
/** The number of values per coordinate in `coords` */
|
|
122
|
+
Object.defineProperty(this, "stride", {
|
|
123
|
+
enumerable: true,
|
|
124
|
+
configurable: true,
|
|
125
|
+
writable: true,
|
|
126
|
+
value: 2
|
|
127
|
+
});
|
|
128
|
+
/** The coordinates written into the buffer of the builder (-1 while it reads the caller's) */
|
|
129
|
+
Object.defineProperty(this, "copied", {
|
|
130
|
+
enumerable: true,
|
|
131
|
+
configurable: true,
|
|
132
|
+
writable: true,
|
|
133
|
+
value: -1
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** The number of lines pushed */
|
|
137
|
+
get count() {
|
|
138
|
+
return this.size;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Pushes a line: the coordinates `[start, end)` of a buffer
|
|
142
|
+
*
|
|
143
|
+
* @param coords The buffer of the coordinates (interleaved)
|
|
144
|
+
* @param stride The number of values per coordinate in `coords` (2 or 3)
|
|
145
|
+
* @param strokeWidth The width in CSS px with the sign convention of `LineBatchItemBase`
|
|
146
|
+
* @param color The instance color (`toLineInstanceColor`)
|
|
147
|
+
*/
|
|
148
|
+
push(coords, stride, start, end, strokeWidth, createdZoom, color) {
|
|
149
|
+
if (this.coords === null) {
|
|
150
|
+
this.coords = coords;
|
|
151
|
+
this.stride = stride;
|
|
152
|
+
}
|
|
153
|
+
else if (this.copied >= 0 || coords !== this.coords || stride !== this.stride) {
|
|
154
|
+
if (this.copied < 0)
|
|
155
|
+
this.copyPushed();
|
|
156
|
+
const at = this.append(coords, stride, start, end);
|
|
157
|
+
end = at + (end - start);
|
|
158
|
+
start = at;
|
|
159
|
+
}
|
|
160
|
+
const i = this.size;
|
|
161
|
+
if (i + 1 > this.start.length) {
|
|
162
|
+
this.start = grow(this.start, i + 1);
|
|
163
|
+
this.end = grow(this.end, i + 1);
|
|
164
|
+
this.strokeWidth = grow(this.strokeWidth, i + 1);
|
|
165
|
+
this.createdZoom = grow(this.createdZoom, i + 1);
|
|
166
|
+
this.color = grow(this.color, (i + 1) * 4);
|
|
167
|
+
}
|
|
168
|
+
this.start[i] = start;
|
|
169
|
+
this.end[i] = end;
|
|
170
|
+
this.strokeWidth[i] = strokeWidth;
|
|
171
|
+
this.createdZoom[i] = createdZoom;
|
|
172
|
+
this.color[i * 4] = color[0];
|
|
173
|
+
this.color[i * 4 + 1] = color[1];
|
|
174
|
+
this.color[i * 4 + 2] = color[2];
|
|
175
|
+
this.color[i * 4 + 3] = color[3];
|
|
176
|
+
this.size = i + 1;
|
|
177
|
+
}
|
|
178
|
+
/** The lines pushed so far */
|
|
179
|
+
view() {
|
|
180
|
+
return {
|
|
181
|
+
count: this.size,
|
|
182
|
+
coords: this.coords ?? new Float64Array(0),
|
|
183
|
+
stride: this.stride,
|
|
184
|
+
start: this.start,
|
|
185
|
+
end: this.end,
|
|
186
|
+
strokeWidth: this.strokeWidth,
|
|
187
|
+
createdZoom: this.createdZoom,
|
|
188
|
+
color: this.color,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/** Moves the coordinates of the lines pushed so far into a buffer of the builder */
|
|
192
|
+
copyPushed() {
|
|
193
|
+
const from = this.coords;
|
|
194
|
+
const stride = this.stride;
|
|
195
|
+
let total = 0;
|
|
196
|
+
for (let i = 0; i < this.size; i++)
|
|
197
|
+
total += this.end[i] - this.start[i];
|
|
198
|
+
this.coords = new Float64Array(Math.max(256, total * 4));
|
|
199
|
+
this.stride = 2;
|
|
200
|
+
this.copied = 0;
|
|
201
|
+
for (let i = 0; i < this.size; i++) {
|
|
202
|
+
const at = this.append(from, stride, this.start[i], this.end[i]);
|
|
203
|
+
this.end[i] = at + (this.end[i] - this.start[i]);
|
|
204
|
+
this.start[i] = at;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Appends the coordinates `[start, end)` of a buffer to the buffer of the builder
|
|
209
|
+
*
|
|
210
|
+
* @returns Where they start in the buffer of the builder
|
|
211
|
+
*/
|
|
212
|
+
append(from, stride, start, end) {
|
|
213
|
+
const at = this.copied;
|
|
214
|
+
const next = at + (end - start);
|
|
215
|
+
let coords = this.coords;
|
|
216
|
+
if (next * 2 > coords.length) {
|
|
217
|
+
coords = grow(coords, next * 2);
|
|
218
|
+
this.coords = coords;
|
|
219
|
+
}
|
|
220
|
+
for (let v = start; v < end; v++) {
|
|
221
|
+
const to = (at + v - start) * 2;
|
|
222
|
+
coords[to] = from[v * stride];
|
|
223
|
+
coords[to + 1] = from[v * stride + 1];
|
|
224
|
+
}
|
|
225
|
+
this.copied = next;
|
|
226
|
+
return at;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/** A typed array of the same kind holding at least `length` elements (the contents kept) */
|
|
230
|
+
function grow(array, length) {
|
|
231
|
+
let size = array.length * 2;
|
|
232
|
+
while (size < length)
|
|
233
|
+
size *= 2;
|
|
234
|
+
const next = new array.constructor(size);
|
|
235
|
+
next.set(array);
|
|
236
|
+
return next;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Creates empty intermediate data
|
|
240
|
+
*
|
|
241
|
+
* @internal
|
|
242
|
+
*/
|
|
243
|
+
export function createChunkDraft() {
|
|
244
|
+
return {
|
|
245
|
+
fixedPolygons: [],
|
|
246
|
+
scaledPolygons: [],
|
|
247
|
+
fixedLines: [],
|
|
248
|
+
scaledLines: [],
|
|
249
|
+
packedFixedLines: null,
|
|
250
|
+
packedScaledLines: null,
|
|
251
|
+
points: new Map(),
|
|
252
|
+
packedPoints: new Map(),
|
|
253
|
+
fallback: [],
|
|
254
|
+
pointFallback: [],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* The number of rows collected between two looks at the clock
|
|
259
|
+
*
|
|
260
|
+
* @internal
|
|
261
|
+
*/
|
|
262
|
+
export const COLLECT_SLICE_ROWS = 512;
|
|
263
|
+
/**
|
|
264
|
+
* The collector of features (the features with the style rules applied, in draw order)
|
|
265
|
+
*
|
|
266
|
+
* @param count The number of rows
|
|
267
|
+
* @param featureOf The feature of a row with the rule colors applied, or null when it is not
|
|
268
|
+
* drawn (thinned away). It is called as the dataset advances, so the preparation of the
|
|
269
|
+
* features is sliced by the budget of the frame as well
|
|
270
|
+
*
|
|
271
|
+
* @internal
|
|
272
|
+
*/
|
|
273
|
+
export function collectFeatures(count, featureOf, options = {}) {
|
|
274
|
+
let next = 0;
|
|
275
|
+
return {
|
|
276
|
+
collect(draft, styles, deadline, now) {
|
|
277
|
+
while (next < count) {
|
|
278
|
+
const end = Math.min(count, next + COLLECT_SLICE_ROWS);
|
|
279
|
+
for (; next < end; next++) {
|
|
280
|
+
const feature = featureOf(next);
|
|
281
|
+
if (!feature?.visible)
|
|
282
|
+
continue;
|
|
283
|
+
if (options.pointsOnly && feature.type !== 'Point' && feature.type !== 'MultiPoint') {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
collectFeature(feature, draft, styles, options.isExternallyRenderedPoint, options.skipDrapedFills);
|
|
287
|
+
}
|
|
288
|
+
if (now() >= deadline)
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
return next >= count;
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The collector of an array of features
|
|
297
|
+
*
|
|
298
|
+
* @internal
|
|
299
|
+
*/
|
|
300
|
+
export function collectFeatureArray(features, options = {}) {
|
|
301
|
+
return collectFeatures(features.length, (index) => features[index], options);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Whether the set of retained batches is empty (nothing at all to draw)
|
|
305
|
+
*
|
|
306
|
+
* @internal
|
|
307
|
+
*/
|
|
308
|
+
export function isEmptyChunkBatches(batches) {
|
|
309
|
+
return (batches.polygons.length === 0 &&
|
|
310
|
+
batches.lines.length === 0 &&
|
|
311
|
+
batches.points.length === 0 &&
|
|
312
|
+
batches.fallback.length === 0 &&
|
|
313
|
+
batches.pointFallback.length === 0);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Builds the retained batches of a chunk
|
|
317
|
+
*
|
|
318
|
+
* @param features The features with the colors of the style rules applied (in draw order)
|
|
319
|
+
* @param renderers The full set of renderers of retained mode
|
|
320
|
+
* @param origin The origin of the relative coordinates (the representative point of the chunk)
|
|
321
|
+
* @param triangulator The entry point of the triangulation of huge polygons (synchronous when
|
|
322
|
+
* omitted)
|
|
323
|
+
* @param isExternallyRenderedPoint Predicate that returns whether a point is drawn by an external
|
|
324
|
+
* renderer (every point is pushed when omitted). A point for which it is true goes neither onto
|
|
325
|
+
* a batch nor into fallback
|
|
326
|
+
* @param skipDrapedFills Do not push the solid polygons and lines (a frame where the analytic
|
|
327
|
+
* drape draws them as ground pixels)
|
|
328
|
+
* @returns The batches that were built. When the GPU resources could not be created (the shaders
|
|
329
|
+
* are not initialized) null is returned and the caller rebuilds them on the next frame
|
|
330
|
+
*
|
|
331
|
+
* @internal
|
|
332
|
+
*/
|
|
333
|
+
export function buildChunkBatches(features, renderers, origin, triangulator, isExternallyRenderedPoint, skipDrapedFills = false) {
|
|
334
|
+
const draft = createChunkDraft();
|
|
335
|
+
collectFeatureArray(features, { isExternallyRenderedPoint, skipDrapedFills }).collect(draft, renderers.styles, Number.POSITIVE_INFINITY, () => 0);
|
|
336
|
+
const batches = {
|
|
337
|
+
polygons: [],
|
|
338
|
+
lines: [],
|
|
339
|
+
points: [],
|
|
340
|
+
fallback: draft.fallback,
|
|
341
|
+
pointFallback: draft.pointFallback,
|
|
342
|
+
};
|
|
343
|
+
// Polygons (drawn in the order fixed width → createdZoom)
|
|
344
|
+
//
|
|
345
|
+
// With a polygon waiting for triangulation, the result can be "not a single triangle to fill".
|
|
346
|
+
// That is different from the shaders not being initialized (which needs a rebuild), so it is
|
|
347
|
+
// not treated as a failure (rebuilding every frame would repeat the flattening of a huge
|
|
348
|
+
// polygon forever).
|
|
349
|
+
if (draft.fixedPolygons.length > 0) {
|
|
350
|
+
const batch = renderers.polygon.buildRetained(draft.fixedPolygons, {
|
|
351
|
+
origin,
|
|
352
|
+
widthZoom: FIXED_WIDTH_ZOOM,
|
|
353
|
+
triangulator,
|
|
354
|
+
});
|
|
355
|
+
if (!batch && !triangulator?.hasDeferred())
|
|
356
|
+
return null;
|
|
357
|
+
if (batch)
|
|
358
|
+
batches.polygons.push(batch);
|
|
359
|
+
}
|
|
360
|
+
if (draft.scaledPolygons.length > 0) {
|
|
361
|
+
const batch = renderers.polygon.buildRetained(draft.scaledPolygons, { origin, triangulator });
|
|
362
|
+
if (!batch && !triangulator?.hasDeferred())
|
|
363
|
+
return null;
|
|
364
|
+
if (batch)
|
|
365
|
+
batches.polygons.push(batch);
|
|
366
|
+
}
|
|
367
|
+
// Lines (solid only; dashes are sent to immediate mode) and points (per shape)
|
|
368
|
+
for (const task of lineAndPointTasks(draft, renderers, origin, batches)) {
|
|
369
|
+
if (!task())
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
return batches;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* The tasks that build the lines (fixed width, then createdZoom) and the points (per shape) of
|
|
376
|
+
* the intermediate data, in draw order. A task returns false when the build failed
|
|
377
|
+
*/
|
|
378
|
+
function lineAndPointTasks(draft, renderers, origin, batches) {
|
|
379
|
+
const tasks = [];
|
|
380
|
+
const solid = { lineStyle: 'solid' };
|
|
381
|
+
const lineGroups = [
|
|
382
|
+
[draft.fixedLines, draft.packedFixedLines, { origin, widthZoom: FIXED_WIDTH_ZOOM }],
|
|
383
|
+
[draft.scaledLines, draft.packedScaledLines, { origin }],
|
|
384
|
+
];
|
|
385
|
+
for (const [items, packed, options] of lineGroups) {
|
|
386
|
+
if (items.length > 0) {
|
|
387
|
+
tasks.push(() => {
|
|
388
|
+
const batch = renderers.line.buildRetainedBatch(items, solid, options);
|
|
389
|
+
if (!batch)
|
|
390
|
+
return false;
|
|
391
|
+
batches.lines.push(batch);
|
|
392
|
+
return true;
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
if (packed && packed.count > 0) {
|
|
396
|
+
tasks.push(() => {
|
|
397
|
+
const lines = packed.view();
|
|
398
|
+
const batch = renderers.line.buildRetainedPackedBatch
|
|
399
|
+
? renderers.line.buildRetainedPackedBatch(lines, solid, options)
|
|
400
|
+
: renderers.line.buildRetainedBatch(unpackLines(lines), solid, options);
|
|
401
|
+
if (!batch)
|
|
402
|
+
return false;
|
|
403
|
+
batches.lines.push(batch);
|
|
404
|
+
return true;
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
for (const [shape, points] of draft.points) {
|
|
409
|
+
if (points.length === 0)
|
|
410
|
+
continue;
|
|
411
|
+
tasks.push(() => {
|
|
412
|
+
const batch = renderers.point.buildRetained(points, shape, { origin });
|
|
413
|
+
if (!batch)
|
|
414
|
+
return false;
|
|
415
|
+
batches.points.push(batch);
|
|
416
|
+
return true;
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
for (const [shape, builder] of draft.packedPoints) {
|
|
420
|
+
if (builder.count === 0)
|
|
421
|
+
continue;
|
|
422
|
+
tasks.push(() => {
|
|
423
|
+
const batch = buildPackedPoints(renderers, builder.view(), shape, origin);
|
|
424
|
+
if (!batch)
|
|
425
|
+
return false;
|
|
426
|
+
batches.points.push(batch);
|
|
427
|
+
return true;
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
return tasks;
|
|
431
|
+
}
|
|
432
|
+
/** Builds packed points (as objects when the renderer has no packed builder) */
|
|
433
|
+
function buildPackedPoints(renderers, points, shape, origin) {
|
|
434
|
+
return renderers.point.buildRetainedPacked
|
|
435
|
+
? renderers.point.buildRetainedPacked(points, shape, { origin })
|
|
436
|
+
: renderers.point.buildRetained(unpackPoints(points), shape, { origin });
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* The packed points as objects (the same values)
|
|
440
|
+
*
|
|
441
|
+
* @internal
|
|
442
|
+
*/
|
|
443
|
+
export function unpackPoints(points) {
|
|
444
|
+
const out = new Array(points.count);
|
|
445
|
+
const { lngLat, style } = points;
|
|
446
|
+
for (let i = 0; i < points.count; i++) {
|
|
447
|
+
const s = i * PACKED_POINT_STYLE_STRIDE;
|
|
448
|
+
out[i] = {
|
|
449
|
+
coord: [lngLat[i * 2], lngLat[i * 2 + 1]],
|
|
450
|
+
fillColor: [style[s], style[s + 1], style[s + 2], style[s + 3]],
|
|
451
|
+
strokeColor: [style[s + 4], style[s + 5], style[s + 6], style[s + 7]],
|
|
452
|
+
fillSize: style[s + 8],
|
|
453
|
+
strokeWidth: style[s + 9],
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
return out;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* The packed lines as objects: the coordinates copied into arrays, the instance color with an
|
|
460
|
+
* opacity of 1 (the same instance color)
|
|
461
|
+
*
|
|
462
|
+
* @internal
|
|
463
|
+
*/
|
|
464
|
+
export function unpackLines(lines) {
|
|
465
|
+
const out = new Array(lines.count);
|
|
466
|
+
const { coords, stride } = lines;
|
|
467
|
+
for (let i = 0; i < lines.count; i++) {
|
|
468
|
+
const positions = [];
|
|
469
|
+
for (let v = lines.start[i]; v < lines.end[i]; v++) {
|
|
470
|
+
positions.push([coords[v * stride], coords[v * stride + 1]]);
|
|
471
|
+
}
|
|
472
|
+
out[i] = {
|
|
473
|
+
coords: positions,
|
|
474
|
+
featureId: '',
|
|
475
|
+
closed: false,
|
|
476
|
+
strokeWidth: lines.strokeWidth[i],
|
|
477
|
+
createdZoom: lines.createdZoom[i],
|
|
478
|
+
color: [
|
|
479
|
+
lines.color[i * 4],
|
|
480
|
+
lines.color[i * 4 + 1],
|
|
481
|
+
lines.color[i * 4 + 2],
|
|
482
|
+
lines.color[i * 4 + 3],
|
|
483
|
+
],
|
|
484
|
+
opacity: 1,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
return out;
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Target number of vertices of the polygons built in one slice
|
|
491
|
+
*
|
|
492
|
+
* With terrain, building a polygon includes the work of "cutting the surface along the grid of
|
|
493
|
+
* the real mesh of the tiles" and takes a few microseconds per original vertex. Building a single
|
|
494
|
+
* large surface that covers the view takes hundreds of milliseconds and stalls the frame (430 ms
|
|
495
|
+
* measured). Polygons are therefore bundled by vertex count and built one bundle at a time.
|
|
496
|
+
*
|
|
497
|
+
* A bundle becomes one retained batch, so making it too small increases the draw calls. 2,000 was
|
|
498
|
+
* taken from "5 to 10 ms per bundle, a few bundles per chunk".
|
|
499
|
+
*/
|
|
500
|
+
const BUILD_SLICE_VERTICES = 2000;
|
|
501
|
+
/**
|
|
502
|
+
* Cuts the polygons into several bundles by vertex count
|
|
503
|
+
*
|
|
504
|
+
* The order within a bundle and between bundles is unchanged, so the draw order (z-order) does
|
|
505
|
+
* not change.
|
|
506
|
+
*/
|
|
507
|
+
function sliceByVertices(polygons) {
|
|
508
|
+
if (polygons.length === 0)
|
|
509
|
+
return [];
|
|
510
|
+
const slices = [];
|
|
511
|
+
let current = [];
|
|
512
|
+
let vertices = 0;
|
|
513
|
+
for (const polygon of polygons) {
|
|
514
|
+
let count = 0;
|
|
515
|
+
for (const ring of polygon.coordinates)
|
|
516
|
+
count += ring.length;
|
|
517
|
+
// A surface that exceeds the budget on its own cannot be split any further, so it becomes a
|
|
518
|
+
// bundle of its own
|
|
519
|
+
if (current.length > 0 && vertices + count > BUILD_SLICE_VERTICES) {
|
|
520
|
+
slices.push(current);
|
|
521
|
+
current = [];
|
|
522
|
+
vertices = 0;
|
|
523
|
+
}
|
|
524
|
+
current.push(polygon);
|
|
525
|
+
vertices += count;
|
|
526
|
+
}
|
|
527
|
+
if (current.length > 0)
|
|
528
|
+
slices.push(current);
|
|
529
|
+
return slices;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Starts the job that builds the retained batches of a chunk in slices
|
|
533
|
+
*
|
|
534
|
+
* Nothing is done at the start. The first steps walk the rows (`collector`), then the GPU
|
|
535
|
+
* resources are built bundle by bundle; both are advanced by the budget of the frame, so neither
|
|
536
|
+
* the resolution of the styles nor the packing of a large chunk lands on one frame.
|
|
537
|
+
*
|
|
538
|
+
* @param collector Walks the rows of the chunk into the intermediate data
|
|
539
|
+
* @param renderers The full set of renderers of retained mode
|
|
540
|
+
* @param origin The origin of the relative coordinates (the representative point of the chunk)
|
|
541
|
+
* @param triangulator The entry point of the triangulation of huge polygons (synchronous when
|
|
542
|
+
* omitted)
|
|
543
|
+
*
|
|
544
|
+
* @internal
|
|
545
|
+
*/
|
|
546
|
+
export function createChunkBuildJob(collector, renderers, origin, triangulator) {
|
|
547
|
+
const draft = createChunkDraft();
|
|
548
|
+
const batches = {
|
|
549
|
+
polygons: [],
|
|
550
|
+
lines: [],
|
|
551
|
+
points: [],
|
|
552
|
+
fallback: draft.fallback,
|
|
553
|
+
pointFallback: draft.pointFallback,
|
|
554
|
+
};
|
|
555
|
+
let collected = false;
|
|
556
|
+
/** The list of jobs advanced one at a time (planned once the rows are collected) */
|
|
557
|
+
let tasks = null;
|
|
558
|
+
let next = 0;
|
|
559
|
+
let failed = false;
|
|
560
|
+
return {
|
|
561
|
+
step(deadline, now) {
|
|
562
|
+
if (failed)
|
|
563
|
+
return true;
|
|
564
|
+
// The dataset is sliced by the deadline (at least one slice per call)
|
|
565
|
+
if (!collected) {
|
|
566
|
+
collected = collector.collect(draft, renderers.styles, deadline, now);
|
|
567
|
+
if (!collected)
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
tasks ?? (tasks = buildTasks(draft, renderers, origin, triangulator, batches));
|
|
571
|
+
while (next < tasks.length) {
|
|
572
|
+
if (!tasks[next]()) {
|
|
573
|
+
failed = true;
|
|
574
|
+
return true;
|
|
575
|
+
}
|
|
576
|
+
next++;
|
|
577
|
+
// Once the budget is exhausted, on to the next frame (at least one step has been taken)
|
|
578
|
+
if (now() >= deadline)
|
|
579
|
+
break;
|
|
580
|
+
}
|
|
581
|
+
return next >= tasks.length;
|
|
582
|
+
},
|
|
583
|
+
take() {
|
|
584
|
+
if (failed || !tasks || next < tasks.length)
|
|
585
|
+
return null;
|
|
586
|
+
return batches;
|
|
587
|
+
},
|
|
588
|
+
dispose(rendererSet) {
|
|
589
|
+
disposeChunkBatches(batches, rendererSet);
|
|
590
|
+
},
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* The tasks that build the retained batches from the collected intermediate data (polygons in
|
|
595
|
+
* bundles by vertex count, then lines, then points)
|
|
596
|
+
*/
|
|
597
|
+
function buildTasks(draft, renderers, origin, triangulator, batches) {
|
|
598
|
+
const tasks = [];
|
|
599
|
+
// Polygons (drawn in the order fixed width → createdZoom). One batch per bundle
|
|
600
|
+
for (const slice of sliceByVertices(draft.fixedPolygons)) {
|
|
601
|
+
tasks.push(() => {
|
|
602
|
+
const batch = renderers.polygon.buildRetained(slice, {
|
|
603
|
+
origin,
|
|
604
|
+
widthZoom: FIXED_WIDTH_ZOOM,
|
|
605
|
+
triangulator,
|
|
606
|
+
});
|
|
607
|
+
// With a polygon waiting for triangulation, the result can be "not a single triangle to
|
|
608
|
+
// fill". That is different from the shaders not being initialized (which needs a rebuild),
|
|
609
|
+
// so it is not treated as a failure
|
|
610
|
+
if (!batch)
|
|
611
|
+
return triangulator?.hasDeferred() === true;
|
|
612
|
+
batches.polygons.push(batch);
|
|
613
|
+
return true;
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
for (const slice of sliceByVertices(draft.scaledPolygons)) {
|
|
617
|
+
tasks.push(() => {
|
|
618
|
+
const batch = renderers.polygon.buildRetained(slice, { origin, triangulator });
|
|
619
|
+
if (!batch)
|
|
620
|
+
return triangulator?.hasDeferred() === true;
|
|
621
|
+
batches.polygons.push(batch);
|
|
622
|
+
return true;
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
// Lines (solid only; dashes are sent to immediate mode) and points (per shape)
|
|
626
|
+
tasks.push(...lineAndPointTasks(draft, renderers, origin, batches));
|
|
627
|
+
return tasks;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Rebuilds only the point part of a chunk: its point batches and its points drawn in immediate
|
|
631
|
+
* mode (`pointFallback`)
|
|
632
|
+
*
|
|
633
|
+
* The polygons, the lines and `fallback` are not touched at all. Two things change the points
|
|
634
|
+
* alone: the anchor elevations baked into the point instances when DEM tiles arrive, and the
|
|
635
|
+
* rows the collision thinning draws (it only ever removes points). Rebuilding the polygons for
|
|
636
|
+
* them would re-triangulate every polygon through earcut, so the point part is rebuilt on its
|
|
637
|
+
* own; its cost is a walk over the rows of the chunk plus the packing of the points it draws.
|
|
638
|
+
*
|
|
639
|
+
* @param collector A collector of the points of the chunk (`pointsOnly`). The dataset uses
|
|
640
|
+
* the same code as the build, so the appearance at build time and at re-bake time cannot
|
|
641
|
+
* disagree
|
|
642
|
+
* @returns true when they could be rebuilt. When the retained-mode renderers do not have their
|
|
643
|
+
* shaders yet (the build failed) false is returned and the old point part is left as it is
|
|
644
|
+
*/
|
|
645
|
+
export function rebuildChunkPoints(batches, collector, renderers, origin) {
|
|
646
|
+
const draft = createChunkDraft();
|
|
647
|
+
collector.collect(draft, renderers.styles, Number.POSITIVE_INFINITY, () => 0);
|
|
648
|
+
const newBatches = [];
|
|
649
|
+
const built = (batch) => {
|
|
650
|
+
// It could not be built, for example because the shaders are not initialized. The new batches
|
|
651
|
+
// built so far are referenced by nobody, so they are discarded and a failure is returned with
|
|
652
|
+
// the old batches left in place
|
|
653
|
+
if (!batch) {
|
|
654
|
+
for (const done of newBatches)
|
|
655
|
+
renderers.point.disposeRetained(done);
|
|
656
|
+
return false;
|
|
657
|
+
}
|
|
658
|
+
newBatches.push(batch);
|
|
659
|
+
return true;
|
|
660
|
+
};
|
|
661
|
+
for (const [shape, points] of draft.points) {
|
|
662
|
+
if (points.length === 0)
|
|
663
|
+
continue;
|
|
664
|
+
if (!built(renderers.point.buildRetained(points, shape, { origin })))
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
for (const [shape, builder] of draft.packedPoints) {
|
|
668
|
+
if (builder.count === 0)
|
|
669
|
+
continue;
|
|
670
|
+
if (!built(buildPackedPoints(renderers, builder.view(), shape, origin)))
|
|
671
|
+
return false;
|
|
672
|
+
}
|
|
673
|
+
for (const old of batches.points) {
|
|
674
|
+
renderers.point.disposeRetained(old);
|
|
675
|
+
}
|
|
676
|
+
batches.points = newBatches;
|
|
677
|
+
batches.pointFallback = draft.pointFallback;
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Draws the retained batches of a chunk (it does not build them)
|
|
682
|
+
*
|
|
683
|
+
* @param factors The factors at draw time (when omitted, a scale of 1 and an opacity of 1, as
|
|
684
|
+
* before). The same factors apply to the fixed and the scaled batches alike, and to points,
|
|
685
|
+
* lines and polygons alike (so that no path a data surface takes is missed)
|
|
686
|
+
*
|
|
687
|
+
* @internal
|
|
688
|
+
*/
|
|
689
|
+
export function drawChunkBatches(batches, renderers, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
|
|
690
|
+
const viewport = renderers.viewport();
|
|
691
|
+
for (const batch of batches.polygons) {
|
|
692
|
+
renderers.polygon.drawRetained(batch, zoom, projectionData, viewport, factors);
|
|
693
|
+
}
|
|
694
|
+
for (const batch of batches.lines) {
|
|
695
|
+
renderers.line.drawRetainedBatch(batch, zoom, projectionData, factors);
|
|
696
|
+
}
|
|
697
|
+
for (const batch of batches.points) {
|
|
698
|
+
renderers.point.drawRetained(batch, zoom, projectionData, factors);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Disposes the retained batches of a chunk
|
|
703
|
+
*
|
|
704
|
+
* @internal
|
|
705
|
+
*/
|
|
706
|
+
export function disposeChunkBatches(batches, renderers) {
|
|
707
|
+
for (const batch of batches.polygons) {
|
|
708
|
+
renderers.polygon.disposeRetained(batch);
|
|
709
|
+
}
|
|
710
|
+
for (const batch of batches.lines) {
|
|
711
|
+
renderers.line.disposeRetainedBatch(batch);
|
|
712
|
+
}
|
|
713
|
+
for (const batch of batches.points) {
|
|
714
|
+
renderers.point.disposeRetained(batch);
|
|
715
|
+
}
|
|
716
|
+
batches.polygons.length = 0;
|
|
717
|
+
batches.lines.length = 0;
|
|
718
|
+
batches.points.length = 0;
|
|
719
|
+
}
|
|
720
|
+
// === Internals of the building ===
|
|
721
|
+
/**
|
|
722
|
+
* Whether it is a type that the analytic drape draws as ground pixels
|
|
723
|
+
*
|
|
724
|
+
* It is paired with the dataset in `view/terrain/drape/pass.ts`. Changing only one of them
|
|
725
|
+
* would draw a surface twice or draw neither of them.
|
|
726
|
+
*
|
|
727
|
+
* @internal
|
|
728
|
+
*/
|
|
729
|
+
export function isDrapedGeometry(feature) {
|
|
730
|
+
return (feature.type === 'Polygon' ||
|
|
731
|
+
feature.type === 'MultiPolygon' ||
|
|
732
|
+
feature.type === 'LineString' ||
|
|
733
|
+
feature.type === 'MultiLineString');
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Pushes a feature into the intermediate data
|
|
737
|
+
*
|
|
738
|
+
* @internal
|
|
739
|
+
*/
|
|
740
|
+
export function collectFeature(feature, draft, styles, isExternallyRenderedPoint, skipDrapedFills = false) {
|
|
741
|
+
const skipSolid = skipDrapedFills && isDrapedGeometry(feature);
|
|
742
|
+
switch (feature.type) {
|
|
743
|
+
case 'Point':
|
|
744
|
+
collectPoint(feature, feature.coordinates, draft, styles, isExternallyRenderedPoint);
|
|
745
|
+
return;
|
|
746
|
+
case 'MultiPoint':
|
|
747
|
+
// Whether the predicate applies to Point alone is up to the predicate itself (the test is
|
|
748
|
+
// in one place)
|
|
749
|
+
for (const coord of feature.coordinates) {
|
|
750
|
+
collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint);
|
|
751
|
+
}
|
|
752
|
+
return;
|
|
753
|
+
case 'LineString':
|
|
754
|
+
case 'Freehand':
|
|
755
|
+
collectLine(feature, feature.coordinates, draft, styles, skipSolid);
|
|
756
|
+
return;
|
|
757
|
+
case 'MultiLineString':
|
|
758
|
+
for (const coords of feature.coordinates) {
|
|
759
|
+
collectLine(feature, coords, draft, styles, skipSolid);
|
|
760
|
+
}
|
|
761
|
+
return;
|
|
762
|
+
case 'Polygon':
|
|
763
|
+
collectPolygon(feature, feature.coordinates, draft, styles, 0, skipSolid);
|
|
764
|
+
return;
|
|
765
|
+
case 'MultiPolygon': {
|
|
766
|
+
const parts = feature.coordinates;
|
|
767
|
+
for (let i = 0; i < parts.length; i++) {
|
|
768
|
+
collectPolygon(feature, parts[i], draft, styles, i, skipSolid);
|
|
769
|
+
}
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
case 'Circle': {
|
|
773
|
+
const radiusMeters = getCircleRadius(feature);
|
|
774
|
+
if (!radiusMeters || radiusMeters <= 0)
|
|
775
|
+
return;
|
|
776
|
+
const center = feature.coordinates;
|
|
777
|
+
collectPolygon(feature, [generateCirclePolygon(center, radiusMeters)], draft, styles);
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
default:
|
|
781
|
+
// A kind that retained mode does not handle, such as Image, is sent to immediate mode
|
|
782
|
+
pushFallback(draft, feature);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Pushes a feature that is sent to immediate mode (a point goes to the point part,
|
|
787
|
+
* `pointFallback`; anything else to `fallback`)
|
|
788
|
+
*
|
|
789
|
+
* A Multi geometry is decided per part, so the same feature can come around several times in a
|
|
790
|
+
* row. The immediate-mode path draws every part of a feature at once, so it is not pushed twice.
|
|
791
|
+
*
|
|
792
|
+
* @internal
|
|
793
|
+
*/
|
|
794
|
+
export function pushFallback(draft, feature) {
|
|
795
|
+
const list = feature.type === 'Point' || feature.type === 'MultiPoint'
|
|
796
|
+
? draft.pointFallback
|
|
797
|
+
: draft.fallback;
|
|
798
|
+
if (list[list.length - 1] === feature)
|
|
799
|
+
return;
|
|
800
|
+
list.push(feature);
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Pushes a point (a shape without instancing support is sent to immediate mode)
|
|
804
|
+
*
|
|
805
|
+
* A point drawn by an external renderer goes neither onto a batch nor into the immediate-mode
|
|
806
|
+
* list (core draws nothing; drawing it is the job of the external renderer).
|
|
807
|
+
*/
|
|
808
|
+
function collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint) {
|
|
809
|
+
if (isExternallyRenderedPoint?.(feature))
|
|
810
|
+
return;
|
|
811
|
+
const style = styles.getPointStyle(feature);
|
|
812
|
+
const shape = toInstancedPointShape(style.shape);
|
|
813
|
+
if (!shape) {
|
|
814
|
+
// The path that goes to immediate mode is not multiplied by the factors of zoomScale
|
|
815
|
+
pushFallback(draft, feature);
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
let points = draft.points.get(shape);
|
|
819
|
+
if (!points) {
|
|
820
|
+
points = [];
|
|
821
|
+
draft.points.set(shape, points);
|
|
822
|
+
}
|
|
823
|
+
points.push(toPointInstanceData(coord, style));
|
|
824
|
+
}
|
|
825
|
+
/**
|
|
826
|
+
* Pushes a line (a dashed line is sent to immediate mode because its CPU-side splitting depends
|
|
827
|
+
* on the zoom)
|
|
828
|
+
*/
|
|
829
|
+
function collectLine(feature, coords, draft, styles, skipSolid = false) {
|
|
830
|
+
if (coords.length < 2)
|
|
831
|
+
return;
|
|
832
|
+
const strokeStyle = styles.getLineStringStrokeStyle(feature);
|
|
833
|
+
if (strokeStyle.lineStyle !== 'solid') {
|
|
834
|
+
// The path that goes to immediate mode is not multiplied by the factors of zoomScale
|
|
835
|
+
pushFallback(draft, feature);
|
|
836
|
+
return;
|
|
837
|
+
}
|
|
838
|
+
// A solid line is drawn by the analytic drape as ground pixels (in this frame only)
|
|
839
|
+
if (skipSolid && strokeStyle.opacity > 0 && strokeStyle.width > 0)
|
|
840
|
+
return;
|
|
841
|
+
const createdZoom = getCreatedZoom(feature);
|
|
842
|
+
const target = createdZoom === undefined ? draft.fixedLines : draft.scaledLines;
|
|
843
|
+
const item = toLineBatchItem(coords, feature.id, strokeStyle, createdZoom ?? FIXED_WIDTH_ZOOM);
|
|
844
|
+
// A fixed line width is declared by the negative convention. With widthZoom 0 and createdZoom 0
|
|
845
|
+
// it would look the same through `2^(0 - 0) = 1`, but only a negative value says "a size fixed
|
|
846
|
+
// in screen pixels" and gets the factor of the rendering pixel ratio (renderScale) applied
|
|
847
|
+
// ("the two ratios" in shared/utils/pixel-ratio.ts).
|
|
848
|
+
if (createdZoom === undefined)
|
|
849
|
+
item.strokeWidth = -item.strokeWidth;
|
|
850
|
+
target.push(item);
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Pushes a polygon (a dashed outline is sent to immediate mode)
|
|
854
|
+
*
|
|
855
|
+
* A fill-only polygon is also pushed as an SDFPolygon without an outline (immediate mode uses
|
|
856
|
+
* PolygonBatchRenderer, but the appearance of the fill is the same).
|
|
857
|
+
*/
|
|
858
|
+
function collectPolygon(feature, rings, draft, styles, partIndex = 0, skipSolid = false) {
|
|
859
|
+
const outerRing = rings[0];
|
|
860
|
+
if (!outerRing || outerRing.length < 3)
|
|
861
|
+
return;
|
|
862
|
+
const { fillColor, strokeStyle } = styles.getPolygonStyles(feature);
|
|
863
|
+
const hasStroke = strokeStyle.opacity > 0 && strokeStyle.width > 0;
|
|
864
|
+
if (hasStroke && strokeStyle.lineStyle !== 'solid') {
|
|
865
|
+
// The path that goes to immediate mode is not multiplied by the factors of zoomScale
|
|
866
|
+
pushFallback(draft, feature);
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
if (!hasStroke && fillColor[3] <= 0)
|
|
870
|
+
return;
|
|
871
|
+
// The solid fill and outline are drawn by the analytic drape as ground pixels (in this frame
|
|
872
|
+
// only)
|
|
873
|
+
if (skipSolid)
|
|
874
|
+
return;
|
|
875
|
+
const createdZoom = getCreatedZoom(feature);
|
|
876
|
+
const target = createdZoom === undefined ? draft.fixedPolygons : draft.scaledPolygons;
|
|
877
|
+
// A fixed line width is declared by the negative convention (the same reason as collectLine).
|
|
878
|
+
const strokeWidth = hasStroke
|
|
879
|
+
? createdZoom === undefined
|
|
880
|
+
? -strokeStyle.width
|
|
881
|
+
: strokeStyle.width
|
|
882
|
+
: 0;
|
|
883
|
+
target.push({
|
|
884
|
+
coordinates: rings,
|
|
885
|
+
style: {
|
|
886
|
+
fillColor,
|
|
887
|
+
fillOpacity: 1,
|
|
888
|
+
strokeColor: strokeStyle.color,
|
|
889
|
+
strokeWidth,
|
|
890
|
+
strokeOpacity: hasStroke ? 1 : 0,
|
|
891
|
+
},
|
|
892
|
+
createdZoom: createdZoom ?? FIXED_WIDTH_ZOOM,
|
|
893
|
+
// The build of retained mode does not use the global cache of earcut, so the featureId here
|
|
894
|
+
// is held only for identification
|
|
895
|
+
featureId: feature.id,
|
|
896
|
+
partIndex,
|
|
897
|
+
});
|
|
898
|
+
}
|