gps-plus-slam-app-framework 1.10.0 → 1.13.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 +27 -28
- package/dist/{absolute-orientation-C_IxDR_j.d.ts → absolute-orientation-0WIsqJnu.d.ts} +1 -1
- package/dist/{accuracy-circles-BE7tbvYV.d.ts → accuracy-circles-CFnKGfsD.d.ts} +1 -1
- package/dist/{app-selectors-CV7ggGoo.d.ts → app-selectors-QM0ZpNA4.d.ts} +1 -1
- 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-D1eyGC_o.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 +3 -3
- package/dist/ar/depth-sampler.js +28 -1
- 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 +20 -5
- package/dist/ar/frame-loop.d.ts +1 -1
- package/dist/ar/hit-test-reticle-driver.d.ts +2 -0
- package/dist/ar/hit-test-reticle-driver.js +122 -0
- 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 +136 -4
- package/dist/ar/index.d.ts +35 -32
- package/dist/ar/index.js +17 -15
- package/dist/ar/occlusion-mesh-worker.d.ts +2 -2
- package/dist/ar/occlusion-mesh-worker.js +6 -4
- package/dist/ar/occupancy-grid.d.ts +2 -2
- package/dist/ar/occupancy-grid.js +192 -12
- package/dist/ar/occupancy-mesher.d.ts +1 -1
- package/dist/ar/occupancy-mesher.js +1 -636
- 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-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 +1 -1
- package/dist/ar-crash-isolation-BSFw_beO.d.ts +52 -0
- package/dist/{ar-world-group-alignment-B6XiA1cT.d.ts → ar-world-group-alignment-CvvfACfx.d.ts} +2 -2
- package/dist/{capability-checker-DEo-ktWI.d.ts → capability-checker-DrWimJ_t.d.ts} +1 -1
- package/dist/capture-motion-gate-C60Qrilh.d.ts +120 -0
- package/dist/{cell-key-Bj-eYTLA.js → cell-key-D1b_Ix-p.js} +12 -1
- package/dist/{chromium-camera-access-workaround-DCd8SP2N.d.ts → chromium-camera-access-workaround-BRs6gkI4.d.ts} +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/{create-slam-app-store-CH31erpP.d.ts → create-slam-app-store-HNe1PBtx.d.ts} +37 -6
- package/dist/{create-slam-app-store-DLv5ZwqU.js → create-slam-app-store-wYN7YkB5.js} +21 -10
- package/dist/{depth-grid-lookup-DY6zYTLx.d.ts → depth-grid-lookup-PcJTdRLL.d.ts} +1 -1
- package/dist/{depth-sampler-txG8evgQ.d.ts → depth-sampler-BcvuxgCS.d.ts} +30 -3
- package/dist/{depth-unprojection-JKkeqJrV.d.ts → depth-unprojection-DbGipFkA.d.ts} +1 -1
- package/dist/{enable-gps-ar-BbNWyqp5.d.ts → enable-gps-ar-xjz3jNqm.d.ts} +10 -5
- package/dist/{file-system-utils-CfLTj5Ra.d.ts → file-system-utils-DE3BViuq.d.ts} +1 -1
- package/dist/{frame-conversions-CH7E2Iv_.d.ts → frame-conversions-CzPQDYpM.d.ts} +1 -1
- package/dist/{fused-path-DOKzVMiO.d.ts → fused-path-CBAttcVm.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-HXBWiXiI.js → geodesic-angle-CZ_Ow90I.js} +2 -2
- package/dist/{gps-anchor-BaqyRsPC.d.ts → gps-anchor-Gv4NDwH4.d.ts} +1 -1
- package/dist/{gps-ar-pose-sampler-BOOV0jJk.d.ts → gps-ar-pose-sampler-DBEYDFY5.d.ts} +1 -1
- package/dist/{gps-event-coordinator-03rVh_us.d.ts → gps-event-coordinator-BKwB4RyQ.d.ts} +4 -4
- package/dist/{gps-event-markers-BsC2Ynlh.d.ts → gps-event-markers-212h7j3D.d.ts} +39 -5
- package/dist/{h3-proximity-pFluGfwL.d.ts → h3-proximity-CAEk3osq.d.ts} +1 -1
- package/dist/hit-test-reticle-driver-CfKiDgsa.d.ts +40 -0
- package/dist/{image-capture-Cr_rljeV.d.ts → image-capture-BXmx1YvD.d.ts} +6 -6
- package/dist/{image-capture-BUqqsOi3.js → image-capture-Dn8uLIP2.js} +3 -3
- package/dist/{image-quality-BjBLoTec.d.ts → image-quality-G7_qT4aj.d.ts} +44 -2
- package/dist/index-DVmgFIgm.d.ts +64 -0
- package/dist/{index-C2Bo0buN.d.ts → index-DX9VC257.d.ts} +10 -72
- package/dist/{index-CuHaGY0F.d.ts → index-qtZ2muFd.d.ts} +1 -1
- package/dist/index.d.ts +89 -82
- package/dist/index.js +31 -24
- package/dist/{leaflet-map-overlay-QhF199BW.d.ts → leaflet-map-overlay-BkHmzvpD.d.ts} +1 -1
- package/dist/{leaflet-map-overlay-BRkUhZMD.js → leaflet-map-overlay-DjWfRT8a.js} +1 -1
- package/dist/{map-data-D8sSxpOr.d.ts → map-data-BQXPtRz7.d.ts} +3 -3
- package/dist/{map-data-D3oE8AQP.js → map-data-vL8jb5Z9.js} +1 -1
- package/dist/{map-overlay-draw-1E61FLKs.d.ts → map-overlay-draw-sTM3wug_.d.ts} +1 -1
- package/dist/{median-Bla_W50f.js → median-DDBrZGP0.js} +2 -2
- package/dist/{null-storage-backend-DXXuwG8T.d.ts → null-storage-backend-Dtn3TBfT.d.ts} +2 -2
- package/dist/{occlusion-mesh-CZ4i_SW2.d.ts → occlusion-mesh-BY2aMej3.d.ts} +43 -6
- package/dist/occupancy-cubes-visualizer-soN0Sizd.d.ts +146 -0
- package/dist/{occupancy-grid-f0I07UxI.d.ts → occupancy-grid-DKzIdCSZ.d.ts} +114 -4
- package/dist/{occupancy-mesher-BqnRd10x.d.ts → occupancy-mesher-Co80tOpl.d.ts} +22 -1
- package/dist/occupancy-mesher-DzNeJdQf.js +837 -0
- package/dist/{opfs-storage-backend-D1ZpeNEL.d.ts → opfs-storage-backend-CZ-ECudx.d.ts} +2 -2
- package/dist/perf-stats-overlay-BMEQrzx6.d.ts +68 -0
- package/dist/{persistence-middleware-CI4Cetnl.d.ts → persistence-middleware-Byo_Fs4n.d.ts} +13 -3
- package/dist/{planar-pnp-CPLhg5MX.d.ts → planar-pnp-CkcMN3o3.d.ts} +2 -2
- package/dist/pointer-picking-BATHHTlT.d.ts +41 -0
- package/dist/{ar-D-03Kso-.js → qr-CTp5xI83.js} +11 -25
- package/dist/{qr-debug-view-BmbWo06j.d.ts → qr-debug-view-BMjNVhV2.d.ts} +2 -2
- package/dist/{qr-derived-pose-DEYT85ul.d.ts → qr-derived-pose-Dq7mPK2s.d.ts} +3 -3
- package/dist/{qr-detected-slice-CPEkGbxh.d.ts → qr-detected-slice-8t_laDR9.d.ts} +9 -8
- package/dist/{qr-detection-controller-bRTJXC6G.js → qr-detection-controller-DXc1yHRf.js} +3 -3
- package/dist/{qr-detection-controller-IcMRpTjV.d.ts → qr-detection-controller-Dh4Paymb.d.ts} +4 -4
- package/dist/{qr-frontend-61SKPSyU.d.ts → qr-frontend-BnLlVjKu.d.ts} +2 -2
- package/dist/{qr-pose-CCTF1PP0.d.ts → qr-pose-_dInl6di.d.ts} +1 -1
- package/dist/{qr-pose-aggregation-BL6gfl0s.d.ts → qr-pose-aggregation-Bpv4uARJ.d.ts} +2 -2
- package/dist/{qr-pose-aggregation-H-O_Jjz9.js → qr-pose-aggregation-Cp0Mtg_j.js} +4 -4
- package/dist/{qr-size-depth-context-DJsYqbqY.d.ts → qr-size-depth-context-Bzbx98nS.d.ts} +3 -3
- package/dist/{qr-size-measurer-Bl_i-umk.d.ts → qr-size-measurer-18_W3INY.d.ts} +5 -5
- package/dist/{qr-size-measurer-BVOIg-He.js → qr-size-measurer-zZB9S1va.js} +4 -4
- package/dist/{recording-replayer-DyIN13nG.d.ts → recording-replayer-BKmVuchg.d.ts} +2 -2
- package/dist/{recording-slice-DziOl7P5.d.ts → recording-slice-zMedT0ot.d.ts} +10 -5
- package/dist/{replay-engine-DAymjsd1.d.ts → replay-engine-D-cbT0Fw.d.ts} +1 -1
- package/dist/{replay-scene-CZdWgcpc.d.ts → replay-scene-D5qzY0_x.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/index.d.ts +4 -4
- package/dist/sensors/permission-checker.d.ts +1 -1
- package/dist/{session-disposers-BZS-hi8u.js → session-disposers-BJM5U62W.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 -2
- package/dist/state/gps-event-coordinator.d.ts +2 -2
- package/dist/state/index.d.ts +19 -20
- package/dist/state/index.js +3 -4
- 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 +8 -8
- 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/replay-occupancy-subscriber.d.ts +51 -0
- package/dist/state/replay-occupancy-subscriber.js +85 -0
- package/dist/state/replay-session.d.ts +88 -0
- package/dist/state/replay-session.js +165 -0
- package/dist/state/store-subscribers.d.ts +2 -2
- package/dist/state/store-subscribers.js +1 -1
- 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 +2 -2
- package/dist/state/tracking-slice.d.ts +1 -1
- package/dist/{state-U45ioVyB.js → state-DxL3T1Id.js} +1 -2
- 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-reader.d.ts +1 -1
- package/dist/{storage-backend-BX7egQKi.d.ts → storage-backend-DCYbOvTw.d.ts} +1 -1
- package/dist/{store-subscribers-DtwakLrQ.d.ts → store-subscribers-BbRW35u5.d.ts} +2 -2
- package/dist/{subscribe-to-selector-Cgo9JTfS.d.ts → subscribe-to-selector-B_lm_euO.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/text-sprite-C6VcC2mo.d.ts +53 -0
- package/dist/{tracking-slice-Bt2OEQhA.d.ts → tracking-slice-D5LDL_y4.d.ts} +3 -2
- 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 +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/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/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 +2 -2
- package/dist/visualization/gps-compass-cubes.d.ts +1 -1
- package/dist/visualization/gps-compass-cubes.js +6 -22
- 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/hit-test-reticle.js +3 -2
- package/dist/visualization/index.d.ts +25 -20
- package/dist/visualization/index.js +11 -6
- 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 +54 -4
- package/dist/visualization/occupancy-cubes-visualizer.d.ts +2 -0
- package/dist/visualization/occupancy-cubes-visualizer.js +221 -0
- package/dist/visualization/perf-stats-overlay.d.ts +2 -0
- package/dist/visualization/perf-stats-overlay.js +85 -0
- package/dist/visualization/pointer-picking.d.ts +2 -0
- package/dist/visualization/pointer-picking.js +58 -0
- package/dist/visualization/text-sprite.d.ts +2 -0
- package/dist/visualization/text-sprite.js +105 -0
- package/dist/visualization/three-dispose.d.ts +1 -1
- package/dist/visualization/vis-colors.d.ts +1 -1
- package/dist/visualization/wayfinding-hud.d.ts +2 -0
- package/dist/visualization/wayfinding-hud.js +289 -0
- package/dist/visualization/wayfinding-placement.d.ts +2 -0
- package/dist/visualization/wayfinding-placement.js +157 -0
- package/dist/wayfinding-hud-DVun2b69.d.ts +82 -0
- package/dist/wayfinding-placement-dnHzfYlT.d.ts +97 -0
- package/dist/{webxr-session-DWKUsCN9.js → webxr-session-BBlgzrqY.js} +150 -280
- package/dist/{webxr-session-CGFZ429B.d.ts → webxr-session-DurXRnl_.d.ts} +144 -194
- package/dist/{xr-frame-loop-25gM4B0K.d.ts → xr-frame-loop-A1mGDFHI.d.ts} +1 -1
- package/dist/{zip-coverage-embed-BrodRLq0.d.ts → zip-coverage-embed-BC3O2-8b.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-BmjiWUJv.d.ts +0 -24
- package/dist/map-overlay-0yJOcEVO.d.ts +0 -153
- package/dist/recording-options-Cai9D14V.d.ts +0 -700
- package/dist/state/recording-options.d.ts +0 -2
- package/dist/state/recording-options.js +0 -620
- package/dist/visualization/map-overlay.d.ts +0 -2
- package/dist/visualization/map-overlay.js +0 -241
- /package/dist/{alignment-lerper-B4COh_0p.d.ts → alignment-lerper-CK1TYLIL.d.ts} +0 -0
- /package/dist/{ar-types-CBafnxhE.d.ts → ar-types-BprL3nKv.d.ts} +0 -0
- /package/dist/{bresenham3d-D-t9i_b5.d.ts → bresenham3d-bt61R-Qa.d.ts} +0 -0
- /package/dist/{camera-blit-capture-BlC-arRb.d.ts → camera-blit-capture-CgNJ9grH.d.ts} +0 -0
- /package/dist/{camera-follower-B6zA3dy9.d.ts → camera-follower-OnnXsbHd.d.ts} +0 -0
- /package/dist/{capture-failure-tracker-BAUKjtXU.d.ts → capture-failure-tracker-bUXJeMvQ.d.ts} +0 -0
- /package/dist/{concurrency-DW0jQo3G.d.ts → concurrency-CMhbkxBk.d.ts} +0 -0
- /package/dist/{css3d-renderer-manager-DbrSY7Mh.d.ts → css3d-renderer-manager-CE6xN7XM.d.ts} +0 -0
- /package/dist/{failure-tracker-B7fzPfZo.d.ts → failure-tracker-BdaFulDA.d.ts} +0 -0
- /package/dist/{format-file-size-Da8rZgfs.d.ts → format-file-size-B2CJdRqD.d.ts} +0 -0
- /package/dist/{frame-loop-7HigCj7m.d.ts → frame-loop-CUEIdlhS.d.ts} +0 -0
- /package/dist/{frustum-visibility-COPfzruF.d.ts → frustum-visibility-BTx1Sqfo.d.ts} +0 -0
- /package/dist/{geo-types-BfDK8kJu.d.ts → geo-types-DGe5UKgx.d.ts} +0 -0
- /package/dist/{gps-CX5b9g3s.d.ts → gps-CC0l9lCp.d.ts} +0 -0
- /package/dist/{gps-compass-cubes-CT3TWctJ.d.ts → gps-compass-cubes-QQJgpRXR.d.ts} +0 -0
- /package/dist/{gps-error-handler-DjVuLXve.d.ts → gps-error-handler-da4DCcs5.d.ts} +0 -0
- /package/dist/{hit-test-reticle-DhnCMOsc.d.ts → hit-test-reticle-DcOyqo3B.d.ts} +0 -0
- /package/dist/{index-CjxbDm8W.d.ts → index-T8Fxvzka.d.ts} +0 -0
- /package/dist/{index-Nr3qg4IH.d.ts → index-Y_RNWbQX.d.ts} +0 -0
- /package/dist/{lerp-utils-bwMwVCpU.d.ts → lerp-utils-B-ecvLq2.d.ts} +0 -0
- /package/dist/{list-formatter-1ttG18MQ.d.ts → list-formatter-C45u3Vgv.d.ts} +0 -0
- /package/dist/{logger-B4StJUDb.d.ts → logger-BQGNXi9W.d.ts} +0 -0
- /package/dist/{opfs-storage-S_odkCk1.d.ts → opfs-storage-CrhVauNL.d.ts} +0 -0
- /package/dist/{permission-checker-D1C5zvo-.d.ts → permission-checker-BDrCOwQF.d.ts} +0 -0
- /package/dist/{scene-node-names-DWzhE7Ro.d.ts → scene-node-names-Ct6ATrfM.d.ts} +0 -0
- /package/dist/{three-dispose-C9mdpSRX.d.ts → three-dispose-B5-XiECx.d.ts} +0 -0
- /package/dist/{vis-colors-DjStl_tD.d.ts → vis-colors-16Pht13u.d.ts} +0 -0
- /package/dist/{webxr-nue-basis-C3vTqkE2.d.ts → webxr-nue-basis-B8ZEetVb.d.ts} +0 -0
- /package/dist/{xr-camera-texture-C6Z4d7RR.d.ts → xr-camera-texture-BA4xiaQ4.d.ts} +0 -0
- /package/dist/{xr-error-handler-D9y5r8ok.d.ts → xr-error-handler-BeyxXCE_.d.ts} +0 -0
- /package/dist/{zip-export-CuBimX1J.d.ts → zip-export-Cfl_kNQ7.d.ts} +0 -0
- /package/dist/{zip-reader-BHc_b_iA.d.ts → zip-reader-DwkuvlGo.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -262,19 +262,19 @@ that guard's `APP_OVERLAY_CONTRACTS` list.
|
|
|
262
262
|
|
|
263
263
|
WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay scene management.
|
|
264
264
|
|
|
265
|
-
| Export
|
|
266
|
-
|
|
|
267
|
-
| `initAR(container, isolation?, features?)`
|
|
268
|
-
| `endARSession()`
|
|
269
|
-
| `createEnableGpsArController()`
|
|
270
|
-
| `registerXrFrameUpdate(cb)`
|
|
271
|
-
| `isFullySupported(s)` / `capabilityMessage(s)`
|
|
272
|
-
| `startImageCapture()` / `stopImageCapture()`
|
|
273
|
-
| `ImageCaptureManager`
|
|
274
|
-
| `DepthSampler`
|
|
275
|
-
| `CameraBlitCapture`
|
|
276
|
-
| `initReplayScene(container)`
|
|
277
|
-
| `applyChromiumProjectionLayerWorkaround`
|
|
265
|
+
| Export | Description |
|
|
266
|
+
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
267
|
+
| `initAR(container, isolation?, features?, callbacks?)` | Start a WebXR AR session with Three.js rendering. `features.requestHitTest` opts the session into the WebXR `hit-test` feature. `callbacks` (`ArSessionCallbacks`) carries ALL per-session host callbacks — `imageCapture`, `tracking` (store + callbacks together), `depth`, `cameraFrame`, `onFrame`, `onSessionEnd` — replacing the former pre-init setter exports; re-pass it with each session (cleared at session end). `rebindTrackingStore(store)` remains for the one mid-session need (swapping the tracking store per recording) |
|
|
268
|
+
| `endARSession()` | End the active XR session |
|
|
269
|
+
| `createEnableGpsArController()` | Headless "Enable GPS AR" orchestration (support check + permission bundling + sensor watches + `initAR`) with observable state; the app renders its own button over it |
|
|
270
|
+
| `registerXrFrameUpdate(cb)` | Per-frame access to the live `XRFrame` + reference space + session (valid only synchronously inside the callback). Enables app-side hit-test / other WebXR features |
|
|
271
|
+
| `isFullySupported(s)` / `capabilityMessage(s)` | WebXR + geolocation capability gating + a user-facing message |
|
|
272
|
+
| `startImageCapture()` / `stopImageCapture()` | Toggle camera frame capture |
|
|
273
|
+
| `ImageCaptureManager` | Configurable camera frame capture pipeline |
|
|
274
|
+
| `DepthSampler` | Depth buffer sampling with configurable grids |
|
|
275
|
+
| `CameraBlitCapture` | GPU blit-based camera capture |
|
|
276
|
+
| `initReplayScene(container)` | Create a 3D replay scene with orbit/FPS controls |
|
|
277
|
+
| `applyChromiumProjectionLayerWorkaround` | Chromium camera-access tab-crash workaround. Always deletes projection-layer hooks (forces `XRWebGLLayer`; required on every affected build incl. Chrome 150) and additionally persists `baseLayer` only on the affected Chrome window (148.0.7778.12 up to 149.0.7821) |
|
|
278
278
|
|
|
279
279
|
### `sensors/` — GPS & Permissions
|
|
280
280
|
|
|
@@ -291,19 +291,18 @@ WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay sc
|
|
|
291
291
|
|
|
292
292
|
### `state/` — Store & Recording
|
|
293
293
|
|
|
294
|
-
| Export
|
|
295
|
-
|
|
|
296
|
-
| `createSlamAppStore(options)`
|
|
297
|
-
| `recordingReducer`
|
|
298
|
-
| `startSession()` / `endSession()`
|
|
299
|
-
| `recordGpsEvent(payload)`
|
|
300
|
-
| `createGpsPositionHandler(config)`
|
|
301
|
-
| `captureGpsAnchorSample(options)`
|
|
302
|
-
| `
|
|
303
|
-
| `
|
|
304
|
-
| `
|
|
305
|
-
| `
|
|
306
|
-
| `wireStoreSubscribers(store, deps)` | Bridge store state → visualization updates. |
|
|
294
|
+
| Export | Description |
|
|
295
|
+
| -------------------------------------- | -------------------------------------------------------------- |
|
|
296
|
+
| `createSlamAppStore(options)` | Composable store factory (see options table above). |
|
|
297
|
+
| `recordingReducer` | Recording lifecycle slice (built into the factory). |
|
|
298
|
+
| `startSession()` / `endSession()` | Recording lifecycle actions. |
|
|
299
|
+
| `recordGpsEvent(payload)` | Record a paired AR+GPS observation. |
|
|
300
|
+
| `createGpsPositionHandler(config)` | Factory that adapts `GeolocationPosition` to a store dispatch. |
|
|
301
|
+
| `captureGpsAnchorSample(options)` | Sample a paired AR pose + GPS point for anchoring. |
|
|
302
|
+
| `replayRecording(store, blob)` | Replay a ZIP recording into a store. |
|
|
303
|
+
| `ReplayEngine` | Lower-level timed action playback with pause/resume/speed. |
|
|
304
|
+
| `createPersistenceMiddleware(options)` | Middleware factory used internally by `createSlamAppStore`. |
|
|
305
|
+
| `wireStoreSubscribers(store, deps)` | Bridge store state → visualization updates. |
|
|
307
306
|
|
|
308
307
|
### `storage/` — OPFS, ZIP, File System
|
|
309
308
|
|
|
@@ -312,7 +311,7 @@ WebXR session lifecycle, Three.js renderer setup, image/depth capture, replay sc
|
|
|
312
311
|
| `StorageBackend` | Abstract storage interface (implement your own). |
|
|
313
312
|
| `OpfsStorageBackend` | OPFS-based `StorageBackend`. |
|
|
314
313
|
| `NullStorageBackend` | No-op backend for tests and replay. |
|
|
315
|
-
| `initOpfsStorage()`
|
|
314
|
+
| `initOpfsStorage()` | Initialize the OPFS file-system layer. |
|
|
316
315
|
| `createSession()` / `listSessions()` | Session lifecycle on disk. |
|
|
317
316
|
| `exportSessionAsZip(handle, { contributors })` | Export a recording session as a ZIP blob. |
|
|
318
317
|
| `ZipExportContributor` | Hook for adding your own ZIP subdirectories on export. |
|
|
@@ -341,7 +340,6 @@ H3-based proximity matching for GPS-anchored points (renamed from `ref-points/`
|
|
|
341
340
|
| Export | Description |
|
|
342
341
|
| ------------------------------ | ------------------------------------------------------ |
|
|
343
342
|
| `LeafletMapOverlay` | 2D Leaflet map integrated via CSS3D into a 3D scene. |
|
|
344
|
-
| `MapOverlay` | Tile-based 3D map overlay (no Leaflet dependency). |
|
|
345
343
|
| `GpsEventVisualizer` | Three.js spheres for GPS event positions. |
|
|
346
344
|
| `createAlignmentLerper()` | Smooth alignment matrix interpolation. |
|
|
347
345
|
| `createCameraFollower()` | Camera that tracks a moving target. |
|
|
@@ -392,6 +390,7 @@ pnpm run build # build with tsdown
|
|
|
392
390
|
```
|
|
393
391
|
src/
|
|
394
392
|
├── ar/ # WebXR session, capture, replay scene
|
|
393
|
+
│ └── qr/ # QR detection, pose (planar PnP), size-from-depth, GPS vote
|
|
395
394
|
├── sensors/ # GPS, orientation, permissions
|
|
396
395
|
├── state/ # createSlamAppStore, recording, replay, persistence middleware
|
|
397
396
|
├── storage/ # OPFS, ZIP export/import, StorageBackend
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* AbsoluteOrientationSensor capture (Generic Sensor API).
|
|
4
4
|
*
|
|
5
5
|
* Phase 1 of the AbsoluteOrientationSensor plan
|
|
6
|
-
* (GpsPlusSlamJs_Docs/docs/2026-06-25-absolute-orientation-sensor-plan.md §5.1):
|
|
6
|
+
* (GpsPlusSlamJs_Docs/docs/2026-06-25-0543-absolute-orientation-sensor-plan.md §5.1):
|
|
7
7
|
* passive instrumentation that fuses accelerometer + gyroscope + magnetometer
|
|
8
8
|
* into an Earth-referenced (ENU) quaternion, captured per GPS event as an
|
|
9
9
|
* independent north reference. No production behaviour change.
|
|
@@ -16,7 +16,7 @@ import L from "leaflet";
|
|
|
16
16
|
* @deprecated Stroke-only since 2026-06-28 (Finding 1) — accuracy circles no
|
|
17
17
|
* longer render a fill, so this opacity is unused. Retained as an exported
|
|
18
18
|
* constant only to preserve the published API surface; do not pass it to
|
|
19
|
-
* `L.circle`. See `2026-06-28-map-rings-transparency-and-view-direction-user-feedback.md`.
|
|
19
|
+
* `L.circle`. See `2026-06-28-1822-map-rings-transparency-and-view-direction-user-feedback.md`.
|
|
20
20
|
*/
|
|
21
21
|
declare const ACCURACY_CIRCLE_FILL_OPACITY = 0.12;
|
|
22
22
|
declare const ACCURACY_CIRCLE_STROKE_OPACITY = 0.5;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { N as CombinedRootState } from "./create-slam-app-store-
|
|
1
|
+
import { N as CombinedRootState } from "./create-slam-app-store-HNe1PBtx.js";
|
|
2
2
|
import * as _$gps_plus_slam_js0 from "gps-plus-slam-js";
|
|
3
3
|
import { ArImageCapture, GpsPoint, LatLong, Matrix4, Quaternion, Vector3 } from "gps-plus-slam-js";
|
|
4
4
|
import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region ../src/ar/ar-crash-isolation.ts
|
|
2
|
+
/** Default AR-crash-isolation flags (all features enabled). */
|
|
3
|
+
const DEFAULT_AR_CRASH_ISOLATION = {
|
|
4
|
+
enableDomOverlay: true,
|
|
5
|
+
enableCameraAccess: true,
|
|
6
|
+
enableDepthSensingFeature: true,
|
|
7
|
+
enableCss3dRenderer: true,
|
|
8
|
+
enableCameraTextureAcquisition: true,
|
|
9
|
+
applyChromiumProjectionLayerWorkaround: true
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Boolean-or-default (quality-review C-1): persisted/external values are
|
|
13
|
+
* untrusted, so anything that is not a real boolean falls back to the
|
|
14
|
+
* default. Local copy of the recorder catalog's helper — the validator must
|
|
15
|
+
* stay dependency-free so the framework owns the whole group.
|
|
16
|
+
*/
|
|
17
|
+
function boolOr(value, fallback) {
|
|
18
|
+
return typeof value === "boolean" ? value : fallback;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate and normalize AR crash isolation flags.
|
|
22
|
+
* Missing or invalid values fall back to defaults. The container itself is as
|
|
23
|
+
* untrusted as its fields (persisted blobs may lack the key entirely or hold
|
|
24
|
+
* `null`), so a nullish container yields the full defaults instead of
|
|
25
|
+
* throwing.
|
|
26
|
+
*/
|
|
27
|
+
function validateArCrashIsolationOptions(rawOptions) {
|
|
28
|
+
const options = rawOptions ?? {};
|
|
29
|
+
const defaults = DEFAULT_AR_CRASH_ISOLATION;
|
|
30
|
+
return {
|
|
31
|
+
enableDomOverlay: boolOr(options.enableDomOverlay, defaults.enableDomOverlay),
|
|
32
|
+
enableCameraAccess: boolOr(options.enableCameraAccess, defaults.enableCameraAccess),
|
|
33
|
+
enableDepthSensingFeature: boolOr(options.enableDepthSensingFeature, defaults.enableDepthSensingFeature),
|
|
34
|
+
enableCss3dRenderer: boolOr(options.enableCss3dRenderer, defaults.enableCss3dRenderer),
|
|
35
|
+
enableCameraTextureAcquisition: boolOr(options.enableCameraTextureAcquisition, defaults.enableCameraTextureAcquisition),
|
|
36
|
+
applyChromiumProjectionLayerWorkaround: boolOr(options.applyChromiumProjectionLayerWorkaround, defaults.applyChromiumProjectionLayerWorkaround)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { DEFAULT_AR_CRASH_ISOLATION, validateArCrashIsolationOptions };
|
package/dist/ar/bresenham3d.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-
|
|
1
|
+
import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-bt61R-Qa.js";
|
|
2
2
|
export { GridCell, MAX_TRACE_STEPS, bresenham3d };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-
|
|
1
|
+
import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CgNJ9grH.js";
|
|
2
2
|
export { CameraBlitCapture, CameraBlitCaptureConfig, DEFAULT_BLIT_CONFIG, computeAspectFitSize, computeCaptureSize };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-
|
|
1
|
+
import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-DrWimJ_t.js";
|
|
2
2
|
export { CapabilityMessageOptions, CapabilitySupport, capabilityMessage, isFullySupported };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as createCaptureFailureTracker, i as DEFAULT_CAPTURE_TRACKER_CONFIG, n as CaptureFailureTracker, r as CaptureFailureTrackerConfig, t as CAPTURE_FAILURE_WARNING } from "../capture-failure-tracker-
|
|
1
|
+
import { a as createCaptureFailureTracker, i as DEFAULT_CAPTURE_TRACKER_CONFIG, n as CaptureFailureTracker, r as CaptureFailureTrackerConfig, t as CAPTURE_FAILURE_WARNING } from "../capture-failure-tracker-bUXJeMvQ.js";
|
|
2
2
|
export { CAPTURE_FAILURE_WARNING, CaptureFailureTracker, CaptureFailureTrackerConfig, DEFAULT_CAPTURE_TRACKER_CONFIG, createCaptureFailureTracker };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as MotionWindow, i as MotionFilterConfig, n as DEFAULT_MOTION_FILTER, o as decideCapture, r as DEFAULT_MOTION_WINDOW_SIZE, t as CaptureDecisionInput } from "../capture-motion-gate-C60Qrilh.js";
|
|
2
|
+
export { CaptureDecisionInput, DEFAULT_MOTION_FILTER, DEFAULT_MOTION_WINDOW_SIZE, MotionFilterConfig, MotionWindow, decideCapture };
|
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
//#region ../src/ar/capture-motion-gate.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
|
+
const DEFAULT_MOTION_WINDOW_SIZE = 3;
|
|
1
24
|
/**
|
|
2
25
|
* Angular velocity (rad/s) above which a sample is treated as a tracking glitch
|
|
3
26
|
* (e.g. relocalization teleport), not real motion. A genuine hand/device turn
|
|
@@ -27,7 +50,7 @@ const LINEAR_GLITCH_CEILING_M_S = 20;
|
|
|
27
50
|
* — demoting the (weak-at-scanning-distance) linear signal to a gross-motion
|
|
28
51
|
* safety net and letting the well-behaved angular gate be the primary blur
|
|
29
52
|
* selector. See
|
|
30
|
-
* `GpsPlusSlamJs_Docs/docs/2026-07-02-image-capture-rate-motion-gate-finding.md`.
|
|
53
|
+
* `GpsPlusSlamJs_Docs/docs/2026-07-02-0117-image-capture-rate-motion-gate-finding.md`.
|
|
31
54
|
*
|
|
32
55
|
* `maxAngularVelocity` remains a PLACEHOLDER pending on-device field tuning
|
|
33
56
|
* (plan §7). `maxWaitMs` of 4000 ms is 2× the default 2000 ms image interval.
|
|
@@ -103,4 +126,4 @@ var MotionWindow = class {
|
|
|
103
126
|
}
|
|
104
127
|
};
|
|
105
128
|
//#endregion
|
|
106
|
-
export {
|
|
129
|
+
export { DEFAULT_MOTION_FILTER, DEFAULT_MOTION_WINDOW_SIZE, MotionWindow, decideCapture };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as applyChromiumProjectionLayerWorkaround, i as ChromiumProjectionLayerWorkaroundResult, n as BASELAYER_WINDOW_MIN, o as needsBaseLayerPersistence, r as ChromeVersion, s as parseChromeVersion, t as BASELAYER_WINDOW_MAX } from "../chromium-camera-access-workaround-
|
|
1
|
+
import { a as applyChromiumProjectionLayerWorkaround, i as ChromiumProjectionLayerWorkaroundResult, n as BASELAYER_WINDOW_MIN, o as needsBaseLayerPersistence, r as ChromeVersion, s as parseChromeVersion, t as BASELAYER_WINDOW_MAX } from "../chromium-camera-access-workaround-BRs6gkI4.js";
|
|
2
2
|
export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, applyChromiumProjectionLayerWorkaround, needsBaseLayerPersistence, parseChromeVersion };
|
|
@@ -11,7 +11,7 @@ import { createLogger } from "../utils/logger.js";
|
|
|
11
11
|
* added — i.e. it is not specific to this app's session setup. See:
|
|
12
12
|
*
|
|
13
13
|
* - GpsPlusSlamJs_Docs/docs/2026-04-22-camera-access-reproducer-plan.md
|
|
14
|
-
* - GpsPlusSlamJs_Docs/docs/2026-06-04-camera-access-crash-regression-chrome-148.md
|
|
14
|
+
* - GpsPlusSlamJs_Docs/docs/2026-06-04-0458-camera-access-crash-regression-chrome-148.md
|
|
15
15
|
* - https://github.com/mrdoob/three.js/issues/33404
|
|
16
16
|
* - https://issues.chromium.org/issues/507508099 (root-cause, marked Fixed)
|
|
17
17
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-
|
|
1
|
+
import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-PcJTdRLL.js";
|
|
2
2
|
export { DepthGridLookup, createDepthGridLookup };
|
|
@@ -10,7 +10,7 @@ import * as THREE from "three";
|
|
|
10
10
|
* occludes per-pixel against the surface currently in view (sharp, registration-
|
|
11
11
|
* free, no memory). They **compose** — both depth-only under `arWorldGroup`, the
|
|
12
12
|
* live occluder wins where this frame has depth, the mesh fills out-of-view / depth
|
|
13
|
-
* holes (2026-06-14-webxr-depth-occlusion-plan.md §5).
|
|
13
|
+
* holes (2026-06-14-0009-webxr-depth-occlusion-plan.md §5).
|
|
14
14
|
*
|
|
15
15
|
* **Two layers, two confidence levels:**
|
|
16
16
|
* - The **pure occlusion math** (this file's exported functions) is the CI-tested
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { i as DepthSample } from "../ar-types-
|
|
2
|
-
import { a as
|
|
3
|
-
export { DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, wrapXRDepthInfo };
|
|
1
|
+
import { i as DepthSample } from "../ar-types-BprL3nKv.js";
|
|
2
|
+
import { a as DepthSamplerCallbacks, i as DepthSampler, n as DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, o as DepthSamplerConfig, r as DepthInfo, s as wrapXRDepthInfo, t as DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE } from "../depth-sampler-BcvuxgCS.js";
|
|
3
|
+
export { DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE, DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, wrapXRDepthInfo };
|
package/dist/ar/depth-sampler.js
CHANGED
|
@@ -42,6 +42,33 @@ function wrapXRDepthInfo(raw, projectionMatrix) {
|
|
|
42
42
|
if (uvTransform) wrapped.normDepthBufferFromNormView = uvTransform;
|
|
43
43
|
return wrapped;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Recommended depth-sampling cadence for apps that RECONSTRUCT-and-render an
|
|
47
|
+
* occupancy mesh (the Recorder, the PhysicsDemo) — the depth-side counterpart
|
|
48
|
+
* of `DEFAULT_OCCUPANCY_CELL_SIZE_M`/`DEFAULT_OCCUPANCY_MIN_OBSERVATIONS`
|
|
49
|
+
* (occupancy-grid.ts): one framework-level source of truth so both apps build
|
|
50
|
+
* the mesh at the same speed (2026-07-16 field feedback: the demo relied on
|
|
51
|
+
* the conservative fallback below — 16×16 @ 1 Hz, 8× fewer points/s than the
|
|
52
|
+
* recorder — and reconstructed visibly slower).
|
|
53
|
+
*
|
|
54
|
+
* Tuning (2026-07-16 EVENING, maintainer's on-device framerate/mesh trade-off
|
|
55
|
+
* passes — supersedes the same-day sweep-derived 500 ms × 64): 200 ms × 24×24.
|
|
56
|
+
* The ground-truth density/cadence sweep
|
|
57
|
+
* (GpsPlusSlamJs_Investigation test-results/synthetic-density-cadence-sweep.txt)
|
|
58
|
+
* showed density is the more point-efficient mesh-speed lever, but its
|
|
59
|
+
* flagged open question — on-device frame-time cost — resolved against LARGE
|
|
60
|
+
* per-sample batches: 64² @ 2 Hz (8192 points/s) visibly hurt the framerate,
|
|
61
|
+
* while many SMALL samples (24² @ 5 Hz, ~2880 points/s) keep the per-frame
|
|
62
|
+
* work chunk tiny and rendering smooth at good mesh build-up. If devices get
|
|
63
|
+
* faster, the sweep says gridSize (not the interval) is the knob to raise
|
|
64
|
+
* first.
|
|
65
|
+
*
|
|
66
|
+
* Deliberately OPT-IN named constants, NOT a change to the fallback below:
|
|
67
|
+
* bumping the fallback would silently re-tune consumers that are not
|
|
68
|
+
* reconstruction apps (MinimalExample / AnchorStarter).
|
|
69
|
+
*/
|
|
70
|
+
const DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS = 200;
|
|
71
|
+
const DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE = 24;
|
|
45
72
|
const DEFAULT_CONFIG = {
|
|
46
73
|
intervalMs: 1e3,
|
|
47
74
|
gridSize: 16,
|
|
@@ -228,4 +255,4 @@ function isFinitePositive(value) {
|
|
|
228
255
|
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
229
256
|
}
|
|
230
257
|
//#endregion
|
|
231
|
-
export { DepthSampler, wrapXRDepthInfo };
|
|
258
|
+
export { DEFAULT_RECONSTRUCTION_DEPTH_GRID_SIZE, DEFAULT_RECONSTRUCTION_DEPTH_INTERVAL_MS, DepthSampler, wrapXRDepthInfo };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-
|
|
1
|
+
import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-DbGipFkA.js";
|
|
2
2
|
export { DepthUnprojector, createDepthUnprojector, unprojectDepthPoint };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-
|
|
1
|
+
import { a as EnableGpsArState, i as EnableGpsArResult, n as EnableGpsArController, o as EnableGpsArStatus, r as EnableGpsArDeps, s as createEnableGpsArController, t as EnableGpsArConfig } from "../enable-gps-ar-xjz3jNqm.js";
|
|
2
2
|
export { EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, createEnableGpsArController };
|
package/dist/ar/enable-gps-ar.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { _ as initAR, a as endARSession, v as isWebXRSupported } from "../webxr-session-BBlgzrqY.js";
|
|
3
3
|
import { requestGeolocationPermission, requestOrientationPermission, requestWebXRWithDepthPermission } from "../sensors/permission-checker.js";
|
|
4
4
|
import { startGpsWatch, startOrientationWatch, stopGpsWatch, stopOrientationWatch } from "../sensors/gps.js";
|
|
5
5
|
//#region ../src/ar/enable-gps-ar.ts
|
|
@@ -74,11 +74,22 @@ function createEnableGpsArController(deps = {}) {
|
|
|
74
74
|
error: "AR is already starting, running or stopping."
|
|
75
75
|
};
|
|
76
76
|
setState({ status: "starting" });
|
|
77
|
+
const appCallbacks = config.callbacks;
|
|
78
|
+
const callbacks = {
|
|
79
|
+
...appCallbacks,
|
|
80
|
+
onSessionEnd: (info) => {
|
|
81
|
+
if (state.status === "running") {
|
|
82
|
+
stopWatches();
|
|
83
|
+
setState({ status: "ready" });
|
|
84
|
+
}
|
|
85
|
+
appCallbacks?.onSessionEnd?.(info);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
77
88
|
let sessionStarted = false;
|
|
78
89
|
try {
|
|
79
90
|
const permissionError = await requestPermissions(config);
|
|
80
91
|
if (permissionError !== null) return fail(permissionError);
|
|
81
|
-
await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest });
|
|
92
|
+
await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest }, callbacks);
|
|
82
93
|
sessionStarted = true;
|
|
83
94
|
if (config.onGpsPosition) {
|
|
84
95
|
resolved.startGpsWatch(config.onGpsPosition);
|
|
@@ -127,9 +138,8 @@ function createEnableGpsArController(deps = {}) {
|
|
|
127
138
|
error
|
|
128
139
|
};
|
|
129
140
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
setState({ status: "stopping" });
|
|
141
|
+
/** Stop whichever sensor watches this controller started (idempotent). */
|
|
142
|
+
function stopWatches() {
|
|
133
143
|
if (gpsWatchActive) {
|
|
134
144
|
resolved.stopGpsWatch();
|
|
135
145
|
gpsWatchActive = false;
|
|
@@ -138,6 +148,11 @@ function createEnableGpsArController(deps = {}) {
|
|
|
138
148
|
resolved.stopOrientationWatch();
|
|
139
149
|
orientationWatchActive = false;
|
|
140
150
|
}
|
|
151
|
+
}
|
|
152
|
+
async function disable() {
|
|
153
|
+
if (state.status !== "running") return;
|
|
154
|
+
setState({ status: "stopping" });
|
|
155
|
+
stopWatches();
|
|
141
156
|
try {
|
|
142
157
|
await resolved.endARSession();
|
|
143
158
|
} catch (err) {
|
package/dist/ar/frame-loop.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-
|
|
1
|
+
import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-CUEIdlhS.js";
|
|
2
2
|
export { FrameUpdate, clearFrameUpdates, registerFrameUpdate, runFrameUpdates };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { registerXrFrameUpdate } from "./xr-frame-loop.js";
|
|
2
|
+
import { createReticleMesh, updateReticle } from "../visualization/hit-test-reticle.js";
|
|
3
|
+
import { Vector3 } from "three";
|
|
4
|
+
//#region ../src/ar/hit-test-reticle-driver.ts
|
|
5
|
+
/**
|
|
6
|
+
* Hit-test reticle driver — the per-frame WebXR plumbing that drives the
|
|
7
|
+
* screen-centre hit-test reticle whose pure view-model lives in
|
|
8
|
+
* `visualization/hit-test-reticle.ts` (`createReticleMesh` / `updateReticle`).
|
|
9
|
+
*
|
|
10
|
+
* Promoted from the consumer apps (2026-07-18): MinimalExample,
|
|
11
|
+
* WayfindingHudDemo and AnchorStarter each hand-rolled this loop, and the
|
|
12
|
+
* copies had already drifted in their session-end handling. AnchorStarter's
|
|
13
|
+
* copy (the most careful one) is the reference implementation.
|
|
14
|
+
*
|
|
15
|
+
* Responsibilities, all subtle and previously copy-pasted per app:
|
|
16
|
+
* - Request the hit-test source once per session (`requestReferenceSpace
|
|
17
|
+
* ('viewer')` → `requestHitTestSource`), retrying on transient failure.
|
|
18
|
+
* - Guard the "request still in flight while we shut down" races: a source
|
|
19
|
+
* that resolves after `dispose()` — or after the session that issued the
|
|
20
|
+
* request has ended — is cancelled, never adopted.
|
|
21
|
+
* - Register the session `'end'` (and optional `'select'`) listeners exactly
|
|
22
|
+
* once per session, outside the request-retry path.
|
|
23
|
+
* - Reset per-session state on `'end'` so a fresh session re-requests its own
|
|
24
|
+
* source with its own listeners.
|
|
25
|
+
*
|
|
26
|
+
* Lifecycle: the handle is torn down only by `dispose()`. In the framework's
|
|
27
|
+
* standard flow `resetWebXRState()` clears the XR frame registry at every
|
|
28
|
+
* session end, so a handle is typically created once per AR session entry and
|
|
29
|
+
* disposed from the app's session-teardown path; the per-session reset logic
|
|
30
|
+
* additionally keeps the handle correct when frames are delivered outside that
|
|
31
|
+
* flow (tests, custom loops).
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Request a screen-centre hit-test source from the live session. Returns
|
|
35
|
+
* `null` when the runtime does not expose `requestHitTestSource` (older WebXR
|
|
36
|
+
* builds); the caller keeps the reticle hidden in that case.
|
|
37
|
+
*/
|
|
38
|
+
async function requestHitTestSource(session) {
|
|
39
|
+
const viewerSpace = await session.requestReferenceSpace("viewer");
|
|
40
|
+
return await session.requestHitTestSource?.({ space: viewerSpace }) ?? null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Cancel a hit-test source, tolerating a dead session. `cancel()` can throw
|
|
44
|
+
* once the source's session has ended (e.g. the app's teardown path calls
|
|
45
|
+
* `dispose()` before this driver's own `'end'` listener has run) — and a
|
|
46
|
+
* dead session has already stopped the hit-test, so there is nothing left to
|
|
47
|
+
* clean up.
|
|
48
|
+
*/
|
|
49
|
+
function cancelSource(source) {
|
|
50
|
+
try {
|
|
51
|
+
source?.cancel();
|
|
52
|
+
} catch {}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Install the hit-test reticle under `arWorldGroup` and start driving it from
|
|
56
|
+
* the XR frame loop. Returns a handle the app reads at placement time (or
|
|
57
|
+
* ignores entirely when it placed via `onSelect`).
|
|
58
|
+
*/
|
|
59
|
+
function startHitTestReticle(args) {
|
|
60
|
+
const reticle = createReticleMesh();
|
|
61
|
+
args.arWorldGroup.add(reticle);
|
|
62
|
+
let hitTestSource = null;
|
|
63
|
+
let hitTestSourceRequested = false;
|
|
64
|
+
let disposed = false;
|
|
65
|
+
let removeSessionListeners = null;
|
|
66
|
+
let sessionGeneration = 0;
|
|
67
|
+
const handleSelect = () => {
|
|
68
|
+
args.onSelect?.(reticle.visible ? reticle.getWorldPosition(new Vector3()) : null);
|
|
69
|
+
};
|
|
70
|
+
const handleSessionEnd = () => {
|
|
71
|
+
sessionGeneration += 1;
|
|
72
|
+
hitTestSource = null;
|
|
73
|
+
hitTestSourceRequested = false;
|
|
74
|
+
removeSessionListeners = null;
|
|
75
|
+
};
|
|
76
|
+
const unregister = registerXrFrameUpdate(({ frame, referenceSpace, session }) => {
|
|
77
|
+
if (!removeSessionListeners) {
|
|
78
|
+
session.addEventListener("end", handleSessionEnd);
|
|
79
|
+
if (args.onSelect) session.addEventListener("select", handleSelect);
|
|
80
|
+
removeSessionListeners = () => {
|
|
81
|
+
session.removeEventListener("end", handleSessionEnd);
|
|
82
|
+
if (args.onSelect) session.removeEventListener("select", handleSelect);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (!hitTestSourceRequested) {
|
|
86
|
+
hitTestSourceRequested = true;
|
|
87
|
+
const requestGeneration = sessionGeneration;
|
|
88
|
+
requestHitTestSource(session).then((source) => {
|
|
89
|
+
if (disposed || requestGeneration !== sessionGeneration) {
|
|
90
|
+
cancelSource(source);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
hitTestSource = source;
|
|
94
|
+
}).catch(() => {
|
|
95
|
+
if (requestGeneration === sessionGeneration) hitTestSourceRequested = false;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (!hitTestSource) {
|
|
99
|
+
updateReticle(reticle, null);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const [hit] = frame.getHitTestResults(hitTestSource);
|
|
103
|
+
const pose = hit?.getPose(referenceSpace);
|
|
104
|
+
updateReticle(reticle, pose ? pose.transform.matrix : null);
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
isVisible: () => reticle.visible,
|
|
108
|
+
getWorldPosition: (out) => reticle.getWorldPosition(out),
|
|
109
|
+
dispose: () => {
|
|
110
|
+
if (disposed) return;
|
|
111
|
+
disposed = true;
|
|
112
|
+
unregister();
|
|
113
|
+
removeSessionListeners?.();
|
|
114
|
+
removeSessionListeners = null;
|
|
115
|
+
cancelSource(hitTestSource);
|
|
116
|
+
hitTestSource = null;
|
|
117
|
+
args.arWorldGroup.remove(reticle);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
export { startHitTestReticle };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, r as DEFAULT_CAPTURE_CONFIG, s as ImageCaptureManager, t as CapturedFrame } from "../image-capture-
|
|
1
|
+
import { a as ImageCaptureCallbacks, c as MIN_VALID_IMAGE_BYTES, i as FrameQualityVerdict, n as CapturedImage, o as ImageCaptureConfig, r as DEFAULT_CAPTURE_CONFIG, s as ImageCaptureManager, t as CapturedFrame } from "../image-capture-BXmx1YvD.js";
|
|
2
2
|
export { CapturedFrame, CapturedImage, DEFAULT_CAPTURE_CONFIG, FrameQualityVerdict, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, MIN_VALID_IMAGE_BYTES };
|
package/dist/ar/image-capture.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-
|
|
1
|
+
import { n as ImageCaptureManager, r as MIN_VALID_IMAGE_BYTES, t as DEFAULT_CAPTURE_CONFIG } from "../image-capture-Dn8uLIP2.js";
|
|
2
2
|
export { DEFAULT_CAPTURE_CONFIG, ImageCaptureManager, MIN_VALID_IMAGE_BYTES };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, QualityFilterConfig, QualityRejectReason, QualityVerdict, meanLuminance, rgbaToGrayscale, sharpnessScore };
|
|
1
|
+
import { a as DEFAULT_SHARPNESS_MIN_SAMPLES, c as QualityRejectReason, d as highFrequencyEnergyRatio, f as meanLuminance, i as DEFAULT_SHARPNESS_HISTORY_SIZE, l as QualityVerdict, m as sharpnessScore, n as BlurMetricId, o as ImageQualityGate, p as rgbaToGrayscale, r as DEFAULT_QUALITY_FILTER, s as QualityFilterConfig, t as BLUR_METRIC_IDS, u as blurMetricScorer } from "../image-quality-G7_qT4aj.js";
|
|
2
|
+
export { BLUR_METRIC_IDS, BlurMetricId, DEFAULT_QUALITY_FILTER, DEFAULT_SHARPNESS_HISTORY_SIZE, DEFAULT_SHARPNESS_MIN_SAMPLES, ImageQualityGate, QualityFilterConfig, QualityRejectReason, QualityVerdict, blurMetricScorer, highFrequencyEnergyRatio, meanLuminance, rgbaToGrayscale, sharpnessScore };
|