@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,604 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { DRAPE_BLOCK_EDGES, drapeQuantizedGeometry } from './geometry.js';
|
|
4
|
+
/** The minimum number of divisions of the grid (per side) */
|
|
5
|
+
export const DRAPE_MIN_CELLS = 8;
|
|
6
|
+
/** The maximum number of divisions of the grid (per side) */
|
|
7
|
+
export const DRAPE_MAX_CELLS = 64;
|
|
8
|
+
/**
|
|
9
|
+
* The maximum number of divisions of the grid (per side) allowed on a retry
|
|
10
|
+
*
|
|
11
|
+
* Only when cells that exceed the budget remain is the grid made this fine and rebuilt.
|
|
12
|
+
*/
|
|
13
|
+
export const DRAPE_RETRY_MAX_CELLS = 128;
|
|
14
|
+
/**
|
|
15
|
+
* The target number of edges to put into one cell (the grid is made finer so as not to exceed it)
|
|
16
|
+
*
|
|
17
|
+
* It is set at half of the upper limit of the work per pixel (DRAPE_MAX_CELL_WORK). If the
|
|
18
|
+
* target were the same as the limit, even a single straightforward feature would sit right at
|
|
19
|
+
* the limit and unnecessary quantization would be applied.
|
|
20
|
+
*/
|
|
21
|
+
export const DRAPE_TARGET_EDGES_PER_CELL = 12;
|
|
22
|
+
/** The target number of elements to put into one cell (this decides the number of runs) */
|
|
23
|
+
export const DRAPE_TARGET_ELEMENTS_PER_CELL = 4;
|
|
24
|
+
/** The maximum number of edges one cell can hold (a cell that exceeds it signals degradation) */
|
|
25
|
+
export const DRAPE_MAX_EDGES_PER_CELL = 256;
|
|
26
|
+
/**
|
|
27
|
+
* The maximum number of runs (the span of one feature) one cell can hold
|
|
28
|
+
*
|
|
29
|
+
* A cell that exceeds it is truncated inside that cell alone (the elements at the back of the
|
|
30
|
+
* draw order = in front are dropped). The only cells this applies to are those of a coarse
|
|
31
|
+
* distant tile where dozens of items overlap in a single pixel. The map as a whole is never
|
|
32
|
+
* degraded.
|
|
33
|
+
*/
|
|
34
|
+
export const DRAPE_MAX_RUNS_PER_CELL = 128;
|
|
35
|
+
/**
|
|
36
|
+
* The maximum number of edges handled by a single tile
|
|
37
|
+
*
|
|
38
|
+
* First the vertices are quantized onto a grid (LOD) to make them fit. A tile that still
|
|
39
|
+
* exceeds the limit is not built and returns the degradation signal instead (discarding it
|
|
40
|
+
* after building would stall the frame for exactly that long).
|
|
41
|
+
*
|
|
42
|
+
* The value was taken from measurements. Putting 8,172 administrative boundaries (about 1.1
|
|
43
|
+
* million vertices) through a single tile, building the index takes 0.8ms at z13, 1.2ms at
|
|
44
|
+
* z12, 4.0ms at z11, 15.6ms at z10 and 23.4ms at z9. 200,000 edges is roughly 20ms, and the
|
|
45
|
+
* only tiles that reach this amount are the coarse ones, of which there are just a few in the
|
|
46
|
+
* view (they are built only once, and after that the cache of the tile index takes over). The
|
|
47
|
+
* amount for the whole view is held down separately by the budget of the edge texture
|
|
48
|
+
* (DRAPE_MAX_EDGE_TEXELS in bin-store).
|
|
49
|
+
*/
|
|
50
|
+
export const DRAPE_MAX_EDGES_PER_TILE = 200000;
|
|
51
|
+
/**
|
|
52
|
+
* The upper limit of the amount solved per cell (the average of runs + edges)
|
|
53
|
+
*
|
|
54
|
+
* A fragment walks the runs of its own cell in order and, for each run, sweeps the edges of
|
|
55
|
+
* that cell. The work per pixel is therefore roughly "the number of runs + the number of edges
|
|
56
|
+
* of that cell". When the map is zoomed far out, nested administrative areas (prefectures,
|
|
57
|
+
* districts, municipalities) and neighboring areas pile up dozens deep in a single cell and
|
|
58
|
+
* this amount jumps. In measurements it reached 500ms per frame over the whole Kanto region at
|
|
59
|
+
* z8.7.
|
|
60
|
+
*
|
|
61
|
+
* A tile that exceeds this is not suited to the analytic evaluation. The vertex displacement
|
|
62
|
+
* path takes it over (in a zoomed-out view the relief of the terrain is small on screen, so
|
|
63
|
+
* vertex displacement does not break down either).
|
|
64
|
+
*
|
|
65
|
+
* The actual limit is scaled up by the number of tiles in the view. The screen is shared out
|
|
66
|
+
* among the tiles, so the more tiles there are the fewer pixels each one has, and the same
|
|
67
|
+
* work per pixel costs less for the frame as a whole (`drapeCellWorkBudget`).
|
|
68
|
+
*/
|
|
69
|
+
export const DRAPE_MAX_CELL_WORK = 24;
|
|
70
|
+
/**
|
|
71
|
+
* Derives the upper limit of the work per cell from the number of tiles in the view
|
|
72
|
+
*/
|
|
73
|
+
export function drapeCellWorkBudget(tileCount) {
|
|
74
|
+
const factor = Math.min(8, Math.max(1, tileCount / 4));
|
|
75
|
+
return DRAPE_MAX_CELL_WORK * factor;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The number of edges at which the vertices start being quantized onto a grid
|
|
79
|
+
*
|
|
80
|
+
* A tile below this solves the original geometry as it is (every view at a normal zoom is on
|
|
81
|
+
* this side, and quantization applies only to coarse distant tiles).
|
|
82
|
+
*/
|
|
83
|
+
export const DRAPE_LOD_TRIGGER = 16000;
|
|
84
|
+
/** The resolution of the quantization grid (a single tile is stepped by 2^9 = 512) */
|
|
85
|
+
const DRAPE_TILE_SAMPLES_LOG2 = 9;
|
|
86
|
+
/**
|
|
87
|
+
* The lower bound of the quantization (a single tile is never made coarser than 2^8 = 256)
|
|
88
|
+
*
|
|
89
|
+
* A terrain tile is drawn at roughly 512 pixels on screen, so this step corresponds to 2
|
|
90
|
+
* pixels. Quantizing more coarsely than this makes polygons look like staircase-shaped blocks
|
|
91
|
+
* (verified in the field, the whole Kanto region at z8.7). A tile that does not fit even when
|
|
92
|
+
* made coarser is not suited to the analytic evaluation, so it is handed to the vertex
|
|
93
|
+
* displacement path.
|
|
94
|
+
*/
|
|
95
|
+
const DRAPE_MIN_SAMPLES_LOG2 = 8;
|
|
96
|
+
/**
|
|
97
|
+
* The smallest size a terrain tile is assumed to occupy on screen (physical pixels)
|
|
98
|
+
*
|
|
99
|
+
* Outlines are drawn with a width in screen pixels, so even an edge outside a cell can paint
|
|
100
|
+
* pixels inside the cell. This is the conservative estimate used to convert that margin into
|
|
101
|
+
* in-tile coordinates (an actual tile is often drawn larger than this, and the margin comes out
|
|
102
|
+
* on the safe side by that much).
|
|
103
|
+
*/
|
|
104
|
+
const TILE_SCREEN_PX = 256;
|
|
105
|
+
/**
|
|
106
|
+
* The lower and upper bounds of the margin (in-tile coordinates)
|
|
107
|
+
*
|
|
108
|
+
* Outlines are drawn with a width in screen pixels, so even an edge outside a cell can paint
|
|
109
|
+
* pixels inside the cell. The lower bound is the minimum needed to keep that from being missed
|
|
110
|
+
* (the drawn range fits inside the tile's [0, 1], so the margin is decided by the thickness of
|
|
111
|
+
* the outline alone).
|
|
112
|
+
*/
|
|
113
|
+
const MIN_MARGIN = 0.0025;
|
|
114
|
+
// The upper bound is the size of the coarsest cell (1 / DRAPE_MIN_CELLS). A margin larger than
|
|
115
|
+
// that would amount to "handing a single edge out to the whole tile", and only the index bloats
|
|
116
|
+
const MAX_MARGIN = 1 / DRAPE_MIN_CELLS;
|
|
117
|
+
/**
|
|
118
|
+
* Builds the key of the selection highlight
|
|
119
|
+
*
|
|
120
|
+
* So that IDs colliding across datasets are never mistaken for one another, the dataset
|
|
121
|
+
* ID and the feature ID are tied together with a delimiter. The side that builds the elements
|
|
122
|
+
* (`pass.ts`) and the side that collects the selection (`view/layer/drape-planner.ts`) use the
|
|
123
|
+
* same function.
|
|
124
|
+
*/
|
|
125
|
+
export function drapeSelectionKey(datasetId, featureId) {
|
|
126
|
+
return `${datasetId}\u0000${featureId}`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The margin of an element (in-tile coordinates)
|
|
130
|
+
*
|
|
131
|
+
* A line is drawn with a thickness in screen pixels, so even an edge outside a cell paints
|
|
132
|
+
* pixels inside the cell. This is the margin used to hand that reach out to the cells. For an
|
|
133
|
+
* element that has a reference zoom the thickness changes by `2^(zoom - widthZoom)`, so the
|
|
134
|
+
* same factor is applied to the estimate as well. Forgetting to apply it eats the fringe of a
|
|
135
|
+
* thickened, zoomed-in line at the cell boundaries and chips it away into a jagged edge.
|
|
136
|
+
*
|
|
137
|
+
* @param strokeWidthPx The thickness at the reference zoom (physical pixels)
|
|
138
|
+
* @param widthZoom The reference zoom of the thickness (negative means fixed in screen pixels)
|
|
139
|
+
* @param zoom The current zoom
|
|
140
|
+
*/
|
|
141
|
+
export function drapeMarginOf(strokeWidthPx, widthZoom = -1, zoom = 0) {
|
|
142
|
+
const scale = widthZoom >= 0 ? 2 ** (zoom - widthZoom) : 1;
|
|
143
|
+
const half = strokeWidthPx * scale * 0.5 + 1;
|
|
144
|
+
return Math.min(MAX_MARGIN, Math.max(MIN_MARGIN, half / TILE_SCREEN_PX));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Decides the number of divisions of the grid (a power of two)
|
|
148
|
+
*
|
|
149
|
+
* From the number of edges it picks a resolution that fits within "the target number per cell",
|
|
150
|
+
* and holds it back to the range where a cell does not become smaller than the margin (if the
|
|
151
|
+
* margin were larger than a cell, a single edge would be scattered as far as the cell after
|
|
152
|
+
* the next one and only the index would bloat).
|
|
153
|
+
*/
|
|
154
|
+
export function chooseGrid(edgeCount, margin, elementCount = 0) {
|
|
155
|
+
let grid = DRAPE_MIN_CELLS;
|
|
156
|
+
const want = Math.max(Math.sqrt(Math.max(1, edgeCount) / DRAPE_TARGET_EDGES_PER_CELL), Math.sqrt(Math.max(1, elementCount) / DRAPE_TARGET_ELEMENTS_PER_CELL));
|
|
157
|
+
while (grid < DRAPE_MAX_CELLS && grid < want)
|
|
158
|
+
grid *= 2;
|
|
159
|
+
while (grid > DRAPE_MIN_CELLS && 1 / grid < margin)
|
|
160
|
+
grid /= 2;
|
|
161
|
+
return grid;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Performs the binning for a single tile
|
|
165
|
+
*
|
|
166
|
+
* @param elements The elements in draw order (the whole ordering. The index becomes the row of
|
|
167
|
+
* the style)
|
|
168
|
+
* @param tile The tile
|
|
169
|
+
* @param candidates The indices of the elements narrowed down in advance (when omitted, every
|
|
170
|
+
* element is looked at)
|
|
171
|
+
*/
|
|
172
|
+
export function binTile(elements, tile, options) {
|
|
173
|
+
const candidates = options?.candidates;
|
|
174
|
+
const maxCellWork = options?.maxCellWork ?? DRAPE_MAX_CELL_WORK;
|
|
175
|
+
const zoom = options?.zoom ?? 0;
|
|
176
|
+
const scale = 2 ** tile.z;
|
|
177
|
+
const floorLevel = tile.z + DRAPE_MIN_SAMPLES_LOG2;
|
|
178
|
+
// Pass 1: pick the relevant elements and estimate the amount of edges. If the amount is
|
|
179
|
+
// large, swap in geometry whose vertices have been quantized onto a grid (LOD) matching the
|
|
180
|
+
// resolution of that tile.
|
|
181
|
+
let quantizeLevel = 0;
|
|
182
|
+
let picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
|
|
183
|
+
if (picked.edgeEstimate > DRAPE_LOD_TRIGGER) {
|
|
184
|
+
// Start from a grid that steps a single tile by roughly 512 and make it coarser one level
|
|
185
|
+
// at a time until it fits the budget. It must not skip ahead. The number of edges does not
|
|
186
|
+
// fall in proportion to the coarseness of the quantization; past a certain coarseness
|
|
187
|
+
// whole polygons collapse and it drops all at once. Skipping would pick a grid far coarser
|
|
188
|
+
// than necessary and polygons would look like square blocks (verified in the field, the
|
|
189
|
+
// whole Kanto region at z8.7)
|
|
190
|
+
for (quantizeLevel = tile.z + DRAPE_TILE_SAMPLES_LOG2; quantizeLevel >= floorLevel; quantizeLevel--) {
|
|
191
|
+
picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
|
|
192
|
+
if (picked.edgeEstimate <= DRAPE_MAX_EDGES_PER_TILE)
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
if (quantizeLevel < floorLevel)
|
|
196
|
+
quantizeLevel = floorLevel;
|
|
197
|
+
}
|
|
198
|
+
if (picked.edgeEstimate > DRAPE_MAX_EDGES_PER_TILE) {
|
|
199
|
+
// It does not fit even after quantization. Building alone takes hundreds of milliseconds,
|
|
200
|
+
// so it is degraded without being built
|
|
201
|
+
return emptyBins(DRAPE_MIN_CELLS, picked.edgeEstimate, true);
|
|
202
|
+
}
|
|
203
|
+
let grid = chooseGrid(picked.edgeEstimate, picked.maxMargin, picked.indices.length);
|
|
204
|
+
if (picked.indices.length === 0)
|
|
205
|
+
return emptyBins(grid, picked.edgeEstimate, false);
|
|
206
|
+
// Pass 2: actually build it. If cells that exceed the budget of a cell remain, those cells
|
|
207
|
+
// end up "solving inside/outside with too few edges" and show up as square blotches where a
|
|
208
|
+
// whole cell is painted. While truncation remains the grid is made finer, and if that is
|
|
209
|
+
// still not enough the quantization is made coarser and it is rebuilt. Only when there is
|
|
210
|
+
// nothing left to try does it return the degradation signal.
|
|
211
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
212
|
+
const bins = assembleBins(elements, picked, tile, scale, grid, zoom);
|
|
213
|
+
// A tile with too much work per pixel does not get any lighter whether the quantization is
|
|
214
|
+
// applied or the grid is made finer (the sheer number of deeply overlapping polygons is
|
|
215
|
+
// the cost). It is not suited to the analytic evaluation, so it returns the degradation
|
|
216
|
+
// signal as it is
|
|
217
|
+
if (bins.cellWork > maxCellWork)
|
|
218
|
+
return { ...bins, overflow: true };
|
|
219
|
+
if (bins.truncatedCells === 0)
|
|
220
|
+
return bins;
|
|
221
|
+
if (grid < DRAPE_RETRY_MAX_CELLS) {
|
|
222
|
+
grid *= 2;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (quantizeLevel === 0) {
|
|
226
|
+
quantizeLevel = tile.z + DRAPE_TILE_SAMPLES_LOG2;
|
|
227
|
+
}
|
|
228
|
+
else if (quantizeLevel > floorLevel) {
|
|
229
|
+
quantizeLevel -= 1;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
return { ...bins, overflow: true };
|
|
233
|
+
}
|
|
234
|
+
picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
|
|
235
|
+
// A grid that has once been made finer is never put back (putting it back would only
|
|
236
|
+
// repeat the work of making it finer)
|
|
237
|
+
grid = Math.max(grid, chooseGrid(picked.edgeEstimate, picked.maxMargin, picked.indices.length));
|
|
238
|
+
}
|
|
239
|
+
return emptyBins(DRAPE_MIN_CELLS, picked.edgeEstimate, true);
|
|
240
|
+
}
|
|
241
|
+
/** Empty bins (the common way to return for a degradation and for no relevant elements) */
|
|
242
|
+
function emptyBins(grid, edgeEstimate, overflow) {
|
|
243
|
+
return {
|
|
244
|
+
grid,
|
|
245
|
+
cells: new Int32Array(grid * grid * 2),
|
|
246
|
+
runs: new Float32Array(0),
|
|
247
|
+
edges: new Float32Array(0),
|
|
248
|
+
overflow,
|
|
249
|
+
truncatedCells: 0,
|
|
250
|
+
cellWork: 0,
|
|
251
|
+
edgeEstimate,
|
|
252
|
+
maxEdgesPerCell: 0,
|
|
253
|
+
maxRunsPerCell: 0,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Actually builds the picked elements into the index with the grid that was decided
|
|
258
|
+
*/
|
|
259
|
+
function assembleBins(elements, picked, tile, scale, grid, zoom) {
|
|
260
|
+
const tileX = tile.x;
|
|
261
|
+
const tileY = tile.y;
|
|
262
|
+
const cellCount = grid * grid;
|
|
263
|
+
const cellSize = 1 / grid;
|
|
264
|
+
const cells = new Int32Array(cellCount * 2);
|
|
265
|
+
/** The edges in in-tile coordinates (four numbers per edge). Stacked across elements */
|
|
266
|
+
const edgeXY = [];
|
|
267
|
+
/** The runs per cell. Triples of (elementIndex, inside, edgeListIndex) laid out in a row */
|
|
268
|
+
const cellRuns = new Array(cellCount);
|
|
269
|
+
/** The lists of edge indices that the runs point to */
|
|
270
|
+
const runEdges = [];
|
|
271
|
+
/** The inside/outside difference per row (width grid + 1) */
|
|
272
|
+
const rowDiff = new Int8Array(grid * (grid + 1));
|
|
273
|
+
const rowTouched = new Uint8Array(grid);
|
|
274
|
+
const touchedRows = [];
|
|
275
|
+
/** The cell assignment for a single element */
|
|
276
|
+
const scratch = new Map();
|
|
277
|
+
/** The number of cells truncated for exceeding the budget */
|
|
278
|
+
let truncatedCells = 0;
|
|
279
|
+
/** The diagnostic values */
|
|
280
|
+
let maxEdgesPerCell = 0;
|
|
281
|
+
let maxRunsPerCell = 0;
|
|
282
|
+
const pushRun = (cell, elementIndex, inside, list) => {
|
|
283
|
+
let target = cellRuns[cell];
|
|
284
|
+
if (!target) {
|
|
285
|
+
target = [];
|
|
286
|
+
cellRuns[cell] = target;
|
|
287
|
+
}
|
|
288
|
+
let edgeListIndex = -1;
|
|
289
|
+
if (list !== undefined && list.length > 0) {
|
|
290
|
+
edgeListIndex = runEdges.length;
|
|
291
|
+
runEdges.push(list);
|
|
292
|
+
}
|
|
293
|
+
target.push(elementIndex, inside, edgeListIndex);
|
|
294
|
+
};
|
|
295
|
+
for (let p = 0; p < picked.indices.length; p++) {
|
|
296
|
+
const index = picked.indices[p];
|
|
297
|
+
const element = elements[index];
|
|
298
|
+
const margin = drapeMarginOf(element.strokeWidthPx, element.widthZoom, zoom);
|
|
299
|
+
scratch.clear();
|
|
300
|
+
touchedRows.length = 0;
|
|
301
|
+
rowTouched.fill(0);
|
|
302
|
+
for (const path of picked.geometries[p].paths) {
|
|
303
|
+
scanPath(path, element.kind, tileX, tileY, scale, margin, grid, cellSize, edgeXY, scratch, rowDiff, rowTouched, touchedRows);
|
|
304
|
+
}
|
|
305
|
+
// Turn the cells that are inside and the cells the edges touch into runs (they are stacked
|
|
306
|
+
// in the order of the elements, so this comes out as the draw order)
|
|
307
|
+
const emitted = new Set();
|
|
308
|
+
for (const row of touchedRows) {
|
|
309
|
+
const base = row * (grid + 1);
|
|
310
|
+
let inside = 0;
|
|
311
|
+
for (let i = 0; i < grid; i++) {
|
|
312
|
+
inside ^= rowDiff[base + i];
|
|
313
|
+
const cell = row * grid + i;
|
|
314
|
+
const list = scratch.get(cell);
|
|
315
|
+
if (inside === 0 && list === undefined)
|
|
316
|
+
continue;
|
|
317
|
+
emitted.add(cell);
|
|
318
|
+
pushRun(cell, index, inside, list);
|
|
319
|
+
}
|
|
320
|
+
rowDiff.fill(0, base, base + grid + 1);
|
|
321
|
+
}
|
|
322
|
+
for (const [cell, list] of scratch) {
|
|
323
|
+
if (emitted.has(cell))
|
|
324
|
+
continue;
|
|
325
|
+
pushRun(cell, index, 0, list);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Repacking (laid out in the order cell -> run -> edge)
|
|
329
|
+
const runs = [];
|
|
330
|
+
const edges = [];
|
|
331
|
+
for (let c = 0; c < cellCount; c++) {
|
|
332
|
+
const list = cellRuns[c];
|
|
333
|
+
cells[c * 2] = runs.length / 4;
|
|
334
|
+
if (!list) {
|
|
335
|
+
cells[c * 2 + 1] = 0;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
let runCount = 0;
|
|
339
|
+
let truncated = false;
|
|
340
|
+
for (let i = 0; i + 2 < list.length; i += 3) {
|
|
341
|
+
if (runCount >= DRAPE_MAX_RUNS_PER_CELL) {
|
|
342
|
+
truncated = true;
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
const edgeListIndex = list[i + 2];
|
|
346
|
+
const edgeStart = edges.length / 4;
|
|
347
|
+
let edgeCount = 0;
|
|
348
|
+
if (edgeListIndex >= 0) {
|
|
349
|
+
for (const at of runEdges[edgeListIndex]) {
|
|
350
|
+
if (edgeCount >= DRAPE_MAX_EDGES_PER_CELL) {
|
|
351
|
+
truncated = true;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
edges.push(edgeXY[at * 4], edgeXY[at * 4 + 1], edgeXY[at * 4 + 2], edgeXY[at * 4 + 3]);
|
|
355
|
+
edgeCount++;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
runs.push(list[i], edgeStart, edgeCount, list[i + 1]);
|
|
359
|
+
runCount++;
|
|
360
|
+
if (edgeCount > maxEdgesPerCell)
|
|
361
|
+
maxEdgesPerCell = edgeCount;
|
|
362
|
+
}
|
|
363
|
+
if (truncated)
|
|
364
|
+
truncatedCells++;
|
|
365
|
+
if (runCount > maxRunsPerCell)
|
|
366
|
+
maxRunsPerCell = runCount;
|
|
367
|
+
cells[c * 2 + 1] = runCount;
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
grid,
|
|
371
|
+
cells,
|
|
372
|
+
runs: new Float32Array(runs),
|
|
373
|
+
edges: new Float32Array(edges),
|
|
374
|
+
overflow: false,
|
|
375
|
+
truncatedCells,
|
|
376
|
+
cellWork: (runs.length / 4 + edges.length / 4) / cellCount,
|
|
377
|
+
edgeEstimate: picked.edgeEstimate,
|
|
378
|
+
maxEdgesPerCell,
|
|
379
|
+
maxRunsPerCell,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Picks the elements relevant to a tile by their bounding box
|
|
384
|
+
*
|
|
385
|
+
* @param quantizeLevel 0 uses the original geometry, anything else uses the geometry quantized
|
|
386
|
+
* to that resolution
|
|
387
|
+
*/
|
|
388
|
+
function pickElements(elements, candidates, tile, scale, quantizeLevel, zoom) {
|
|
389
|
+
const indices = [];
|
|
390
|
+
const geometries = [];
|
|
391
|
+
let edgeEstimate = 0;
|
|
392
|
+
let maxMargin = MIN_MARGIN;
|
|
393
|
+
// Quantization can move a vertex outward by half a step of the grid, so it is added to the
|
|
394
|
+
// margin used for the selection
|
|
395
|
+
const quantizeSlack = quantizeLevel > 0 ? 2 ** -quantizeLevel : 0;
|
|
396
|
+
const length = candidates ? candidates.length : elements.length;
|
|
397
|
+
for (let n = 0; n < length; n++) {
|
|
398
|
+
const index = candidates ? candidates[n] : n;
|
|
399
|
+
const element = elements[index];
|
|
400
|
+
const margin = drapeMarginOf(element.strokeWidthPx, element.widthZoom, zoom);
|
|
401
|
+
const m = margin / scale + quantizeSlack;
|
|
402
|
+
const box = element.bounds;
|
|
403
|
+
if (box.maxX < tile.x / scale - m ||
|
|
404
|
+
box.minX > (tile.x + 1) / scale + m ||
|
|
405
|
+
box.maxY < tile.y / scale - m ||
|
|
406
|
+
box.minY > (tile.y + 1) / scale + m) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
// This is where the coordinates are converted for the first time (only the features that
|
|
410
|
+
// touch the view)
|
|
411
|
+
const base = element.geometry();
|
|
412
|
+
if (base.edgeCount === 0)
|
|
413
|
+
continue;
|
|
414
|
+
const geometry = quantizeLevel > 0 ? drapeQuantizedGeometry(base, quantizeLevel) : base;
|
|
415
|
+
if (geometry.edgeCount === 0)
|
|
416
|
+
continue;
|
|
417
|
+
indices.push(index);
|
|
418
|
+
geometries.push(geometry);
|
|
419
|
+
if (margin > maxMargin)
|
|
420
|
+
maxMargin = margin;
|
|
421
|
+
edgeEstimate += countNearEdges(geometry, tile.x, tile.y, scale, m);
|
|
422
|
+
}
|
|
423
|
+
return { indices, geometries, edgeEstimate, maxMargin };
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Streams a single path into the grid of the tile
|
|
427
|
+
*
|
|
428
|
+
* A polygon does two jobs at once. One is the assignment of edges to cells, the other is the
|
|
429
|
+
* tallying of "the inside/outside of the cell origin". The latter counts the crossings to the
|
|
430
|
+
* right of the origin, so an edge outside the tile on the right also counts (it becomes a flip
|
|
431
|
+
* of a whole row). An edge outside on the left flips nothing, so it can be dropped.
|
|
432
|
+
*/
|
|
433
|
+
function scanPath(path, kind, tileX, tileY, scale, margin, grid, cellSize, edgeXY, scratch, rowDiff, rowTouched, touchedRows) {
|
|
434
|
+
const xy = path.xy;
|
|
435
|
+
const vertexCount = xy.length / 2;
|
|
436
|
+
const blockCount = path.blocks.length / 4;
|
|
437
|
+
for (let b = 0; b < blockCount; b++) {
|
|
438
|
+
const by0 = path.blocks[b * 4 + 1] * scale - tileY;
|
|
439
|
+
const by1 = path.blocks[b * 4 + 3] * scale - tileY;
|
|
440
|
+
if (by1 < -margin || by0 > 1 + margin)
|
|
441
|
+
continue;
|
|
442
|
+
const bx0 = path.blocks[b * 4] * scale - tileX;
|
|
443
|
+
const bx1 = path.blocks[b * 4 + 2] * scale - tileX;
|
|
444
|
+
if (bx1 < -margin)
|
|
445
|
+
continue;
|
|
446
|
+
if (kind === 1 && bx0 > 1 + margin)
|
|
447
|
+
continue;
|
|
448
|
+
const from = b * DRAPE_BLOCK_EDGES;
|
|
449
|
+
const to = Math.min(path.edgeCount, from + DRAPE_BLOCK_EDGES);
|
|
450
|
+
for (let e = from; e < to; e++) {
|
|
451
|
+
const v1 = e + 1 < vertexCount ? e + 1 : 0;
|
|
452
|
+
const x0 = xy[e * 2] * scale - tileX;
|
|
453
|
+
const y0 = xy[e * 2 + 1] * scale - tileY;
|
|
454
|
+
const x1 = xy[v1 * 2] * scale - tileX;
|
|
455
|
+
const y1 = xy[v1 * 2 + 1] * scale - tileY;
|
|
456
|
+
if (x0 === x1 && y0 === y1)
|
|
457
|
+
continue;
|
|
458
|
+
if (kind === 0) {
|
|
459
|
+
accumulateInside(x0, y0, x1, y1, grid, cellSize, rowDiff, rowTouched, touchedRows);
|
|
460
|
+
}
|
|
461
|
+
scatterEdge(x0, y0, x1, y1, margin, grid, cellSize, edgeXY, scratch);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Adds "the crossings to the right of the cell origin" for a single edge to the row difference
|
|
467
|
+
*
|
|
468
|
+
* Every cell whose origin lies to the left of the crossing point xint is flipped. The range
|
|
469
|
+
* that is flipped is [0, k), so by setting 0 and k in the difference array and afterwards
|
|
470
|
+
* taking the exclusive OR from the left in order, the inside/outside of the whole row comes
|
|
471
|
+
* out.
|
|
472
|
+
*/
|
|
473
|
+
function accumulateInside(x0, y0, x1, y1, grid, cellSize, rowDiff, rowTouched, touchedRows) {
|
|
474
|
+
if (y0 === y1)
|
|
475
|
+
return;
|
|
476
|
+
const yLo = Math.min(y0, y1);
|
|
477
|
+
const yHi = Math.max(y0, y1);
|
|
478
|
+
let jLo = Math.ceil(yLo / cellSize);
|
|
479
|
+
let jHi = Math.floor(yHi / cellSize);
|
|
480
|
+
if (jLo < 0)
|
|
481
|
+
jLo = 0;
|
|
482
|
+
if (jHi > grid - 1)
|
|
483
|
+
jHi = grid - 1;
|
|
484
|
+
if (jLo > jHi)
|
|
485
|
+
return;
|
|
486
|
+
const inv = 1 / (y1 - y0);
|
|
487
|
+
for (let j = jLo; j <= jHi; j++) {
|
|
488
|
+
const yj = j * cellSize;
|
|
489
|
+
if (y0 > yj === y1 > yj)
|
|
490
|
+
continue;
|
|
491
|
+
const t = (yj - y0) * inv;
|
|
492
|
+
const xint = x0 + t * (x1 - x0);
|
|
493
|
+
let k = Math.ceil(xint / cellSize);
|
|
494
|
+
if (k <= 0)
|
|
495
|
+
continue;
|
|
496
|
+
if (k > grid)
|
|
497
|
+
k = grid;
|
|
498
|
+
const base = j * (grid + 1);
|
|
499
|
+
if (rowTouched[j] === 0) {
|
|
500
|
+
rowTouched[j] = 1;
|
|
501
|
+
touchedRows.push(j);
|
|
502
|
+
}
|
|
503
|
+
rowDiff[base] ^= 1;
|
|
504
|
+
rowDiff[base + k] ^= 1;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Assigns a single edge to the cells it passes through (including the margin)
|
|
509
|
+
*
|
|
510
|
+
* Sweeping the bounding box as it is would touch a whole rectangle of cells for a single edge
|
|
511
|
+
* that crosses the tile diagonally. The segment is cut per row to obtain the range of x, and
|
|
512
|
+
* only the columns in that range are touched.
|
|
513
|
+
*/
|
|
514
|
+
function scatterEdge(x0, y0, x1, y1, margin, grid, cellSize, edgeXY, scratch) {
|
|
515
|
+
const exLo = Math.min(x0, x1) - margin;
|
|
516
|
+
const exHi = Math.max(x0, x1) + margin;
|
|
517
|
+
const eyLo = Math.min(y0, y1) - margin;
|
|
518
|
+
const eyHi = Math.max(y0, y1) + margin;
|
|
519
|
+
if (exHi < 0 || exLo > 1 || eyHi < 0 || eyLo > 1)
|
|
520
|
+
return;
|
|
521
|
+
let jLo = Math.floor(eyLo / cellSize);
|
|
522
|
+
let jHi = Math.floor(eyHi / cellSize);
|
|
523
|
+
if (jLo < 0)
|
|
524
|
+
jLo = 0;
|
|
525
|
+
if (jHi > grid - 1)
|
|
526
|
+
jHi = grid - 1;
|
|
527
|
+
if (jLo > jHi)
|
|
528
|
+
return;
|
|
529
|
+
const at = edgeXY.length / 4;
|
|
530
|
+
edgeXY.push(x0, y0, x1, y1);
|
|
531
|
+
const horizontal = y0 === y1;
|
|
532
|
+
const inv = horizontal ? 0 : 1 / (y1 - y0);
|
|
533
|
+
for (let j = jLo; j <= jHi; j++) {
|
|
534
|
+
let xa;
|
|
535
|
+
let xb;
|
|
536
|
+
if (horizontal) {
|
|
537
|
+
xa = Math.min(x0, x1);
|
|
538
|
+
xb = Math.max(x0, x1);
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
let t0 = (j * cellSize - margin - y0) * inv;
|
|
542
|
+
let t1 = ((j + 1) * cellSize + margin - y0) * inv;
|
|
543
|
+
if (t0 > t1) {
|
|
544
|
+
const swap = t0;
|
|
545
|
+
t0 = t1;
|
|
546
|
+
t1 = swap;
|
|
547
|
+
}
|
|
548
|
+
if (t0 < 0)
|
|
549
|
+
t0 = 0;
|
|
550
|
+
if (t1 > 1)
|
|
551
|
+
t1 = 1;
|
|
552
|
+
if (t0 > t1)
|
|
553
|
+
continue;
|
|
554
|
+
const xt0 = x0 + t0 * (x1 - x0);
|
|
555
|
+
const xt1 = x0 + t1 * (x1 - x0);
|
|
556
|
+
xa = Math.min(xt0, xt1);
|
|
557
|
+
xb = Math.max(xt0, xt1);
|
|
558
|
+
}
|
|
559
|
+
xa -= margin;
|
|
560
|
+
xb += margin;
|
|
561
|
+
if (xb < 0 || xa > 1)
|
|
562
|
+
continue;
|
|
563
|
+
let iLo = Math.floor(xa / cellSize);
|
|
564
|
+
let iHi = Math.floor(xb / cellSize);
|
|
565
|
+
if (iLo < 0)
|
|
566
|
+
iLo = 0;
|
|
567
|
+
if (iHi > grid - 1)
|
|
568
|
+
iHi = grid - 1;
|
|
569
|
+
for (let i = iLo; i <= iHi; i++) {
|
|
570
|
+
const cell = j * grid + i;
|
|
571
|
+
const list = scratch.get(cell);
|
|
572
|
+
// No limit is applied here. Applying one would create "a cell that silently lost edges",
|
|
573
|
+
// the inside/outside test would go wrong and a whole cell would be painted. Truncation
|
|
574
|
+
// is detected during the repacking
|
|
575
|
+
if (list)
|
|
576
|
+
list.push(at);
|
|
577
|
+
else
|
|
578
|
+
scratch.set(cell, [at]);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Counts the number of edges near the tile (an estimate for deciding the resolution of the grid)
|
|
584
|
+
*/
|
|
585
|
+
function countNearEdges(geometry, tileX, tileY, scale, margin) {
|
|
586
|
+
const x0 = tileX / scale - margin;
|
|
587
|
+
const y0 = tileY / scale - margin;
|
|
588
|
+
const x1 = (tileX + 1) / scale + margin;
|
|
589
|
+
const y1 = (tileY + 1) / scale + margin;
|
|
590
|
+
let count = 0;
|
|
591
|
+
for (const path of geometry.paths) {
|
|
592
|
+
const blockCount = path.blocks.length / 4;
|
|
593
|
+
for (let b = 0; b < blockCount; b++) {
|
|
594
|
+
if (path.blocks[b * 4 + 2] < x0 ||
|
|
595
|
+
path.blocks[b * 4] > x1 ||
|
|
596
|
+
path.blocks[b * 4 + 3] < y0 ||
|
|
597
|
+
path.blocks[b * 4 + 1] > y1) {
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
count += Math.min(DRAPE_BLOCK_EDGES, path.edgeCount - b * DRAPE_BLOCK_EDGES);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
return count;
|
|
604
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DrapeTerrainTexture, UniformSet } from './shared.js';
|
|
2
|
+
import type { ResolvedTileEdges } from './stitch.js';
|
|
3
|
+
/** The order of the edges (used to assemble the uniform names) */
|
|
4
|
+
export declare const EDGE_NAMES: readonly ["top", "bottom", "left", "right"];
|
|
5
|
+
export type EdgeName = (typeof EDGE_NAMES)[number];
|
|
6
|
+
/**
|
|
7
|
+
* The DEM texture unit per edge (one's own DEM is unit 0)
|
|
8
|
+
*
|
|
9
|
+
* 6 is not used. The DEM atlas (TERRAIN_ATLAS_TEXTURE_UNIT in state.ts) is bound to 6 at the
|
|
10
|
+
* head of the frame and stays there, and every renderer of the vertex displacement path reads
|
|
11
|
+
* it as u_dem_atlas as is. Overwriting it here would make whatever is drawn after the drape
|
|
12
|
+
* rendering (a preview being drawn, dashed lines and so on) look elevations up in a broken
|
|
13
|
+
* texture and fly off screen. 1 to 4 are used by the data textures (renderer.ts) and the
|
|
14
|
+
* contents of the quads (quad.ts).
|
|
15
|
+
*/
|
|
16
|
+
export declare const EDGE_UNITS: Record<EdgeName, number>;
|
|
17
|
+
/**
|
|
18
|
+
* The GLSL of the edge constraint (injected into the vertex shader)
|
|
19
|
+
*
|
|
20
|
+
* It goes after TERRAIN_SAMPLE_GLSL (because it uses u_terrain_exaggeration and the upstream DEM
|
|
21
|
+
* functions it carries). The caller
|
|
22
|
+
* obtains the constrained elevation with `drape_edge_constrained(a_pos, ele)`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const EDGE_CONSTRAIN_GLSL: string;
|
|
25
|
+
/** The names of the uniforms the edge constraint uses (for getUniformLocation) */
|
|
26
|
+
export declare const EDGE_CONSTRAIN_UNIFORMS: readonly string[];
|
|
27
|
+
/**
|
|
28
|
+
* Writes the uniforms of the edge constraint
|
|
29
|
+
*
|
|
30
|
+
* The step and the DEM are both written from one and the same value (the result of
|
|
31
|
+
* resolveTileEdges). They all come out of the terrain tile state at one and the same instant,
|
|
32
|
+
* so the inconsistency "the DEM is new but the step is old" cannot occur. An edge with no
|
|
33
|
+
* coarse neighbor (an edge that is not constrained) gets one's own DEM at unit scale with a
|
|
34
|
+
* translation of 0. It is never referenced because the step is 0, but leaving an unbound
|
|
35
|
+
* sampler makes the rendering itself fail in some implementations.
|
|
36
|
+
*/
|
|
37
|
+
export declare function applyEdgeConstrainUniforms(gl: WebGL2RenderingContext, set: UniformSet, edges: ResolvedTileEdges<DrapeTerrainTexture>, own: DrapeTerrainTexture): void;
|