gps-plus-slam-app-framework 1.4.0 → 1.8.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/dist/absolute-orientation-BAxc15J6.d.ts +54 -0
- package/dist/{accuracy-circles-Pi2YeCrM.d.ts → accuracy-circles-DkWBkF5g.d.ts} +16 -6
- package/dist/{app-selectors-CrOucL00.d.ts → app-selectors-JqydaUMN.d.ts} +1 -1
- package/dist/ar/bresenham3d.d.ts +1 -1
- package/dist/ar/camera-blit-capture.d.ts +1 -1
- package/dist/ar/capability-checker.d.ts +1 -1
- package/dist/ar/capture-failure-tracker.d.ts +1 -1
- package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
- package/dist/ar/depth-grid-lookup.d.ts +1 -1
- package/dist/ar/depth-occluder.d.ts +127 -0
- package/dist/ar/depth-occluder.js +299 -0
- package/dist/ar/depth-sampler.d.ts +2 -2
- package/dist/ar/depth-sampler.js +24 -4
- package/dist/ar/depth-unprojection.d.ts +1 -1
- package/dist/ar/depth-unprojection.js +52 -21
- package/dist/ar/enable-gps-ar.d.ts +1 -1
- package/dist/ar/enable-gps-ar.js +1 -1
- package/dist/ar/frame-loop.d.ts +1 -1
- package/dist/ar/frame-loop.js +12 -2
- package/dist/ar/image-capture.d.ts +2 -2
- package/dist/ar/image-capture.js +1 -154
- package/dist/ar/image-quality.d.ts +2 -0
- package/dist/ar/image-quality.js +169 -0
- package/dist/ar/index.d.ts +32 -30
- package/dist/ar/index.js +7 -5
- package/dist/ar/occlusion-mesh-worker.d.ts +58 -0
- package/dist/ar/occlusion-mesh-worker.js +129 -0
- package/dist/ar/occupancy-grid.d.ts +2 -2
- package/dist/ar/occupancy-grid.js +287 -31
- package/dist/ar/occupancy-mesher.d.ts +2 -0
- package/dist/ar/occupancy-mesher.js +638 -0
- package/dist/ar/planar-pnp.d.ts +1 -1
- package/dist/ar/qr-debug-view.d.ts +1 -1
- package/dist/ar/qr-derived-pose.d.ts +1 -1
- package/dist/ar/qr-detection-controller.d.ts +1 -1
- package/dist/ar/qr-frontend.d.ts +1 -1
- package/dist/ar/qr-pose.d.ts +1 -1
- package/dist/ar/qr-size-depth-context.d.ts +2 -2
- package/dist/ar/qr-size-measurer.d.ts +1 -1
- package/dist/ar/replay-scene.d.ts +1 -1
- package/dist/ar/replay-scene.js +1 -1
- package/dist/ar/scene-node-names.d.ts +1 -1
- package/dist/ar/webxr-nue-basis.d.ts +1 -1
- package/dist/ar/webxr-session.d.ts +4 -4
- package/dist/ar/webxr-session.js +2 -2
- package/dist/ar/xr-camera-texture.d.ts +1 -1
- package/dist/ar/xr-error-handler.d.ts +1 -1
- package/dist/ar/xr-frame-loop.d.ts +1 -1
- package/dist/ar/xr-frame-loop.js +12 -2
- package/dist/{ar-Dc72Ksiu.js → ar-BqCudtqE.js} +4 -3
- package/dist/{ar-world-group-alignment-DDLkgNf_.d.ts → ar-world-group-alignment-BlvGcIAk.d.ts} +1 -1
- package/dist/capture-motion-gate-BGoAMkmf.d.ts +24 -0
- package/dist/capture-motion-gate-_NdTSwKi.js +106 -0
- package/dist/cell-key-DIB4rOTV.js +51 -0
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/{create-slam-app-store-Ce2FMKCp.d.ts → create-slam-app-store-D3nzh9Wb.d.ts} +50 -40
- package/dist/create-slam-app-store-DXiAnJwR.js +156 -0
- package/dist/{depth-grid-lookup-vMDrGTk_.d.ts → depth-grid-lookup-D5atpNZ3.d.ts} +1 -1
- package/dist/{depth-sampler-DwfPYzS7.d.ts → depth-sampler-CwObAwEA.d.ts} +33 -1
- package/dist/{depth-unprojection-CK3b9htH.d.ts → depth-unprojection-DRdBU90S.d.ts} +1 -1
- package/dist/{enable-gps-ar-CjZ1nEdu.d.ts → enable-gps-ar-DvGzBOrp.d.ts} +4 -4
- package/dist/{frame-conversions-D_Af8Dt3.d.ts → frame-conversions-C4bnNOEY.d.ts} +1 -1
- package/dist/{fused-path-C0FHe67t.d.ts → fused-path-C5pp0PJU.d.ts} +1 -1
- package/dist/geo/h3-proximity.d.ts +1 -1
- package/dist/geo/index.d.ts +1 -1
- package/dist/geodesic-angle-BTldfFgs.js +39 -0
- package/dist/{gps-anchor-C6I9NDHA.d.ts → gps-anchor-BjECcYnD.d.ts} +1 -1
- package/dist/{gps-ar-pose-sampler-DaHg2aPZ.d.ts → gps-ar-pose-sampler-DEGNk2CI.d.ts} +1 -1
- package/dist/{gps-event-coordinator-C7hwHyLA.d.ts → gps-event-coordinator-CHtIkhb7.d.ts} +21 -11
- package/dist/{image-capture-C2Feywet.d.ts → image-capture-Bp6Pd4Md.d.ts} +103 -3
- package/dist/image-capture-DVcuqMtX.js +374 -0
- package/dist/image-quality-BMx2ko9-.d.ts +158 -0
- package/dist/index-D4vrgV4b.d.ts +2 -0
- package/dist/index-D74JTX4I.d.ts +22 -0
- package/dist/{index-m_LneUSi.d.ts → index-DlsOo2IB.d.ts} +1 -1
- package/dist/{index-BvLo2poy.d.ts → index-cCQWuYqy.d.ts} +3 -3
- package/dist/index.d.ts +82 -77
- package/dist/index.js +15 -10
- package/dist/{leaflet-map-overlay-bnb2U1NQ.d.ts → leaflet-map-overlay-BOZFW5kT.d.ts} +64 -10
- package/dist/leaflet-map-overlay-CBWPvaX9.js +452 -0
- package/dist/lerp-utils-Qs8OhumS.d.ts +42 -0
- package/dist/map-data-D7rpMC6f.js +120 -0
- package/dist/{map-data-DdjPiSav.d.ts → map-data-PNfGKGWx.d.ts} +22 -2
- package/dist/{map-overlay-draw-CPVdAsFq.d.ts → map-overlay-draw-DiroaJed.d.ts} +1 -1
- package/dist/{null-storage-backend-CuSdYFsM.d.ts → null-storage-backend-B1-jlpin.d.ts} +2 -2
- package/dist/occlusion-mesh-b28lRJ6S.d.ts +194 -0
- package/dist/occupancy-grid-BV7RhB7I.d.ts +194 -0
- package/dist/occupancy-mesher-C2ecWhNp.d.ts +100 -0
- package/dist/{opfs-storage-DMtlt57S.d.ts → opfs-storage-CTkxvxN4.d.ts} +5 -0
- package/dist/{opfs-storage-backend-CeQAb0SD.d.ts → opfs-storage-backend-D6Z03fML.d.ts} +2 -2
- package/dist/{persistence-middleware-5eearhSV.d.ts → persistence-middleware-CG-t08X4.d.ts} +1 -1
- package/dist/{planar-pnp-cjthe7Be.d.ts → planar-pnp-D7bc_rLX.d.ts} +1 -1
- package/dist/{qr-debug-view-B8gTzjMm.d.ts → qr-debug-view-BJooqbiP.d.ts} +1 -1
- package/dist/{qr-derived-pose-DinKE600.d.ts → qr-derived-pose-BwNWn8oV.d.ts} +2 -2
- package/dist/{qr-detected-slice-Cpv-dg82.d.ts → qr-detected-slice-TzVb8bij.d.ts} +4 -4
- package/dist/{qr-detection-controller-Cd2Ih4cC.d.ts → qr-detection-controller-Bo4XfQTP.d.ts} +3 -3
- package/dist/{qr-frontend-DufZp2xS.d.ts → qr-frontend-BPURlh3S.d.ts} +1 -1
- package/dist/{qr-pose-aggregation-CFlmLm6w.d.ts → qr-pose-aggregation-CypnmjA-.d.ts} +1 -1
- package/dist/{qr-pose-aggregation-DXR9STHs.js → qr-pose-aggregation-DBiaLW0O.js} +1 -10
- package/dist/{qr-size-depth-context-onu36E9s.d.ts → qr-size-depth-context-apAOmbrZ.d.ts} +2 -2
- package/dist/{qr-size-measurer-D7739ZpB.d.ts → qr-size-measurer-DxiMqRUw.d.ts} +3 -3
- package/dist/recording-options-vASCFzc5.d.ts +667 -0
- package/dist/{recording-replayer-CUEK82tM.d.ts → recording-replayer-D0V9WkmY.d.ts} +2 -2
- package/dist/{recording-slice-B-uCgGoh.d.ts → recording-slice-DTUtSVgd.d.ts} +2 -2
- package/dist/{replay-engine-BSVd7Zzb.d.ts → replay-engine-xdrUgWJi.d.ts} +1 -1
- package/dist/{replay-scene-CPt56pps.d.ts → replay-scene-zJ8SFDjE.d.ts} +3 -3
- package/dist/sensors/absolute-orientation.d.ts +2 -0
- package/dist/sensors/absolute-orientation.js +162 -0
- package/dist/sensors/gps-error-handler.d.ts +1 -1
- package/dist/sensors/gps.d.ts +1 -1
- package/dist/sensors/index.d.ts +5 -4
- package/dist/sensors/index.js +2 -1
- package/dist/sensors/permission-checker.d.ts +1 -1
- package/dist/state/app-selectors.d.ts +1 -1
- package/dist/state/combined-root-state.d.ts +1 -1
- package/dist/state/create-slam-app-store.d.ts +1 -1
- package/dist/state/create-slam-app-store.js +1 -74
- package/dist/state/gps-ar-pose-sampler.d.ts +3 -3
- package/dist/state/gps-event-coordinator.d.ts +2 -2
- package/dist/state/gps-event-coordinator.js +27 -17
- package/dist/state/index.d.ts +20 -20
- package/dist/state/index.js +4 -4
- package/dist/state/persistence-middleware.d.ts +1 -1
- package/dist/state/persistence-middleware.js +30 -19
- package/dist/state/qr-detected-slice.d.ts +3 -3
- package/dist/state/qr-detected-slice.js +1 -1
- package/dist/state/recording-options.d.ts +2 -2
- package/dist/state/recording-options.js +286 -25
- package/dist/state/recording-replayer.d.ts +2 -2
- package/dist/state/recording-replayer.js +1 -1
- package/dist/state/recording-slice.d.ts +1 -1
- package/dist/state/replay-engine.d.ts +1 -1
- package/dist/state/store-subscribers.d.ts +2 -2
- package/dist/state/store-subscribers.js +2 -1
- package/dist/state/subscribe-to-selector.d.ts +1 -1
- package/dist/state/tracking-quality.d.ts +2 -2
- package/dist/state/tracking-quality.js +49 -128
- package/dist/state/tracking-slice.d.ts +1 -1
- package/dist/{state-IEw0ZsBu.js → state-BeKvn4B-.js} +1 -1
- package/dist/storage/file-system-utils.d.ts +1 -1
- package/dist/storage/index.d.ts +8 -8
- package/dist/storage/null-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage.d.ts +1 -1
- package/dist/storage/opfs-storage.js +25 -1
- package/dist/storage/storage-backend.d.ts +1 -1
- package/dist/storage/zip-coverage-embed.d.ts +1 -1
- package/dist/storage/zip-export.d.ts +1 -1
- package/dist/storage/zip-reader.d.ts +1 -1
- package/dist/{storage-backend-CTJHNdMp.d.ts → storage-backend-sEtmM4yW.d.ts} +1 -1
- package/dist/{store-subscribers-BZP81hjh.d.ts → store-subscribers-DScA7tdT.d.ts} +2 -2
- package/dist/{subscribe-to-selector-Bp3sLx8L.d.ts → subscribe-to-selector-B9ylM5Oh.d.ts} +1 -1
- package/dist/test-utils/browser-mocks.d.ts +1 -1
- package/dist/test-utils/zip-round-trip-helpers.d.ts +1 -1
- package/dist/{tracking-slice-DJZ9qeGg.d.ts → tracking-slice-DMkHlbny.d.ts} +1 -1
- package/dist/types/ar-types.d.ts +1 -1
- package/dist/types/geo-types.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/utils/concurrency.d.ts +1 -1
- package/dist/utils/failure-tracker.d.ts +1 -1
- package/dist/utils/format-file-size.d.ts +1 -1
- package/dist/utils/fused-path.d.ts +1 -1
- package/dist/utils/index.d.ts +8 -7
- package/dist/utils/index.js +2 -1
- package/dist/utils/list-formatter.d.ts +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/visualization/accuracy-circles.d.ts +1 -1
- package/dist/visualization/accuracy-circles.js +17 -8
- package/dist/visualization/alignment-lerper.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.js +1 -1
- package/dist/visualization/camera-follower.d.ts +1 -1
- package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
- package/dist/visualization/frame-conversions.d.ts +1 -1
- package/dist/visualization/frustum-visibility.d.ts +1 -1
- package/dist/visualization/gps-anchor.d.ts +1 -1
- package/dist/visualization/gps-compass-cubes.d.ts +1 -1
- package/dist/visualization/gps-event-markers.d.ts +1 -1
- package/dist/visualization/gps-event-markers.js +1 -1
- package/dist/visualization/hit-test-reticle.d.ts +1 -1
- package/dist/visualization/index.d.ts +20 -19
- package/dist/visualization/index.js +4 -3
- package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
- package/dist/visualization/leaflet-map-overlay.js +1 -282
- package/dist/visualization/lerp-utils.d.ts +2 -2
- package/dist/visualization/lerp-utils.js +27 -3
- package/dist/visualization/map-data.d.ts +1 -1
- package/dist/visualization/map-data.js +1 -32
- package/dist/visualization/map-overlay-draw.d.ts +1 -1
- package/dist/visualization/map-overlay-draw.js +24 -2
- package/dist/visualization/map-overlay.d.ts +1 -1
- package/dist/visualization/occluder-mesh-driver.d.ts +130 -0
- package/dist/visualization/occluder-mesh-driver.js +219 -0
- package/dist/visualization/occlusion-mesh.d.ts +2 -0
- package/dist/visualization/occlusion-mesh.js +437 -0
- package/dist/visualization/three-dispose.d.ts +1 -1
- package/dist/visualization/vis-colors.d.ts +1 -1
- package/dist/{webxr-session-CJF9Nijp.js → webxr-session-BCP2XK7k.js} +110 -14
- package/dist/{webxr-session-COsOjJwn.d.ts → webxr-session-cRG2SYAQ.d.ts} +83 -10
- package/package.json +4 -4
- package/dist/index-eaI1Z1KR.d.ts +0 -2
- package/dist/lerp-utils-kLxMJ2Xj.d.ts +0 -20
- package/dist/occupancy-grid-Bvi2Gw1U.d.ts +0 -82
- package/dist/recording-options-D93kksJU.d.ts +0 -369
- /package/dist/{alignment-lerper-BUTsQ2yu.d.ts → alignment-lerper-gD70k7Fq.d.ts} +0 -0
- /package/dist/{ar-types-BckI1E-O.d.ts → ar-types-Cc5yvBwn.d.ts} +0 -0
- /package/dist/{bresenham3d-ByjcmEgM.d.ts → bresenham3d-DGc4nIb-.d.ts} +0 -0
- /package/dist/{camera-blit-capture-CqWe1G7s.d.ts → camera-blit-capture-BimSdyih.d.ts} +0 -0
- /package/dist/{camera-follower-BTb2Yp12.d.ts → camera-follower-DfBm2J5i.d.ts} +0 -0
- /package/dist/{capability-checker-CXqoJYtb.d.ts → capability-checker-BTTpygvZ.d.ts} +0 -0
- /package/dist/{capture-failure-tracker-BL5SoG2a.d.ts → capture-failure-tracker-_BVfhpxv.d.ts} +0 -0
- /package/dist/{chromium-camera-access-workaround-BNK189P0.d.ts → chromium-camera-access-workaround-C6yJLXz9.d.ts} +0 -0
- /package/dist/{concurrency-DqAlKX4j.d.ts → concurrency-DPeGBH0X.d.ts} +0 -0
- /package/dist/{css3d-renderer-manager-m-ab19vp.d.ts → css3d-renderer-manager-CPpVtvgs.d.ts} +0 -0
- /package/dist/{failure-tracker-Cnc_xWUw.d.ts → failure-tracker-CeKf5HIc.d.ts} +0 -0
- /package/dist/{file-system-utils-Bs7lpeVP.d.ts → file-system-utils-DueXHxo9.d.ts} +0 -0
- /package/dist/{format-file-size-BFUWvir1.d.ts → format-file-size-DxN-EBLc.d.ts} +0 -0
- /package/dist/{frame-loop-BEO9_q3k.d.ts → frame-loop-7GBMBu68.d.ts} +0 -0
- /package/dist/{frustum-visibility-D_RGmH98.d.ts → frustum-visibility-CokkgS_i.d.ts} +0 -0
- /package/dist/{geo-types-DqiBzPO9.d.ts → geo-types-DrGVu8nS.d.ts} +0 -0
- /package/dist/{gps-C5inWeNV.d.ts → gps-CDKDQokE.d.ts} +0 -0
- /package/dist/{gps-compass-cubes-BExxrWJ-.d.ts → gps-compass-cubes-1mooS3BS.d.ts} +0 -0
- /package/dist/{gps-error-handler-C2bS69oJ.d.ts → gps-error-handler-C34GQuTu.d.ts} +0 -0
- /package/dist/{gps-event-markers-Dd0G2bD0.d.ts → gps-event-markers-Di2nBzx-.d.ts} +0 -0
- /package/dist/{h3-proximity-B57C6rYL.d.ts → h3-proximity-D0GTHQmr.d.ts} +0 -0
- /package/dist/{hit-test-reticle-Dqak9hiR.d.ts → hit-test-reticle-CaQbrhbk.d.ts} +0 -0
- /package/dist/{list-formatter-ct8txwvR.d.ts → list-formatter-DLFDnS70.d.ts} +0 -0
- /package/dist/{logger-CzQrCe6C.d.ts → logger-CqTd5Kpk.d.ts} +0 -0
- /package/dist/{map-overlay-Dci4yvm3.d.ts → map-overlay-BCQgvIgU.d.ts} +0 -0
- /package/dist/{permission-checker-CtPtPQRq.d.ts → permission-checker-B-VtjnBA.d.ts} +0 -0
- /package/dist/{qr-pose-Bt2reSw7.d.ts → qr-pose-y3vaEd6x.d.ts} +0 -0
- /package/dist/{scene-node-names-CdNeQjOE.d.ts → scene-node-names-CGb-ylBd.d.ts} +0 -0
- /package/dist/{session-disposers-D8wnO-uW.js → session-disposers-BPrMplIC.js} +0 -0
- /package/dist/{three-dispose-BCZkSJp2.d.ts → three-dispose-BMOAmPhb.d.ts} +0 -0
- /package/dist/{vis-colors-BZsSLI4i.d.ts → vis-colors-C7HI0u9_.d.ts} +0 -0
- /package/dist/{webxr-nue-basis-CW1wsbm6.d.ts → webxr-nue-basis-CaCnYxuq.d.ts} +0 -0
- /package/dist/{xr-camera-texture-BmrP7iNZ.d.ts → xr-camera-texture-q0eIDSRg.d.ts} +0 -0
- /package/dist/{xr-error-handler-BEjRgZjt.d.ts → xr-error-handler-uVGDu9IX.d.ts} +0 -0
- /package/dist/{xr-frame-loop-K8ebdjLw.d.ts → xr-frame-loop-DX3JPpAU.d.ts} +0 -0
- /package/dist/{zip-coverage-embed-tFohI2J4.d.ts → zip-coverage-embed-ncVbaZAz.d.ts} +0 -0
- /package/dist/{zip-export-DDWXInTR.d.ts → zip-export-CtiUnAlJ.d.ts} +0 -0
- /package/dist/{zip-reader-Q2ue6zlC.d.ts → zip-reader-CvruaGvD.d.ts} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
export { ArCrashIsolationOptions, DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, DepthCaptureOptions, FRAME_TILE_DISPLAY_CONSTRAINTS, FrameTileDisplayOptions, IMAGE_CONSTRAINTS, ImageCaptureOptions, OCCUPANCY_CONSTRAINTS, OccupancyOptions, QR_CONSTRAINTS, QrCaptureOptions, RecordingOptions, RecordingOptionsInput, STORAGE_KEY, VisualizationOptions, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateOccupancyOptions, validateQrOptions, validateRecordingOptions, validateVisualizationOptions };
|
|
1
|
+
import { A as validateImageOptions, C as loadRecordingOptions, D as validateCompassDebugOptions, E as validateArCrashIsolationOptions, F as validateRecordingOptions, I as validateVisualizationOptions, M as validateOccupancyOptions, N as validateQrOptions, O as validateDepthOptions, P as validateQualityFilterOptions, S as cloneRecordingOptions, T as saveRecordingOptions, _ as QrCaptureOptions, a as DepthCaptureOptions, b as STORAGE_KEY, c as IMAGE_CONSTRAINTS, d as OCCUPANCY_CONSTRAINTS, f as OccluderDebugStyle, g as QUALITY_FILTER_CONSTRAINTS, h as QR_CONSTRAINTS, i as DEPTH_CONSTRAINTS, j as validateMotionFilterOptions, k as validateFrameTileDisplayOptions, l as ImageCaptureOptions, m as OccupancyOptions, n as CompassDebugOptions, o as FRAME_TILE_DISPLAY_CONSTRAINTS, p as OccluderMeshMode, r as DEFAULT_RECORDING_OPTIONS, s as FrameTileDisplayOptions, t as ArCrashIsolationOptions, u as MOTION_FILTER_CONSTRAINTS, v as RecordingOptions, w as resetRecordingOptions, x as VisualizationOptions, y as RecordingOptionsInput } from "../recording-options-vASCFzc5.js";
|
|
2
|
+
export { ArCrashIsolationOptions, CompassDebugOptions, DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, DepthCaptureOptions, FRAME_TILE_DISPLAY_CONSTRAINTS, FrameTileDisplayOptions, IMAGE_CONSTRAINTS, ImageCaptureOptions, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, OccluderDebugStyle, OccluderMeshMode, OccupancyOptions, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, QrCaptureOptions, RecordingOptions, RecordingOptionsInput, STORAGE_KEY, VisualizationOptions, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger.js";
|
|
2
|
+
import { t as DEFAULT_MOTION_FILTER } from "../capture-motion-gate-_NdTSwKi.js";
|
|
3
|
+
import { DEFAULT_QUALITY_FILTER } from "../ar/image-quality.js";
|
|
2
4
|
//#region ../src/state/recording-options.ts
|
|
3
5
|
/**
|
|
4
6
|
* Recording Options - User-configurable settings for data capture.
|
|
@@ -10,6 +12,55 @@ import { createLogger } from "../utils/logger.js";
|
|
|
10
12
|
*/
|
|
11
13
|
const log = createLogger("RecordingOptions");
|
|
12
14
|
/**
|
|
15
|
+
* Configuration for the derived AR-space occupancy grid (the voxelization of
|
|
16
|
+
* the depth samples, port plan 2026-06-11). These settings do NOT change what
|
|
17
|
+
* is recorded — they govern the grid derived from the recorded depth points,
|
|
18
|
+
* so they also apply when replaying an existing recording, letting the same
|
|
19
|
+
* session be re-quantized at a different resolution.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Mesher strategy for the **persistent occluder** mesh, exposed as a recorder
|
|
23
|
+
* setting (2026-06-30 occluder-tuning, F2/F2b) so the two surface-hugging
|
|
24
|
+
* approaches can be A/B-tested on-device against the blocky baseline:
|
|
25
|
+
* - `'greedy'` — blocky greedy cubes (the existing default; fewest triangles).
|
|
26
|
+
* - `'corner-fit'` — cubes with corners pulled to the measured centroids
|
|
27
|
+
* (surface-hugging **and** watertight).
|
|
28
|
+
* - `'smooth'` — surface nets: smoothest, hugs the measured surface, but an open
|
|
29
|
+
* sheet over thin features.
|
|
30
|
+
*
|
|
31
|
+
* Maps directly onto `meshOccupiedCells` / `OcclusionMesh` `MeshMode` (a subset).
|
|
32
|
+
* `'per-face'` is intentionally not offered (same shape as `'greedy'`, more
|
|
33
|
+
* triangles — no on-device value).
|
|
34
|
+
*/
|
|
35
|
+
const OCCLUDER_MESH_MODES = [
|
|
36
|
+
"greedy",
|
|
37
|
+
"corner-fit",
|
|
38
|
+
"smooth"
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Debug-visualization style for the **persistent occluder** mesh (2026-07-02
|
|
42
|
+
* debug-viz-styles plan) — which visible debug skin(s) `OcclusionMesh` renders
|
|
43
|
+
* on top of the invisible depth-only occluder:
|
|
44
|
+
* - `'off'` — no debug rendering (the shipped default; occlusion is invisible).
|
|
45
|
+
* - `'matcap'` — the original shiny semi-transparent cyan skin.
|
|
46
|
+
* - `'depth-shaded'` — matcap + camera-distance fade + white fresnel rim, so
|
|
47
|
+
* overlapping near/far surfaces read as separate shells.
|
|
48
|
+
* - `'wireframe'` — the raw triangulation as GL lines (mesh-structure
|
|
49
|
+
* inspection: triangle density, mesher seams, degenerate spots).
|
|
50
|
+
* - `'depth-shaded-wireframe'` — both of the above composed.
|
|
51
|
+
*
|
|
52
|
+
* Values array module-private (validation only; the settings `<select>`
|
|
53
|
+
* options are hardcoded in the recorder's `index.html`), type exported —
|
|
54
|
+
* mirroring `OCCLUDER_MESH_MODES` / {@link OccluderMeshMode}.
|
|
55
|
+
*/
|
|
56
|
+
const OCCLUDER_DEBUG_STYLES = [
|
|
57
|
+
"off",
|
|
58
|
+
"matcap",
|
|
59
|
+
"depth-shaded",
|
|
60
|
+
"wireframe",
|
|
61
|
+
"depth-shaded-wireframe"
|
|
62
|
+
];
|
|
63
|
+
/**
|
|
13
64
|
* localStorage key for persisted options.
|
|
14
65
|
*
|
|
15
66
|
* **Multi-tab caveat:** All tabs/instances sharing the same origin will
|
|
@@ -23,15 +74,17 @@ const STORAGE_KEY = "gps-plus-slam-recorder-options";
|
|
|
23
74
|
const DEFAULT_RECORDING_OPTIONS = {
|
|
24
75
|
depth: {
|
|
25
76
|
enabled: true,
|
|
26
|
-
intervalMs:
|
|
27
|
-
gridSize:
|
|
77
|
+
intervalMs: 500,
|
|
78
|
+
gridSize: 32,
|
|
28
79
|
rgb: true
|
|
29
80
|
},
|
|
30
81
|
images: {
|
|
31
82
|
enabled: true,
|
|
32
83
|
intervalMs: 2e3,
|
|
33
84
|
quality: .7,
|
|
34
|
-
resolutionDivisor: 1
|
|
85
|
+
resolutionDivisor: 1,
|
|
86
|
+
motionFilter: { ...DEFAULT_MOTION_FILTER },
|
|
87
|
+
qualityFilter: { ...DEFAULT_QUALITY_FILTER }
|
|
35
88
|
},
|
|
36
89
|
arCrashIsolation: {
|
|
37
90
|
enableDomOverlay: true,
|
|
@@ -41,18 +94,36 @@ const DEFAULT_RECORDING_OPTIONS = {
|
|
|
41
94
|
enableCameraTextureAcquisition: true,
|
|
42
95
|
applyChromiumProjectionLayerWorkaround: true
|
|
43
96
|
},
|
|
44
|
-
occupancy: {
|
|
45
|
-
|
|
97
|
+
occupancy: {
|
|
98
|
+
cellSizeM: .15,
|
|
99
|
+
minConfidence: 3,
|
|
100
|
+
persistentOcclusion: true,
|
|
101
|
+
liveOcclusion: false,
|
|
102
|
+
occluderDebugStyle: "off",
|
|
103
|
+
occluderMeshMode: "smooth",
|
|
104
|
+
occluderRadiusM: 25
|
|
105
|
+
},
|
|
106
|
+
frameTileDisplay: {
|
|
107
|
+
divisor: 2,
|
|
108
|
+
maxTiles: 100
|
|
109
|
+
},
|
|
46
110
|
visualization: {
|
|
47
111
|
frameTiles: true,
|
|
48
112
|
occupancyCubes: true,
|
|
49
113
|
gpsAlignmentMarkers: true,
|
|
50
|
-
compassCubes: true
|
|
114
|
+
compassCubes: true,
|
|
115
|
+
headingUpMap: true,
|
|
116
|
+
statsOverlay: false
|
|
51
117
|
},
|
|
52
118
|
qr: {
|
|
53
119
|
enabled: false,
|
|
54
120
|
intervalMs: 125,
|
|
55
121
|
captureSize: 1024
|
|
122
|
+
},
|
|
123
|
+
compassDebug: {
|
|
124
|
+
coldStartOverride: true,
|
|
125
|
+
rotationPrior: false,
|
|
126
|
+
webXRConsistency: false
|
|
56
127
|
}
|
|
57
128
|
};
|
|
58
129
|
/** Validation constraints for depth options */
|
|
@@ -64,7 +135,7 @@ const DEPTH_CONSTRAINTS = {
|
|
|
64
135
|
},
|
|
65
136
|
gridSize: {
|
|
66
137
|
min: 2,
|
|
67
|
-
max:
|
|
138
|
+
max: 64,
|
|
68
139
|
step: 1
|
|
69
140
|
}
|
|
70
141
|
};
|
|
@@ -87,6 +158,65 @@ const IMAGE_CONSTRAINTS = {
|
|
|
87
158
|
}
|
|
88
159
|
};
|
|
89
160
|
/**
|
|
161
|
+
* Validation constraints for the motion-filter (blurry-frame gate) thresholds.
|
|
162
|
+
*
|
|
163
|
+
* The velocity ranges (0.05–5) bracket the plausible scanning regime: below
|
|
164
|
+
* ~0.05 the gate would reject almost everything; above ~5 rad/s ≈ 286°/s (or
|
|
165
|
+
* 5 m/s) it would never reject, so the gate would be inert. `maxWaitMs` is
|
|
166
|
+
* clamped to 0.5–20 s — the never-calm fallback must always be able to fire.
|
|
167
|
+
* All three back a (currently advanced/hidden) settings slider, so a corrupt
|
|
168
|
+
* stored value can never disable capture. The default thresholds themselves are
|
|
169
|
+
* placeholders pending on-device field tuning (plan §7).
|
|
170
|
+
*/
|
|
171
|
+
const MOTION_FILTER_CONSTRAINTS = {
|
|
172
|
+
maxAngularVelocity: {
|
|
173
|
+
min: .05,
|
|
174
|
+
max: 5,
|
|
175
|
+
step: .05
|
|
176
|
+
},
|
|
177
|
+
maxLinearVelocity: {
|
|
178
|
+
min: .05,
|
|
179
|
+
max: 5,
|
|
180
|
+
step: .05
|
|
181
|
+
},
|
|
182
|
+
maxWaitMs: {
|
|
183
|
+
min: 500,
|
|
184
|
+
max: 2e4,
|
|
185
|
+
step: 500
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Validation constraints for the image-quality (blur/blackness) gate thresholds.
|
|
190
|
+
*
|
|
191
|
+
* `blurRelativeThreshold` (`k` in `sharpness < k·median`) is clamped to
|
|
192
|
+
* 0.05–0.95: it is a fraction of the recent sharpness median, so values must sit
|
|
193
|
+
* strictly inside (0, 1) — at ~0 the blur check never rejects, near 1 it rejects
|
|
194
|
+
* almost everything. `minMeanLuminance` (the absolute black cutoff on a 0–255
|
|
195
|
+
* luma scale) is clamped to 0–128: 0 disables the black check, and a cutoff
|
|
196
|
+
* above mid-grey would reject normally-lit frames. `maxWaitMs` mirrors the motion
|
|
197
|
+
* gate's range (0.5–20 s) so the never-good fallback can always fire. All back a
|
|
198
|
+
* (currently advanced/hidden) settings slider, so a corrupt stored value can
|
|
199
|
+
* never disable capture. The default thresholds are placeholders pending
|
|
200
|
+
* on-device field tuning (plan §5, §10).
|
|
201
|
+
*/
|
|
202
|
+
const QUALITY_FILTER_CONSTRAINTS = {
|
|
203
|
+
blurRelativeThreshold: {
|
|
204
|
+
min: .05,
|
|
205
|
+
max: .95,
|
|
206
|
+
step: .05
|
|
207
|
+
},
|
|
208
|
+
minMeanLuminance: {
|
|
209
|
+
min: 0,
|
|
210
|
+
max: 128,
|
|
211
|
+
step: 1
|
|
212
|
+
},
|
|
213
|
+
maxWaitMs: {
|
|
214
|
+
min: 500,
|
|
215
|
+
max: 2e4,
|
|
216
|
+
step: 500
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
90
220
|
* Validation constraints for occupancy options.
|
|
91
221
|
*
|
|
92
222
|
* `cellSizeM` is clamped to 1–20 cm. The floor exists because cell count (and
|
|
@@ -94,12 +224,29 @@ const IMAGE_CONSTRAINTS = {
|
|
|
94
224
|
* `points3D` row count) scales as 1/cellSize³ — sub-centimetre voxels are both
|
|
95
225
|
* a memory/perf cliff on a phone and below the depth sensor's noise floor.
|
|
96
226
|
* Step is 1 cm (the settings slider operates in cm).
|
|
227
|
+
*
|
|
228
|
+
* `minConfidence` is clamped to 1–10 (integer). 1 disables the filter (legacy
|
|
229
|
+
* behaviour: a single observation counts as occupied); the ceiling exists
|
|
230
|
+
* because real surfaces accumulate only a handful of observations per second
|
|
231
|
+
* of dwell, so a floor above ~10 would start hiding genuine geometry.
|
|
97
232
|
*/
|
|
98
|
-
const OCCUPANCY_CONSTRAINTS = {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
233
|
+
const OCCUPANCY_CONSTRAINTS = {
|
|
234
|
+
cellSizeM: {
|
|
235
|
+
min: .01,
|
|
236
|
+
max: .2,
|
|
237
|
+
step: .01
|
|
238
|
+
},
|
|
239
|
+
minConfidence: {
|
|
240
|
+
min: 1,
|
|
241
|
+
max: 10,
|
|
242
|
+
step: 1
|
|
243
|
+
},
|
|
244
|
+
occluderRadiusM: {
|
|
245
|
+
min: 0,
|
|
246
|
+
max: 200,
|
|
247
|
+
step: 5
|
|
248
|
+
}
|
|
249
|
+
};
|
|
103
250
|
/**
|
|
104
251
|
* Validation constraints for the frame-tile display-resolution divisor.
|
|
105
252
|
*
|
|
@@ -108,11 +255,18 @@ const OCCUPANCY_CONSTRAINTS = { cellSizeM: {
|
|
|
108
255
|
* same. The intended stops are 1, 2, 4, 8 (full / half / quarter / eighth); the
|
|
109
256
|
* divisor is rounded to an integer so the resize target dimensions stay clean.
|
|
110
257
|
*/
|
|
111
|
-
const FRAME_TILE_DISPLAY_CONSTRAINTS = {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
258
|
+
const FRAME_TILE_DISPLAY_CONSTRAINTS = {
|
|
259
|
+
divisor: {
|
|
260
|
+
min: 1,
|
|
261
|
+
max: 8,
|
|
262
|
+
step: 1
|
|
263
|
+
},
|
|
264
|
+
maxTiles: {
|
|
265
|
+
min: 0,
|
|
266
|
+
max: 2e3,
|
|
267
|
+
step: 10
|
|
268
|
+
}
|
|
269
|
+
};
|
|
116
270
|
/**
|
|
117
271
|
* Validation constraints for QR-capture options.
|
|
118
272
|
*
|
|
@@ -150,6 +304,19 @@ function validateArCrashIsolationOptions(options) {
|
|
|
150
304
|
};
|
|
151
305
|
}
|
|
152
306
|
/**
|
|
307
|
+
* Validate and normalize the compass alignment debug toggles. Boolean-or-default
|
|
308
|
+
* per field; a missing/corrupted/pre-feature value falls back to the OFF default
|
|
309
|
+
* so a bad persisted value can never silently turn an alignment override ON.
|
|
310
|
+
*/
|
|
311
|
+
function validateCompassDebugOptions(options) {
|
|
312
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.compassDebug;
|
|
313
|
+
return {
|
|
314
|
+
coldStartOverride: typeof options.coldStartOverride === "boolean" ? options.coldStartOverride : defaults.coldStartOverride,
|
|
315
|
+
rotationPrior: typeof options.rotationPrior === "boolean" ? options.rotationPrior : defaults.rotationPrior,
|
|
316
|
+
webXRConsistency: typeof options.webXRConsistency === "boolean" ? options.webXRConsistency : defaults.webXRConsistency
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
153
320
|
* Validate and normalize the live debug-overlay visibility toggles.
|
|
154
321
|
* Each field is boolean-or-default (same policy as the AR-crash-isolation
|
|
155
322
|
* flags): a missing, corrupted, or pre-feature persisted value falls back to
|
|
@@ -161,7 +328,9 @@ function validateVisualizationOptions(options) {
|
|
|
161
328
|
frameTiles: typeof options.frameTiles === "boolean" ? options.frameTiles : defaults.frameTiles,
|
|
162
329
|
occupancyCubes: typeof options.occupancyCubes === "boolean" ? options.occupancyCubes : defaults.occupancyCubes,
|
|
163
330
|
gpsAlignmentMarkers: typeof options.gpsAlignmentMarkers === "boolean" ? options.gpsAlignmentMarkers : defaults.gpsAlignmentMarkers,
|
|
164
|
-
compassCubes: typeof options.compassCubes === "boolean" ? options.compassCubes : defaults.compassCubes
|
|
331
|
+
compassCubes: typeof options.compassCubes === "boolean" ? options.compassCubes : defaults.compassCubes,
|
|
332
|
+
headingUpMap: typeof options.headingUpMap === "boolean" ? options.headingUpMap : defaults.headingUpMap,
|
|
333
|
+
statsOverlay: typeof options.statsOverlay === "boolean" ? options.statsOverlay : defaults.statsOverlay
|
|
165
334
|
};
|
|
166
335
|
}
|
|
167
336
|
/**
|
|
@@ -200,6 +369,41 @@ function validateDepthOptions(options) {
|
|
|
200
369
|
};
|
|
201
370
|
}
|
|
202
371
|
/**
|
|
372
|
+
* Validate and normalize the motion-filter (blurry-frame gate) options.
|
|
373
|
+
* `enabled` is boolean-or-default; the three numeric thresholds are clamped to
|
|
374
|
+
* {@link MOTION_FILTER_CONSTRAINTS} with a `Number.isFinite` guard (a stored
|
|
375
|
+
* `NaN` is `typeof 'number'` and would survive `clamp`). A missing group
|
|
376
|
+
* default-fills entirely — a pre-feature persisted options object that lacks
|
|
377
|
+
* `motionFilter` therefore loads with the gate enabled rather than crashing.
|
|
378
|
+
*/
|
|
379
|
+
function validateMotionFilterOptions(options) {
|
|
380
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.images.motionFilter;
|
|
381
|
+
return {
|
|
382
|
+
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
383
|
+
maxAngularVelocity: clamp(typeof options.maxAngularVelocity === "number" && Number.isFinite(options.maxAngularVelocity) ? options.maxAngularVelocity : defaults.maxAngularVelocity, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.min, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.max),
|
|
384
|
+
maxLinearVelocity: clamp(typeof options.maxLinearVelocity === "number" && Number.isFinite(options.maxLinearVelocity) ? options.maxLinearVelocity : defaults.maxLinearVelocity, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.min, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.max),
|
|
385
|
+
maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, MOTION_FILTER_CONSTRAINTS.maxWaitMs.min, MOTION_FILTER_CONSTRAINTS.maxWaitMs.max)
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Validate and normalize the image-quality (blur/blackness gate) options. Same
|
|
390
|
+
* policy as {@link validateMotionFilterOptions}: `enabled` is boolean-or-default;
|
|
391
|
+
* the three numeric thresholds are clamped to {@link QUALITY_FILTER_CONSTRAINTS}
|
|
392
|
+
* with a `Number.isFinite` guard (a stored `NaN` is `typeof 'number'` and would
|
|
393
|
+
* survive `clamp`). A missing group default-fills entirely — a pre-feature
|
|
394
|
+
* persisted options object that lacks `qualityFilter` loads with the gate
|
|
395
|
+
* disabled (the safe default) rather than crashing.
|
|
396
|
+
*/
|
|
397
|
+
function validateQualityFilterOptions(options) {
|
|
398
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.images.qualityFilter;
|
|
399
|
+
return {
|
|
400
|
+
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
401
|
+
blurRelativeThreshold: clamp(typeof options.blurRelativeThreshold === "number" && Number.isFinite(options.blurRelativeThreshold) ? options.blurRelativeThreshold : defaults.blurRelativeThreshold, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.min, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.max),
|
|
402
|
+
minMeanLuminance: clamp(typeof options.minMeanLuminance === "number" && Number.isFinite(options.minMeanLuminance) ? options.minMeanLuminance : defaults.minMeanLuminance, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.min, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.max),
|
|
403
|
+
maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.min, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.max)
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
203
407
|
* Validate and normalize image options.
|
|
204
408
|
* Invalid values are clamped to valid ranges.
|
|
205
409
|
*/
|
|
@@ -209,7 +413,9 @@ function validateImageOptions(options) {
|
|
|
209
413
|
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
210
414
|
intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, IMAGE_CONSTRAINTS.intervalMs.min, IMAGE_CONSTRAINTS.intervalMs.max),
|
|
211
415
|
quality: clamp(typeof options.quality === "number" ? options.quality : defaults.quality, IMAGE_CONSTRAINTS.quality.min, IMAGE_CONSTRAINTS.quality.max),
|
|
212
|
-
resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max)
|
|
416
|
+
resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max),
|
|
417
|
+
motionFilter: validateMotionFilterOptions(options.motionFilter ?? {}),
|
|
418
|
+
qualityFilter: validateQualityFilterOptions(options.qualityFilter ?? {})
|
|
213
419
|
};
|
|
214
420
|
}
|
|
215
421
|
/**
|
|
@@ -220,10 +426,56 @@ function validateImageOptions(options) {
|
|
|
220
426
|
* `RangeError` on a non-finite cell size, and `clamp(NaN, …)` would otherwise
|
|
221
427
|
* pass `NaN` straight through (it is `typeof 'number'`). Falling back to the
|
|
222
428
|
* default keeps a corrupted stored value from crashing grid construction.
|
|
429
|
+
*
|
|
430
|
+
* **Backward-compat migration:** the occlusion options were a single
|
|
431
|
+
* `occlusionMeshEnabled` boolean before 2026-06-29; they are now the two
|
|
432
|
+
* composable booleans `persistentOcclusion` + `liveOcclusion`. A persisted
|
|
433
|
+
* object that predates the split carries only the legacy field, so when the new
|
|
434
|
+
* `persistentOcclusion` is absent we read `occlusionMeshEnabled` and map
|
|
435
|
+
* `true → persistentOcclusion: true` (the old mesh occluder is the persistent
|
|
436
|
+
* one); the legacy shape never enabled a live occluder, so `liveOcclusion`
|
|
437
|
+
* stays at its default. A present new field always wins over the legacy one.
|
|
438
|
+
* See `2026-06-29-occupancy-mesh-followups.md`.
|
|
439
|
+
*/
|
|
440
|
+
/**
|
|
441
|
+
* Resolve `persistentOcclusion` with legacy migration. A **present** new field
|
|
442
|
+
* always wins over the legacy `occlusionMeshEnabled` — even when its value is
|
|
443
|
+
* invalid: a present-but-corrupt value falls back to the default, never to the
|
|
444
|
+
* legacy flag, so corrupted saved options can't silently flip the occluder
|
|
445
|
+
* against the "new field wins" contract. Only an **absent** new field migrates
|
|
446
|
+
* the legacy boolean (`true → persistent on`); else the default.
|
|
223
447
|
*/
|
|
448
|
+
function resolvePersistentOcclusion(options, legacyOcclusionMeshEnabled, defaultValue) {
|
|
449
|
+
if ("persistentOcclusion" in options) return typeof options.persistentOcclusion === "boolean" ? options.persistentOcclusion : defaultValue;
|
|
450
|
+
return typeof legacyOcclusionMeshEnabled === "boolean" ? legacyOcclusionMeshEnabled : defaultValue;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Resolve `occluderDebugStyle` with legacy migration, following the same
|
|
454
|
+
* contract as {@link resolvePersistentOcclusion}: a **present** new field
|
|
455
|
+
* always wins over the legacy `occluderDebugViz` boolean — even when its value
|
|
456
|
+
* is unknown/corrupt it falls back to the default (`'off'`), never to the
|
|
457
|
+
* legacy flag, so corrupted saved options can't silently turn a debug render
|
|
458
|
+
* on. Only an **absent** new field migrates the legacy boolean
|
|
459
|
+
* (`true → 'matcap'`, the skin the boolean used to enable); else the default.
|
|
460
|
+
*/
|
|
461
|
+
function resolveOccluderDebugStyle(options, legacyOccluderDebugViz, defaultValue) {
|
|
462
|
+
if ("occluderDebugStyle" in options) return OCCLUDER_DEBUG_STYLES.includes(options.occluderDebugStyle) ? options.occluderDebugStyle : defaultValue;
|
|
463
|
+
if (typeof legacyOccluderDebugViz === "boolean") return legacyOccluderDebugViz ? "matcap" : "off";
|
|
464
|
+
return defaultValue;
|
|
465
|
+
}
|
|
224
466
|
function validateOccupancyOptions(options) {
|
|
225
467
|
const defaults = DEFAULT_RECORDING_OPTIONS.occupancy;
|
|
226
|
-
|
|
468
|
+
const legacyOcclusionMeshEnabled = options.occlusionMeshEnabled;
|
|
469
|
+
const legacyOccluderDebugViz = options.occluderDebugViz;
|
|
470
|
+
return {
|
|
471
|
+
cellSizeM: clamp(typeof options.cellSizeM === "number" && Number.isFinite(options.cellSizeM) ? options.cellSizeM : defaults.cellSizeM, OCCUPANCY_CONSTRAINTS.cellSizeM.min, OCCUPANCY_CONSTRAINTS.cellSizeM.max),
|
|
472
|
+
minConfidence: clamp(typeof options.minConfidence === "number" && Number.isFinite(options.minConfidence) ? Math.round(options.minConfidence) : defaults.minConfidence, OCCUPANCY_CONSTRAINTS.minConfidence.min, OCCUPANCY_CONSTRAINTS.minConfidence.max),
|
|
473
|
+
persistentOcclusion: resolvePersistentOcclusion(options, legacyOcclusionMeshEnabled, defaults.persistentOcclusion),
|
|
474
|
+
liveOcclusion: typeof options.liveOcclusion === "boolean" ? options.liveOcclusion : defaults.liveOcclusion,
|
|
475
|
+
occluderDebugStyle: resolveOccluderDebugStyle(options, legacyOccluderDebugViz, defaults.occluderDebugStyle),
|
|
476
|
+
occluderMeshMode: OCCLUDER_MESH_MODES.includes(options.occluderMeshMode) ? options.occluderMeshMode : defaults.occluderMeshMode,
|
|
477
|
+
occluderRadiusM: clamp(typeof options.occluderRadiusM === "number" && Number.isFinite(options.occluderRadiusM) ? Math.round(options.occluderRadiusM) : defaults.occluderRadiusM, OCCUPANCY_CONSTRAINTS.occluderRadiusM.min, OCCUPANCY_CONSTRAINTS.occluderRadiusM.max)
|
|
478
|
+
};
|
|
227
479
|
}
|
|
228
480
|
/**
|
|
229
481
|
* Validate and normalize frame-tile display options. `divisor` is clamped to
|
|
@@ -234,7 +486,10 @@ function validateOccupancyOptions(options) {
|
|
|
234
486
|
*/
|
|
235
487
|
function validateFrameTileDisplayOptions(options) {
|
|
236
488
|
const defaults = DEFAULT_RECORDING_OPTIONS.frameTileDisplay;
|
|
237
|
-
return {
|
|
489
|
+
return {
|
|
490
|
+
divisor: clamp(typeof options.divisor === "number" && Number.isFinite(options.divisor) ? Math.round(options.divisor) : defaults.divisor, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.min, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.max),
|
|
491
|
+
maxTiles: clamp(typeof options.maxTiles === "number" && Number.isFinite(options.maxTiles) ? Math.round(options.maxTiles) : defaults.maxTiles, FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.min, FRAME_TILE_DISPLAY_CONSTRAINTS.maxTiles.max)
|
|
492
|
+
};
|
|
238
493
|
}
|
|
239
494
|
/**
|
|
240
495
|
* Validate and normalize a full RecordingOptions object.
|
|
@@ -248,7 +503,8 @@ function validateRecordingOptions(options) {
|
|
|
248
503
|
occupancy: validateOccupancyOptions(options.occupancy ?? {}),
|
|
249
504
|
frameTileDisplay: validateFrameTileDisplayOptions(options.frameTileDisplay ?? {}),
|
|
250
505
|
visualization: validateVisualizationOptions(options.visualization ?? {}),
|
|
251
|
-
qr: validateQrOptions(options.qr ?? {})
|
|
506
|
+
qr: validateQrOptions(options.qr ?? {}),
|
|
507
|
+
compassDebug: validateCompassDebugOptions(options.compassDebug ?? {})
|
|
252
508
|
};
|
|
253
509
|
}
|
|
254
510
|
/**
|
|
@@ -306,13 +562,18 @@ function resetRecordingOptions(storageKey = STORAGE_KEY) {
|
|
|
306
562
|
function cloneRecordingOptions(options) {
|
|
307
563
|
return {
|
|
308
564
|
depth: { ...options.depth },
|
|
309
|
-
images: {
|
|
565
|
+
images: {
|
|
566
|
+
...options.images,
|
|
567
|
+
motionFilter: { ...options.images.motionFilter },
|
|
568
|
+
qualityFilter: { ...options.images.qualityFilter }
|
|
569
|
+
},
|
|
310
570
|
arCrashIsolation: { ...options.arCrashIsolation },
|
|
311
571
|
occupancy: { ...options.occupancy },
|
|
312
572
|
frameTileDisplay: { ...options.frameTileDisplay },
|
|
313
573
|
visualization: { ...options.visualization },
|
|
314
|
-
qr: { ...options.qr }
|
|
574
|
+
qr: { ...options.qr },
|
|
575
|
+
compassDebug: { ...options.compassDebug }
|
|
315
576
|
};
|
|
316
577
|
}
|
|
317
578
|
//#endregion
|
|
318
|
-
export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, FRAME_TILE_DISPLAY_CONSTRAINTS, IMAGE_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, QR_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateOccupancyOptions, validateQrOptions, validateRecordingOptions, validateVisualizationOptions };
|
|
579
|
+
export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, FRAME_TILE_DISPLAY_CONSTRAINTS, IMAGE_CONSTRAINTS, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-
|
|
1
|
+
import { N as CombinedRootState } from "../create-slam-app-store-D3nzh9Wb.js";
|
|
2
|
+
import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-D0V9WkmY.js";
|
|
3
3
|
export { CombinedRootState, ReplayRecordingOptions, replayRecording };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadActionsFromZip } from "../storage/zip-reader.js";
|
|
2
2
|
import { NullStorageBackend } from "../storage/null-storage-backend.js";
|
|
3
|
-
import { createSlamAppStore } from "
|
|
3
|
+
import { t as createSlamAppStore } from "../create-slam-app-store-DXiAnJwR.js";
|
|
4
4
|
//#region ../src/state/recording-replayer.ts
|
|
5
5
|
/**
|
|
6
6
|
* Recording Replayer
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-
|
|
1
|
+
import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-DTUtSVgd.js";
|
|
2
2
|
export { RecordingState, SessionMetadata, endSession, recordDepthSample, recordWriteFailure, recordingReducer, startSession };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-
|
|
1
|
+
import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-xdrUgWJi.js";
|
|
2
2
|
export { CompleteCallback, DEFAULT_MAX_DELAY_MS, ErrorCallback, ProgressCallback, ReplayAction, ReplayEngine, ReplayState, computeInterActionDelay, extractActionTimestamp };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as SubscribableStore } from "../subscribe-to-selector-
|
|
2
|
-
import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-
|
|
1
|
+
import { t as SubscribableStore } from "../subscribe-to-selector-B9ylM5Oh.js";
|
|
2
|
+
import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-DScA7tdT.js";
|
|
3
3
|
export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { selectAlignmentMatrix, selectGpsPositions, selectOdometryPositions, selectOdometryRotations, selectZeroReference } from "./app-selectors.js";
|
|
2
|
-
import { buildMapData } from "../
|
|
2
|
+
import { t as buildMapData } from "../map-data-D7rpMC6f.js";
|
|
3
3
|
import { subscribeToSelector } from "./subscribe-to-selector.js";
|
|
4
4
|
import { calcGpsCoords } from "gps-plus-slam-js";
|
|
5
5
|
import { mat4, vec3 } from "gl-matrix";
|
|
@@ -46,6 +46,7 @@ function wireStoreSubscribers(store, deps) {
|
|
|
46
46
|
deps.mapOverlay.render(buildMapData({
|
|
47
47
|
rawGpsPath,
|
|
48
48
|
odometryPositions: selectOdometryPositions(state),
|
|
49
|
+
odometryRotations: selectOdometryRotations(state),
|
|
49
50
|
alignmentMatrix: selectAlignmentMatrix(state),
|
|
50
51
|
zeroRef: selectZeroReference(state),
|
|
51
52
|
alignmentSnapshots: alignmentSnapshotGps
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-
|
|
1
|
+
import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B9ylM5Oh.js";
|
|
2
2
|
export { SubscribableStore, subscribeToSelector };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
export { AlignmentSnapshot,
|
|
1
|
+
import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-D3nzh9Wb.js";
|
|
2
|
+
export { AlignmentSnapshot, ConvergenceResult, CoverageResult, DEFAULT_TRACKING_QUALITY_OPTIONS, GpsAccuracyResult, ResidualConsensusResult, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, matrixDelta, reportUpdated, resetTrackingQuality, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer };
|