gps-plus-slam-app-framework 1.3.0 → 1.4.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 (225) hide show
  1. package/dist/{app-selectors-B8VQoMDY.d.ts → app-selectors-CrOucL00.d.ts} +1 -1
  2. package/dist/ar/bresenham3d.d.ts +1 -1
  3. package/dist/ar/camera-blit-capture.d.ts +2 -2
  4. package/dist/ar/camera-blit-capture.js +74 -9
  5. package/dist/ar/capability-checker.d.ts +1 -1
  6. package/dist/ar/capture-failure-tracker.d.ts +1 -1
  7. package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
  8. package/dist/ar/depth-grid-lookup.d.ts +2 -0
  9. package/dist/ar/depth-grid-lookup.js +43 -0
  10. package/dist/ar/depth-sampler.d.ts +2 -2
  11. package/dist/ar/depth-sampler.js +2 -4
  12. package/dist/ar/depth-unprojection.d.ts +1 -1
  13. package/dist/ar/enable-gps-ar.d.ts +1 -1
  14. package/dist/ar/enable-gps-ar.js +26 -1
  15. package/dist/ar/frame-loop.d.ts +1 -1
  16. package/dist/ar/image-capture.d.ts +1 -1
  17. package/dist/ar/index.d.ts +30 -19
  18. package/dist/ar/index.js +15 -4
  19. package/dist/ar/occupancy-grid.d.ts +1 -1
  20. package/dist/ar/occupancy-grid.js +29 -2
  21. package/dist/ar/planar-pnp.d.ts +2 -0
  22. package/dist/ar/planar-pnp.js +425 -0
  23. package/dist/ar/qr-debug-view.d.ts +2 -0
  24. package/dist/ar/qr-debug-view.js +89 -0
  25. package/dist/ar/qr-derived-pose.d.ts +2 -0
  26. package/dist/ar/qr-derived-pose.js +114 -0
  27. package/dist/ar/qr-detection-controller.d.ts +2 -0
  28. package/dist/ar/qr-detection-controller.js +2 -0
  29. package/dist/ar/qr-frontend.d.ts +2 -0
  30. package/dist/ar/qr-frontend.js +60 -0
  31. package/dist/ar/qr-pose.d.ts +2 -0
  32. package/dist/ar/qr-pose.js +267 -0
  33. package/dist/ar/qr-size-depth-context.d.ts +3 -0
  34. package/dist/ar/qr-size-depth-context.js +42 -0
  35. package/dist/ar/qr-size-measurer.d.ts +2 -0
  36. package/dist/ar/qr-size-measurer.js +2 -0
  37. package/dist/ar/replay-scene.d.ts +1 -1
  38. package/dist/ar/replay-scene.js +1 -1
  39. package/dist/ar/scene-node-names.d.ts +1 -1
  40. package/dist/ar/webxr-nue-basis.d.ts +1 -1
  41. package/dist/ar/webxr-session.d.ts +4 -4
  42. package/dist/ar/webxr-session.js +2 -2
  43. package/dist/ar/xr-camera-texture.d.ts +1 -1
  44. package/dist/ar/xr-error-handler.d.ts +1 -1
  45. package/dist/ar/xr-frame-loop.d.ts +1 -1
  46. package/dist/ar-Dc72Ksiu.js +382 -0
  47. package/dist/{ar-world-group-alignment-C9lwwIyI.d.ts → ar-world-group-alignment-DDLkgNf_.d.ts} +1 -1
  48. package/dist/{camera-blit-capture-CnxUDbKx.d.ts → camera-blit-capture-CqWe1G7s.d.ts} +57 -4
  49. package/dist/concurrency-DqAlKX4j.d.ts +50 -0
  50. package/dist/core/index.d.ts +1 -1
  51. package/dist/{create-slam-app-store-BljusOua.d.ts → create-slam-app-store-Ce2FMKCp.d.ts} +5 -5
  52. package/dist/depth-grid-lookup-vMDrGTk_.d.ts +21 -0
  53. package/dist/{depth-sampler-Bhanfwla.d.ts → depth-sampler-DwfPYzS7.d.ts} +1 -1
  54. package/dist/{depth-unprojection-Y6i_mJuT.d.ts → depth-unprojection-CK3b9htH.d.ts} +1 -1
  55. package/dist/{enable-gps-ar-BfUJOgpW.d.ts → enable-gps-ar-CjZ1nEdu.d.ts} +4 -4
  56. package/dist/{frame-conversions-BfsafGWR.d.ts → frame-conversions-D_Af8Dt3.d.ts} +1 -1
  57. package/dist/{fused-path-DJoVu98b.d.ts → fused-path-C0FHe67t.d.ts} +1 -1
  58. package/dist/geo/h3-proximity.d.ts +2 -2
  59. package/dist/geo/h3-proximity.js +61 -2
  60. package/dist/geo/index.d.ts +2 -2
  61. package/dist/geo/index.js +2 -2
  62. package/dist/{gps-anchor-dYeCvvp5.d.ts → gps-anchor-C6I9NDHA.d.ts} +1 -1
  63. package/dist/{gps-ar-pose-sampler-DVb96iOy.d.ts → gps-ar-pose-sampler-DaHg2aPZ.d.ts} +1 -1
  64. package/dist/{gps-event-coordinator-CWIDOk4U.d.ts → gps-event-coordinator-C7hwHyLA.d.ts} +3 -3
  65. package/dist/{gps-event-markers-Dc9FT-q1.d.ts → gps-event-markers-Dd0G2bD0.d.ts} +18 -0
  66. package/dist/{h3-proximity-I1msGPgE.d.ts → h3-proximity-B57C6rYL.d.ts} +39 -1
  67. package/dist/{image-capture-qAZ5Fh5X.d.ts → image-capture-C2Feywet.d.ts} +1 -1
  68. package/dist/index-BvLo2poy.d.ts +399 -0
  69. package/dist/{index-BYYUdf9v.d.ts → index-m_LneUSi.d.ts} +1 -1
  70. package/dist/index.d.ts +77 -67
  71. package/dist/index.js +18 -9
  72. package/dist/{leaflet-map-overlay-6CJC-E1l.d.ts → leaflet-map-overlay-bnb2U1NQ.d.ts} +1 -1
  73. package/dist/{map-data-CkloBxIl.d.ts → map-data-DdjPiSav.d.ts} +1 -1
  74. package/dist/{map-overlay-draw-krOKwDAq.d.ts → map-overlay-draw-CPVdAsFq.d.ts} +1 -1
  75. package/dist/{null-storage-backend-uKQE8tl7.d.ts → null-storage-backend-CuSdYFsM.d.ts} +2 -2
  76. package/dist/{occupancy-grid-BRNRaPyT.d.ts → occupancy-grid-Bvi2Gw1U.d.ts} +12 -2
  77. package/dist/{opfs-storage-D5zAn_lx.d.ts → opfs-storage-DMtlt57S.d.ts} +23 -4
  78. package/dist/{opfs-storage-backend-6aYMUZlJ.d.ts → opfs-storage-backend-CeQAb0SD.d.ts} +3 -3
  79. package/dist/{persistence-middleware-B9ei4Nhx.d.ts → persistence-middleware-5eearhSV.d.ts} +1 -1
  80. package/dist/planar-pnp-cjthe7Be.d.ts +67 -0
  81. package/dist/qr-debug-view-B8gTzjMm.d.ts +29 -0
  82. package/dist/qr-derived-pose-DinKE600.d.ts +122 -0
  83. package/dist/qr-detected-slice-Cpv-dg82.d.ts +166 -0
  84. package/dist/qr-detection-controller-B-tLVd-S.js +119 -0
  85. package/dist/qr-detection-controller-Cd2Ih4cC.d.ts +48 -0
  86. package/dist/qr-frontend-DufZp2xS.d.ts +58 -0
  87. package/dist/qr-pose-Bt2reSw7.d.ts +138 -0
  88. package/dist/qr-pose-aggregation-CFlmLm6w.d.ts +90 -0
  89. package/dist/qr-pose-aggregation-DXR9STHs.js +200 -0
  90. package/dist/qr-size-depth-context-onu36E9s.d.ts +13 -0
  91. package/dist/qr-size-measurer-D7739ZpB.d.ts +165 -0
  92. package/dist/qr-size-measurer-DLb33geH.js +596 -0
  93. package/dist/recording-options-D93kksJU.d.ts +369 -0
  94. package/dist/{recording-replayer-r0DZ9ALp.d.ts → recording-replayer-CUEK82tM.d.ts} +2 -2
  95. package/dist/recording-slice-B-uCgGoh.d.ts +55 -0
  96. package/dist/{replay-engine-XpDa0dy1.d.ts → replay-engine-BSVd7Zzb.d.ts} +7 -4
  97. package/dist/{replay-scene-Bw58VL6p.d.ts → replay-scene-CPt56pps.d.ts} +3 -3
  98. package/dist/sensors/gps-error-handler.d.ts +1 -1
  99. package/dist/sensors/gps.d.ts +1 -1
  100. package/dist/sensors/index.d.ts +3 -3
  101. package/dist/sensors/permission-checker.d.ts +1 -1
  102. package/dist/sensors/permission-checker.js +1 -1
  103. package/dist/state/app-selectors.d.ts +1 -1
  104. package/dist/state/combined-root-state.d.ts +1 -1
  105. package/dist/state/create-slam-app-store.d.ts +1 -1
  106. package/dist/state/gps-ar-pose-sampler.d.ts +3 -3
  107. package/dist/state/gps-event-coordinator.d.ts +1 -1
  108. package/dist/state/index.d.ts +20 -17
  109. package/dist/state/index.js +3 -2
  110. package/dist/state/persistence-middleware.d.ts +1 -1
  111. package/dist/state/qr-detected-slice.d.ts +4 -0
  112. package/dist/state/qr-detected-slice.js +311 -0
  113. package/dist/state/recording-options.d.ts +2 -2
  114. package/dist/state/recording-options.js +128 -4
  115. package/dist/state/recording-replayer.d.ts +2 -2
  116. package/dist/state/recording-slice.d.ts +1 -1
  117. package/dist/state/recording-slice.js +5 -1
  118. package/dist/state/replay-engine.d.ts +1 -1
  119. package/dist/state/replay-engine.js +7 -3
  120. package/dist/state/store-subscribers.d.ts +2 -2
  121. package/dist/state/subscribe-to-selector.d.ts +1 -1
  122. package/dist/state/tracking-quality.d.ts +1 -1
  123. package/dist/state/tracking-slice.d.ts +1 -1
  124. package/dist/{state-BkIfpiyA.js → state-IEw0ZsBu.js} +1 -0
  125. package/dist/storage/file-system-utils.d.ts +1 -1
  126. package/dist/storage/index.d.ts +9 -9
  127. package/dist/storage/index.js +4 -4
  128. package/dist/storage/null-storage-backend.d.ts +1 -1
  129. package/dist/storage/opfs-storage-backend.d.ts +1 -1
  130. package/dist/storage/opfs-storage-backend.js +3 -3
  131. package/dist/storage/opfs-storage.d.ts +1 -1
  132. package/dist/storage/opfs-storage.js +5 -4
  133. package/dist/storage/storage-backend.d.ts +1 -1
  134. package/dist/storage/zip-coverage-embed.d.ts +2 -0
  135. package/dist/storage/zip-coverage-embed.js +88 -0
  136. package/dist/storage/zip-export.d.ts +2 -2
  137. package/dist/storage/zip-export.js +37 -59
  138. package/dist/storage/zip-reader.d.ts +1 -1
  139. package/dist/{storage-backend-Do6YDpNo.d.ts → storage-backend-CTJHNdMp.d.ts} +1 -1
  140. package/dist/{store-subscribers-0YWyOLvV.d.ts → store-subscribers-BZP81hjh.d.ts} +2 -2
  141. package/dist/{subscribe-to-selector-CZ6k1NFP.d.ts → subscribe-to-selector-Bp3sLx8L.d.ts} +1 -1
  142. package/dist/test-utils/browser-mocks.d.ts +7 -1
  143. package/dist/test-utils/browser-mocks.js +6 -0
  144. package/dist/test-utils/zip-round-trip-helpers.d.ts +9 -1
  145. package/dist/test-utils/zip-round-trip-helpers.js +5 -1
  146. package/dist/{tracking-slice-CdK8c-8P.d.ts → tracking-slice-DJZ9qeGg.d.ts} +1 -1
  147. package/dist/types/ar-types.d.ts +1 -1
  148. package/dist/types/geo-types.d.ts +1 -1
  149. package/dist/types/index.d.ts +2 -2
  150. package/dist/utils/concurrency.d.ts +2 -2
  151. package/dist/utils/concurrency.js +66 -2
  152. package/dist/utils/failure-tracker.d.ts +1 -1
  153. package/dist/utils/format-file-size.d.ts +1 -1
  154. package/dist/utils/fused-path.d.ts +1 -1
  155. package/dist/utils/index.d.ts +6 -6
  156. package/dist/utils/list-formatter.d.ts +1 -1
  157. package/dist/utils/logger.d.ts +1 -1
  158. package/dist/visualization/accuracy-circles.d.ts +1 -1
  159. package/dist/visualization/alignment-lerper.d.ts +1 -1
  160. package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
  161. package/dist/visualization/ar-world-group-alignment.js +1 -1
  162. package/dist/visualization/camera-follower.d.ts +1 -1
  163. package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
  164. package/dist/visualization/frame-conversions.d.ts +1 -1
  165. package/dist/visualization/frustum-visibility.d.ts +1 -1
  166. package/dist/visualization/gps-anchor.d.ts +1 -1
  167. package/dist/visualization/gps-compass-cubes.d.ts +1 -1
  168. package/dist/visualization/gps-event-markers.d.ts +1 -1
  169. package/dist/visualization/gps-event-markers.js +40 -5
  170. package/dist/visualization/hit-test-reticle.d.ts +1 -1
  171. package/dist/visualization/hit-test-reticle.js +1 -0
  172. package/dist/visualization/index.d.ts +18 -18
  173. package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
  174. package/dist/visualization/leaflet-map-overlay.js +15 -3
  175. package/dist/visualization/lerp-utils.d.ts +1 -1
  176. package/dist/visualization/map-data.d.ts +1 -1
  177. package/dist/visualization/map-overlay-draw.d.ts +1 -1
  178. package/dist/visualization/map-overlay.d.ts +1 -1
  179. package/dist/visualization/three-dispose.d.ts +1 -1
  180. package/dist/visualization/vis-colors.d.ts +1 -1
  181. package/dist/{webxr-session-TIaD883f.js → webxr-session-CJF9Nijp.js} +221 -9
  182. package/dist/{webxr-session-GjZ2BIpS.d.ts → webxr-session-COsOjJwn.d.ts} +76 -8
  183. package/dist/zip-coverage-embed-tFohI2J4.d.ts +41 -0
  184. package/dist/{zip-export-G14hkSPG.d.ts → zip-export-DDWXInTR.d.ts} +27 -23
  185. package/package.json +2 -2
  186. package/dist/concurrency-CO1FQvs3.d.ts +0 -24
  187. package/dist/file-system-CwXTNHmB.d.ts +0 -114
  188. package/dist/recording-options-DJBXuMxV.d.ts +0 -182
  189. package/dist/recording-slice-89O07ebs.d.ts +0 -36
  190. package/dist/storage/file-system.d.ts +0 -2
  191. package/dist/storage/file-system.js +0 -289
  192. /package/dist/{accuracy-circles-BpwWAs8G.d.ts → accuracy-circles-Pi2YeCrM.d.ts} +0 -0
  193. /package/dist/{alignment-lerper-Dm9G7JJO.d.ts → alignment-lerper-BUTsQ2yu.d.ts} +0 -0
  194. /package/dist/{ar-types-Dan1MVTi.d.ts → ar-types-BckI1E-O.d.ts} +0 -0
  195. /package/dist/{bresenham3d-CFfd7n6B.d.ts → bresenham3d-ByjcmEgM.d.ts} +0 -0
  196. /package/dist/{camera-follower-C2mwEn7c.d.ts → camera-follower-BTb2Yp12.d.ts} +0 -0
  197. /package/dist/{capability-checker-CQXJHxXg.d.ts → capability-checker-CXqoJYtb.d.ts} +0 -0
  198. /package/dist/{capture-failure-tracker-CUeU3L_M.d.ts → capture-failure-tracker-BL5SoG2a.d.ts} +0 -0
  199. /package/dist/{chromium-camera-access-workaround-Jqbn0apH.d.ts → chromium-camera-access-workaround-BNK189P0.d.ts} +0 -0
  200. /package/dist/{css3d-renderer-manager-ptu_t3B3.d.ts → css3d-renderer-manager-m-ab19vp.d.ts} +0 -0
  201. /package/dist/{failure-tracker-Cn8Fo9D4.d.ts → failure-tracker-Cnc_xWUw.d.ts} +0 -0
  202. /package/dist/{file-system-utils-CXIoL-DM.d.ts → file-system-utils-Bs7lpeVP.d.ts} +0 -0
  203. /package/dist/{format-file-size-CLCZz3lC.d.ts → format-file-size-BFUWvir1.d.ts} +0 -0
  204. /package/dist/{frame-loop-CMewS8cY.d.ts → frame-loop-BEO9_q3k.d.ts} +0 -0
  205. /package/dist/{frustum-visibility-CmI96ESS.d.ts → frustum-visibility-D_RGmH98.d.ts} +0 -0
  206. /package/dist/{geo-types-SaPnIEUM.d.ts → geo-types-DqiBzPO9.d.ts} +0 -0
  207. /package/dist/{gps-VuezJWK3.d.ts → gps-C5inWeNV.d.ts} +0 -0
  208. /package/dist/{gps-compass-cubes-BM1uGiYV.d.ts → gps-compass-cubes-BExxrWJ-.d.ts} +0 -0
  209. /package/dist/{gps-error-handler-CJl_2MVm.d.ts → gps-error-handler-C2bS69oJ.d.ts} +0 -0
  210. /package/dist/{hit-test-reticle-BEzEybxZ.d.ts → hit-test-reticle-Dqak9hiR.d.ts} +0 -0
  211. /package/dist/{index-CF05QV2m.d.ts → index-eaI1Z1KR.d.ts} +0 -0
  212. /package/dist/{lerp-utils-BpV-0Dtk.d.ts → lerp-utils-kLxMJ2Xj.d.ts} +0 -0
  213. /package/dist/{list-formatter-RRcBe8Vg.d.ts → list-formatter-ct8txwvR.d.ts} +0 -0
  214. /package/dist/{logger-BEHXsnnq.d.ts → logger-CzQrCe6C.d.ts} +0 -0
  215. /package/dist/{map-overlay-bcogY5fK.d.ts → map-overlay-Dci4yvm3.d.ts} +0 -0
  216. /package/dist/{permission-checker-GpAiSCwd.d.ts → permission-checker-CtPtPQRq.d.ts} +0 -0
  217. /package/dist/{scene-node-names-Bu0S66H1.d.ts → scene-node-names-CdNeQjOE.d.ts} +0 -0
  218. /package/dist/{session-disposers-M-oashRH.js → session-disposers-D8wnO-uW.js} +0 -0
  219. /package/dist/{three-dispose-D950t71B.d.ts → three-dispose-BCZkSJp2.d.ts} +0 -0
  220. /package/dist/{vis-colors-D6omC64K.d.ts → vis-colors-BZsSLI4i.d.ts} +0 -0
  221. /package/dist/{webxr-nue-basis-CqKQmZzT.d.ts → webxr-nue-basis-CW1wsbm6.d.ts} +0 -0
  222. /package/dist/{xr-camera-texture-DBwCaKTd.d.ts → xr-camera-texture-BmrP7iNZ.d.ts} +0 -0
  223. /package/dist/{xr-error-handler-C0AQRmxs.d.ts → xr-error-handler-BEjRgZjt.d.ts} +0 -0
  224. /package/dist/{xr-frame-loop-BtYytZJg.d.ts → xr-frame-loop-K8ebdjLw.d.ts} +0 -0
  225. /package/dist/{zip-reader-DSEXt7K6.d.ts → zip-reader-Q2ue6zlC.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { L as CombinedRootState, r as SlamAppRootState } from "./create-slam-app-store-BljusOua.js";
1
+ import { L as CombinedRootState, r as SlamAppRootState } from "./create-slam-app-store-Ce2FMKCp.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";
@@ -1,2 +1,2 @@
1
- import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-CFfd7n6B.js";
1
+ import { n as MAX_TRACE_STEPS, r as bresenham3d, t as GridCell } from "../bresenham3d-ByjcmEgM.js";
2
2
  export { GridCell, MAX_TRACE_STEPS, bresenham3d };
@@ -1,2 +1,2 @@
1
- import { i as computeCaptureSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CnxUDbKx.js";
2
- export { CameraBlitCapture, CameraBlitCaptureConfig, DEFAULT_BLIT_CONFIG, computeCaptureSize };
1
+ import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CqWe1G7s.js";
2
+ export { CameraBlitCapture, CameraBlitCaptureConfig, DEFAULT_BLIT_CONFIG, computeAspectFitSize, computeCaptureSize };
@@ -51,6 +51,36 @@ function computeCaptureSize(cameraWidth, cameraHeight, divisor) {
51
51
  };
52
52
  }
53
53
  /**
54
+ * Compute blit dimensions that PRESERVE the camera aspect ratio with the
55
+ * **longer edge fixed at `maxEdge`**. Unlike {@link computeCaptureSize} (which
56
+ * divides the native resolution by a user divisor), this fits the frame into a
57
+ * fixed pixel budget, so a 4:3 camera becomes e.g. 512×384 — NOT a stretched
58
+ * 512×512. Used by the QR-detection blit (B2) so the detector sees an
59
+ * undistorted code while the readback cost stays bounded by `maxEdge²`.
60
+ *
61
+ * @param cameraWidth - Native camera width in pixels (from XRCamera)
62
+ * @param cameraHeight - Native camera height in pixels (from XRCamera)
63
+ * @param maxEdge - Target length (px) of the longer output edge.
64
+ * @returns Integer dimensions, longer edge == `maxEdge`, aspect preserved
65
+ * (within rounding), each clamped to ≥ 1. When `maxEdge` itself is invalid
66
+ * (< 1 / NaN / Infinity) the longer edge falls back to
67
+ * `DEFAULT_BLIT_CONFIG.width` (still aspect-preserving). When the camera
68
+ * dimensions are invalid (≤ 0 / NaN / Infinity) the aspect is unknown, so it
69
+ * returns a square at the (possibly defaulted) edge.
70
+ */
71
+ function computeAspectFitSize(cameraWidth, cameraHeight, maxEdge) {
72
+ const safeEdge = maxEdge >= 1 && Number.isFinite(maxEdge) ? Math.floor(maxEdge) : DEFAULT_BLIT_CONFIG.width;
73
+ if (!(cameraWidth > 0) || !Number.isFinite(cameraWidth) || !(cameraHeight > 0) || !Number.isFinite(cameraHeight)) return {
74
+ width: safeEdge,
75
+ height: safeEdge
76
+ };
77
+ const scale = safeEdge / Math.max(cameraWidth, cameraHeight);
78
+ return {
79
+ width: Math.max(1, Math.round(cameraWidth * scale)),
80
+ height: Math.max(1, Math.round(cameraHeight * scale))
81
+ };
82
+ }
83
+ /**
54
84
  * Number of sampled pixels to check in isBlackFrame.
55
85
  * We sample a subset rather than checking every pixel for speed.
56
86
  */
@@ -168,6 +198,32 @@ var CameraBlitCapture = class {
168
198
  }
169
199
  }
170
200
  /**
201
+ * Capture the camera texture as **top-left-origin** RGBA — the orientation
202
+ * QR detection (and `BarcodeDetector`) expects — returning a FRESH copy that
203
+ * is safe to retain beyond the next capture.
204
+ *
205
+ * This is the efficient replacement for the demo's old JPEG round-trip: blit
206
+ * + readback (shared with {@link captureToBlob} / {@link captureToPixels}),
207
+ * then the same vertical flip the JPEG encoder applies, but with no encode →
208
+ * decode. Unlike {@link captureToPixels} (which returns the reusable internal
209
+ * buffer in WebGL bottom-row-first order), this returns an owned,
210
+ * correctly-oriented `Uint8ClampedArray`.
211
+ *
212
+ * IMPORTANT: Must be called within the XR animation frame callback, while the
213
+ * camera texture is valid.
214
+ *
215
+ * @returns `{ data, width, height }` (top-left RGBA), or null on
216
+ * failure/dispose.
217
+ */
218
+ captureToRgba(renderer, cameraTexture) {
219
+ if (!this.captureToPixels(renderer, cameraTexture)) return null;
220
+ return {
221
+ data: this.flippedPixelCopy(),
222
+ width: this.width,
223
+ height: this.height
224
+ };
225
+ }
226
+ /**
171
227
  * Check if a pixel buffer is entirely black (all zeros).
172
228
  * Uses sampling for performance (checks BLACK_CHECK_SAMPLE_COUNT evenly-spaced pixels).
173
229
  *
@@ -197,10 +253,19 @@ var CameraBlitCapture = class {
197
253
  return this.pixelsToJpegViaCanvas(quality);
198
254
  }
199
255
  getFlippedImageData() {
200
- const clampedBuffer = new Uint8ClampedArray(this.pixelBuffer);
201
- const imageData = new ImageData(clampedBuffer, this.width, this.height);
202
- this.flipImageDataVertically(imageData);
203
- return imageData;
256
+ return new ImageData(this.flippedPixelCopy(), this.width, this.height);
257
+ }
258
+ /**
259
+ * Produce a FRESH, top-left-origin RGBA copy of the internal readback buffer.
260
+ * WebGL `readPixels` returns bottom-row-first; this copies (so the internal
261
+ * buffer stays y-flipped for a subsequent capture) and swaps rows. Shared by
262
+ * the JPEG encode path ({@link getFlippedImageData}) and {@link captureToRgba}.
263
+ */
264
+ flippedPixelCopy() {
265
+ const copy = new Uint8ClampedArray(this.pixelBuffer.length);
266
+ copy.set(this.pixelBuffer);
267
+ this.flipRowsVertically(copy, this.width, this.height);
268
+ return copy;
204
269
  }
205
270
  async pixelsToJpegViaOffscreenCanvas(quality) {
206
271
  const offscreen = new OffscreenCanvas(this.width, this.height);
@@ -229,11 +294,11 @@ var CameraBlitCapture = class {
229
294
  });
230
295
  }
231
296
  /**
232
- * Flip ImageData vertically in-place.
233
- * WebGL readPixels returns bottom-row-first; canvas expects top-row-first.
297
+ * Flip an RGBA buffer vertically in-place (row swap).
298
+ * WebGL readPixels returns bottom-row-first; canvas / detectors expect
299
+ * top-row-first.
234
300
  */
235
- flipImageDataVertically(imageData) {
236
- const { data, width, height } = imageData;
301
+ flipRowsVertically(data, width, height) {
237
302
  const rowSize = width * 4;
238
303
  const tempRow = new Uint8ClampedArray(rowSize);
239
304
  for (let y = 0; y < Math.floor(height / 2); y++) {
@@ -291,4 +356,4 @@ var CameraBlitCapture = class {
291
356
  }
292
357
  };
293
358
  //#endregion
294
- export { CameraBlitCapture, DEFAULT_BLIT_CONFIG, computeCaptureSize };
359
+ export { CameraBlitCapture, 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-CQXJHxXg.js";
1
+ import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-CXqoJYtb.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-CUeU3L_M.js";
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-BL5SoG2a.js";
2
2
  export { CAPTURE_FAILURE_WARNING, CaptureFailureTracker, CaptureFailureTrackerConfig, DEFAULT_CAPTURE_TRACKER_CONFIG, createCaptureFailureTracker };
@@ -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-Jqbn0apH.js";
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-BNK189P0.js";
2
2
  export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, applyChromiumProjectionLayerWorkaround, needsBaseLayerPersistence, parseChromeVersion };
@@ -0,0 +1,2 @@
1
+ import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-vMDrGTk_.js";
2
+ export { DepthGridLookup, createDepthGridLookup };
@@ -0,0 +1,43 @@
1
+ //#region ../src/ar/depth-grid-lookup.ts
2
+ /** A node's depth if finite and positive, else `null` (a grid hole). */
3
+ function validDepth(points, index) {
4
+ const p = points[index];
5
+ if (!p) return null;
6
+ const d = p.depthM;
7
+ return Number.isFinite(d) && d > 0 ? d : null;
8
+ }
9
+ /**
10
+ * Build a bilinear lookup over a depth-sampler grid.
11
+ *
12
+ * @param points - the grid `DepthPoint`s (row-major, `row·g + col`).
13
+ * @param gridSize - points-per-side; inferred as `round(√points.length)` when
14
+ * omitted (the sampler always emits a full `g²` grid).
15
+ */
16
+ function createDepthGridLookup(points, gridSize) {
17
+ const g = gridSize ?? Math.round(Math.sqrt(points.length));
18
+ if (g < 2 || points.length < g * g) return { depthAt() {
19
+ for (let i = 0; i < points.length; i++) {
20
+ const d = validDepth(points, i);
21
+ if (d !== null) return d;
22
+ }
23
+ return null;
24
+ } };
25
+ return { depthAt(screenX, screenY) {
26
+ const gx = screenX * (g + 1) - 1;
27
+ const gy = screenY * (g + 1) - 1;
28
+ if (gx < 0 || gx > g - 1 || gy < 0 || gy > g - 1) return null;
29
+ const col0 = Math.min(Math.floor(gx), g - 2);
30
+ const row0 = Math.min(Math.floor(gy), g - 2);
31
+ const fx = gx - col0;
32
+ const fy = gy - row0;
33
+ const d00 = validDepth(points, row0 * g + col0);
34
+ const d10 = validDepth(points, row0 * g + col0 + 1);
35
+ const d01 = validDepth(points, (row0 + 1) * g + col0);
36
+ const d11 = validDepth(points, (row0 + 1) * g + col0 + 1);
37
+ if (d00 === null || d10 === null || d01 === null || d11 === null) return null;
38
+ const top = d00 + (d10 - d00) * fx;
39
+ return top + (d01 + (d11 - d01) * fx - top) * fy;
40
+ } };
41
+ }
42
+ //#endregion
43
+ export { createDepthGridLookup };
@@ -1,3 +1,3 @@
1
- import { i as DepthSample } from "../ar-types-Dan1MVTi.js";
2
- import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-Bhanfwla.js";
1
+ import { i as DepthSample } from "../ar-types-BckI1E-O.js";
2
+ import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-DwfPYzS7.js";
3
3
  export { DepthInfo, DepthSample, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, wrapXRDepthInfo };
@@ -56,10 +56,8 @@ var DepthSampler = class {
56
56
  unavailableCallbackFired = false;
57
57
  constructor(callbacks, config) {
58
58
  this.callbacks = callbacks;
59
- this.config = {
60
- ...DEFAULT_CONFIG,
61
- ...config
62
- };
59
+ this.config = { ...DEFAULT_CONFIG };
60
+ if (config) this.updateConfig(config);
63
61
  }
64
62
  /**
65
63
  * Start depth sampling.
@@ -1,2 +1,2 @@
1
- import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-Y6i_mJuT.js";
1
+ import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-CK3b9htH.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-BfUJOgpW.js";
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-CjZ1nEdu.js";
2
2
  export { EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, createEnableGpsArController };
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger.js";
2
+ import { a as endARSession, b as isWebXRSupported, y as initAR } from "../webxr-session-CJF9Nijp.js";
2
3
  import { requestGeolocationPermission, requestOrientationPermission, requestWebXRWithDepthPermission } from "../sensors/permission-checker.js";
3
4
  import { startGpsWatch, startOrientationWatch, stopGpsWatch, stopOrientationWatch } from "../sensors/gps.js";
4
- import { _ as isWebXRSupported, g as initAR, i as endARSession } from "../webxr-session-TIaD883f.js";
5
5
  //#region ../src/ar/enable-gps-ar.ts
6
6
  const log = createLogger("EnableGpsAr");
7
7
  const defaultDeps = {
@@ -74,10 +74,12 @@ function createEnableGpsArController(deps = {}) {
74
74
  error: "AR is already starting, running or stopping."
75
75
  };
76
76
  setState({ status: "starting" });
77
+ let sessionStarted = false;
77
78
  try {
78
79
  const permissionError = await requestPermissions(config);
79
80
  if (permissionError !== null) return fail(permissionError);
80
81
  await resolved.initAR(config.container, config.isolationOptions, { requestHitTest: config.requestHitTest });
82
+ sessionStarted = true;
81
83
  if (config.onGpsPosition) {
82
84
  resolved.startGpsWatch(config.onGpsPosition);
83
85
  gpsWatchActive = true;
@@ -89,6 +91,29 @@ function createEnableGpsArController(deps = {}) {
89
91
  setState({ status: "running" });
90
92
  return { ok: true };
91
93
  } catch (err) {
94
+ if (sessionStarted) {
95
+ if (gpsWatchActive) {
96
+ try {
97
+ resolved.stopGpsWatch();
98
+ } catch (cleanupErr) {
99
+ log.error("stopGpsWatch during enable() cleanup threw:", cleanupErr);
100
+ }
101
+ gpsWatchActive = false;
102
+ }
103
+ if (orientationWatchActive) {
104
+ try {
105
+ resolved.stopOrientationWatch();
106
+ } catch (cleanupErr) {
107
+ log.error("stopOrientationWatch during enable() cleanup threw:", cleanupErr);
108
+ }
109
+ orientationWatchActive = false;
110
+ }
111
+ try {
112
+ await resolved.endARSession();
113
+ } catch (cleanupErr) {
114
+ log.error("Cleanup after enable() failure threw; continuing:", cleanupErr);
115
+ }
116
+ }
92
117
  return fail(err instanceof Error ? err.message : String(err));
93
118
  }
94
119
  }
@@ -1,2 +1,2 @@
1
- import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-CMewS8cY.js";
1
+ import { i as runFrameUpdates, n as clearFrameUpdates, r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-BEO9_q3k.js";
2
2
  export { FrameUpdate, clearFrameUpdates, registerFrameUpdate, runFrameUpdates };
@@ -1,2 +1,2 @@
1
- import { a as ImageCaptureConfig, i as ImageCaptureCallbacks, n as CapturedImage, o as ImageCaptureManager, r as DEFAULT_CAPTURE_CONFIG, s as MIN_VALID_IMAGE_BYTES, t as CapturedFrame } from "../image-capture-qAZ5Fh5X.js";
1
+ import { a as ImageCaptureConfig, i as ImageCaptureCallbacks, n as CapturedImage, o as ImageCaptureManager, r as DEFAULT_CAPTURE_CONFIG, s as MIN_VALID_IMAGE_BYTES, t as CapturedFrame } from "../image-capture-C2Feywet.js";
2
2
  export { CapturedFrame, CapturedImage, DEFAULT_CAPTURE_CONFIG, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, MIN_VALID_IMAGE_BYTES };
@@ -1,19 +1,30 @@
1
- import { r as bresenham3d, t as GridCell } from "../bresenham3d-CFfd7n6B.js";
2
- import { i as computeCaptureSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CnxUDbKx.js";
3
- import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-CQXJHxXg.js";
4
- 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-CUeU3L_M.js";
5
- 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-Jqbn0apH.js";
6
- import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-Bhanfwla.js";
7
- import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-Y6i_mJuT.js";
8
- import { a as ImageCaptureConfig, i as ImageCaptureCallbacks, n as CapturedImage, o as ImageCaptureManager, r as DEFAULT_CAPTURE_CONFIG, s as MIN_VALID_IMAGE_BYTES } from "../image-capture-qAZ5Fh5X.js";
9
- import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-DBwCaKTd.js";
10
- import { D as setDepthCaptureCallback, I as startDepthCapture, L as startImageCapture, M as setTrackingLostCallback, O as setFrameCallback, P as setTrackingStore, R as stopDepthCapture, d as getCamera, f as getCurrentArPose, g as getScene, h as getLiveCss3dManager, j as setTrackingCallbacks, k as setImageCaptureCallback, m as getImageCaptureFrameCount, o as endARSession, p as getDepthSampleCount, t as SessionFeatureOptions, u as getArWorldGroup, v as initAR, z as stopImageCapture } from "../webxr-session-GjZ2BIpS.js";
11
- 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-BfUJOgpW.js";
12
- import { r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-CMewS8cY.js";
13
- import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-BRNRaPyT.js";
14
- import { i as registerXrFrameUpdate, n as XrFrameUpdate, t as XrFrameContext } from "../xr-frame-loop-BtYytZJg.js";
15
- import { a as getCameraFollower, c as getReplayState, d as updateOrbitTarget, i as getAlignmentLerper, l as initReplayScene, n as ReplaySceneState, o as getCameraMode, r as disposeReplayScene, t as CameraMode, u as toggleCameraMode } from "../replay-scene-Bw58VL6p.js";
16
- import { t as SCENE_NODE } from "../scene-node-names-Bu0S66H1.js";
17
- import { t as WEBXR_TO_NUE } from "../webxr-nue-basis-CqKQmZzT.js";
18
- import { n as XR_ERROR_MESSAGE_UNKNOWN, r as getXrErrorMessage, t as XR_ERROR_MESSAGES } from "../xr-error-handler-C0AQRmxs.js";
19
- export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, CAPTURE_FAILURE_WARNING, CameraBlitCapture, type CameraBlitCaptureConfig, type CameraMode, type CameraTextureResult, type CapabilityMessageOptions, type CapabilitySupport, type CaptureFailureTracker, type CaptureFailureTrackerConfig, type CapturedImage, type ChromeVersion, type ChromiumProjectionLayerWorkaroundResult, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, type DepthInfo, DepthSampler, type DepthSamplerCallbacks, type DepthSamplerConfig, type DepthUnprojector, type EnableGpsArConfig, type EnableGpsArController, type EnableGpsArDeps, type EnableGpsArResult, type EnableGpsArState, type EnableGpsArStatus, type FrameUpdate, type GridCell, type ImageCaptureCallbacks, type ImageCaptureConfig, ImageCaptureManager, MIN_VALID_IMAGE_BYTES, OccupancyGrid, type OccupancyGridOptions, type RendererLike, type ReplaySceneState, SCENE_NODE, type SessionFeatureOptions, WEBXR_TO_NUE, type XRCameraLike, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, type XrFrameContext, type XrFrameUpdate, acquireCameraTexture, applyChromiumProjectionLayerWorkaround, bresenham3d, capabilityMessage, computeCaptureSize, createCaptureFailureTracker, createDepthUnprojector, createEnableGpsArController, disposeReplayScene, endARSession, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraMode, getCurrentArPose, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getReplayState, getScene, getXrErrorMessage, initAR, initReplayScene, isFullySupported, needsBaseLayerPersistence, parseChromeVersion, registerFrameUpdate, registerXrFrameUpdate, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingStore, startDepthCapture, startImageCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, unprojectDepthPoint, updateOrbitTarget, wrapXRDepthInfo };
1
+ import { r as bresenham3d, t as GridCell } from "../bresenham3d-ByjcmEgM.js";
2
+ import { a as computeCaptureSize, i as computeAspectFitSize, n as CameraBlitCaptureConfig, r as DEFAULT_BLIT_CONFIG, t as CameraBlitCapture } from "../camera-blit-capture-CqWe1G7s.js";
3
+ import { i as isFullySupported, n as CapabilitySupport, r as capabilityMessage, t as CapabilityMessageOptions } from "../capability-checker-CXqoJYtb.js";
4
+ 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-BL5SoG2a.js";
5
+ 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-BNK189P0.js";
6
+ import { n as createDepthGridLookup, t as DepthGridLookup } from "../depth-grid-lookup-vMDrGTk_.js";
7
+ import { a as wrapXRDepthInfo, i as DepthSamplerConfig, n as DepthSampler, r as DepthSamplerCallbacks, t as DepthInfo } from "../depth-sampler-DwfPYzS7.js";
8
+ import { n as createDepthUnprojector, r as unprojectDepthPoint, t as DepthUnprojector } from "../depth-unprojection-CK3b9htH.js";
9
+ import { a as ImageCaptureConfig, i as ImageCaptureCallbacks, n as CapturedImage, o as ImageCaptureManager, r as DEFAULT_CAPTURE_CONFIG, s as MIN_VALID_IMAGE_BYTES } from "../image-capture-C2Feywet.js";
10
+ import { _ as solveQrPose, a as QrPoseSolution, c as SolveQrPoseInput, d as intrinsicsFromProjection, f as invertPose, g as signedQuadArea, h as reprojectionErrorPx, i as Pose, l as buildObjectPoints, m as qrInCameraFromOpenCv, n as OpenCvPnpResult, o as QuadValidation, p as projectViewPoint, r as Point2, s as SolvePnpSquare, t as CameraIntrinsics, u as composePose, v as transformPoint, y as validateQuad } from "../qr-pose-Bt2reSw7.js";
11
+ import { a as QrFrontEnd, c as createBarcodeDetectorFrontEnd, i as QrDetection, n as BarcodeDetectorLike, o as RgbaImage, r as DetectedBarcodeLike, s as ToImageBitmapSource, t as BarcodeDetectorFrontEnd } from "../qr-frontend-DufZp2xS.js";
12
+ import { i as acquireCameraTexture, n as RendererLike, r as XRCameraLike, t as CameraTextureResult } from "../xr-camera-texture-BmrP7iNZ.js";
13
+ import { G as stopDepthCapture, H as startDepthCapture, I as setTrackingCallbacks, K as stopImageCapture, L as setTrackingLostCallback, M as setDepthCaptureCallback, N as setFrameCallback, P as setImageCaptureCallback, S as initAR, U as startImageCapture, V as startCameraFrameCapture, W as stopCameraFrameCapture, _ as getDepthSampleCount, b as getScene, c as endARSession, f as getArWorldGroup, g as getCurrentArPose, h as getCameraFrameCount, j as setCameraFrameCallback, p as getCamera, r as SessionFeatureOptions, t as CameraFrameCaptureConfig, v as getImageCaptureFrameCount, y as getLiveCss3dManager, z as setTrackingStore } from "../webxr-session-COsOjJwn.js";
14
+ 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-CjZ1nEdu.js";
15
+ import { r as registerFrameUpdate, t as FrameUpdate } from "../frame-loop-BEO9_q3k.js";
16
+ import { c as QrSizeAccumulatorOptions, d as QrSizeStatus, f as createQrSizeAccumulator, i as QrSizeMeasurer, l as QrSizeEstimate, n as QrSizeDepthContext, o as createQrSizeMeasurer, p as estimateQrSizeFromDepth, r as QrSizeMeasurement, s as QrSizeAccumulator, t as ImageSize, u as QrSizeObservation } from "../qr-size-measurer-D7739ZpB.js";
17
+ import { t as createQrSizeDepthContext } from "../qr-size-depth-context-onu36E9s.js";
18
+ import { a as createIncrementalQrPlacement, c as deriveSolvedQrPose, i as RawQrObservation, l as solveQrPoseFromObservation, n as DerivedQrPlacement, o as deriveQrPlacement, r as IncrementalQrPlacement, s as deriveQrSizeM, t as DeriveQrPoseDeps } from "../qr-derived-pose-DinKE600.js";
19
+ import { n as createQrDebugView, t as QrDebugView } from "../qr-debug-view-B8gTzjMm.js";
20
+ import { a as createQrDetectionController, i as RawObservationSink, n as QrDetectionControllerDeps, r as QrScanStatus, t as QrDetectionController } from "../qr-detection-controller-Cd2Ih4cC.js";
21
+ import { a as QrPoseStability, c as aggregateQrPose, i as DEFAULT_ROTATION_INLIER_ANGLE_DEG, l as averageRotation, n as AverageRotationOptions, o as QrPoseStabilityOptions, r as AverageRotationResult, s as QrPoseStabilityStatus, t as AggregateQrPoseResult, u as evaluateQrPoseStability } from "../qr-pose-aggregation-CFlmLm6w.js";
22
+ import { A as QrGpsVoteInput, C as QrLevel, D as Enu, E as parseQrLevel, M as localPlaneToEnu, N as offsetGeo, O as METERS_PER_DEG_LAT, S as FetchQrLevelOptions, T as fetchQrLevel, _ as QrTrackingController, a as checkQrPlausibility, b as createQrTrackingController, c as QrDetectionScheduler, d as createQrDetectionScheduler, f as CameraFrameSource, g as QrSolvePoseInput, h as QrDetectionEvent, i as QrPlausibilityVerdict, j as buildQrGpsVotes, k as QrGeoPose, l as QrDetectionSchedulerConfig, m as CameraFrameSourceConfig, n as QrPlausibility, o as DetectionScheduler, p as CameraFrameSourceCallbacks, r as QrPlausibilityOptions, s as DetectionSchedulerConfig, t as OccupancySurface, u as createDetectionScheduler, v as QrTrackingControllerConfig, w as QrLevelValidationError, x as FetchLike, y as QrTrackingStatus } from "../index-BvLo2poy.js";
23
+ import { a as homographyFromCorrespondences, c as rotationToRodrigues, i as PoseCandidate, l as solveLinear, n as Mat3, o as ippePoseCandidates, r as PlanarPnpSquare, s as nearestRotation3x3, t as Homography } from "../planar-pnp-cjthe7Be.js";
24
+ import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-Bvi2Gw1U.js";
25
+ import { i as registerXrFrameUpdate, n as XrFrameUpdate, t as XrFrameContext } from "../xr-frame-loop-K8ebdjLw.js";
26
+ import { a as getCameraFollower, c as getReplayState, d as updateOrbitTarget, i as getAlignmentLerper, l as initReplayScene, n as ReplaySceneState, o as getCameraMode, r as disposeReplayScene, t as CameraMode, u as toggleCameraMode } from "../replay-scene-CPt56pps.js";
27
+ import { t as SCENE_NODE } from "../scene-node-names-CdNeQjOE.js";
28
+ import { t as WEBXR_TO_NUE } from "../webxr-nue-basis-CW1wsbm6.js";
29
+ import { n as XR_ERROR_MESSAGE_UNKNOWN, r as getXrErrorMessage, t as XR_ERROR_MESSAGES } from "../xr-error-handler-BEjRgZjt.js";
30
+ export { AggregateQrPoseResult, AverageRotationOptions, AverageRotationResult, BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BarcodeDetectorFrontEnd, BarcodeDetectorLike, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraBlitCaptureConfig, CameraFrameCaptureConfig, CameraFrameSource, CameraFrameSourceCallbacks, CameraFrameSourceConfig, CameraIntrinsics, CameraMode, CameraTextureResult, CapabilityMessageOptions, CapabilitySupport, CaptureFailureTracker, CaptureFailureTrackerConfig, CapturedImage, ChromeVersion, ChromiumProjectionLayerWorkaroundResult, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, DEFAULT_ROTATION_INLIER_ANGLE_DEG, DepthGridLookup, DepthInfo, DepthSampler, DepthSamplerCallbacks, DepthSamplerConfig, DepthUnprojector, DeriveQrPoseDeps, DerivedQrPlacement, DetectedBarcodeLike, DetectionScheduler, DetectionSchedulerConfig, EnableGpsArConfig, EnableGpsArController, EnableGpsArDeps, EnableGpsArResult, EnableGpsArState, EnableGpsArStatus, Enu, FetchLike, FetchQrLevelOptions, FrameUpdate, GridCell, Homography, ImageCaptureCallbacks, ImageCaptureConfig, ImageCaptureManager, ImageSize, IncrementalQrPlacement, METERS_PER_DEG_LAT, MIN_VALID_IMAGE_BYTES, Mat3, OccupancyGrid, OccupancyGridOptions, OccupancySurface, OpenCvPnpResult, PlanarPnpSquare, Point2, Pose, PoseCandidate, QrDebugView, QrDetection, QrDetectionController, QrDetectionControllerDeps, QrDetectionEvent, QrDetectionScheduler, QrDetectionSchedulerConfig, QrFrontEnd, QrGeoPose, QrGpsVoteInput, QrLevel, QrLevelValidationError, QrPlausibility, QrPlausibilityOptions, QrPlausibilityVerdict, QrPoseSolution, QrPoseStability, QrPoseStabilityOptions, QrPoseStabilityStatus, QrScanStatus, QrSizeAccumulator, QrSizeAccumulatorOptions, QrSizeDepthContext, QrSizeEstimate, QrSizeMeasurement, QrSizeMeasurer, QrSizeObservation, QrSizeStatus, QrSolvePoseInput, QrTrackingController, QrTrackingControllerConfig, QrTrackingStatus, QuadValidation, RawObservationSink, RawQrObservation, RendererLike, ReplaySceneState, RgbaImage, SCENE_NODE, SessionFeatureOptions, SolvePnpSquare, SolveQrPoseInput, ToImageBitmapSource, WEBXR_TO_NUE, XRCameraLike, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, XrFrameContext, XrFrameUpdate, acquireCameraTexture, aggregateQrPose, applyChromiumProjectionLayerWorkaround, averageRotation, bresenham3d, buildObjectPoints, buildQrGpsVotes, capabilityMessage, checkQrPlausibility, composePose, computeAspectFitSize, computeCaptureSize, createBarcodeDetectorFrontEnd, createCaptureFailureTracker, createDepthGridLookup, createDepthUnprojector, createDetectionScheduler, createEnableGpsArController, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, disposeReplayScene, endARSession, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraFrameCount, getCameraMode, getCurrentArPose, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getReplayState, getScene, getXrErrorMessage, homographyFromCorrespondences, initAR, initReplayScene, intrinsicsFromProjection, invertPose, ippePoseCandidates, isFullySupported, localPlaneToEnu, nearestRotation3x3, needsBaseLayerPersistence, offsetGeo, parseChromeVersion, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, registerFrameUpdate, registerXrFrameUpdate, reprojectionErrorPx, rotationToRodrigues, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingStore, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, transformPoint, unprojectDepthPoint, updateOrbitTarget, validateQuad, wrapXRDepthInfo };
package/dist/ar/index.js CHANGED
@@ -1,19 +1,30 @@
1
- import { CameraBlitCapture, DEFAULT_BLIT_CONFIG, computeCaptureSize } from "./camera-blit-capture.js";
1
+ import { CameraBlitCapture, DEFAULT_BLIT_CONFIG, computeAspectFitSize, computeCaptureSize } from "./camera-blit-capture.js";
2
2
  import { capabilityMessage, isFullySupported } from "./capability-checker.js";
3
3
  import { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, applyChromiumProjectionLayerWorkaround, needsBaseLayerPersistence, parseChromeVersion } from "./chromium-camera-access-workaround.js";
4
4
  import { CAPTURE_FAILURE_WARNING, DEFAULT_CAPTURE_TRACKER_CONFIG, createCaptureFailureTracker } from "./capture-failure-tracker.js";
5
5
  import { DepthSampler, wrapXRDepthInfo } from "./depth-sampler.js";
6
6
  import { createDepthUnprojector, unprojectDepthPoint } from "./depth-unprojection.js";
7
+ import { createDepthGridLookup } from "./depth-grid-lookup.js";
8
+ import { n as createQrSizeAccumulator, r as estimateQrSizeFromDepth, t as createQrSizeMeasurer } from "../qr-size-measurer-DLb33geH.js";
9
+ import { createQrSizeDepthContext } from "./qr-size-depth-context.js";
10
+ import { buildObjectPoints, composePose, intrinsicsFromProjection, invertPose, projectViewPoint, qrInCameraFromOpenCv, reprojectionErrorPx, signedQuadArea, solveQrPose, transformPoint, validateQuad } from "./qr-pose.js";
11
+ import { createIncrementalQrPlacement, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, solveQrPoseFromObservation } from "./qr-derived-pose.js";
12
+ import { WEBXR_TO_NUE } from "./webxr-nue-basis.js";
13
+ import { createQrDebugView } from "./qr-debug-view.js";
14
+ import { n as createDetectionScheduler, r as createQrDetectionScheduler, t as createQrDetectionController } from "../qr-detection-controller-B-tLVd-S.js";
15
+ import { i as evaluateQrPoseStability, n as aggregateQrPose, r as averageRotation, t as DEFAULT_ROTATION_INLIER_ANGLE_DEG } from "../qr-pose-aggregation-DXR9STHs.js";
16
+ import { a as localPlaneToEnu, c as fetchQrLevel, i as buildQrGpsVotes, l as parseQrLevel, n as createQrTrackingController, o as offsetGeo, r as METERS_PER_DEG_LAT, s as QrLevelValidationError, t as checkQrPlausibility } from "../ar-Dc72Ksiu.js";
17
+ import { BarcodeDetectorFrontEnd, createBarcodeDetectorFrontEnd } from "./qr-frontend.js";
18
+ import { A as setFrameCallback, B as startImageCapture, H as stopDepthCapture, I as setTrackingStore, N as setTrackingCallbacks, O as setCameraFrameCallback, P as setTrackingLostCallback, R as startCameraFrameCapture, U as stopImageCapture, V as stopCameraFrameCapture, W as CameraFrameSource, _ as getScene, a as endARSession, f as getCameraFrameCount, g as getLiveCss3dManager, h as getImageCaptureFrameCount, j as setImageCaptureCallback, k as setDepthCaptureCallback, l as getArWorldGroup, m as getDepthSampleCount, p as getCurrentArPose, u as getCamera, y as initAR, z as startDepthCapture } from "../webxr-session-CJF9Nijp.js";
19
+ import { PlanarPnpSquare, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear } from "./planar-pnp.js";
7
20
  import { bresenham3d } from "./bresenham3d.js";
8
21
  import { OccupancyGrid } from "./occupancy-grid.js";
9
22
  import { registerFrameUpdate } from "./frame-loop.js";
10
23
  import { registerXrFrameUpdate } from "./xr-frame-loop.js";
11
- import { WEBXR_TO_NUE } from "./webxr-nue-basis.js";
12
24
  import { DEFAULT_CAPTURE_CONFIG, ImageCaptureManager, MIN_VALID_IMAGE_BYTES } from "./image-capture.js";
13
- import { A as setTrackingLostCallback, D as setImageCaptureCallback, E as setFrameCallback, F as startImageCapture, I as stopDepthCapture, L as stopImageCapture, M as setTrackingStore, P as startDepthCapture, T as setDepthCaptureCallback, c as getArWorldGroup, d as getDepthSampleCount, f as getImageCaptureFrameCount, g as initAR, i as endARSession, k as setTrackingCallbacks, l as getCamera, m as getScene, p as getLiveCss3dManager, u as getCurrentArPose } from "../webxr-session-TIaD883f.js";
14
25
  import { acquireCameraTexture } from "./xr-camera-texture.js";
15
26
  import { SCENE_NODE } from "./scene-node-names.js";
16
27
  import { createEnableGpsArController } from "./enable-gps-ar.js";
17
28
  import { disposeReplayScene, getAlignmentLerper, getCameraFollower, getCameraMode, getReplayState, initReplayScene, toggleCameraMode, updateOrbitTarget } from "./replay-scene.js";
18
29
  import { XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, getXrErrorMessage } from "./xr-error-handler.js";
19
- export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, CAPTURE_FAILURE_WARNING, CameraBlitCapture, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, DepthSampler, ImageCaptureManager, MIN_VALID_IMAGE_BYTES, OccupancyGrid, SCENE_NODE, WEBXR_TO_NUE, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, acquireCameraTexture, applyChromiumProjectionLayerWorkaround, bresenham3d, capabilityMessage, computeCaptureSize, createCaptureFailureTracker, createDepthUnprojector, createEnableGpsArController, disposeReplayScene, endARSession, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraMode, getCurrentArPose, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getReplayState, getScene, getXrErrorMessage, initAR, initReplayScene, isFullySupported, needsBaseLayerPersistence, parseChromeVersion, registerFrameUpdate, registerXrFrameUpdate, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingStore, startDepthCapture, startImageCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, unprojectDepthPoint, updateOrbitTarget, wrapXRDepthInfo };
30
+ export { BASELAYER_WINDOW_MAX, BASELAYER_WINDOW_MIN, BarcodeDetectorFrontEnd, CAPTURE_FAILURE_WARNING, CameraBlitCapture, CameraFrameSource, DEFAULT_BLIT_CONFIG, DEFAULT_CAPTURE_CONFIG, DEFAULT_CAPTURE_TRACKER_CONFIG, DEFAULT_ROTATION_INLIER_ANGLE_DEG, DepthSampler, ImageCaptureManager, METERS_PER_DEG_LAT, MIN_VALID_IMAGE_BYTES, OccupancyGrid, PlanarPnpSquare, QrLevelValidationError, SCENE_NODE, WEBXR_TO_NUE, XR_ERROR_MESSAGES, XR_ERROR_MESSAGE_UNKNOWN, acquireCameraTexture, aggregateQrPose, applyChromiumProjectionLayerWorkaround, averageRotation, bresenham3d, buildObjectPoints, buildQrGpsVotes, capabilityMessage, checkQrPlausibility, composePose, computeAspectFitSize, computeCaptureSize, createBarcodeDetectorFrontEnd, createCaptureFailureTracker, createDepthGridLookup, createDepthUnprojector, createDetectionScheduler, createEnableGpsArController, createIncrementalQrPlacement, createQrDebugView, createQrDetectionController, createQrDetectionScheduler, createQrSizeAccumulator, createQrSizeDepthContext, createQrSizeMeasurer, createQrTrackingController, deriveQrPlacement, deriveQrSizeM, deriveSolvedQrPose, disposeReplayScene, endARSession, estimateQrSizeFromDepth, evaluateQrPoseStability, fetchQrLevel, getAlignmentLerper, getArWorldGroup, getCamera, getCameraFollower, getCameraFrameCount, getCameraMode, getCurrentArPose, getDepthSampleCount, getImageCaptureFrameCount, getLiveCss3dManager, getReplayState, getScene, getXrErrorMessage, homographyFromCorrespondences, initAR, initReplayScene, intrinsicsFromProjection, invertPose, ippePoseCandidates, isFullySupported, localPlaneToEnu, nearestRotation3x3, needsBaseLayerPersistence, offsetGeo, parseChromeVersion, parseQrLevel, projectViewPoint, qrInCameraFromOpenCv, registerFrameUpdate, registerXrFrameUpdate, reprojectionErrorPx, rotationToRodrigues, setCameraFrameCallback, setDepthCaptureCallback, setFrameCallback, setImageCaptureCallback, setTrackingCallbacks, setTrackingLostCallback, setTrackingStore, signedQuadArea, solveLinear, solveQrPose, solveQrPoseFromObservation, startCameraFrameCapture, startDepthCapture, startImageCapture, stopCameraFrameCapture, stopDepthCapture, stopImageCapture, toggleCameraMode, transformPoint, unprojectDepthPoint, updateOrbitTarget, validateQuad, wrapXRDepthInfo };
@@ -1,2 +1,2 @@
1
- import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-BRNRaPyT.js";
1
+ import { n as OccupancyGridOptions, t as OccupancyGrid } from "../occupancy-grid-Bvi2Gw1U.js";
2
2
  export { OccupancyGrid, OccupancyGridOptions };
@@ -47,10 +47,11 @@ var OccupancyGrid = class {
47
47
  if (!cellsEqual(cameraCell, cell)) this.carve(cameraCell, cell);
48
48
  endpoints.push({
49
49
  cell,
50
+ world,
50
51
  rgb: point.rgb
51
52
  });
52
53
  }
53
- for (const endpoint of endpoints) this.increment(endpoint.cell, endpoint.rgb);
54
+ for (const endpoint of endpoints) this.increment(endpoint.cell, endpoint.world, endpoint.rgb);
54
55
  return endpoints.length;
55
56
  }
56
57
  /** Occupied cells observed at least `minObservations` times (default 1). */
@@ -76,6 +77,24 @@ var OccupancyGrid = class {
76
77
  ];
77
78
  }
78
79
  /**
80
+ * Running-average of the EXACT unprojected surface points observed in this
81
+ * cell (raw WebXR space), or null for an unknown cell. Unlike
82
+ * {@link getCellCenter} (the geometric 15 cm-lattice center) this hugs the
83
+ * real measured surface and noise-averages across viewpoints — used by the
84
+ * COLMAP `points3D` export and the debug cubes (follow-up Item A). Being a
85
+ * centroid of points that fell in the cell, it always lies within
86
+ * `cellSizeM/2` of the cell center per axis.
87
+ */
88
+ getCellPoint(cell) {
89
+ const record = this.cells.get(cellKey(cell));
90
+ if (!record || record.count === 0) return null;
91
+ return [
92
+ record.posSum[0] / record.count,
93
+ record.posSum[1] / record.count,
94
+ record.posSum[2] / record.count
95
+ ];
96
+ }
97
+ /**
79
98
  * Running-average color of the cell's colored observations (Iter 8), or
80
99
  * null when the cell is unknown or was only ever observed without color
81
100
  * (rgb option off / pre-Iter-8 recordings) — consumers fall back to
@@ -126,13 +145,18 @@ var OccupancyGrid = class {
126
145
  return true;
127
146
  }, this.carveStopCells);
128
147
  }
129
- increment(cell, rgb) {
148
+ increment(cell, world, rgb) {
130
149
  const key = cellKey(cell);
131
150
  let record = this.cells.get(key);
132
151
  if (!record) {
133
152
  record = {
134
153
  cell,
135
154
  count: 0,
155
+ posSum: [
156
+ 0,
157
+ 0,
158
+ 0
159
+ ],
136
160
  colorCount: 0,
137
161
  colorSum: [
138
162
  0,
@@ -143,6 +167,9 @@ var OccupancyGrid = class {
143
167
  this.cells.set(key, record);
144
168
  }
145
169
  record.count++;
170
+ record.posSum[0] += world[0];
171
+ record.posSum[1] += world[1];
172
+ record.posSum[2] += world[2];
146
173
  if (rgb && isFiniteTriple(rgb)) {
147
174
  record.colorCount++;
148
175
  record.colorSum[0] += rgb[0];
@@ -0,0 +1,2 @@
1
+ import { a as homographyFromCorrespondences, c as rotationToRodrigues, i as PoseCandidate, l as solveLinear, n as Mat3, o as ippePoseCandidates, r as PlanarPnpSquare, s as nearestRotation3x3, t as Homography } from "../planar-pnp-cjthe7Be.js";
2
+ export { Homography, Mat3, PlanarPnpSquare, PoseCandidate, homographyFromCorrespondences, ippePoseCandidates, nearestRotation3x3, rotationToRodrigues, solveLinear };