@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,567 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { resolveContentPixelRatio, resolvePixelRatio } from '../../../shared/utils/pixel-ratio.js';
|
|
4
|
+
import { calculateOffsetUniforms, createProgram } from '../../shaders/helpers.js';
|
|
5
|
+
import { ProjectionUniformManager } from '../../shaders/projection.js';
|
|
6
|
+
import { TerrainContext } from '../../terrain/context.js';
|
|
7
|
+
import { NEUTRAL_DRAW_FACTORS } from '../draw-factors.js';
|
|
8
|
+
import { buildLineBatchArrays, buildPackedLineBatchArrays, defaultLineOrigin, growFloat32, INSTANCE_STRIDE, lineStationsOnMercatorPlane, maxInstanceSegmentMercator, normalizeOrigin, resolveLineStations, STATION_VERTICES, toLineInstanceColor, writeLineCoordTexels, writeLineInstances, } from './line-geometry.js';
|
|
9
|
+
import { createRetainedLineBatch, deleteRetainedLineBatch, ImmediateCoordTexture, patchRetainedCoordTexels, releaseInstanceAttribs, setupInstanceAttribs, setupQuadAttribs, } from './line-gl.js';
|
|
10
|
+
import { buildLineVertexSource, LINE_FRAGMENT_SOURCE } from './line-shader.js';
|
|
11
|
+
import { LineUniforms } from './line-uniforms.js';
|
|
12
|
+
/**
|
|
13
|
+
* SDFLineRenderer
|
|
14
|
+
*
|
|
15
|
+
* Line rendering with the HHAA approach
|
|
16
|
+
*/
|
|
17
|
+
export class SDFLineRenderer {
|
|
18
|
+
constructor(_map, gl, pixelRatio, terrain = new TerrainContext()) {
|
|
19
|
+
Object.defineProperty(this, "gl", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "program", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: null
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "variantName", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: ''
|
|
36
|
+
});
|
|
37
|
+
// Buffers for instancing
|
|
38
|
+
Object.defineProperty(this, "quadVAO", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: null
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(this, "quadVBO", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: null
|
|
49
|
+
});
|
|
50
|
+
// GPU resources reused in immediate mode
|
|
51
|
+
Object.defineProperty(this, "immCoordTexture", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: void 0
|
|
56
|
+
});
|
|
57
|
+
/** MAX_TEXTURE_SIZE of the context (read once, 0 = not read yet) */
|
|
58
|
+
Object.defineProperty(this, "maxTextureSize", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true,
|
|
62
|
+
value: 0
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Scratch arrays of the immediate draw of one line (grown, never shrunk)
|
|
66
|
+
*
|
|
67
|
+
* A frame of the immediate path draws every line in view one by one, and allocating two
|
|
68
|
+
* arrays per line puts the garbage collector under pressure on large data.
|
|
69
|
+
*/
|
|
70
|
+
Object.defineProperty(this, "scratchCoords", {
|
|
71
|
+
enumerable: true,
|
|
72
|
+
configurable: true,
|
|
73
|
+
writable: true,
|
|
74
|
+
value: new Float32Array(0)
|
|
75
|
+
});
|
|
76
|
+
Object.defineProperty(this, "scratchInstances", {
|
|
77
|
+
enumerable: true,
|
|
78
|
+
configurable: true,
|
|
79
|
+
writable: true,
|
|
80
|
+
value: new Float32Array(0)
|
|
81
|
+
});
|
|
82
|
+
Object.defineProperty(this, "immInstanceBuffer", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
configurable: true,
|
|
85
|
+
writable: true,
|
|
86
|
+
value: null
|
|
87
|
+
});
|
|
88
|
+
// State tracking within a frame
|
|
89
|
+
// isDrawing: a flag for skipping the recomputation of the projection uniforms and the
|
|
90
|
+
// viewport setup
|
|
91
|
+
// Note: the program and the VAO may be changed by other renderers, so they are always rebound
|
|
92
|
+
Object.defineProperty(this, "isDrawing", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
configurable: true,
|
|
95
|
+
writable: true,
|
|
96
|
+
value: false
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(this, "frameCount", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
configurable: true,
|
|
101
|
+
writable: true,
|
|
102
|
+
value: 0
|
|
103
|
+
});
|
|
104
|
+
// The renderer-specific uniforms and the record of the values written last
|
|
105
|
+
Object.defineProperty(this, "uniforms", {
|
|
106
|
+
enumerable: true,
|
|
107
|
+
configurable: true,
|
|
108
|
+
writable: true,
|
|
109
|
+
value: void 0
|
|
110
|
+
});
|
|
111
|
+
// Projection uniform management (shared)
|
|
112
|
+
Object.defineProperty(this, "projectionUniformManager", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
configurable: true,
|
|
115
|
+
writable: true,
|
|
116
|
+
value: void 0
|
|
117
|
+
});
|
|
118
|
+
// Stores the offset uniforms
|
|
119
|
+
Object.defineProperty(this, "offsetUniforms", {
|
|
120
|
+
enumerable: true,
|
|
121
|
+
configurable: true,
|
|
122
|
+
writable: true,
|
|
123
|
+
value: null
|
|
124
|
+
});
|
|
125
|
+
/** The injected rendering ratio (read from window each time when not injected) */
|
|
126
|
+
Object.defineProperty(this, "pixelRatio", {
|
|
127
|
+
enumerable: true,
|
|
128
|
+
configurable: true,
|
|
129
|
+
writable: true,
|
|
130
|
+
value: void 0
|
|
131
|
+
});
|
|
132
|
+
/** The terrain state of the draw instance this renderer belongs to */
|
|
133
|
+
Object.defineProperty(this, "terrain", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
configurable: true,
|
|
136
|
+
writable: true,
|
|
137
|
+
value: void 0
|
|
138
|
+
});
|
|
139
|
+
this.gl = gl;
|
|
140
|
+
this.pixelRatio = pixelRatio;
|
|
141
|
+
this.terrain = terrain;
|
|
142
|
+
this.uniforms = new LineUniforms(gl);
|
|
143
|
+
this.immCoordTexture = new ImmediateCoordTexture(gl);
|
|
144
|
+
this.projectionUniformManager = new ProjectionUniformManager(gl, { surface: true, terrain });
|
|
145
|
+
this.initBuffers();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Initializes the fixed quad vertex buffer
|
|
149
|
+
*/
|
|
150
|
+
initBuffers() {
|
|
151
|
+
const gl = this.gl;
|
|
152
|
+
this.quadVAO = gl.createVertexArray();
|
|
153
|
+
gl.bindVertexArray(this.quadVAO);
|
|
154
|
+
this.quadVBO = gl.createBuffer();
|
|
155
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVBO);
|
|
156
|
+
gl.bufferData(gl.ARRAY_BUFFER, STATION_VERTICES, gl.STATIC_DRAW);
|
|
157
|
+
setupQuadAttribs(gl);
|
|
158
|
+
gl.bindVertexArray(null);
|
|
159
|
+
// The instance buffer for immediate mode (orphaned and reused on every draw)
|
|
160
|
+
this.immInstanceBuffer = gl.createBuffer();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Called at the start of a frame
|
|
164
|
+
*
|
|
165
|
+
* @internal
|
|
166
|
+
*/
|
|
167
|
+
incrementFrame() {
|
|
168
|
+
this.frameCount++;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Begins drawing
|
|
172
|
+
*
|
|
173
|
+
* Sets the isDrawing flag to true and sets up the projection uniforms and the viewport.
|
|
174
|
+
* This lets subsequent draw()/drawBatch() calls skip those settings.
|
|
175
|
+
*
|
|
176
|
+
* @param projectionData MapLibre's ProjectionData
|
|
177
|
+
* @param zoom The current zoom level
|
|
178
|
+
*
|
|
179
|
+
* @internal
|
|
180
|
+
*/
|
|
181
|
+
beginDraw(projectionData, zoom) {
|
|
182
|
+
if (!this.program)
|
|
183
|
+
return;
|
|
184
|
+
const gl = this.gl;
|
|
185
|
+
gl.useProgram(this.program);
|
|
186
|
+
gl.bindVertexArray(this.quadVAO);
|
|
187
|
+
this.setProjectionUniforms(projectionData, zoom);
|
|
188
|
+
// Set the viewport size (the actual framebuffer size)
|
|
189
|
+
this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
|
|
190
|
+
this.isDrawing = true;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Ends drawing
|
|
194
|
+
*
|
|
195
|
+
* Resets the isDrawing flag to false.
|
|
196
|
+
* Calling it at the end of a frame makes the projection uniforms be set up again on the next
|
|
197
|
+
* frame.
|
|
198
|
+
*
|
|
199
|
+
* @internal
|
|
200
|
+
*/
|
|
201
|
+
endDraw() {
|
|
202
|
+
if (!this.isDrawing)
|
|
203
|
+
return;
|
|
204
|
+
const gl = this.gl;
|
|
205
|
+
releaseInstanceAttribs(gl);
|
|
206
|
+
this.isDrawing = false;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Gets the cache statistics
|
|
210
|
+
*
|
|
211
|
+
* @internal
|
|
212
|
+
*/
|
|
213
|
+
getCacheStats() {
|
|
214
|
+
return {
|
|
215
|
+
size: 0,
|
|
216
|
+
frameCount: this.frameCount,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Ensures the shader
|
|
221
|
+
*/
|
|
222
|
+
ensureShader(shaderData) {
|
|
223
|
+
if (this.variantName !== shaderData.variantName) {
|
|
224
|
+
if (this.program) {
|
|
225
|
+
this.gl.deleteProgram(this.program);
|
|
226
|
+
}
|
|
227
|
+
this.program = createProgram(this.gl, buildLineVertexSource(shaderData.vertexShaderPrelude, shaderData.define), LINE_FRAGMENT_SOURCE);
|
|
228
|
+
this.variantName = shaderData.variantName;
|
|
229
|
+
// Get the renderer-specific uniform locations (this also discards the record of the
|
|
230
|
+
// values written last, since a recreated program resets its uniforms)
|
|
231
|
+
this.uniforms.bind(this.program);
|
|
232
|
+
// Get the projection-related uniform locations (shared)
|
|
233
|
+
this.projectionUniformManager.getLocations(this.program);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Sets the uniforms for offset mode
|
|
238
|
+
*/
|
|
239
|
+
setOffsetUniforms(uniforms) {
|
|
240
|
+
this.offsetUniforms = uniforms;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Sets the projection uniforms (supporting offset mode and globe mode)
|
|
244
|
+
* @param projectionData MapLibre's ProjectionData
|
|
245
|
+
* @param zoom The current zoom level (used to switch offset mode)
|
|
246
|
+
*/
|
|
247
|
+
setProjectionUniforms(projectionData, zoom) {
|
|
248
|
+
this.projectionUniformManager.setUniforms(projectionData, zoom, this.offsetUniforms);
|
|
249
|
+
}
|
|
250
|
+
/** The largest side of a coordinate texture this GPU allows (MAX_TEXTURE_SIZE, read once) */
|
|
251
|
+
textureSizeLimit() {
|
|
252
|
+
if (this.maxTextureSize === 0) {
|
|
253
|
+
const max = Number(this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE));
|
|
254
|
+
this.maxTextureSize = Number.isFinite(max) && max > 0 ? max : 4096;
|
|
255
|
+
}
|
|
256
|
+
return this.maxTextureSize;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Executes the draw call (processing shared by draw/drawBatch)
|
|
260
|
+
*
|
|
261
|
+
* The coordinate texture and the instance buffer use the persistent immediate-mode
|
|
262
|
+
* resources. Finish the upload into `immCoordTexture` and the `bufferData` into instanceBuffer
|
|
263
|
+
* before calling it.
|
|
264
|
+
*/
|
|
265
|
+
executeDrawCall(instanceCount, texSize, shape, zoom, projectionData, widthOverride, stations, factors = NEUTRAL_DRAW_FACTORS) {
|
|
266
|
+
const gl = this.gl;
|
|
267
|
+
// The program and the VAO may have been changed by other renderers, so always bind them
|
|
268
|
+
gl.useProgram(this.program);
|
|
269
|
+
gl.bindVertexArray(this.quadVAO);
|
|
270
|
+
// The projection uniforms and the viewport are skipped when beginDraw() already set them
|
|
271
|
+
// (a performance optimization)
|
|
272
|
+
if (!this.isDrawing) {
|
|
273
|
+
this.setProjectionUniforms(projectionData, zoom);
|
|
274
|
+
this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
|
|
275
|
+
}
|
|
276
|
+
// Set up the instance attributes (stride = 48 bytes = 12 floats)
|
|
277
|
+
// vertexAttribPointer records the current ARRAY_BUFFER binding, so it must always be
|
|
278
|
+
// called with the instance buffer bound
|
|
279
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
|
|
280
|
+
setupInstanceAttribs(gl);
|
|
281
|
+
// Uniforms (color and opacity moved to instance attributes, so they are not here)
|
|
282
|
+
this.uniforms.setLineDraw(widthOverride, zoom, texSize, stations, lineStationsOnMercatorPlane(this.terrain));
|
|
283
|
+
// Always written (1 when the caller has none) so that no factor of an earlier draw is left
|
|
284
|
+
this.uniforms.setDrawFactors(factors);
|
|
285
|
+
// The coordinate texture (the sampler unit is written by LineUniforms.setLineDraw)
|
|
286
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
287
|
+
gl.bindTexture(gl.TEXTURE_2D, this.immCoordTexture.texture);
|
|
288
|
+
// The dash pattern
|
|
289
|
+
this.uniforms.setDash(shape, resolvePixelRatio(this.pixelRatio));
|
|
290
|
+
// Draw
|
|
291
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 2 * (stations + 1), instanceCount);
|
|
292
|
+
if (!this.isDrawing) {
|
|
293
|
+
releaseInstanceAttribs(gl);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Draws a line
|
|
298
|
+
*/
|
|
299
|
+
draw(coords, style, options, zoom, projectionData) {
|
|
300
|
+
if (!this.program || coords.length < 2 || !projectionData)
|
|
301
|
+
return;
|
|
302
|
+
const gl = this.gl;
|
|
303
|
+
// Get the rendering ratio (to convert CSS pixels into physical pixels)
|
|
304
|
+
//
|
|
305
|
+
// When there is a createdZoom (= the GPU scales with zoom), use the ratio without
|
|
306
|
+
// renderScale applied; for a fixed width drawn with u_width, use the ratio that includes
|
|
307
|
+
// renderScale (the "two ratios" in shared/utils/pixel-ratio.ts).
|
|
308
|
+
const screenDpr = resolvePixelRatio(this.pixelRatio);
|
|
309
|
+
const contentDpr = resolveContentPixelRatio(this.pixelRatio);
|
|
310
|
+
const n = coords.length;
|
|
311
|
+
// The texture size
|
|
312
|
+
const texSize = Math.max(2, Math.ceil(Math.sqrt(n)));
|
|
313
|
+
// Compute the relative coordinates on the CPU side (offset mode: computed at 64-bit
|
|
314
|
+
// precision)
|
|
315
|
+
const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
|
|
316
|
+
// The texture data (stores the relative coordinates). Only the first n texels are read,
|
|
317
|
+
// so what the reused array holds past them does not matter
|
|
318
|
+
this.scratchCoords = growFloat32(this.scratchCoords, texSize * texSize * 4);
|
|
319
|
+
const texData = this.scratchCoords.subarray(0, texSize * texSize * 4);
|
|
320
|
+
writeLineCoordTexels(texData, 0, coords, centerLngLat);
|
|
321
|
+
// Upload into the coordinate texture (the persistent texture is reused)
|
|
322
|
+
if (!this.immCoordTexture.upload(texData, texSize, this.textureSizeLimit()))
|
|
323
|
+
return;
|
|
324
|
+
// The instance data (12 floats per instance: indices(4) + extra(4) + color(4))
|
|
325
|
+
const instanceCount = n - 1;
|
|
326
|
+
this.scratchInstances = growFloat32(this.scratchInstances, instanceCount * INSTANCE_STRIDE);
|
|
327
|
+
const instanceData = this.scratchInstances.subarray(0, instanceCount * INSTANCE_STRIDE);
|
|
328
|
+
const instanceColor = toLineInstanceColor(style.color, style.opacity);
|
|
329
|
+
// Compute on the GPU when createdZoom is specified, otherwise use u_width
|
|
330
|
+
const useGpuScaling = options.createdZoom !== undefined;
|
|
331
|
+
// Convert the line width into physical pixels (CSS pixels * devicePixelRatio)
|
|
332
|
+
const strokeWidth = useGpuScaling ? style.width * contentDpr : 0;
|
|
333
|
+
const createdZoom = options.createdZoom ?? 0;
|
|
334
|
+
const maxSegmentMeters = writeLineInstances(instanceData, 0, 0, coords, {
|
|
335
|
+
closed: options.closed,
|
|
336
|
+
zoom,
|
|
337
|
+
dashPixelRatio: screenDpr,
|
|
338
|
+
// a_extra.y: the original line width (px); u_width is used when it is 0
|
|
339
|
+
strokeWidth,
|
|
340
|
+
createdZoom,
|
|
341
|
+
color: instanceColor,
|
|
342
|
+
});
|
|
343
|
+
// Only the globe reads the length on the Mercator plane
|
|
344
|
+
const maxSegmentMercator = lineStationsOnMercatorPlane(this.terrain)
|
|
345
|
+
? maxInstanceSegmentMercator(instanceData, instanceCount, zoom, screenDpr)
|
|
346
|
+
: 0;
|
|
347
|
+
// Upload into the instance buffer (orphaned and reused)
|
|
348
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
|
|
349
|
+
gl.bufferData(gl.ARRAY_BUFFER, instanceData, gl.STREAM_DRAW);
|
|
350
|
+
// widthOverride: the GPU computation (0) when createdZoom is specified, otherwise u_width
|
|
351
|
+
// Convert the line width into physical pixels (CSS pixels * devicePixelRatio)
|
|
352
|
+
const widthOverride = useGpuScaling ? 0 : style.width * screenDpr;
|
|
353
|
+
this.executeDrawCall(instanceCount, texSize, { lineStyle: style.lineStyle, dashArray: style.dashArray }, zoom, projectionData, widthOverride, resolveLineStations(this.terrain, maxSegmentMeters, instanceCount, maxSegmentMercator));
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Draws a closed path
|
|
357
|
+
*/
|
|
358
|
+
drawClosed(coords, style, options, zoom, projectionData) {
|
|
359
|
+
if (coords.length < 3)
|
|
360
|
+
return;
|
|
361
|
+
// Remove the duplicate when the first and last points are the same
|
|
362
|
+
let closedCoords = coords;
|
|
363
|
+
const first = coords[0];
|
|
364
|
+
const last = coords[coords.length - 1];
|
|
365
|
+
if (first[0] === last[0] && first[1] === last[1]) {
|
|
366
|
+
closedCoords = coords.slice(0, -1);
|
|
367
|
+
}
|
|
368
|
+
// Draw it as a closed path
|
|
369
|
+
const loopCoords = [...closedCoords, closedCoords[0]];
|
|
370
|
+
this.draw(loopCoords, style, { ...options, closed: true }, zoom, projectionData);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Batch-draws multiple lines (per-instance colors)
|
|
374
|
+
*
|
|
375
|
+
* Color and opacity are passed as instance attributes, so even when the color differs from
|
|
376
|
+
* one line to the next, they can be drawn in one draw call as long as the shape parameters
|
|
377
|
+
* (the dash kind) are the same.
|
|
378
|
+
*
|
|
379
|
+
* @param items The line data (carrying the color, opacity, and width per line)
|
|
380
|
+
* @param shape The per-batch shape parameters, such as the dash kind
|
|
381
|
+
* @param factors The factors used at draw time (the opacity of the layer being drawn; 1x
|
|
382
|
+
* scale and opacity 1 when omitted)
|
|
383
|
+
*
|
|
384
|
+
* @internal
|
|
385
|
+
*/
|
|
386
|
+
drawAll(items, shape, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
|
|
387
|
+
if (!this.program || items.length === 0)
|
|
388
|
+
return;
|
|
389
|
+
const gl = this.gl;
|
|
390
|
+
// Compute the relative coordinates on the CPU side (offset mode: computed at 64-bit
|
|
391
|
+
// precision)
|
|
392
|
+
const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
|
|
393
|
+
const arrays = buildLineBatchArrays(items, zoom, centerLngLat, this.pixelRatio);
|
|
394
|
+
if (!arrays)
|
|
395
|
+
return;
|
|
396
|
+
// Upload into the coordinate texture (the persistent texture is reused)
|
|
397
|
+
if (!this.immCoordTexture.upload(arrays.texData, arrays.texSize, this.textureSizeLimit())) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Upload into the instance buffer (orphaned and reused)
|
|
401
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
|
|
402
|
+
gl.bufferData(gl.ARRAY_BUFFER, arrays.instanceData, gl.STREAM_DRAW);
|
|
403
|
+
this.executeDrawCall(arrays.instanceCount, arrays.texSize, shape, zoom, projectionData, 0, resolveLineStations(this.terrain, arrays.maxSegmentMeters, arrays.instanceCount, arrays.maxSegmentMercator), factors);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Builds a retained-mode line batch
|
|
407
|
+
*
|
|
408
|
+
* It creates the coordinate texture, the instance buffer, and the VAO so that on later
|
|
409
|
+
* frames `drawRetainedBatch` can draw with nothing but a bind, the uniforms, and the draw
|
|
410
|
+
* call. The vertex data does not depend on the camera (the projection is done by the
|
|
411
|
+
* uniforms on every frame).
|
|
412
|
+
*
|
|
413
|
+
* @param items The line data (carrying the color, opacity, and width per line)
|
|
414
|
+
* @param shape The per-batch shape parameters, such as the dash kind
|
|
415
|
+
* @param options The origin of the relative coordinates and the zoom for the line-width
|
|
416
|
+
* computation
|
|
417
|
+
* @returns The built batch, or null when the shader is not initialized or there are not
|
|
418
|
+
* enough coordinates
|
|
419
|
+
*
|
|
420
|
+
* @internal
|
|
421
|
+
*/
|
|
422
|
+
buildRetainedBatch(items, shape, options = {}) {
|
|
423
|
+
if (!this.program || items.length === 0)
|
|
424
|
+
return null;
|
|
425
|
+
// The origin of the relative coordinates is fixed per batch (it must not depend on the
|
|
426
|
+
// camera center)
|
|
427
|
+
const origin = normalizeOrigin(options.origin ?? defaultLineOrigin(items));
|
|
428
|
+
const arrays = buildLineBatchArrays(items, options.distanceZoom ?? 0, origin, this.pixelRatio);
|
|
429
|
+
if (!arrays)
|
|
430
|
+
return null;
|
|
431
|
+
return createRetainedLineBatch(this.gl, arrays, shape, origin, options.widthZoom ?? null, this.textureSizeLimit());
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Builds a retained-mode line batch from packed lines
|
|
435
|
+
*
|
|
436
|
+
* The same batch as `buildRetainedBatch` builds for the same lines, without an array per line.
|
|
437
|
+
*
|
|
438
|
+
* @returns The built batch, or null when the shader is not initialized or there are not
|
|
439
|
+
* enough coordinates
|
|
440
|
+
*
|
|
441
|
+
* @internal
|
|
442
|
+
*/
|
|
443
|
+
buildRetainedPackedBatch(lines, shape, options = {}) {
|
|
444
|
+
if (!this.program || lines.count === 0)
|
|
445
|
+
return null;
|
|
446
|
+
const first = lines.start[0] * lines.stride;
|
|
447
|
+
const origin = normalizeOrigin(options.origin ?? [lines.coords[first] ?? 0, lines.coords[first + 1] ?? 0]);
|
|
448
|
+
const arrays = buildPackedLineBatchArrays(lines, options.distanceZoom ?? 0, origin, this.pixelRatio);
|
|
449
|
+
if (!arrays)
|
|
450
|
+
return null;
|
|
451
|
+
return createRetainedLineBatch(this.gl, arrays, shape, origin, options.widthZoom ?? null, this.textureSizeLimit());
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Draws a retained-mode line batch
|
|
455
|
+
*
|
|
456
|
+
* It neither creates textures nor calls bufferData. The projection uniforms are recomputed
|
|
457
|
+
* every frame from the origin coordinate of the batch (the vertex data is not rebuilt).
|
|
458
|
+
*
|
|
459
|
+
* @param factors The factors used at draw time (when omitted, 1x scale and opacity 1, the
|
|
460
|
+
* same as before)
|
|
461
|
+
*
|
|
462
|
+
* @internal
|
|
463
|
+
*/
|
|
464
|
+
drawRetainedBatch(batch, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
|
|
465
|
+
if (!this.program || batch.instanceCount === 0)
|
|
466
|
+
return;
|
|
467
|
+
const gl = this.gl;
|
|
468
|
+
gl.useProgram(this.program);
|
|
469
|
+
gl.bindVertexArray(batch.vao);
|
|
470
|
+
// The center of linearization is aligned with the camera center (linearizing around the
|
|
471
|
+
// origin coordinate of the batch turns the residual of the Mercator approximation into a
|
|
472
|
+
// displacement of pixel magnitude at vertices far from the center).
|
|
473
|
+
// The vertices are relative to the origin coordinate, so that difference is passed via
|
|
474
|
+
// u_origin_shift
|
|
475
|
+
const cameraUniforms = this.offsetUniforms;
|
|
476
|
+
if (cameraUniforms) {
|
|
477
|
+
this.projectionUniformManager.setUniforms(projectionData, zoom, cameraUniforms, [
|
|
478
|
+
batch.origin[0] - cameraUniforms.centerLngLat[0],
|
|
479
|
+
batch.origin[1] - cameraUniforms.centerLngLat[1],
|
|
480
|
+
]);
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
// Fallback (normally custom-layer has already called setOffsetUniforms each frame)
|
|
484
|
+
this.projectionUniformManager.setUniforms(projectionData, zoom, calculateOffsetUniforms(batch.origin, projectionData.mainMatrix));
|
|
485
|
+
}
|
|
486
|
+
this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
|
|
487
|
+
const stations = resolveLineStations(this.terrain, batch.maxSegmentMeters, batch.instanceCount, batch.maxSegmentMercator);
|
|
488
|
+
this.uniforms.setLineDraw(0, batch.widthZoom ?? zoom, batch.texSize, stations, lineStationsOnMercatorPlane(this.terrain));
|
|
489
|
+
this.uniforms.setDrawFactors(factors);
|
|
490
|
+
// The coordinate texture (the sampler unit is written by LineUniforms.setLineDraw)
|
|
491
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
492
|
+
gl.bindTexture(gl.TEXTURE_2D, batch.texture);
|
|
493
|
+
this.uniforms.setDash(batch.shape, resolvePixelRatio(this.pixelRatio));
|
|
494
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 2 * (stations + 1), batch.instanceCount);
|
|
495
|
+
gl.bindVertexArray(null);
|
|
496
|
+
// When this interrupted an immediate-mode frame, restore the shared VAO and the projection
|
|
497
|
+
// uniforms (because the subsequent drawAll assumes the state set up by beginDraw)
|
|
498
|
+
if (this.isDrawing) {
|
|
499
|
+
gl.bindVertexArray(this.quadVAO);
|
|
500
|
+
this.setProjectionUniforms(projectionData, zoom);
|
|
501
|
+
// Leave no residual factors either (executeDrawCall rewrites them too, but the restoring
|
|
502
|
+
// side closes the loop)
|
|
503
|
+
this.uniforms.setDrawFactors(NEUTRAL_DRAW_FACTORS);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Partially updates the coordinate texture of a retained batch (applying the diff from a
|
|
508
|
+
* vertex drag)
|
|
509
|
+
*
|
|
510
|
+
* Rebuilding the batch every time a single vertex moves overflows the frame for lines with
|
|
511
|
+
* many vertices. The coordinates live in the texture, so rewriting only the texel of the
|
|
512
|
+
* vertex that moved is enough.
|
|
513
|
+
*
|
|
514
|
+
* The instance array is not touched. The indices (a_indices) are invariant as topology as
|
|
515
|
+
* long as the number of coordinates does not change, and the miter computation follows
|
|
516
|
+
* automatically because the shader reads them back with texelFetch. a_extra.x (the
|
|
517
|
+
* cumulative distance) and a_extra.w (the segment length) are left stale, but those are
|
|
518
|
+
* dash-only values, and a retained-mode line batch is always solid (dashed lines go through
|
|
519
|
+
* immediate mode). Both the line width and the caps are computed from lengths recomputed in
|
|
520
|
+
* screen space, so there is no visual impact. Those values return to correct ones on the
|
|
521
|
+
* next full rebuild (a style change, a change in the number of vertices, and so on).
|
|
522
|
+
*
|
|
523
|
+
* There is also no need to rebuild after the drag is committed. The last patch applied is
|
|
524
|
+
* the committed value as it stands.
|
|
525
|
+
*
|
|
526
|
+
* @param updates The running index within the coordinate texture and the new longitude and
|
|
527
|
+
* latitude of that vertex
|
|
528
|
+
*
|
|
529
|
+
* @internal
|
|
530
|
+
*/
|
|
531
|
+
patchRetainedBatchCoords(batch, updates) {
|
|
532
|
+
patchRetainedCoordTexels(this.gl, batch, updates);
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Disposes of a retained-mode line batch
|
|
536
|
+
*
|
|
537
|
+
* @internal
|
|
538
|
+
*/
|
|
539
|
+
disposeRetainedBatch(batch) {
|
|
540
|
+
deleteRetainedLineBatch(this.gl, batch);
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Disposes of the resources
|
|
544
|
+
*
|
|
545
|
+
* @internal
|
|
546
|
+
*/
|
|
547
|
+
dispose() {
|
|
548
|
+
const gl = this.gl;
|
|
549
|
+
if (this.program) {
|
|
550
|
+
gl.deleteProgram(this.program);
|
|
551
|
+
this.program = null;
|
|
552
|
+
}
|
|
553
|
+
if (this.quadVAO) {
|
|
554
|
+
gl.deleteVertexArray(this.quadVAO);
|
|
555
|
+
this.quadVAO = null;
|
|
556
|
+
}
|
|
557
|
+
if (this.quadVBO) {
|
|
558
|
+
gl.deleteBuffer(this.quadVBO);
|
|
559
|
+
this.quadVBO = null;
|
|
560
|
+
}
|
|
561
|
+
this.immCoordTexture.dispose();
|
|
562
|
+
if (this.immInstanceBuffer) {
|
|
563
|
+
gl.deleteBuffer(this.immInstanceBuffer);
|
|
564
|
+
this.immInstanceBuffer = null;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a draw callback with the depth test off, then restores the depth test as it was.
|
|
3
|
+
*
|
|
4
|
+
* Use it around anything drawn as a billboard (a marker or an icon facing the screen) so that
|
|
5
|
+
* the terrain mesh does not cut it in half. Polygons and lines should stay depth-tested.
|
|
6
|
+
*
|
|
7
|
+
* @param gl The WebGL context of the map
|
|
8
|
+
* @param draw The drawing to run
|
|
9
|
+
*/
|
|
10
|
+
export declare function drawBillboardsWithoutDepth(gl: WebGL2RenderingContext, draw: () => void): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Draws symbols (billboards and glyphs) with the depth test disabled.
|
|
5
|
+
*
|
|
6
|
+
* A point is lifted to the elevation of its anchor and then drawn as a billboard that faces
|
|
7
|
+
* the screen. The lower half of the billboard sits below the anchor, so testing it against the
|
|
8
|
+
* depth of the terrain mesh buries it in the ground and clips it away, leaving the point as a
|
|
9
|
+
* half circle. Whether something is hidden by the terrain is the job of the occlusion ghost
|
|
10
|
+
* (occlusion.ts), not of the depth test, so the depth test is always disabled here.
|
|
11
|
+
*
|
|
12
|
+
* The responsibility for disabling the depth test belongs to the renderer. Disabling it in
|
|
13
|
+
* custom-layer instead means it gets forgotten in configurations where the analytic drape is
|
|
14
|
+
* unavailable (a single dataset makes canDrape false). That is exactly what the
|
|
15
|
+
* "only points of datasets become half circles" defect was.
|
|
16
|
+
*
|
|
17
|
+
* Billboards are not drawn in a single place. Both the instanced billboard (point-instance) and
|
|
18
|
+
* the per-point shapes (point-shape: triangle, star, icon, and the degenerate path for the
|
|
19
|
+
* default circle) draw billboards. Wrapping only the instanced side leaves hand-drawn points as
|
|
20
|
+
* half circles. A hand-drawn Point may be taken over by a registered CustomFeatureRenderer,
|
|
21
|
+
* and then never goes through the instanced path at all. That is why this function is shared
|
|
22
|
+
* by every renderer that draws billboards. SDF glyphs laid flat on the map plane (text that is
|
|
23
|
+
* not painted into a ground quad) go through here for the same reason.
|
|
24
|
+
* A glyph is a flat quad given elevation at its four corners, so, having no subdivision, its
|
|
25
|
+
* strokes get shaved off where the terrain pokes through from the inside and the text looks
|
|
26
|
+
* broken.
|
|
27
|
+
*
|
|
28
|
+
* The original state is always restored. Polygons and lines must be hidden correctly by the
|
|
29
|
+
* depth of the terrain mesh.
|
|
30
|
+
*
|
|
31
|
+
* The original state is read from the record in `layer/depth-state.ts`. It must not be queried
|
|
32
|
+
* with `gl.isEnabled` every time (that is a synchronous GPU round trip, and on a map with
|
|
33
|
+
* thousands of labels a single frame reaches tens of seconds).
|
|
34
|
+
*/
|
|
35
|
+
import { isDepthTestEnabled, setDepthTestEnabled } from '../../layer/depth-state.js';
|
|
36
|
+
/**
|
|
37
|
+
* Runs a draw callback with the depth test off, then restores the depth test as it was.
|
|
38
|
+
*
|
|
39
|
+
* Use it around anything drawn as a billboard (a marker or an icon facing the screen) so that
|
|
40
|
+
* the terrain mesh does not cut it in half. Polygons and lines should stay depth-tested.
|
|
41
|
+
*
|
|
42
|
+
* @param gl The WebGL context of the map
|
|
43
|
+
* @param draw The drawing to run
|
|
44
|
+
*/
|
|
45
|
+
export function drawBillboardsWithoutDepth(gl, draw) {
|
|
46
|
+
const depthWasEnabled = isDepthTestEnabled(gl);
|
|
47
|
+
if (depthWasEnabled)
|
|
48
|
+
setDepthTestEnabled(gl, false);
|
|
49
|
+
try {
|
|
50
|
+
draw();
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
if (depthWasEnabled)
|
|
54
|
+
setDepthTestEnabled(gl, true);
|
|
55
|
+
}
|
|
56
|
+
}
|