@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,718 @@
|
|
|
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 { densifyPathForGlobe } from '../globe-subdivision.js';
|
|
6
|
+
import { TerrainContext } from '../terrain/context.js';
|
|
7
|
+
import { anchorGhostOpacity } from '../terrain/occlusion.js';
|
|
8
|
+
import { layerDrawFactors, NEUTRAL_DRAW_FACTORS, } from './draw-factors.js';
|
|
9
|
+
import { getStrokeDashPattern, splitIntoDashes } from './line/dash.js';
|
|
10
|
+
import { toInstancedPointShape, } from './point/point-instance.js';
|
|
11
|
+
/**
|
|
12
|
+
* Convert a Point style into instance data
|
|
13
|
+
*
|
|
14
|
+
* The opacity is folded into the alpha of the color, and the stroke is disabled
|
|
15
|
+
* by setting its width to 0 when its opacity is 0.
|
|
16
|
+
*/
|
|
17
|
+
export function toPointInstanceData(coord, style) {
|
|
18
|
+
const fillColor = [
|
|
19
|
+
style.fillColor[0],
|
|
20
|
+
style.fillColor[1],
|
|
21
|
+
style.fillColor[2],
|
|
22
|
+
style.fillColor[3] * style.fillOpacity,
|
|
23
|
+
];
|
|
24
|
+
const strokeColor = [
|
|
25
|
+
style.strokeColor[0],
|
|
26
|
+
style.strokeColor[1],
|
|
27
|
+
style.strokeColor[2],
|
|
28
|
+
style.strokeColor[3] * style.strokeOpacity,
|
|
29
|
+
];
|
|
30
|
+
return {
|
|
31
|
+
coord: [coord[0], coord[1]],
|
|
32
|
+
fillColor,
|
|
33
|
+
fillSize: style.size / 2,
|
|
34
|
+
strokeColor,
|
|
35
|
+
strokeWidth: style.strokeOpacity > 0 ? style.strokeWidth : 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Convert a Point style into the packed style of `PackedPointInstances`
|
|
40
|
+
*
|
|
41
|
+
* The same values as `toPointInstanceData` puts on a point, in the order fillColor, strokeColor,
|
|
42
|
+
* fillSize, strokeWidth.
|
|
43
|
+
*/
|
|
44
|
+
export function toPackedPointStyle(style) {
|
|
45
|
+
const packed = toPointInstanceData([0, 0], style);
|
|
46
|
+
return Float64Array.of(packed.fillColor[0], packed.fillColor[1], packed.fillColor[2], packed.fillColor[3], packed.strokeColor[0], packed.strokeColor[1], packed.strokeColor[2], packed.strokeColor[3], packed.fillSize, packed.strokeWidth);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert a stroke style into an item of a line batch
|
|
50
|
+
*
|
|
51
|
+
* The color and the opacity are passed to the GPU as instance attributes, so
|
|
52
|
+
* they are expanded from the style down to the per-item level. The dash kind and
|
|
53
|
+
* the reference zoom of the width are handled on the shape side (the batch key
|
|
54
|
+
* and the instance attributes), so they are not included here.
|
|
55
|
+
*/
|
|
56
|
+
export function toLineBatchItem(coords, featureId, style, createdZoom, closed = false) {
|
|
57
|
+
return {
|
|
58
|
+
coords,
|
|
59
|
+
featureId,
|
|
60
|
+
closed,
|
|
61
|
+
strokeWidth: style.width,
|
|
62
|
+
createdZoom,
|
|
63
|
+
color: [style.color[0], style.color[1], style.color[2], style.color[3]],
|
|
64
|
+
opacity: style.opacity,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Turn an item that is "constant in width on the screen" into a negative fixed width
|
|
69
|
+
*
|
|
70
|
+
* When the line width is expressed as a negative value, the shader ignores
|
|
71
|
+
* createdZoom and draws it at a fixed width. Putting features that have no
|
|
72
|
+
* createdZoom (that is, those that should stay constant in width on the screen)
|
|
73
|
+
* on that convention lets them declare that their dimension is "fixed in screen
|
|
74
|
+
* pixels" while staying in the same batch as variable-width ones. Only once that
|
|
75
|
+
* is declared does renderScale (the factor of the rendering ratio) apply (see
|
|
76
|
+
* "the two ratios" in shared/utils/pixel-ratio.ts).
|
|
77
|
+
*/
|
|
78
|
+
function withFixedWidth(item, fixed) {
|
|
79
|
+
if (!fixed)
|
|
80
|
+
return item;
|
|
81
|
+
item.strokeWidth = -item.strokeWidth;
|
|
82
|
+
return item;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Obtain the shape parameters of a line batch
|
|
86
|
+
*
|
|
87
|
+
* The color is an instance attribute, so it is not included. For solid lines the
|
|
88
|
+
* dash array is not used for rendering, so it is dropped to avoid pointless batch
|
|
89
|
+
* splits.
|
|
90
|
+
*/
|
|
91
|
+
export function toLineBatchShape(style) {
|
|
92
|
+
if (style.lineStyle === 'solid') {
|
|
93
|
+
return { lineStyle: 'solid' };
|
|
94
|
+
}
|
|
95
|
+
return { lineStyle: style.lineStyle, dashArray: style.dashArray };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Obtain the key of a line batch (shape parameters only; it does not depend on the color)
|
|
99
|
+
*/
|
|
100
|
+
export function lineBatchKey(shape) {
|
|
101
|
+
return [shape.lineStyle, (shape.dashArray ?? []).join(',')].join(':');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* BatchManager
|
|
105
|
+
*
|
|
106
|
+
* The class that manages the batching of features
|
|
107
|
+
*
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
export class BatchManager {
|
|
111
|
+
constructor(deps) {
|
|
112
|
+
Object.defineProperty(this, "gl", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
configurable: true,
|
|
115
|
+
writable: true,
|
|
116
|
+
value: void 0
|
|
117
|
+
});
|
|
118
|
+
Object.defineProperty(this, "featureDrawer", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
configurable: true,
|
|
121
|
+
writable: true,
|
|
122
|
+
value: void 0
|
|
123
|
+
});
|
|
124
|
+
Object.defineProperty(this, "pointInstanceRenderer", {
|
|
125
|
+
enumerable: true,
|
|
126
|
+
configurable: true,
|
|
127
|
+
writable: true,
|
|
128
|
+
value: void 0
|
|
129
|
+
});
|
|
130
|
+
Object.defineProperty(this, "sdfLineRenderer", {
|
|
131
|
+
enumerable: true,
|
|
132
|
+
configurable: true,
|
|
133
|
+
writable: true,
|
|
134
|
+
value: void 0
|
|
135
|
+
});
|
|
136
|
+
Object.defineProperty(this, "polygonBatchRenderer", {
|
|
137
|
+
enumerable: true,
|
|
138
|
+
configurable: true,
|
|
139
|
+
writable: true,
|
|
140
|
+
value: void 0
|
|
141
|
+
});
|
|
142
|
+
Object.defineProperty(this, "sdfPolygonRenderer", {
|
|
143
|
+
enumerable: true,
|
|
144
|
+
configurable: true,
|
|
145
|
+
writable: true,
|
|
146
|
+
value: void 0
|
|
147
|
+
});
|
|
148
|
+
/** The terrain state of the draw instance (occlusion of the points) */
|
|
149
|
+
Object.defineProperty(this, "terrain", {
|
|
150
|
+
enumerable: true,
|
|
151
|
+
configurable: true,
|
|
152
|
+
writable: true,
|
|
153
|
+
value: void 0
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* The set of renderers for retained mode
|
|
157
|
+
*
|
|
158
|
+
* undefined = not determined yet, null = not supported (immediate mode only)
|
|
159
|
+
*/
|
|
160
|
+
Object.defineProperty(this, "retainedRenderers", {
|
|
161
|
+
enumerable: true,
|
|
162
|
+
configurable: true,
|
|
163
|
+
writable: true,
|
|
164
|
+
value: void 0
|
|
165
|
+
});
|
|
166
|
+
// State
|
|
167
|
+
Object.defineProperty(this, "currentBatchType", {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
configurable: true,
|
|
170
|
+
writable: true,
|
|
171
|
+
value: null
|
|
172
|
+
});
|
|
173
|
+
// Point batch management (the key is the shape only)
|
|
174
|
+
Object.defineProperty(this, "pointBatches", {
|
|
175
|
+
enumerable: true,
|
|
176
|
+
configurable: true,
|
|
177
|
+
writable: true,
|
|
178
|
+
value: new Map()
|
|
179
|
+
});
|
|
180
|
+
Object.defineProperty(this, "currentPointBatchKey", {
|
|
181
|
+
enumerable: true,
|
|
182
|
+
configurable: true,
|
|
183
|
+
writable: true,
|
|
184
|
+
value: null
|
|
185
|
+
});
|
|
186
|
+
// LineString batch management (the key is the shape parameters only; the color is held
|
|
187
|
+
// by the item)
|
|
188
|
+
Object.defineProperty(this, "lineBatch", {
|
|
189
|
+
enumerable: true,
|
|
190
|
+
configurable: true,
|
|
191
|
+
writable: true,
|
|
192
|
+
value: []
|
|
193
|
+
});
|
|
194
|
+
Object.defineProperty(this, "lineBatchShapeKey", {
|
|
195
|
+
enumerable: true,
|
|
196
|
+
configurable: true,
|
|
197
|
+
writable: true,
|
|
198
|
+
value: ''
|
|
199
|
+
});
|
|
200
|
+
Object.defineProperty(this, "lineBatchShape", {
|
|
201
|
+
enumerable: true,
|
|
202
|
+
configurable: true,
|
|
203
|
+
writable: true,
|
|
204
|
+
value: null
|
|
205
|
+
});
|
|
206
|
+
Object.defineProperty(this, "sdfLineDrawing", {
|
|
207
|
+
enumerable: true,
|
|
208
|
+
configurable: true,
|
|
209
|
+
writable: true,
|
|
210
|
+
value: false
|
|
211
|
+
});
|
|
212
|
+
// Polygon batch management
|
|
213
|
+
Object.defineProperty(this, "polygonFillBatch", {
|
|
214
|
+
enumerable: true,
|
|
215
|
+
configurable: true,
|
|
216
|
+
writable: true,
|
|
217
|
+
value: []
|
|
218
|
+
});
|
|
219
|
+
Object.defineProperty(this, "sdfPolygonBatch", {
|
|
220
|
+
enumerable: true,
|
|
221
|
+
configurable: true,
|
|
222
|
+
writable: true,
|
|
223
|
+
value: []
|
|
224
|
+
});
|
|
225
|
+
// The rendering context
|
|
226
|
+
Object.defineProperty(this, "projectionData", {
|
|
227
|
+
enumerable: true,
|
|
228
|
+
configurable: true,
|
|
229
|
+
writable: true,
|
|
230
|
+
value: null
|
|
231
|
+
});
|
|
232
|
+
Object.defineProperty(this, "zoom", {
|
|
233
|
+
enumerable: true,
|
|
234
|
+
configurable: true,
|
|
235
|
+
writable: true,
|
|
236
|
+
value: 14
|
|
237
|
+
});
|
|
238
|
+
/**
|
|
239
|
+
* The layer being drawn
|
|
240
|
+
*
|
|
241
|
+
* The rendering loop starts a frame per layer, so the layer needed to evaluate
|
|
242
|
+
* the style rules can be held as the context of the frame.
|
|
243
|
+
*/
|
|
244
|
+
Object.defineProperty(this, "layer", {
|
|
245
|
+
enumerable: true,
|
|
246
|
+
configurable: true,
|
|
247
|
+
writable: true,
|
|
248
|
+
value: void 0
|
|
249
|
+
});
|
|
250
|
+
/**
|
|
251
|
+
* The draw-time factors of the frame (the opacity of the layer being drawn)
|
|
252
|
+
*
|
|
253
|
+
* The batches are flushed within the frame, so they are drawn with the factors of the layer
|
|
254
|
+
* they were filled for. The paths without a factor uniform (the fill-only polygons, the
|
|
255
|
+
* per-point shapes) multiply the opacity into their colors instead.
|
|
256
|
+
*/
|
|
257
|
+
Object.defineProperty(this, "factors", {
|
|
258
|
+
enumerable: true,
|
|
259
|
+
configurable: true,
|
|
260
|
+
writable: true,
|
|
261
|
+
value: NEUTRAL_DRAW_FACTORS
|
|
262
|
+
});
|
|
263
|
+
this.gl = deps.gl;
|
|
264
|
+
this.featureDrawer = deps.featureDrawer;
|
|
265
|
+
this.pointInstanceRenderer = deps.pointInstanceRenderer;
|
|
266
|
+
this.sdfLineRenderer = deps.sdfLineRenderer;
|
|
267
|
+
this.polygonBatchRenderer = deps.polygonBatchRenderer;
|
|
268
|
+
this.sdfPolygonRenderer = deps.sdfPolygonRenderer;
|
|
269
|
+
this.terrain = deps.terrain ?? new TerrainContext();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* The terrain state of the draw instance (read by the datasets drawn here)
|
|
273
|
+
*/
|
|
274
|
+
getTerrain() {
|
|
275
|
+
return this.terrain;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Return the set of renderers for retained mode
|
|
279
|
+
*
|
|
280
|
+
* Used for rendering that is not rebuilt every frame, such as a
|
|
281
|
+
* dataset. When the renderers do not support retained mode (a test stub, for
|
|
282
|
+
* example), undefined is returned and the caller falls back to the immediate-mode
|
|
283
|
+
* path.
|
|
284
|
+
*/
|
|
285
|
+
getRetainedRenderers() {
|
|
286
|
+
if (this.retainedRenderers !== undefined)
|
|
287
|
+
return this.retainedRenderers ?? undefined;
|
|
288
|
+
const line = this.sdfLineRenderer;
|
|
289
|
+
const polygon = this.sdfPolygonRenderer;
|
|
290
|
+
const point = this.pointInstanceRenderer;
|
|
291
|
+
const supported = typeof line?.buildRetainedBatch === 'function' &&
|
|
292
|
+
typeof polygon?.buildRetained === 'function' &&
|
|
293
|
+
typeof point?.buildRetained === 'function';
|
|
294
|
+
if (!supported) {
|
|
295
|
+
this.retainedRenderers = null;
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
this.retainedRenderers = {
|
|
299
|
+
line,
|
|
300
|
+
polygon,
|
|
301
|
+
point,
|
|
302
|
+
styles: this.featureDrawer,
|
|
303
|
+
viewport: () => [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight],
|
|
304
|
+
};
|
|
305
|
+
return this.retainedRenderers;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Begin a rendering frame
|
|
309
|
+
*
|
|
310
|
+
* @param layer The layer to draw (used to evaluate the style rules, and its opacity is
|
|
311
|
+
* multiplied into everything the frame draws; no factor when omitted)
|
|
312
|
+
*/
|
|
313
|
+
beginFrame(projectionData, zoom, layer) {
|
|
314
|
+
this.projectionData = projectionData;
|
|
315
|
+
this.zoom = zoom;
|
|
316
|
+
this.layer = layer;
|
|
317
|
+
this.factors = layerDrawFactors(layer);
|
|
318
|
+
this.currentBatchType = null;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Process a feature
|
|
322
|
+
*
|
|
323
|
+
* @returns true when it is selected
|
|
324
|
+
*/
|
|
325
|
+
processFeature(feature, isSelected) {
|
|
326
|
+
if (!feature.visible || !this.projectionData)
|
|
327
|
+
return false;
|
|
328
|
+
if (feature.type === 'Point') {
|
|
329
|
+
this.processPoint(feature);
|
|
330
|
+
}
|
|
331
|
+
else if (feature.type === 'LineString') {
|
|
332
|
+
this.processLineString(feature);
|
|
333
|
+
}
|
|
334
|
+
else if (feature.type === 'Polygon') {
|
|
335
|
+
this.processPolygon(feature);
|
|
336
|
+
}
|
|
337
|
+
else if (feature.type === 'MultiPoint') {
|
|
338
|
+
this.processMultiPoint(feature);
|
|
339
|
+
}
|
|
340
|
+
else if (feature.type === 'MultiLineString') {
|
|
341
|
+
this.processMultiLineString(feature);
|
|
342
|
+
}
|
|
343
|
+
else if (feature.type === 'MultiPolygon') {
|
|
344
|
+
this.processMultiPolygon(feature);
|
|
345
|
+
}
|
|
346
|
+
else if (feature.type === 'Freehand') {
|
|
347
|
+
// Freehand is processed in the same way as LineString
|
|
348
|
+
this.processLineString(feature);
|
|
349
|
+
}
|
|
350
|
+
else if (feature.type === 'Circle') {
|
|
351
|
+
// Circle is batched in the same way as Polygon
|
|
352
|
+
this.processCircle(feature);
|
|
353
|
+
}
|
|
354
|
+
else if (feature.type === 'Image') {
|
|
355
|
+
// Image: always flush the batches and draw it individually
|
|
356
|
+
this.flushLineBatch();
|
|
357
|
+
// endSDFLineDraw is called only at the end of the frame (a performance optimization)
|
|
358
|
+
this.flushAllBatches();
|
|
359
|
+
this.currentBatchType = null;
|
|
360
|
+
this.featureDrawer.drawFeature(feature, this.projectionData, this.zoom, this.layer);
|
|
361
|
+
}
|
|
362
|
+
return isSelected;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* End the rendering frame (flush the remaining batches)
|
|
366
|
+
*/
|
|
367
|
+
endFrame() {
|
|
368
|
+
this.flushLineBatch();
|
|
369
|
+
this.endSDFLineDraw();
|
|
370
|
+
this.flushAllBatches();
|
|
371
|
+
}
|
|
372
|
+
// === Point processing ===
|
|
373
|
+
processPoint(feature) {
|
|
374
|
+
this.processPointCoord(feature, feature.coordinates);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Add a MultiPoint to the point batch, part by part
|
|
378
|
+
*
|
|
379
|
+
* The coordinates are `Coordinate[]` (a part = one point). The style is per
|
|
380
|
+
* feature, so it is shared across all parts.
|
|
381
|
+
*/
|
|
382
|
+
processMultiPoint(feature) {
|
|
383
|
+
const parts = feature.coordinates;
|
|
384
|
+
for (const coord of parts) {
|
|
385
|
+
this.processPointCoord(feature, coord);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* The shared processing that adds one point to the batch (shared by Point and the parts
|
|
390
|
+
* of MultiPoint)
|
|
391
|
+
*/
|
|
392
|
+
processPointCoord(feature, coord) {
|
|
393
|
+
if (this.currentBatchType !== null && this.currentBatchType !== 'point') {
|
|
394
|
+
this.flushLineBatch();
|
|
395
|
+
// endSDFLineDraw is called only at the end of the frame (a performance optimization)
|
|
396
|
+
this.flushAllBatches();
|
|
397
|
+
}
|
|
398
|
+
this.currentBatchType = 'point';
|
|
399
|
+
const style = this.featureDrawer.getPointStyle(feature, this.layer);
|
|
400
|
+
const instancedShape = toInstancedPointShape(style.shape);
|
|
401
|
+
// The look of a Point does not change when it is selected; it is shown enclosed by a
|
|
402
|
+
// bounding box
|
|
403
|
+
// Therefore it is drawn with instancing even when selected
|
|
404
|
+
if (!instancedShape) {
|
|
405
|
+
if (this.pointBatches.size > 0) {
|
|
406
|
+
this.flushPointBatches();
|
|
407
|
+
}
|
|
408
|
+
// Shapes that do not support instancing are drawn individually, one point at a time
|
|
409
|
+
// (MultiPoint comes into this function part by part, so they are drawn per point)
|
|
410
|
+
this.featureDrawer.drawPointShape(coord, this.withLayerOpacity(style), this.zoom, feature.id);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// Color, size and stroke are instance attributes, so the batch key only needs the shape
|
|
414
|
+
const batchKey = instancedShape;
|
|
415
|
+
if (this.currentPointBatchKey !== null && this.currentPointBatchKey !== batchKey) {
|
|
416
|
+
this.flushPointBatches();
|
|
417
|
+
}
|
|
418
|
+
let batch = this.pointBatches.get(batchKey);
|
|
419
|
+
if (!batch) {
|
|
420
|
+
batch = { points: [], shape: batchKey };
|
|
421
|
+
this.pointBatches.set(batchKey, batch);
|
|
422
|
+
}
|
|
423
|
+
// Points occluded by the terrain are drawn faintly (ghost). This is the
|
|
424
|
+
// immediate path, rebuilt every frame, so it follows the camera movement directly.
|
|
425
|
+
batch.points.push({
|
|
426
|
+
...toPointInstanceData(coord, style),
|
|
427
|
+
ghost: anchorGhostOpacity(this.terrain, coord[0], coord[1]),
|
|
428
|
+
});
|
|
429
|
+
this.currentPointBatchKey = batchKey;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
flushPointBatches() {
|
|
433
|
+
for (const batch of this.pointBatches.values()) {
|
|
434
|
+
if (batch.points.length > 0) {
|
|
435
|
+
this.pointInstanceRenderer.drawAll(batch.points, batch.shape, this.zoom, this.factors);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
this.pointBatches.clear();
|
|
439
|
+
this.currentPointBatchKey = null;
|
|
440
|
+
}
|
|
441
|
+
// === LineString processing ===
|
|
442
|
+
processLineString(feature) {
|
|
443
|
+
this.processLineCoords(feature, feature.coordinates);
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Add a MultiLineString to the line batch, part by part
|
|
447
|
+
*
|
|
448
|
+
* The coordinates are `Coordinate[][]` (a part = one polyline).
|
|
449
|
+
*/
|
|
450
|
+
processMultiLineString(feature) {
|
|
451
|
+
const parts = feature.coordinates;
|
|
452
|
+
for (const coords of parts) {
|
|
453
|
+
if (coords.length < 2)
|
|
454
|
+
continue;
|
|
455
|
+
this.processLineCoords(feature, coords);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* The shared processing that adds one polyline to the batch (shared by LineString,
|
|
460
|
+
* Freehand and the parts of MultiLineString)
|
|
461
|
+
*/
|
|
462
|
+
processLineCoords(feature, coords) {
|
|
463
|
+
if (this.currentBatchType !== null && this.currentBatchType !== 'linestring') {
|
|
464
|
+
// endSDFLineDraw is called only at the end of the frame (a performance optimization)
|
|
465
|
+
this.flushLineBatch();
|
|
466
|
+
this.flushAllBatches();
|
|
467
|
+
}
|
|
468
|
+
this.currentBatchType = 'linestring';
|
|
469
|
+
const strokeStyle = this.featureDrawer.getLineStringStrokeStyle(feature, this.layer);
|
|
470
|
+
// A feature that has no createdZoom is drawn "constant in width on the screen". It is
|
|
471
|
+
// passed to the GPU as a negative fixed width and does not go through the shader's zoom
|
|
472
|
+
// conversion (the same convention as retained mode; at scale = 1, 2^(zoom - zoom) = 1, so
|
|
473
|
+
// the look does not change).
|
|
474
|
+
const fixedWidth = getCreatedZoom(feature) === undefined;
|
|
475
|
+
const createdZoom = getCreatedZoom(feature) ?? this.zoom;
|
|
476
|
+
// Compute the effective line width at the current zoom level
|
|
477
|
+
const effectiveStrokeWidth = strokeStyle.width * 2 ** (this.zoom - createdZoom);
|
|
478
|
+
// For dashed/dotted lines the dashes are computed on the CPU side
|
|
479
|
+
const dashPattern = getStrokeDashPattern(strokeStyle.lineStyle, effectiveStrokeWidth);
|
|
480
|
+
if (dashPattern) {
|
|
481
|
+
// They are drawn as solid lines, so the shape is treated as 'solid'
|
|
482
|
+
const shape = toLineBatchShape({ ...strokeStyle, lineStyle: 'solid' });
|
|
483
|
+
this.switchLineBatchShape(shape);
|
|
484
|
+
// Split into dashes on the CPU side. On the globe the path is cut along the Mercator
|
|
485
|
+
// plane first, so the dashes follow the path the solid line takes (globe-subdivision.ts)
|
|
486
|
+
const dashSegments = splitIntoDashes(densifyPathForGlobe(this.terrain, coords), dashPattern[0], dashPattern[1], this.zoom);
|
|
487
|
+
// Add each dash as an individual solid line
|
|
488
|
+
for (const segment of dashSegments) {
|
|
489
|
+
if (segment.coords.length >= 2) {
|
|
490
|
+
this.lineBatch.push(withFixedWidth(toLineBatchItem(segment.coords, feature.id, strokeStyle, createdZoom), fixedWidth));
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// For a solid line, as before
|
|
496
|
+
this.switchLineBatchShape(toLineBatchShape(strokeStyle));
|
|
497
|
+
this.lineBatch.push(withFixedWidth(toLineBatchItem(coords, feature.id, strokeStyle, createdZoom), fixedWidth));
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Switch the shape of the line batch
|
|
502
|
+
*
|
|
503
|
+
* It is flushed only when the shape (the dash kind) changes. The color is an
|
|
504
|
+
* instance attribute, so it does not split the batch.
|
|
505
|
+
*/
|
|
506
|
+
switchLineBatchShape(shape) {
|
|
507
|
+
const key = lineBatchKey(shape);
|
|
508
|
+
if (this.lineBatchShapeKey !== '' && this.lineBatchShapeKey !== key) {
|
|
509
|
+
this.flushLineBatch();
|
|
510
|
+
}
|
|
511
|
+
this.lineBatchShapeKey = key;
|
|
512
|
+
this.lineBatchShape = shape;
|
|
513
|
+
}
|
|
514
|
+
beginSDFLineDraw() {
|
|
515
|
+
if (!this.sdfLineDrawing && this.projectionData) {
|
|
516
|
+
this.sdfLineRenderer.beginDraw(this.projectionData, this.zoom);
|
|
517
|
+
this.sdfLineDrawing = true;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
endSDFLineDraw() {
|
|
521
|
+
if (this.sdfLineDrawing) {
|
|
522
|
+
this.sdfLineRenderer.endDraw();
|
|
523
|
+
this.sdfLineDrawing = false;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
flushLineBatch() {
|
|
527
|
+
if (this.lineBatch.length > 0 && this.lineBatchShape && this.projectionData) {
|
|
528
|
+
this.beginSDFLineDraw();
|
|
529
|
+
this.sdfLineRenderer.drawAll(this.lineBatch, this.lineBatchShape, this.zoom, this.projectionData, this.factors);
|
|
530
|
+
this.lineBatch.length = 0;
|
|
531
|
+
this.lineBatchShapeKey = '';
|
|
532
|
+
this.lineBatchShape = null;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// === Polygon processing ===
|
|
536
|
+
processPolygon(feature) {
|
|
537
|
+
const rings = feature.coordinates;
|
|
538
|
+
const outerRing = rings[0];
|
|
539
|
+
if (!outerRing || outerRing.length < 3)
|
|
540
|
+
return;
|
|
541
|
+
this.processPolygonRings(rings, feature);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Add a MultiPolygon to the hole-aware polygon batch, part by part
|
|
545
|
+
*
|
|
546
|
+
* The coordinates are `Coordinate[][][]` (a part = an array of rings; rings[0] is the
|
|
547
|
+
* outer ring and the rest are inner rings).
|
|
548
|
+
* The key of the earcut cache includes the part index as well.
|
|
549
|
+
*/
|
|
550
|
+
processMultiPolygon(feature) {
|
|
551
|
+
const parts = feature.coordinates;
|
|
552
|
+
for (let partIndex = 0; partIndex < parts.length; partIndex++) {
|
|
553
|
+
const rings = parts[partIndex];
|
|
554
|
+
const outerRing = rings?.[0];
|
|
555
|
+
if (!outerRing || outerRing.length < 3)
|
|
556
|
+
continue;
|
|
557
|
+
this.processPolygonRings(rings, feature, partIndex);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// === Circle processing ===
|
|
561
|
+
processCircle(feature) {
|
|
562
|
+
const center = feature.coordinates;
|
|
563
|
+
const radiusMeters = getCircleRadius(feature);
|
|
564
|
+
if (!radiusMeters || radiusMeters <= 0)
|
|
565
|
+
return;
|
|
566
|
+
// Convert the circle into a polygon (a Circle is always a single ring)
|
|
567
|
+
const circleCoords = generateCirclePolygon(center, radiusMeters);
|
|
568
|
+
this.processPolygonRings([circleCoords], feature);
|
|
569
|
+
}
|
|
570
|
+
// === Processing shared by Polygon and Circle ===
|
|
571
|
+
/**
|
|
572
|
+
* The shared processing that adds an array of polygon rings to a batch
|
|
573
|
+
*
|
|
574
|
+
* Shared by Polygon ([0] is the outer ring, [1..] are the inner rings), Circle
|
|
575
|
+
* (a polygon approximation with a single ring) and each part of a MultiPolygon.
|
|
576
|
+
*
|
|
577
|
+
* @param partIndex The part index of a MultiPolygon (for the key of the earcut cache)
|
|
578
|
+
*/
|
|
579
|
+
processPolygonRings(rings, feature, partIndex = 0) {
|
|
580
|
+
if (this.currentBatchType !== null && this.currentBatchType !== 'polygon') {
|
|
581
|
+
this.flushLineBatch();
|
|
582
|
+
this.flushAllBatches();
|
|
583
|
+
}
|
|
584
|
+
this.currentBatchType = 'polygon';
|
|
585
|
+
const { fillColor, strokeStyle } = this.featureDrawer.getPolygonStyles(feature, this.layer);
|
|
586
|
+
// The outline of a feature that has no createdZoom uses a negative fixed width (the same
|
|
587
|
+
// convention as withFixedWidth; collectPolygons in retained mode does the same).
|
|
588
|
+
const fixedWidth = getCreatedZoom(feature) === undefined;
|
|
589
|
+
const createdZoom = getCreatedZoom(feature) ?? this.zoom;
|
|
590
|
+
const effectiveStrokeWidth = strokeStyle.width * 2 ** (this.zoom - createdZoom);
|
|
591
|
+
const isDashed = strokeStyle.lineStyle !== 'solid';
|
|
592
|
+
if (strokeStyle.opacity > 0 && !isDashed) {
|
|
593
|
+
// For a solid line: drawn all at once by SDFPolygonRenderer
|
|
594
|
+
this.flushPolygonFillBatch();
|
|
595
|
+
this.sdfPolygonBatch.push({
|
|
596
|
+
coordinates: rings,
|
|
597
|
+
style: {
|
|
598
|
+
fillColor,
|
|
599
|
+
fillOpacity: 1,
|
|
600
|
+
strokeColor: strokeStyle.color,
|
|
601
|
+
strokeWidth: fixedWidth ? -strokeStyle.width : strokeStyle.width,
|
|
602
|
+
strokeOpacity: 1,
|
|
603
|
+
},
|
|
604
|
+
createdZoom,
|
|
605
|
+
featureId: feature.id,
|
|
606
|
+
partIndex,
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
else if (strokeStyle.opacity > 0 && isDashed) {
|
|
610
|
+
// For a dashed/dotted line: the fill goes to PolygonBatchRenderer, and the stroke
|
|
611
|
+
// is split into dashes on the CPU side and drawn by SDFLineRenderer
|
|
612
|
+
this.addPolygonDashedStroke(rings, feature.id, fillColor, strokeStyle, effectiveStrokeWidth, createdZoom, partIndex, fixedWidth);
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
// When there is no stroke: the fill only
|
|
616
|
+
this.flushSdfPolygonBatch();
|
|
617
|
+
if (fillColor[3] > 0) {
|
|
618
|
+
this.polygonFillBatch.push({
|
|
619
|
+
coordinates: rings,
|
|
620
|
+
color: this.colorWithLayerOpacity(fillColor),
|
|
621
|
+
featureId: feature.id,
|
|
622
|
+
partIndex,
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Processing of the dashed/dotted stroke of a polygon
|
|
629
|
+
*/
|
|
630
|
+
addPolygonDashedStroke(rings, featureId, fillColor, strokeStyle, effectiveStrokeWidth, createdZoom, partIndex = 0, fixedWidth = false) {
|
|
631
|
+
this.flushSdfPolygonBatch();
|
|
632
|
+
// Draw the fill (inner rings are punched out as holes)
|
|
633
|
+
if (fillColor[3] > 0) {
|
|
634
|
+
this.polygonFillBatch.push({
|
|
635
|
+
coordinates: rings,
|
|
636
|
+
color: this.colorWithLayerOpacity(fillColor),
|
|
637
|
+
featureId,
|
|
638
|
+
partIndex,
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
this.flushPolygonFillBatch();
|
|
642
|
+
// They are drawn as solid lines, so the shape is treated as 'solid'
|
|
643
|
+
this.switchLineBatchShape(toLineBatchShape({ ...strokeStyle, lineStyle: 'solid' }));
|
|
644
|
+
// Split into dashes on the CPU side (the outer ring and each inner ring are drawn as
|
|
645
|
+
// closed paths)
|
|
646
|
+
const dashPattern = getStrokeDashPattern(strokeStyle.lineStyle, effectiveStrokeWidth);
|
|
647
|
+
if (dashPattern) {
|
|
648
|
+
for (const ring of rings) {
|
|
649
|
+
if (ring.length < 3)
|
|
650
|
+
continue;
|
|
651
|
+
// To draw it as a closed path, the first point is appended at the end
|
|
652
|
+
const closedCoords = [...ring];
|
|
653
|
+
const first = closedCoords[0];
|
|
654
|
+
const last = closedCoords[closedCoords.length - 1];
|
|
655
|
+
if (first[0] !== last[0] || first[1] !== last[1]) {
|
|
656
|
+
closedCoords.push(first);
|
|
657
|
+
}
|
|
658
|
+
const dashSegments = splitIntoDashes(densifyPathForGlobe(this.terrain, closedCoords), dashPattern[0], dashPattern[1], this.zoom);
|
|
659
|
+
for (const segment of dashSegments) {
|
|
660
|
+
if (segment.coords.length >= 2) {
|
|
661
|
+
this.lineBatch.push(withFixedWidth(toLineBatchItem(segment.coords, featureId, strokeStyle, createdZoom), fixedWidth));
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
flushPolygonFillBatch() {
|
|
668
|
+
if (this.polygonFillBatch.length > 0 && this.projectionData) {
|
|
669
|
+
this.polygonBatchRenderer.drawBatch(this.polygonFillBatch, this.projectionData, this.zoom);
|
|
670
|
+
this.polygonFillBatch.length = 0;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
flushSdfPolygonBatch() {
|
|
674
|
+
if (this.sdfPolygonBatch.length > 0 && this.projectionData) {
|
|
675
|
+
this.sdfPolygonRenderer.drawBatch(this.sdfPolygonBatch, this.projectionData, this.zoom, [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight], this.factors);
|
|
676
|
+
this.sdfPolygonBatch.length = 0;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* A color with the opacity of the layer multiplied into its alpha (for the fill-only polygon
|
|
681
|
+
* batch, whose colors are per vertex and which has no factor uniform)
|
|
682
|
+
*/
|
|
683
|
+
colorWithLayerOpacity(color) {
|
|
684
|
+
const opacity = this.factors.opacity;
|
|
685
|
+
return opacity === 1 ? color : [color[0], color[1], color[2], color[3] * opacity];
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* A point style with the opacity of the layer multiplied in (for the per-point renderer, which
|
|
689
|
+
* has no factor uniform)
|
|
690
|
+
*/
|
|
691
|
+
withLayerOpacity(style) {
|
|
692
|
+
const opacity = this.factors.opacity;
|
|
693
|
+
if (opacity === 1)
|
|
694
|
+
return style;
|
|
695
|
+
return {
|
|
696
|
+
...style,
|
|
697
|
+
fillOpacity: style.fillOpacity * opacity,
|
|
698
|
+
strokeOpacity: style.strokeOpacity * opacity,
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
flushAllBatches() {
|
|
702
|
+
if (this.pointBatches.size > 0) {
|
|
703
|
+
this.flushPointBatches();
|
|
704
|
+
}
|
|
705
|
+
if (this.polygonFillBatch.length > 0) {
|
|
706
|
+
this.flushPolygonFillBatch();
|
|
707
|
+
}
|
|
708
|
+
if (this.sdfPolygonBatch.length > 0) {
|
|
709
|
+
this.flushSdfPolygonBatch();
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Create a BatchManager
|
|
715
|
+
*/
|
|
716
|
+
export function createBatchManager(deps) {
|
|
717
|
+
return new BatchManager(deps);
|
|
718
|
+
}
|