gps-plus-slam-app-framework 1.4.0 → 1.8.0

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