gps-plus-slam-app-framework 1.9.1 → 1.11.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/README.md +14 -14
- package/dist/{absolute-orientation-BAxc15J6.d.ts → absolute-orientation-Dj1One3y.d.ts} +1 -1
- package/dist/{accuracy-circles-DkWBkF5g.d.ts → accuracy-circles-BHz7yVIL.d.ts} +1 -1
- package/dist/{alignment-lerper-gD70k7Fq.d.ts → alignment-lerper-DAHicRON.d.ts} +0 -6
- package/dist/{app-selectors-BbAiCRUT.d.ts → app-selectors-DG0ZqaeI.d.ts} +23 -13
- package/dist/ar/ar-crash-isolation.d.ts +2 -0
- package/dist/ar/ar-crash-isolation.js +40 -0
- 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/capture-motion-gate.d.ts +2 -0
- package/dist/{capture-motion-gate-_NdTSwKi.js → ar/capture-motion-gate.js} +25 -2
- package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
- package/dist/ar/chromium-camera-access-workaround.js +1 -1
- package/dist/ar/depth-grid-lookup.d.ts +1 -1
- package/dist/ar/depth-occluder.d.ts +1 -1
- package/dist/ar/depth-occluder.js +1 -1
- package/dist/ar/depth-sampler.d.ts +2 -2
- package/dist/ar/depth-sampler.js +16 -5
- package/dist/ar/depth-unprojection.d.ts +1 -1
- package/dist/ar/enable-gps-ar.d.ts +1 -1
- package/dist/ar/enable-gps-ar.js +2 -2
- package/dist/ar/image-capture.d.ts +1 -1
- package/dist/ar/image-capture.js +1 -1
- package/dist/ar/image-quality.d.ts +2 -2
- package/dist/ar/image-quality.js +159 -8
- package/dist/ar/index.d.ts +32 -30
- package/dist/ar/index.js +15 -14
- package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
- package/dist/ar/occlusion-mesh-worker.js +1 -1
- package/dist/ar/occupancy-grid.d.ts +1 -1
- package/dist/ar/occupancy-grid.js +2 -2
- package/dist/ar/occupancy-mesher.d.ts +1 -1
- package/dist/ar/occupancy-mesher.js +4 -5
- package/dist/ar/qr/index.d.ts +11 -0
- package/dist/ar/qr/index.js +11 -0
- package/dist/ar/{planar-pnp.d.ts → qr/planar-pnp.d.ts} +1 -1
- package/dist/ar/{planar-pnp.js → qr/planar-pnp.js} +1 -1
- package/dist/ar/qr/qr-debug-view.d.ts +2 -0
- package/dist/ar/{qr-debug-view.js → qr/qr-debug-view.js} +2 -2
- package/dist/ar/{qr-derived-pose.d.ts → qr/qr-derived-pose.d.ts} +1 -1
- package/dist/ar/{qr-derived-pose.js → qr/qr-derived-pose.js} +2 -2
- package/dist/ar/{qr-detection-controller.d.ts → qr/qr-detection-controller.d.ts} +1 -1
- package/dist/ar/qr/qr-detection-controller.js +2 -0
- package/dist/ar/{qr-frontend.d.ts → qr/qr-frontend.d.ts} +1 -1
- package/dist/ar/{qr-frontend.js → qr/qr-frontend.js} +1 -1
- package/dist/ar/{qr-pose.d.ts → qr/qr-pose.d.ts} +1 -1
- package/dist/ar/{qr-pose.js → qr/qr-pose.js} +1 -1
- package/dist/ar/qr/qr-size-depth-context.d.ts +3 -0
- package/dist/ar/{qr-size-depth-context.js → qr/qr-size-depth-context.js} +4 -4
- package/dist/ar/{qr-size-measurer.d.ts → qr/qr-size-measurer.d.ts} +1 -1
- package/dist/ar/qr/qr-size-measurer.js +2 -0
- package/dist/ar/replay-scene.d.ts +1 -1
- package/dist/ar/replay-scene.js +15 -13
- 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-error-handler.d.ts +1 -1
- package/dist/ar/xr-frame-loop.d.ts +1 -1
- package/dist/ar/xr-frame-loop.js +1 -1
- package/dist/ar-crash-isolation-DlXCGzMf.d.ts +52 -0
- package/dist/{ar-types-Cc5yvBwn.d.ts → ar-types-D6PYS4bc.d.ts} +16 -1
- package/dist/{ar-world-group-alignment-Cfg0trC3.d.ts → ar-world-group-alignment-BdS_h8Nf.d.ts} +2 -2
- package/dist/{capability-checker-BTTpygvZ.d.ts → capability-checker-BZ3_x1YL.d.ts} +1 -1
- package/dist/capture-motion-gate-CPwLekNf.d.ts +120 -0
- package/dist/{chromium-camera-access-workaround-C6yJLXz9.d.ts → chromium-camera-access-workaround-BHR4clTE.d.ts} +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/{create-slam-app-store-D1QSMuKu.d.ts → create-slam-app-store-DFm5K9Ob.d.ts} +15 -6
- package/dist/{create-slam-app-store-DXiAnJwR.js → create-slam-app-store-oK9bnqyI.js} +10 -8
- package/dist/{depth-grid-lookup-D5atpNZ3.d.ts → depth-grid-lookup-CCuzlqUo.d.ts} +1 -1
- package/dist/{depth-sampler-CwObAwEA.d.ts → depth-sampler-CS2jAFw4.d.ts} +15 -5
- package/dist/{depth-unprojection-DRdBU90S.d.ts → depth-unprojection-ET3Gwedf.d.ts} +1 -1
- package/dist/device-orientation-cache-j-kLP8he.js +20 -0
- package/dist/{enable-gps-ar-BBtRO2FJ.d.ts → enable-gps-ar-D_xEHzh5.d.ts} +9 -4
- package/dist/{file-system-utils-DueXHxo9.d.ts → file-system-utils-BHI0rXr9.d.ts} +1 -1
- package/dist/{frame-conversions-DDcNHkTb.d.ts → frame-conversions-CH7E2Iv_.d.ts} +1 -1
- package/dist/{fused-path-C5pp0PJU.d.ts → fused-path-DOKzVMiO.d.ts} +1 -1
- package/dist/geo/h3-proximity.d.ts +1 -1
- package/dist/geo/h3-proximity.js +1 -1
- package/dist/geo/index.d.ts +1 -1
- package/dist/{geodesic-angle-BTldfFgs.js → geodesic-angle-CZ_Ow90I.js} +2 -2
- package/dist/{gps-CDKDQokE.d.ts → gps-CnhYrJCa.d.ts} +8 -1
- package/dist/{gps-anchor-CEjGqEVD.d.ts → gps-anchor-BaqyRsPC.d.ts} +14 -4
- package/dist/{gps-ar-pose-sampler-DEGNk2CI.d.ts → gps-ar-pose-sampler-BuuUuK-D.d.ts} +1 -1
- package/dist/{gps-event-coordinator-BWpgBrHq.d.ts → gps-event-coordinator-Cruoe5I-.d.ts} +16 -29
- package/dist/{gps-event-markers-Di2nBzx-.d.ts → gps-event-markers-y2b2aVl6.d.ts} +35 -1
- package/dist/{h3-proximity-D0GTHQmr.d.ts → h3-proximity-BaAulrnM.d.ts} +1 -1
- package/dist/{image-capture-Bp6Pd4Md.d.ts → image-capture-BevgKpoO.d.ts} +6 -6
- package/dist/{image-capture-DVcuqMtX.js → image-capture-C4DwxC10.js} +12 -10
- package/dist/{image-quality-BMx2ko9-.d.ts → image-quality--HLuyJ2r.d.ts} +44 -2
- package/dist/{index-cCQWuYqy.d.ts → index-BWVwd9Zw.d.ts} +10 -74
- package/dist/{index-B6iBnO_K.d.ts → index-ClmnNJ6-.d.ts} +1 -1
- package/dist/index-Dxb6ATNK.d.ts +64 -0
- package/dist/index.d.ts +79 -79
- package/dist/index.js +26 -24
- package/dist/{leaflet-map-overlay-CBWPvaX9.js → leaflet-map-overlay-CTcTVmL1.js} +1 -1
- package/dist/{leaflet-map-overlay-C8GS4cUy.d.ts → leaflet-map-overlay-CksetpTt.d.ts} +1 -1
- package/dist/{map-data-CUnTzRIC.d.ts → map-data-D8cCqpOM.d.ts} +3 -3
- package/dist/{map-data-1tF5gcYV.js → map-data-DkhsYDGM.js} +1 -1
- package/dist/{map-overlay-draw-6WJeq0Kg.d.ts → map-overlay-draw-Cy-klqoA.d.ts} +1 -1
- package/dist/median-DDBrZGP0.js +44 -0
- package/dist/{null-storage-backend-B1-jlpin.d.ts → null-storage-backend-DXXuwG8T.d.ts} +2 -2
- package/dist/{occlusion-mesh-kXCQ2FM1.d.ts → occlusion-mesh-BWe2PrVi.d.ts} +23 -12
- package/dist/{occupancy-grid-BV7RhB7I.d.ts → occupancy-grid-CYBdmMOo.d.ts} +3 -3
- package/dist/{occupancy-mesher-C2ecWhNp.d.ts → occupancy-mesher-B4Bv4BTk.d.ts} +4 -9
- package/dist/{opfs-storage-backend-D6Z03fML.d.ts → opfs-storage-backend-D1ZpeNEL.d.ts} +2 -2
- package/dist/{persistence-middleware-CG-t08X4.d.ts → persistence-middleware-Cun4aF5M.d.ts} +13 -3
- package/dist/{planar-pnp-D7bc_rLX.d.ts → planar-pnp-ByxwDEyM.d.ts} +2 -2
- package/dist/{ar-BqCudtqE.js → qr-CTp5xI83.js} +24 -34
- package/dist/{qr-debug-view-BJooqbiP.d.ts → qr-debug-view-CGlITU09.d.ts} +2 -2
- package/dist/{qr-derived-pose-BwNWn8oV.d.ts → qr-derived-pose-DZPxZd9C.d.ts} +3 -3
- package/dist/{qr-detected-slice-TzVb8bij.d.ts → qr-detected-slice-mfyxD2-M.d.ts} +9 -8
- package/dist/{qr-detection-controller-Bo4XfQTP.d.ts → qr-detection-controller-C5NII-vs.d.ts} +4 -4
- package/dist/{qr-detection-controller-B-tLVd-S.js → qr-detection-controller-DXc1yHRf.js} +3 -3
- package/dist/{qr-frontend-BPURlh3S.d.ts → qr-frontend-QzKZSqB-.d.ts} +2 -2
- package/dist/{qr-pose-y3vaEd6x.d.ts → qr-pose-21fRDcFO.d.ts} +1 -1
- package/dist/{qr-pose-aggregation-DBiaLW0O.js → qr-pose-aggregation-Cp0Mtg_j.js} +7 -12
- package/dist/{qr-pose-aggregation-CypnmjA-.d.ts → qr-pose-aggregation-mABSN0AW.d.ts} +2 -2
- package/dist/{qr-size-depth-context-apAOmbrZ.d.ts → qr-size-depth-context-CMDv6T29.d.ts} +3 -3
- package/dist/{qr-size-measurer-DxiMqRUw.d.ts → qr-size-measurer-rVFf4AdM.d.ts} +5 -5
- package/dist/{qr-size-measurer-DLb33geH.js → qr-size-measurer-zZB9S1va.js} +9 -15
- package/dist/{recording-replayer-BJ8Lf0QY.d.ts → recording-replayer-qT2EM1Qs.d.ts} +2 -2
- package/dist/{recording-slice-BW8SiLo1.d.ts → recording-slice-DXw5-UvO.d.ts} +10 -5
- package/dist/{replay-engine-DmCAc7WM.d.ts → replay-engine-B1H_kLhK.d.ts} +1 -1
- package/dist/{replay-scene-zJ8SFDjE.d.ts → replay-scene-BJeO36YT.d.ts} +12 -5
- package/dist/sensors/absolute-orientation.d.ts +1 -1
- package/dist/sensors/absolute-orientation.js +1 -1
- package/dist/sensors/gps-error-handler.d.ts +1 -1
- package/dist/sensors/gps.d.ts +1 -1
- package/dist/sensors/gps.js +10 -8
- package/dist/sensors/index.d.ts +3 -3
- package/dist/sensors/index.js +1 -1
- package/dist/sensors/permission-checker.js +71 -40
- package/dist/{session-disposers-BPrMplIC.js → session-disposers-B7hUN90w.js} +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 -1
- package/dist/state/gps-ar-pose-sampler.d.ts +2 -3
- package/dist/state/gps-ar-pose-sampler.js +1 -1
- package/dist/state/gps-event-coordinator.d.ts +2 -1
- package/dist/state/gps-event-coordinator.js +4 -46
- package/dist/state/index.d.ts +19 -20
- package/dist/state/index.js +6 -5
- package/dist/state/persistence-middleware.d.ts +2 -2
- package/dist/state/persistence-middleware.js +24 -15
- package/dist/state/qr-detected-slice.d.ts +3 -3
- package/dist/state/qr-detected-slice.js +11 -15
- 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 +23 -6
- package/dist/state/subscribe-to-selector.d.ts +1 -1
- package/dist/state/tracking-quality.d.ts +1 -1
- package/dist/state/tracking-quality.js +14 -11
- package/dist/state/tracking-slice.d.ts +1 -1
- package/dist/{state-BeKvn4B-.js → state-CDF5LvsO.js} +2 -4
- package/dist/storage/file-system-utils.d.ts +1 -1
- package/dist/storage/file-system-utils.js +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/storage-backend.d.ts +1 -1
- package/dist/storage/zip-coverage-embed.d.ts +1 -1
- package/dist/storage/zip-coverage-embed.js +1 -1
- package/dist/storage/zip-export.d.ts +1 -1
- package/dist/storage/zip-export.js +10 -4
- package/dist/storage/zip-reader.d.ts +1 -1
- package/dist/{storage-backend-sEtmM4yW.d.ts → storage-backend-BX7egQKi.d.ts} +1 -1
- package/dist/{store-subscribers-DJUErW-o.d.ts → store-subscribers-CWHToX6N.d.ts} +2 -2
- package/dist/{subscribe-to-selector-dQV8SpsO.d.ts → subscribe-to-selector-j-eOYybQ.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-DMkHlbny.d.ts → tracking-slice-BAbcZK-Y.d.ts} +3 -2
- package/dist/types/ar-types.d.ts +2 -2
- package/dist/types/ar-types.js +31 -1
- package/dist/types/geo-types.d.ts +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.js +2 -1
- 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/fused-path.js +1 -1
- package/dist/utils/index.d.ts +7 -7
- package/dist/utils/index.js +1 -1
- package/dist/utils/list-formatter.d.ts +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +30 -20
- package/dist/visualization/accuracy-circles.d.ts +1 -1
- package/dist/visualization/accuracy-circles.js +1 -1
- package/dist/visualization/alignment-lerper.d.ts +1 -1
- package/dist/visualization/alignment-lerper.js +20 -5
- package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.js +2 -2
- 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-anchor.js +44 -19
- package/dist/visualization/gps-compass-cubes.d.ts +1 -1
- package/dist/visualization/gps-event-markers.d.ts +2 -2
- package/dist/visualization/gps-event-markers.js +27 -6
- package/dist/visualization/hit-test-reticle.d.ts +1 -1
- package/dist/visualization/index.d.ts +19 -20
- package/dist/visualization/index.js +4 -5
- package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
- package/dist/visualization/leaflet-map-overlay.js +1 -1
- package/dist/visualization/lerp-utils.d.ts +1 -1
- package/dist/visualization/map-data.d.ts +1 -1
- package/dist/visualization/map-data.js +1 -1
- package/dist/visualization/map-overlay-draw.d.ts +1 -1
- package/dist/visualization/occluder-mesh-driver.d.ts +2 -2
- package/dist/visualization/occluder-mesh-driver.js +1 -1
- package/dist/visualization/occlusion-mesh.d.ts +2 -2
- package/dist/visualization/occlusion-mesh.js +29 -14
- package/dist/visualization/three-dispose.d.ts +1 -1
- package/dist/visualization/vis-colors.d.ts +1 -1
- package/dist/{webxr-session-BWCpGd-2.d.ts → webxr-session-DefwObIu.d.ts} +143 -193
- package/dist/{webxr-session-BCP2XK7k.js → webxr-session-OyR3YbTq.js} +154 -284
- package/dist/{xr-frame-loop-DX3JPpAU.d.ts → xr-frame-loop-BiZvgqP7.d.ts} +1 -1
- package/dist/{zip-coverage-embed-ncVbaZAz.d.ts → zip-coverage-embed-CyoX7XL7.d.ts} +1 -1
- package/package.json +5 -3
- package/dist/ar/qr-debug-view.d.ts +0 -2
- package/dist/ar/qr-detection-controller.js +0 -2
- package/dist/ar/qr-size-depth-context.d.ts +0 -3
- package/dist/ar/qr-size-measurer.js +0 -2
- package/dist/capture-motion-gate-BGoAMkmf.d.ts +0 -24
- package/dist/map-overlay-BCQgvIgU.d.ts +0 -153
- package/dist/recording-options-DYKWVI93.d.ts +0 -693
- package/dist/state/recording-options.d.ts +0 -2
- package/dist/state/recording-options.js +0 -591
- package/dist/visualization/map-overlay.d.ts +0 -2
- package/dist/visualization/map-overlay.js +0 -241
- /package/dist/{bresenham3d-DGc4nIb-.d.ts → bresenham3d-D-t9i_b5.d.ts} +0 -0
- /package/dist/{camera-blit-capture-BimSdyih.d.ts → camera-blit-capture-BlC-arRb.d.ts} +0 -0
- /package/dist/{camera-follower-DfBm2J5i.d.ts → camera-follower-CO_ibF2o.d.ts} +0 -0
- /package/dist/{capture-failure-tracker-_BVfhpxv.d.ts → capture-failure-tracker-BAUKjtXU.d.ts} +0 -0
- /package/dist/{cell-key-DIB4rOTV.js → cell-key-Bj-eYTLA.js} +0 -0
- /package/dist/{concurrency-DPeGBH0X.d.ts → concurrency-DW0jQo3G.d.ts} +0 -0
- /package/dist/{css3d-renderer-manager-CPpVtvgs.d.ts → css3d-renderer-manager-CJjHtCMT.d.ts} +0 -0
- /package/dist/{failure-tracker-CeKf5HIc.d.ts → failure-tracker-B7fzPfZo.d.ts} +0 -0
- /package/dist/{format-file-size-DxN-EBLc.d.ts → format-file-size-Da8rZgfs.d.ts} +0 -0
- /package/dist/{frustum-visibility-CokkgS_i.d.ts → frustum-visibility-COPfzruF.d.ts} +0 -0
- /package/dist/{geo-types-DrGVu8nS.d.ts → geo-types-BfDK8kJu.d.ts} +0 -0
- /package/dist/{gps-compass-cubes-1mooS3BS.d.ts → gps-compass-cubes-CT3TWctJ.d.ts} +0 -0
- /package/dist/{gps-error-handler-C34GQuTu.d.ts → gps-error-handler-DjVuLXve.d.ts} +0 -0
- /package/dist/{hit-test-reticle-CaQbrhbk.d.ts → hit-test-reticle-DhnCMOsc.d.ts} +0 -0
- /package/dist/{index-DXPVzOpP.d.ts → index-CjxbDm8W.d.ts} +0 -0
- /package/dist/{index-D74JTX4I.d.ts → index-Nr3qg4IH.d.ts} +0 -0
- /package/dist/{lerp-utils-Qs8OhumS.d.ts → lerp-utils-bwMwVCpU.d.ts} +0 -0
- /package/dist/{list-formatter-DLFDnS70.d.ts → list-formatter-1ttG18MQ.d.ts} +0 -0
- /package/dist/{logger-CqTd5Kpk.d.ts → logger-B4StJUDb.d.ts} +0 -0
- /package/dist/{opfs-storage-CTkxvxN4.d.ts → opfs-storage-S_odkCk1.d.ts} +0 -0
- /package/dist/{scene-node-names-CGb-ylBd.d.ts → scene-node-names-DWzhE7Ro.d.ts} +0 -0
- /package/dist/{three-dispose-BMOAmPhb.d.ts → three-dispose-C3mnKQR5.d.ts} +0 -0
- /package/dist/{vis-colors-C7HI0u9_.d.ts → vis-colors-CoSpbZEO.d.ts} +0 -0
- /package/dist/{webxr-nue-basis-CaCnYxuq.d.ts → webxr-nue-basis-C3vTqkE2.d.ts} +0 -0
- /package/dist/{xr-error-handler-uVGDu9IX.d.ts → xr-error-handler-D9y5r8ok.d.ts} +0 -0
- /package/dist/{zip-export-CtiUnAlJ.d.ts → zip-export-CuBimX1J.d.ts} +0 -0
- /package/dist/{zip-reader-BzENzMH6.d.ts → zip-reader-BHc_b_iA.d.ts} +0 -0
package/dist/ar/replay-scene.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { i as createSceneHierarchy } from "../webxr-session-OyR3YbTq.js";
|
|
3
3
|
import { createCss3dRendererManager } from "../visualization/css3d-renderer-manager.js";
|
|
4
4
|
import { createCameraFollower } from "../visualization/camera-follower.js";
|
|
5
5
|
import { createAlignmentLerper } from "../visualization/alignment-lerper.js";
|
|
@@ -16,8 +16,15 @@ import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
|
|
16
16
|
* controls operate in a stable world-space frame, unaffected by the
|
|
17
17
|
* alignment matrix on arWorldGroup or odom pose updates on arpose.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* OWNS its scene objects: the replay scene/arWorldGroup/camera/arpose are
|
|
20
|
+
* exposed via initReplayScene()'s return value and getReplayState(), and are
|
|
21
|
+
* NEVER injected into webxr-session.ts (the historical Risk R1
|
|
22
|
+
* setScene/setArWorldGroup/setCamera/setArPose hack was removed by the
|
|
23
|
+
* 2026-07-11 webxr-session surface-reduction plan, step 2). The live-session
|
|
24
|
+
* getters (getScene() etc.) stay null during replay; replay consumers read
|
|
25
|
+
* this module's accessors instead, and scene-reading visualizers (e.g.
|
|
26
|
+
* gpsEventVisualizer.setSceneSource) are pointed at these references by the
|
|
27
|
+
* replay orchestrator.
|
|
21
28
|
*
|
|
22
29
|
* Camera modes:
|
|
23
30
|
* - orbit (default): OrbitControls — click-drag orbit + scroll zoom
|
|
@@ -70,7 +77,8 @@ function updateFpsMovement(dt) {
|
|
|
70
77
|
* - Creates the scene hierarchy via createSceneHierarchy()
|
|
71
78
|
* - Reparents camera from arWorldGroup to scene root (Risk R5)
|
|
72
79
|
* - Creates a WebGLRenderer WITHOUT WebXR
|
|
73
|
-
* -
|
|
80
|
+
* - Keeps its own scene/arWorldGroup/arpose/camera references (returned
|
|
81
|
+
* here and via getReplayState()) — nothing is written into webxr-session
|
|
74
82
|
* - Inserts canvas into the provided container
|
|
75
83
|
* - Starts a requestAnimationFrame render loop
|
|
76
84
|
* - Sets up OrbitControls as default camera mode
|
|
@@ -96,10 +104,6 @@ function initReplayScene(container) {
|
|
|
96
104
|
renderer.xr.enabled = false;
|
|
97
105
|
container.appendChild(renderer.domElement);
|
|
98
106
|
const css3dManager = createCss3dRendererManager(container, width, height);
|
|
99
|
-
setScene(scene);
|
|
100
|
-
setArWorldGroup(arWorldGroup);
|
|
101
|
-
setArPose(arpose);
|
|
102
|
-
setCamera(camera);
|
|
103
107
|
const orbitControls = new OrbitControls(camera, renderer.domElement);
|
|
104
108
|
orbitControls.enableDamping = true;
|
|
105
109
|
orbitControls.target.set(0, 0, 0);
|
|
@@ -109,6 +113,7 @@ function initReplayScene(container) {
|
|
|
109
113
|
state = {
|
|
110
114
|
scene,
|
|
111
115
|
arWorldGroup,
|
|
116
|
+
arpose,
|
|
112
117
|
camera,
|
|
113
118
|
renderer,
|
|
114
119
|
orbitControls,
|
|
@@ -123,6 +128,7 @@ function initReplayScene(container) {
|
|
|
123
128
|
return {
|
|
124
129
|
scene,
|
|
125
130
|
arWorldGroup,
|
|
131
|
+
arpose,
|
|
126
132
|
camera,
|
|
127
133
|
renderer
|
|
128
134
|
};
|
|
@@ -134,7 +140,7 @@ function initReplayScene(container) {
|
|
|
134
140
|
* - Disposes renderer (frees GPU resources)
|
|
135
141
|
* - Disposes camera controls
|
|
136
142
|
* - Removes canvas from DOM
|
|
137
|
-
* - Clears module
|
|
143
|
+
* - Clears this module's state (getReplayState() returns null afterwards)
|
|
138
144
|
*
|
|
139
145
|
* Safe to call multiple times (idempotent).
|
|
140
146
|
*/
|
|
@@ -151,10 +157,6 @@ function disposeReplayScene() {
|
|
|
151
157
|
restoreTabindex();
|
|
152
158
|
if (state.renderer.domElement.parentElement) state.renderer.domElement.parentElement.removeChild(state.renderer.domElement);
|
|
153
159
|
state.renderer.dispose();
|
|
154
|
-
setScene(null);
|
|
155
|
-
setArWorldGroup(null);
|
|
156
|
-
setArPose(null);
|
|
157
|
-
setCamera(null);
|
|
158
160
|
state = null;
|
|
159
161
|
log.info("Replay scene disposed");
|
|
160
162
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as SCENE_NODE } from "../scene-node-names-
|
|
1
|
+
import { t as SCENE_NODE } from "../scene-node-names-DWzhE7Ro.js";
|
|
2
2
|
export { SCENE_NODE };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as WEBXR_TO_NUE } from "../webxr-nue-basis-
|
|
1
|
+
import { t as WEBXR_TO_NUE } from "../webxr-nue-basis-C3vTqkE2.js";
|
|
2
2
|
export { WEBXR_TO_NUE };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as DepthSample, t as ARPose } from "../ar-types-
|
|
2
|
-
import { n as CapturedImage } from "../image-capture-
|
|
3
|
-
import {
|
|
4
|
-
export { ARPose,
|
|
1
|
+
import { i as DepthSample, t as ARPose } from "../ar-types-D6PYS4bc.js";
|
|
2
|
+
import { n as CapturedImage } from "../image-capture-BevgKpoO.js";
|
|
3
|
+
import { A as startCameraFrameCapture, C as isWebXRSupported, D as rebindTrackingStore, E as nueQuaternionToWebXR, F as stopImageCapture, M as startImageCapture, N as stopCameraFrameCapture, O as resetWebXRState, P as stopDepthCapture, S as initAR, T as nuePositionToWebXR, _ as getDepthInfoFromFrame, a as SessionFeatureOptions, b as getScene, c as buildSessionOptions, d as extractPoseFromViewer, f as extractResetTransformData, g as getCurrentArPose, h as getCameraFrameCount, i as SessionEndInfo, j as startDepthCapture, k as shouldLogCameraAccessDiagnostic, l as createSceneHierarchy, m as getCamera, n as CameraFrameCaptureConfig, o as TrackingSubscribableStore, p as getArWorldGroup, r as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, s as applyAlignmentMatrix, t as ArSessionCallbacks, u as endARSession, v as getDepthSampleCount, w as isXRCameraLike, x as getXrCameraFromPose, y as getImageCaptureFrameCount } from "../webxr-session-DefwObIu.js";
|
|
4
|
+
export { ARPose, ArSessionCallbacks, CameraFrameCaptureConfig, CapturedImage, DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, DepthSample, SessionEndInfo, SessionFeatureOptions, TrackingSubscribableStore, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArWorldGroup, getCamera, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, rebindTrackingStore, resetWebXRState, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
|
package/dist/ar/webxr-session.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
export {
|
|
1
|
+
import { A as stopImageCapture, C as resetWebXRState, D as startImageCapture, E as startDepthCapture, O as stopCameraFrameCapture, S as rebindTrackingStore, T as startCameraFrameCapture, _ as initAR, a as endARSession, b as nuePositionToWebXR, c as getArWorldGroup, d as getCurrentArPose, f as getDepthInfoFromFrame, g as getXrCameraFromPose, h as getScene, i as createSceneHierarchy, k as stopDepthCapture, l as getCamera, m as getImageCaptureFrameCount, n as applyAlignmentMatrix, o as extractPoseFromViewer, p as getDepthSampleCount, r as buildSessionOptions, s as extractResetTransformData, t as DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, u as getCameraFrameCount, v as isWebXRSupported, w as shouldLogCameraAccessDiagnostic, x as nueQuaternionToWebXR, y as isXRCameraLike } from "../webxr-session-OyR3YbTq.js";
|
|
2
|
+
export { DEFAULT_CAMERA_FRAME_CAPTURE_SIZE, applyAlignmentMatrix, buildSessionOptions, createSceneHierarchy, endARSession, extractPoseFromViewer, extractResetTransformData, getArWorldGroup, getCamera, getCameraFrameCount, getCurrentArPose, getDepthInfoFromFrame, getDepthSampleCount, getImageCaptureFrameCount, getScene, getXrCameraFromPose, initAR, isWebXRSupported, isXRCameraLike, nuePositionToWebXR, nueQuaternionToWebXR, rebindTrackingStore, resetWebXRState, shouldLogCameraAccessDiagnostic, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as XR_ERROR_MESSAGE_UNKNOWN, r as getXrErrorMessage, t as XR_ERROR_MESSAGES } from "../xr-error-handler-
|
|
1
|
+
import { n as XR_ERROR_MESSAGE_UNKNOWN, r as getXrErrorMessage, t as XR_ERROR_MESSAGES } from "../xr-error-handler-D9y5r8ok.js";
|
|
2
2
|
export { XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, getXrErrorMessage };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as runXrFrameUpdates, i as registerXrFrameUpdate, n as XrFrameUpdate, r as clearXrFrameUpdates, t as XrFrameContext } from "../xr-frame-loop-
|
|
1
|
+
import { a as runXrFrameUpdates, i as registerXrFrameUpdate, n as XrFrameUpdate, r as clearXrFrameUpdates, t as XrFrameContext } from "../xr-frame-loop-BiZvgqP7.js";
|
|
2
2
|
export { XrFrameContext, XrFrameUpdate, clearXrFrameUpdates, registerXrFrameUpdate, runXrFrameUpdates };
|
package/dist/ar/xr-frame-loop.js
CHANGED
|
@@ -18,7 +18,7 @@ import { createLogger } from "../utils/logger.js";
|
|
|
18
18
|
* makes correct use the easy path and stashing the awkward one. Do NOT retain
|
|
19
19
|
* `ctx` or its fields beyond the callback's synchronous execution.
|
|
20
20
|
*
|
|
21
|
-
* See `2026-06-03-threejs-arbutton-minimal-ar-example-user-feedback.md`
|
|
21
|
+
* See `2026-06-03-0553-threejs-arbutton-minimal-ar-example-user-feedback.md`
|
|
22
22
|
* §6.2/§6.3 (option H-A2) for the design rationale.
|
|
23
23
|
*/
|
|
24
24
|
const log = createLogger("XrFrameLoop");
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//#region ../src/ar/ar-crash-isolation.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* AR crash isolation flags — diagnostic gates for XR session negotiation.
|
|
4
|
+
*
|
|
5
|
+
* Moved out of the recorder settings catalog (2026-07-11 G-1 move,
|
|
6
|
+
* `2026-07-11-1445-recording-options-altitude-move-plan.md`): the framework itself
|
|
7
|
+
* consumes these flags in `webxr-session.ts` (session feature requests, frame
|
|
8
|
+
* loop) and on `enable-gps-ar.ts`'s public param, so the type + defaults +
|
|
9
|
+
* validator live framework-side. The recorder embeds the group in its own
|
|
10
|
+
* `RecordingOptions` catalog and re-exports the type.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Diagnostic flags for isolating pre-recording AR startup crashes.
|
|
14
|
+
* These gates affect XR session negotiation and frame-loop behavior,
|
|
15
|
+
* independently of recording-time image/depth capture.
|
|
16
|
+
*/
|
|
17
|
+
interface ArCrashIsolationOptions {
|
|
18
|
+
enableDomOverlay: boolean;
|
|
19
|
+
enableCameraAccess: boolean;
|
|
20
|
+
enableDepthSensingFeature: boolean;
|
|
21
|
+
enableCss3dRenderer: boolean;
|
|
22
|
+
enableCameraTextureAcquisition: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Apply the Chromium WebXR camera-access tab-crash workaround at app
|
|
25
|
+
* bootstrap. The workaround always deletes
|
|
26
|
+
* `XRWebGLBinding.prototype.createProjectionLayer` /
|
|
27
|
+
* `XRRenderState.prototype.layers` (forcing `XRWebGLLayer`) — required on
|
|
28
|
+
* every affected Chrome build observed on-device, including Chrome 150 — and
|
|
29
|
+
* additionally persists the `baseLayer` across
|
|
30
|
+
* `XRSession.prototype.updateRenderState` only for Chrome builds inside the
|
|
31
|
+
* affected window (148.0.7778.12 up to 149.0.7821).
|
|
32
|
+
*
|
|
33
|
+
* Default `true`. Opt-out is offered because forcing `XRWebGLLayer` may break
|
|
34
|
+
* WebXR on unaffected (e.g. Quest) devices.
|
|
35
|
+
*
|
|
36
|
+
* @see GpsPlusSlamJs_AppFramework/src/ar/chromium-camera-access-workaround.ts
|
|
37
|
+
* @see https://github.com/mrdoob/three.js/issues/33404
|
|
38
|
+
*/
|
|
39
|
+
applyChromiumProjectionLayerWorkaround: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Default AR-crash-isolation flags (all features enabled). */
|
|
42
|
+
declare const DEFAULT_AR_CRASH_ISOLATION: ArCrashIsolationOptions;
|
|
43
|
+
/**
|
|
44
|
+
* Validate and normalize AR crash isolation flags.
|
|
45
|
+
* Missing or invalid values fall back to defaults. The container itself is as
|
|
46
|
+
* untrusted as its fields (persisted blobs may lack the key entirely or hold
|
|
47
|
+
* `null`), so a nullish container yields the full defaults instead of
|
|
48
|
+
* throwing.
|
|
49
|
+
*/
|
|
50
|
+
declare function validateArCrashIsolationOptions(rawOptions?: Partial<ArCrashIsolationOptions> | null): ArCrashIsolationOptions;
|
|
51
|
+
//#endregion
|
|
52
|
+
export { DEFAULT_AR_CRASH_ISOLATION as n, validateArCrashIsolationOptions as r, ArCrashIsolationOptions as t };
|
|
@@ -43,6 +43,21 @@ interface ARPose {
|
|
|
43
43
|
readonly position: WebXRVec3;
|
|
44
44
|
readonly orientation: WebXRQuaternion;
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Extract the raw odometry position tuple from an {@link ARPose}.
|
|
48
|
+
*
|
|
49
|
+
* Returns the raw WebXR position without coordinate conversion — the reducer
|
|
50
|
+
* applies the WebXR→NUE transform when storing into state (raw-storage
|
|
51
|
+
* pattern, see docs/2026-04-09-raw-storage-convert-on-read.md).
|
|
52
|
+
* WebXR local-floor frame: X=East, Y=Up, Z=South (toward viewer / backward).
|
|
53
|
+
*
|
|
54
|
+
* Lives next to the type (quality-review G-8 — it used to sit in
|
|
55
|
+
* `state/gps-event-coordinator.ts`, forcing an ar→state import in
|
|
56
|
+
* `ar/depth-sampler.ts`).
|
|
57
|
+
*/
|
|
58
|
+
declare function extractOdomPosition(arPose: ARPose): Vector3;
|
|
59
|
+
/** Extract the raw odometry rotation tuple from an {@link ARPose}. */
|
|
60
|
+
declare function extractOdomRotation(arPose: ARPose): Quaternion;
|
|
46
61
|
/**
|
|
47
62
|
* An sRGB color triple, 0–255 integers per channel. Kept as plain ints so
|
|
48
63
|
* persisted JSON stays compact (~3 bytes/point in practice).
|
|
@@ -102,4 +117,4 @@ interface DepthSample {
|
|
|
102
117
|
readonly projectionMatrix?: Matrix4;
|
|
103
118
|
}
|
|
104
119
|
//#endregion
|
|
105
|
-
export { RgbTuple as a, DepthSample as i, ArPoseTuples as n, WebXRQuaternion as o, DepthPoint as r, WebXRVec3 as s, ARPose as t };
|
|
120
|
+
export { RgbTuple as a, extractOdomPosition as c, DepthSample as i, extractOdomRotation as l, ArPoseTuples as n, WebXRQuaternion as o, DepthPoint as r, WebXRVec3 as s, ARPose as t };
|
package/dist/{ar-world-group-alignment-Cfg0trC3.d.ts → ar-world-group-alignment-BdS_h8Nf.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as SubscribableStore } from "./subscribe-to-selector-
|
|
1
|
+
import { t as SubscribableStore } from "./subscribe-to-selector-j-eOYybQ.js";
|
|
2
2
|
import * as THREE from "three";
|
|
3
3
|
|
|
4
4
|
//#region ../src/visualization/ar-world-group-alignment.d.ts
|
|
@@ -32,7 +32,7 @@ interface ArWorldGroupAlignmentHandle {
|
|
|
32
32
|
* handle is still returned for callers that want to stop alignment mid-session,
|
|
33
33
|
* and is idempotent + self-deregistering so a manual `dispose()` and the
|
|
34
34
|
* teardown flush never double-run. See
|
|
35
|
-
* gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-08-arworldgroup-alignment-session-scoped-disposal.md.
|
|
35
|
+
* gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-08-2149-arworldgroup-alignment-session-scoped-disposal.md.
|
|
36
36
|
*
|
|
37
37
|
* Double-drive is still the caller's concern: the recorder owns its own lerper
|
|
38
38
|
* and must NOT also call this (it would double-lerp the same group). It does not
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* stays in each app's `main.ts`; only the browser-free decision and the
|
|
9
9
|
* user-facing message live here so they can be unit-tested without a browser.
|
|
10
10
|
*
|
|
11
|
-
* See `2026-06-03-threejs-arbutton-minimal-ar-example-user-feedback.md` §6.4.
|
|
11
|
+
* See `2026-06-03-0553-threejs-arbutton-minimal-ar-example-user-feedback.md` §6.4.
|
|
12
12
|
*/
|
|
13
13
|
/** The two capabilities every GPS+AR demo requires to run. */
|
|
14
14
|
interface CapabilitySupport {
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
//#region ../src/ar/capture-motion-gate.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Capture motion gate — the policy that decides whether a *due* capture should
|
|
4
|
+
* fire on the current frame or be deferred until the device settles.
|
|
5
|
+
*
|
|
6
|
+
* Two cohesive pieces, both pure/deterministic and unit-testable in isolation
|
|
7
|
+
* from `ImageCaptureManager`:
|
|
8
|
+
* - {@link decideCapture} — the stateless capture-vs-defer decision over the
|
|
9
|
+
* windowed motion maxima, the thresholds, and the time since the capture
|
|
10
|
+
* became due (the never-calm safety fallback).
|
|
11
|
+
* - {@link MotionWindow} — a tiny fixed-size ring of recent per-frame
|
|
12
|
+
* velocities with glitch rejection, so the decision judges "max over the
|
|
13
|
+
* last N frames" rather than one lucky-calm sample.
|
|
14
|
+
*
|
|
15
|
+
* The window size and glitch ceilings are INTERNAL constants, deliberately not
|
|
16
|
+
* user-facing config: the user-facing surface is only enabled / maxAngular /
|
|
17
|
+
* maxLinear / maxWaitMs (plan §5.1). Keeping the stateful policy here (not in a
|
|
18
|
+
* speculative framework-wide service) matches the plan's §4.1 scope note.
|
|
19
|
+
*
|
|
20
|
+
* @see GpsPlusSlamJs_Docs/docs/2026-06-23-2105-blurry-frame-motion-gating-plan.md §4.2-4.4
|
|
21
|
+
*/
|
|
22
|
+
/** Default number of recent frames the gate judges motion over (~50 ms @ 60fps). */
|
|
23
|
+
declare const DEFAULT_MOTION_WINDOW_SIZE = 3;
|
|
24
|
+
/**
|
|
25
|
+
* User-/consumer-facing motion-filter configuration. Shared by both config
|
|
26
|
+
* shapes that carry it — `ImageCaptureConfig` (what `ImageCaptureManager`
|
|
27
|
+
* consumes) and `ImageCaptureOptions` (the persisted recorder options) — so the
|
|
28
|
+
* one definition cannot drift between them. The window size and glitch ceilings
|
|
29
|
+
* are deliberately NOT here: they are internal tuning constants, not exposed.
|
|
30
|
+
*/
|
|
31
|
+
interface MotionFilterConfig {
|
|
32
|
+
/** Master switch for the motion gate. Default `true`. */
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
/** Angular-velocity threshold (rad/s); at/below this a frame is "calm". */
|
|
35
|
+
maxAngularVelocity: number;
|
|
36
|
+
/** Linear-velocity threshold (m/s); at/below this a frame is "calm". */
|
|
37
|
+
maxLinearVelocity: number;
|
|
38
|
+
/**
|
|
39
|
+
* Never-calm safety fallback: once a due capture has waited this many ms it
|
|
40
|
+
* fires regardless of motion, so an interval is never silently lost. A
|
|
41
|
+
* sensible value is ~2× the capture interval.
|
|
42
|
+
*/
|
|
43
|
+
maxWaitMs: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Default motion-filter configuration. Enabled by default (plan §1).
|
|
47
|
+
*
|
|
48
|
+
* `maxLinearVelocity` was raised `0.5 → 2.5` m/s on 2026-07-02 after a
|
|
49
|
+
* 5-recording field analysis: at 0.5 m/s (~⅓ of a ~1.4 m/s walking pace) the
|
|
50
|
+
* gate deferred ~90 % of captures to the never-calm `maxWaitMs` fallback,
|
|
51
|
+
* collapsing the walking capture rate from the configured 0.5 Hz to ~0.17 Hz.
|
|
52
|
+
* Measured 1 Hz-averaged walking speed was a tight band (median 1.38, max
|
|
53
|
+
* 1.73 m/s); allowing for higher instantaneous per-frame stride peaks, 2.5 m/s
|
|
54
|
+
* clears steady and brisk walking while still deferring genuine lunges/jogging
|
|
55
|
+
* — demoting the (weak-at-scanning-distance) linear signal to a gross-motion
|
|
56
|
+
* safety net and letting the well-behaved angular gate be the primary blur
|
|
57
|
+
* selector. See
|
|
58
|
+
* `GpsPlusSlamJs_Docs/docs/2026-07-02-0117-image-capture-rate-motion-gate-finding.md`.
|
|
59
|
+
*
|
|
60
|
+
* `maxAngularVelocity` remains a PLACEHOLDER pending on-device field tuning
|
|
61
|
+
* (plan §7). `maxWaitMs` of 4000 ms is 2× the default 2000 ms image interval.
|
|
62
|
+
*/
|
|
63
|
+
declare const DEFAULT_MOTION_FILTER: MotionFilterConfig;
|
|
64
|
+
/** Inputs to the stateless capture decision. */
|
|
65
|
+
interface CaptureDecisionInput {
|
|
66
|
+
/** Max angular velocity (rad/s) over the recent window. `Infinity` if empty. */
|
|
67
|
+
windowMaxAngular: number;
|
|
68
|
+
/** Max linear velocity (m/s) over the recent window. `Infinity` if empty. */
|
|
69
|
+
windowMaxLinear: number;
|
|
70
|
+
/** Angular-velocity threshold (rad/s); at/below this is "calm". */
|
|
71
|
+
maxAngularVelocity: number;
|
|
72
|
+
/** Linear-velocity threshold (m/s); at/below this is "calm". */
|
|
73
|
+
maxLinearVelocity: number;
|
|
74
|
+
/** Milliseconds since the capture first became due (interval elapsed). */
|
|
75
|
+
msSinceDue: number;
|
|
76
|
+
/** Safety fallback: capture regardless once this many ms have passed. */
|
|
77
|
+
maxWaitMs: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Decide whether a due capture should fire now or defer to a later frame.
|
|
81
|
+
*
|
|
82
|
+
* A frame is "calm" when BOTH windowed maxima are at/below their thresholds —
|
|
83
|
+
* an empty window reports `Infinity`, so it is never calm (no capture before a
|
|
84
|
+
* valid sample exists). If not calm, the capture is deferred UNTIL `msSinceDue`
|
|
85
|
+
* reaches `maxWaitMs`, at which point it fires regardless to guarantee an
|
|
86
|
+
* interval is never silently lost (worst case: one blurry frame, not a gap).
|
|
87
|
+
*/
|
|
88
|
+
declare function decideCapture(input: CaptureDecisionInput): 'capture' | 'defer';
|
|
89
|
+
/**
|
|
90
|
+
* Fixed-size ring of the most recent VALID (non-glitch) per-frame velocities.
|
|
91
|
+
*
|
|
92
|
+
* `maxAngular()`/`maxLinear()` return the max over the retained samples, or
|
|
93
|
+
* `Infinity` when empty so "no data yet" reads as not-calm in
|
|
94
|
+
* {@link decideCapture}. A sample exceeding either glitch ceiling is rejected
|
|
95
|
+
* outright (`push` returns `false`) and never stored, so a relocalization spike
|
|
96
|
+
* neither pollutes the window (no spurious defer) nor is treated as motion.
|
|
97
|
+
*/
|
|
98
|
+
declare class MotionWindow {
|
|
99
|
+
private readonly angularGlitchCeiling;
|
|
100
|
+
private readonly linearGlitchCeiling;
|
|
101
|
+
private readonly size;
|
|
102
|
+
private readonly angular;
|
|
103
|
+
private readonly linear;
|
|
104
|
+
constructor(size?: number, angularGlitchCeiling?: number, linearGlitchCeiling?: number);
|
|
105
|
+
/**
|
|
106
|
+
* Record a per-frame velocity pair. Returns `false` (and stores nothing) when
|
|
107
|
+
* the sample exceeds either glitch ceiling, `true` otherwise.
|
|
108
|
+
*/
|
|
109
|
+
push(angularVel: number, linearVel: number): boolean;
|
|
110
|
+
/** Whether the window holds at least one valid (non-glitch) sample yet. */
|
|
111
|
+
hasSamples(): boolean;
|
|
112
|
+
/** Max angular velocity over the retained window, or `Infinity` if empty. */
|
|
113
|
+
maxAngular(): number;
|
|
114
|
+
/** Max linear velocity over the retained window, or `Infinity` if empty. */
|
|
115
|
+
maxLinear(): number;
|
|
116
|
+
/** Clear all samples (e.g. on tracking loss / capture restart). */
|
|
117
|
+
reset(): void;
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { MotionWindow as a, MotionFilterConfig as i, DEFAULT_MOTION_FILTER as n, decideCapture as o, DEFAULT_MOTION_WINDOW_SIZE as r, CaptureDecisionInput as t };
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* added — i.e. it is not specific to this app's session setup. See:
|
|
11
11
|
*
|
|
12
12
|
* - GpsPlusSlamJs_Docs/docs/2026-04-22-camera-access-reproducer-plan.md
|
|
13
|
-
* - GpsPlusSlamJs_Docs/docs/2026-06-04-camera-access-crash-regression-chrome-148.md
|
|
13
|
+
* - GpsPlusSlamJs_Docs/docs/2026-06-04-0458-camera-access-crash-regression-chrome-148.md
|
|
14
14
|
* - https://github.com/mrdoob/three.js/issues/33404
|
|
15
15
|
* - https://issues.chromium.org/issues/507508099 (root-cause, marked Fixed)
|
|
16
16
|
*
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { S as webxrToNUE, _ as createLoopClosureHandler, a as LibraryRootState, b as odometryTrackingRestarted, c as Matrix4, d as Vector3, f as arNorthBearingDeg, g as createGpsSlamStore, h as calcRelativeCoordsInMeters, i as LatLongAlt, l as Quaternion, m as calcGpsCoords, n as GpsPoint, o as LoopClosureHandler, p as bearingDeltaDeg, r as LatLong, s as LoopClosureHandlerConfig, t as ArImageCapture, u as RootState, v as isIdentityMatrix4, x as validateLicenseKey, y as magneticHeadingFromEnuQuat } from "../index-
|
|
1
|
+
import { S as webxrToNUE, _ as createLoopClosureHandler, a as LibraryRootState, b as odometryTrackingRestarted, c as Matrix4, d as Vector3, f as arNorthBearingDeg, g as createGpsSlamStore, h as calcRelativeCoordsInMeters, i as LatLongAlt, l as Quaternion, m as calcGpsCoords, n as GpsPoint, o as LoopClosureHandler, p as bearingDeltaDeg, r as LatLong, s as LoopClosureHandlerConfig, t as ArImageCapture, u as RootState, v as isIdentityMatrix4, x as validateLicenseKey, y as magneticHeadingFromEnuQuat } from "../index-CjxbDm8W.js";
|
|
2
2
|
export { ArImageCapture, GpsPoint, LatLong, LatLongAlt, LibraryRootState, LoopClosureHandler, LoopClosureHandlerConfig, Matrix4, Quaternion, RootState, Vector3, arNorthBearingDeg, bearingDeltaDeg, calcGpsCoords, calcRelativeCoordsInMeters, createGpsSlamStore, createLoopClosureHandler, isIdentityMatrix4, magneticHeadingFromEnuQuat, odometryTrackingRestarted, validateLicenseKey, webxrToNUE };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { a as TrackingSliceState } from "./tracking-slice-
|
|
2
|
-
import { t as RecordingState } from "./recording-slice-
|
|
3
|
-
import { n as SessionMetadata } from "./opfs-storage-
|
|
4
|
-
import { n as StorageBackend } from "./storage-backend-
|
|
1
|
+
import { a as TrackingSliceState } from "./tracking-slice-BAbcZK-Y.js";
|
|
2
|
+
import { t as RecordingState } from "./recording-slice-DXw5-UvO.js";
|
|
3
|
+
import { n as SessionMetadata } from "./opfs-storage-S_odkCk1.js";
|
|
4
|
+
import { n as StorageBackend } from "./storage-backend-BX7egQKi.js";
|
|
5
5
|
import { GpsPoint, LatLong, Matrix4, RootState, Vector3 } from "gps-plus-slam-js";
|
|
6
6
|
import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
|
|
7
7
|
import { Middleware, Reducer, ReducersMapObject, configureStore } from "@reduxjs/toolkit";
|
|
8
|
+
import * as _$redux from "redux";
|
|
8
9
|
|
|
9
10
|
//#region ../src/state/combined-root-state.d.ts
|
|
10
11
|
type CombinedRootState = SlamAppCombinedState;
|
|
@@ -205,7 +206,7 @@ declare function computeGpsVsFusedDivergence(alignmentMatrix: Matrix4 | null, gp
|
|
|
205
206
|
declare const snapshotPushed: _$_reduxjs_toolkit0.ActionCreatorWithPayload<AlignmentSnapshot, "trackingQuality/snapshotPushed">, snapshotsTrimmed: _$_reduxjs_toolkit0.ActionCreatorWithPayload<{
|
|
206
207
|
size: number;
|
|
207
208
|
}, "trackingQuality/snapshotsTrimmed">, reportUpdated: _$_reduxjs_toolkit0.ActionCreatorWithPayload<TrackingQualityReport | null, "trackingQuality/reportUpdated">, degradedCountUpdated: _$_reduxjs_toolkit0.ActionCreatorWithPayload<number, "trackingQuality/degradedCountUpdated">, resetTrackingQuality: _$_reduxjs_toolkit0.ActionCreatorWithoutPayload<"trackingQuality/resetTrackingQuality">;
|
|
208
|
-
declare const trackingQualityReducer: _$
|
|
209
|
+
declare const trackingQualityReducer: _$redux.Reducer<TrackingQualitySliceState>;
|
|
209
210
|
interface RootWithTrackingQuality {
|
|
210
211
|
trackingQuality?: TrackingQualitySliceState;
|
|
211
212
|
}
|
|
@@ -329,7 +330,7 @@ interface SlamAppStoreOptions<ExtraReducers extends ReducersMapObject = Record<s
|
|
|
329
330
|
* override on. **For Stage-A/§6a field-calibration recordings, turn this OFF**
|
|
330
331
|
* (recorder settings) so the captured compass behaviour is unmodified.
|
|
331
332
|
*
|
|
332
|
-
* @see GpsPlusSlamJs_Docs/docs/2026-06-26-stage0-field-collection-and-enablement.md
|
|
333
|
+
* @see GpsPlusSlamJs_Docs/docs/2026-06-26-0701-stage0-field-collection-and-enablement.md
|
|
333
334
|
*/
|
|
334
335
|
enableCompassColdStartOverride?: boolean;
|
|
335
336
|
/**
|
|
@@ -369,6 +370,14 @@ interface SlamAppStore<ExtraReducers extends ReducersMapObject = Record<string,
|
|
|
369
370
|
writeFrame: (blob: Blob, index: number) => Promise<void>;
|
|
370
371
|
/** Persist session metadata (`session.json`) via the configured backend. */
|
|
371
372
|
writeSessionMetadata: (metadata: SessionMetadata) => Promise<void>;
|
|
373
|
+
/**
|
|
374
|
+
* Resolves once every action write queued by the persistence middleware
|
|
375
|
+
* has settled. The stop flow MUST await this before anything reads the
|
|
376
|
+
* session's `actions/` (final sync, ZIP export) — the write queue is
|
|
377
|
+
* async, so an action dispatched moments before Stop could otherwise
|
|
378
|
+
* land after the export enumerated the directory and miss the zip.
|
|
379
|
+
*/
|
|
380
|
+
flushPendingActionWrites: () => Promise<void>;
|
|
372
381
|
}
|
|
373
382
|
/**
|
|
374
383
|
* Build a Redux store wired with library + recording slices, persistence
|
|
@@ -129,16 +129,17 @@ function createSlamAppStore(options) {
|
|
|
129
129
|
});
|
|
130
130
|
const prependedListeners = [trackingQualityMiddleware];
|
|
131
131
|
if (compassOptIns.length > 0) prependedListeners.push(createSlamAppStoreListenerMiddleware(compassOptIns));
|
|
132
|
+
const persistenceMiddleware = createPersistenceMiddleware({
|
|
133
|
+
storageBackend,
|
|
134
|
+
onWriteFailure,
|
|
135
|
+
persistedPrefixes: [...BUILTIN_PERSISTED_PREFIXES, ...persistedExtraPrefixes ?? []]
|
|
136
|
+
});
|
|
132
137
|
const store = configureStore({
|
|
133
138
|
reducer,
|
|
134
139
|
middleware: (getDefaultMiddleware) => getDefaultMiddleware({
|
|
135
|
-
serializableCheck: enableDevChecks,
|
|
136
|
-
immutableCheck: enableDevChecks
|
|
137
|
-
}).prepend(...prependedListeners).concat(
|
|
138
|
-
storageBackend,
|
|
139
|
-
onWriteFailure,
|
|
140
|
-
persistedPrefixes: [...BUILTIN_PERSISTED_PREFIXES, ...persistedExtraPrefixes ?? []]
|
|
141
|
-
}), ...extraMiddleware ?? []),
|
|
140
|
+
serializableCheck: enableDevChecks ? { ignoredActions: ["tracking/poseReceived"] } : false,
|
|
141
|
+
immutableCheck: enableDevChecks ? { ignoredPaths: ["tracking"] } : false
|
|
142
|
+
}).prepend(...prependedListeners).concat(persistenceMiddleware, ...extraMiddleware ?? []),
|
|
142
143
|
devTools: {
|
|
143
144
|
actionSanitizer: sanitizeForDevTools,
|
|
144
145
|
stateSanitizer: sanitizeForDevTools
|
|
@@ -149,7 +150,8 @@ function createSlamAppStore(options) {
|
|
|
149
150
|
dispatch: store.dispatch,
|
|
150
151
|
subscribe: (listener) => store.subscribe(listener),
|
|
151
152
|
writeFrame: (blob, index) => storageBackend.writeFrame(blob, index),
|
|
152
|
-
writeSessionMetadata: (metadata) => storageBackend.writeSessionMetadata(metadata)
|
|
153
|
+
writeSessionMetadata: (metadata) => storageBackend.writeSessionMetadata(metadata),
|
|
154
|
+
flushPendingActionWrites: () => persistenceMiddleware.flushPendingWrites()
|
|
153
155
|
};
|
|
154
156
|
}
|
|
155
157
|
//#endregion
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as RgbTuple, i as DepthSample, t as ARPose } from "./ar-types-
|
|
1
|
+
import { a as RgbTuple, i as DepthSample, t as ARPose } from "./ar-types-D6PYS4bc.js";
|
|
2
2
|
import { Matrix4 } from "gps-plus-slam-js";
|
|
3
3
|
|
|
4
4
|
//#region ../src/ar/depth-rgb-lookup.d.ts
|
|
@@ -72,7 +72,7 @@ interface DepthInfo {
|
|
|
72
72
|
* the matrices: the per-frame buffer is too large to clone and the live
|
|
73
73
|
* depth occluder uploads it synchronously). Absent when the source carries
|
|
74
74
|
* no `data` (e.g. the sparse-only path). Plumbed for the live depth occluder
|
|
75
|
-
* (2026-06-14-webxr-depth-occlusion-plan.md §2); the sparse sampler ignores it.
|
|
75
|
+
* (2026-06-14-0009-webxr-depth-occlusion-plan.md §2); the sparse sampler ignores it.
|
|
76
76
|
*/
|
|
77
77
|
data?: ArrayBuffer;
|
|
78
78
|
/**
|
|
@@ -169,12 +169,22 @@ declare class DepthSampler {
|
|
|
169
169
|
*/
|
|
170
170
|
updateConfig(config: Partial<DepthSamplerConfig>): void;
|
|
171
171
|
/**
|
|
172
|
-
* Called each frame with depth
|
|
172
|
+
* Called each frame with a LAZY depth provider (quality-review E-4: the
|
|
173
|
+
* caller used to acquire + wrap the depth info every frame while this
|
|
174
|
+
* method threw ~59 of 60 acquisitions away at the interval check — the
|
|
175
|
+
* provider is now invoked only when a sample is due).
|
|
176
|
+
*
|
|
177
|
+
* Unavailability detection is preserved by construction:
|
|
178
|
+
* `lastSampleTime` only advances when a sample is EMITTED, so while depth
|
|
179
|
+
* is unavailable the sampler stays "due" and probes the provider every
|
|
180
|
+
* frame — exactly the cadence the old per-frame acquisition gave
|
|
181
|
+
* `checkDepthUnavailability` (Field Test Readiness Issue #8).
|
|
173
182
|
*
|
|
174
183
|
* @param timestamp - Current frame timestamp in milliseconds
|
|
175
|
-
* @param
|
|
184
|
+
* @param acquireDepthInfo - Returns the frame's depth info, or null if
|
|
185
|
+
* unavailable. Only invoked when a sample is due.
|
|
176
186
|
*/
|
|
177
|
-
onFrame(timestamp: number,
|
|
187
|
+
onFrame(timestamp: number, acquireDepthInfo: () => DepthInfo | null): void;
|
|
178
188
|
/**
|
|
179
189
|
* Acquire the per-sample RGB lookup, gated by `config.rgb` and guarded so
|
|
180
190
|
* a failing acquisition (e.g. GL context loss during the blit) can never
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region ../src/sensors/device-orientation-cache.ts
|
|
2
|
+
let lastDeviceOrientation = null;
|
|
3
|
+
/**
|
|
4
|
+
* Update the cached device orientation.
|
|
5
|
+
* Called by the host's orientation watch; read when a GPS event arrives and
|
|
6
|
+
* by the XR frame loop's orientation snapshot.
|
|
7
|
+
*/
|
|
8
|
+
function updateDeviceOrientation(orientation) {
|
|
9
|
+
lastDeviceOrientation = orientation;
|
|
10
|
+
}
|
|
11
|
+
/** Get the current cached device orientation (null before the first reading). */
|
|
12
|
+
function getLastDeviceOrientation() {
|
|
13
|
+
return lastDeviceOrientation;
|
|
14
|
+
}
|
|
15
|
+
/** Clear the cache (testing / session reset). */
|
|
16
|
+
function resetDeviceOrientationCache() {
|
|
17
|
+
lastDeviceOrientation = null;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { resetDeviceOrientationCache as n, updateDeviceOrientation as r, getLastDeviceOrientation as t };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as ArCrashIsolationOptions } from "./
|
|
2
|
-
import { n as RawDeviceOrientation, t as GpsPosition } from "./gps-
|
|
1
|
+
import { t as ArCrashIsolationOptions } from "./ar-crash-isolation-DlXCGzMf.js";
|
|
2
|
+
import { n as RawDeviceOrientation, t as GpsPosition } from "./gps-CnhYrJCa.js";
|
|
3
3
|
import { n as PermissionStatus } from "./permission-checker-B-VtjnBA.js";
|
|
4
|
-
import {
|
|
4
|
+
import { a as SessionFeatureOptions, t as ArSessionCallbacks } from "./webxr-session-DefwObIu.js";
|
|
5
5
|
|
|
6
6
|
//#region ../src/ar/enable-gps-ar.d.ts
|
|
7
7
|
/**
|
|
@@ -37,6 +37,11 @@ interface EnableGpsArConfig {
|
|
|
37
37
|
requestHitTest?: boolean;
|
|
38
38
|
/** Crash-isolation diagnostic flags forwarded verbatim to `initAR`. */
|
|
39
39
|
isolationOptions?: Partial<ArCrashIsolationOptions>;
|
|
40
|
+
/**
|
|
41
|
+
* Per-session AR callbacks (tracking store, depth, image capture, …)
|
|
42
|
+
* forwarded verbatim to `initAR` — see {@link ArSessionCallbacks}.
|
|
43
|
+
*/
|
|
44
|
+
callbacks?: ArSessionCallbacks;
|
|
40
45
|
/** Receives every GPS fix from the started watch. */
|
|
41
46
|
onGpsPosition?: (position: GpsPosition) => void;
|
|
42
47
|
/** Receives every device-orientation sample from the started watch. */
|
|
@@ -56,7 +61,7 @@ interface EnableGpsArDeps {
|
|
|
56
61
|
requestWebXRWithDepthPermission: () => Promise<PermissionStatus>;
|
|
57
62
|
startGpsWatch: (onPosition: (position: GpsPosition) => void, onError?: (error: GeolocationPositionError) => void) => void;
|
|
58
63
|
startOrientationWatch: (onOrientation: (orientation: RawDeviceOrientation) => void) => void;
|
|
59
|
-
initAR: (container: HTMLElement, isolationOptions?: Partial<ArCrashIsolationOptions>, sessionFeatures?: SessionFeatureOptions) => Promise<void>;
|
|
64
|
+
initAR: (container: HTMLElement, isolationOptions?: Partial<ArCrashIsolationOptions>, sessionFeatures?: SessionFeatureOptions, callbacks?: ArSessionCallbacks) => Promise<void>;
|
|
60
65
|
stopGpsWatch: () => void;
|
|
61
66
|
stopOrientationWatch: () => void;
|
|
62
67
|
endARSession: () => Promise<void>;
|
|
@@ -26,7 +26,7 @@ declare function formatFrameFilename(index: number): string;
|
|
|
26
26
|
* is a textbook COLMAP tree (`images/frame-NNNNNN.jpg` next to `sparse/0/`).
|
|
27
27
|
* Both the OPFS write path and the recorder's persisted `imageFile` value must
|
|
28
28
|
* use THIS constant so a recording stays self-consistent (COLMAP export plan
|
|
29
|
-
* Q5, gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-13-colmap-export-plan.md).
|
|
29
|
+
* Q5, gps-plus-slam/GpsPlusSlamJs_Docs/docs/2026-06-13-1205-colmap-export-plan.md).
|
|
30
30
|
*/
|
|
31
31
|
declare const SESSION_IMAGES_DIR = "images";
|
|
32
32
|
/**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as findNearbyGeoAnchor, c as h3CellsMatch, i as clusterCellsByZoom, l as isH3Index, n as KnownGeoAnchor, o as gpsPathToCoverageCells, r as approxDistanceMetres, s as gpsToH3, t as H3_RESOLUTION } from "../h3-proximity-
|
|
1
|
+
import { a as findNearbyGeoAnchor, c as h3CellsMatch, i as clusterCellsByZoom, l as isH3Index, n as KnownGeoAnchor, o as gpsPathToCoverageCells, r as approxDistanceMetres, s as gpsToH3, t as H3_RESOLUTION } from "../h3-proximity-BaAulrnM.js";
|
|
2
2
|
export { H3_RESOLUTION, KnownGeoAnchor, approxDistanceMetres, clusterCellsByZoom, findNearbyGeoAnchor, gpsPathToCoverageCells, gpsToH3, h3CellsMatch, isH3Index };
|
package/dist/geo/h3-proximity.js
CHANGED
|
@@ -51,7 +51,7 @@ function gpsPathToCoverageCells(path) {
|
|
|
51
51
|
* truncate the hex-string id: resolution is encoded in the high bits with
|
|
52
52
|
* trailing `f` padding, so slicing yields INVALID cells, not parents (verified;
|
|
53
53
|
* see the D1 gotcha in
|
|
54
|
-
* docs/2026-06-14-map-centric-recording-browser-and-h3-index-user-feedback.md).
|
|
54
|
+
* docs/2026-06-14-1048-map-centric-recording-browser-and-h3-index-user-feedback.md).
|
|
55
55
|
*
|
|
56
56
|
* `targetRes` is clamped to `[0, H3_RESOLUTION]` because `cellToParent` throws
|
|
57
57
|
* when asked for a FINER resolution than the cell, and res 11 is the finest
|
package/dist/geo/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as findNearbyGeoAnchor, c as h3CellsMatch, i as clusterCellsByZoom, l as isH3Index, n as KnownGeoAnchor, o as gpsPathToCoverageCells, r as approxDistanceMetres, s as gpsToH3, t as H3_RESOLUTION } from "../h3-proximity-
|
|
1
|
+
import { a as findNearbyGeoAnchor, c as h3CellsMatch, i as clusterCellsByZoom, l as isH3Index, n as KnownGeoAnchor, o as gpsPathToCoverageCells, r as approxDistanceMetres, s as gpsToH3, t as H3_RESOLUTION } from "../h3-proximity-BaAulrnM.js";
|
|
2
2
|
export { H3_RESOLUTION, type KnownGeoAnchor, approxDistanceMetres, clusterCellsByZoom, findNearbyGeoAnchor, gpsPathToCoverageCells, gpsToH3, h3CellsMatch, isH3Index };
|