react-native-nitro-ar 2026.2.1

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 (261) hide show
  1. package/README.md +347 -0
  2. package/app.plugin.js +24 -0
  3. package/ios/Bridge.h +8 -0
  4. package/ios/HybridARAnchor.swift +58 -0
  5. package/ios/HybridARBoundingBoxBuilder.swift +142 -0
  6. package/ios/HybridARDepthData.swift +138 -0
  7. package/ios/HybridARFrame.swift +121 -0
  8. package/ios/HybridARLightEstimate.swift +58 -0
  9. package/ios/HybridARMeasurement.swift +33 -0
  10. package/ios/HybridARMeshAnchor.swift +108 -0
  11. package/ios/HybridARPlaneAnchor.swift +114 -0
  12. package/ios/HybridARRaycastResult.swift +53 -0
  13. package/ios/HybridARSession.swift +505 -0
  14. package/ios/HybridARView.swift +725 -0
  15. package/ios/HybridARVolume.swift +52 -0
  16. package/ios/HybridARWorldMap.swift +55 -0
  17. package/lib/commonjs/index.js +24 -0
  18. package/lib/commonjs/index.js.map +1 -0
  19. package/lib/commonjs/package.json +3 -0
  20. package/lib/commonjs/specs/ARAnchor.nitro.js +6 -0
  21. package/lib/commonjs/specs/ARAnchor.nitro.js.map +1 -0
  22. package/lib/commonjs/specs/ARBoundingBoxBuilder.nitro.js +6 -0
  23. package/lib/commonjs/specs/ARBoundingBoxBuilder.nitro.js.map +1 -0
  24. package/lib/commonjs/specs/ARDepthData.nitro.js +6 -0
  25. package/lib/commonjs/specs/ARDepthData.nitro.js.map +1 -0
  26. package/lib/commonjs/specs/ARFrame.nitro.js +6 -0
  27. package/lib/commonjs/specs/ARFrame.nitro.js.map +1 -0
  28. package/lib/commonjs/specs/ARLightEstimate.nitro.js +6 -0
  29. package/lib/commonjs/specs/ARLightEstimate.nitro.js.map +1 -0
  30. package/lib/commonjs/specs/ARMeasurement.nitro.js +6 -0
  31. package/lib/commonjs/specs/ARMeasurement.nitro.js.map +1 -0
  32. package/lib/commonjs/specs/ARPlaneAnchor.nitro.js +6 -0
  33. package/lib/commonjs/specs/ARPlaneAnchor.nitro.js.map +1 -0
  34. package/lib/commonjs/specs/ARRaycastResult.nitro.js +6 -0
  35. package/lib/commonjs/specs/ARRaycastResult.nitro.js.map +1 -0
  36. package/lib/commonjs/specs/ARSceneMesh.nitro.js +6 -0
  37. package/lib/commonjs/specs/ARSceneMesh.nitro.js.map +1 -0
  38. package/lib/commonjs/specs/ARSession.nitro.js +6 -0
  39. package/lib/commonjs/specs/ARSession.nitro.js.map +1 -0
  40. package/lib/commonjs/specs/ARView.nitro.js +6 -0
  41. package/lib/commonjs/specs/ARView.nitro.js.map +1 -0
  42. package/lib/commonjs/specs/ARVolume.nitro.js +6 -0
  43. package/lib/commonjs/specs/ARVolume.nitro.js.map +1 -0
  44. package/lib/commonjs/specs/ARWorldMap.nitro.js +6 -0
  45. package/lib/commonjs/specs/ARWorldMap.nitro.js.map +1 -0
  46. package/lib/module/index.js +18 -0
  47. package/lib/module/index.js.map +1 -0
  48. package/lib/module/specs/ARAnchor.nitro.js +4 -0
  49. package/lib/module/specs/ARAnchor.nitro.js.map +1 -0
  50. package/lib/module/specs/ARBoundingBoxBuilder.nitro.js +4 -0
  51. package/lib/module/specs/ARBoundingBoxBuilder.nitro.js.map +1 -0
  52. package/lib/module/specs/ARDepthData.nitro.js +4 -0
  53. package/lib/module/specs/ARDepthData.nitro.js.map +1 -0
  54. package/lib/module/specs/ARFrame.nitro.js +4 -0
  55. package/lib/module/specs/ARFrame.nitro.js.map +1 -0
  56. package/lib/module/specs/ARLightEstimate.nitro.js +4 -0
  57. package/lib/module/specs/ARLightEstimate.nitro.js.map +1 -0
  58. package/lib/module/specs/ARMeasurement.nitro.js +4 -0
  59. package/lib/module/specs/ARMeasurement.nitro.js.map +1 -0
  60. package/lib/module/specs/ARPlaneAnchor.nitro.js +4 -0
  61. package/lib/module/specs/ARPlaneAnchor.nitro.js.map +1 -0
  62. package/lib/module/specs/ARRaycastResult.nitro.js +4 -0
  63. package/lib/module/specs/ARRaycastResult.nitro.js.map +1 -0
  64. package/lib/module/specs/ARSceneMesh.nitro.js +4 -0
  65. package/lib/module/specs/ARSceneMesh.nitro.js.map +1 -0
  66. package/lib/module/specs/ARSession.nitro.js +4 -0
  67. package/lib/module/specs/ARSession.nitro.js.map +1 -0
  68. package/lib/module/specs/ARView.nitro.js +4 -0
  69. package/lib/module/specs/ARView.nitro.js.map +1 -0
  70. package/lib/module/specs/ARVolume.nitro.js +4 -0
  71. package/lib/module/specs/ARVolume.nitro.js.map +1 -0
  72. package/lib/module/specs/ARWorldMap.nitro.js +4 -0
  73. package/lib/module/specs/ARWorldMap.nitro.js.map +1 -0
  74. package/lib/typescript/src/index.d.ts +20 -0
  75. package/lib/typescript/src/index.d.ts.map +1 -0
  76. package/lib/typescript/src/specs/ARAnchor.nitro.d.ts +18 -0
  77. package/lib/typescript/src/specs/ARAnchor.nitro.d.ts.map +1 -0
  78. package/lib/typescript/src/specs/ARBoundingBoxBuilder.nitro.d.ts +11 -0
  79. package/lib/typescript/src/specs/ARBoundingBoxBuilder.nitro.d.ts.map +1 -0
  80. package/lib/typescript/src/specs/ARDepthData.nitro.d.ts +26 -0
  81. package/lib/typescript/src/specs/ARDepthData.nitro.d.ts.map +1 -0
  82. package/lib/typescript/src/specs/ARFrame.nitro.d.ts +32 -0
  83. package/lib/typescript/src/specs/ARFrame.nitro.d.ts.map +1 -0
  84. package/lib/typescript/src/specs/ARLightEstimate.nitro.d.ts +18 -0
  85. package/lib/typescript/src/specs/ARLightEstimate.nitro.d.ts.map +1 -0
  86. package/lib/typescript/src/specs/ARMeasurement.nitro.d.ts +11 -0
  87. package/lib/typescript/src/specs/ARMeasurement.nitro.d.ts.map +1 -0
  88. package/lib/typescript/src/specs/ARPlaneAnchor.nitro.d.ts +32 -0
  89. package/lib/typescript/src/specs/ARPlaneAnchor.nitro.d.ts.map +1 -0
  90. package/lib/typescript/src/specs/ARRaycastResult.nitro.d.ts +26 -0
  91. package/lib/typescript/src/specs/ARRaycastResult.nitro.d.ts.map +1 -0
  92. package/lib/typescript/src/specs/ARSceneMesh.nitro.d.ts +47 -0
  93. package/lib/typescript/src/specs/ARSceneMesh.nitro.d.ts.map +1 -0
  94. package/lib/typescript/src/specs/ARSession.nitro.d.ts +75 -0
  95. package/lib/typescript/src/specs/ARSession.nitro.d.ts.map +1 -0
  96. package/lib/typescript/src/specs/ARView.nitro.d.ts +51 -0
  97. package/lib/typescript/src/specs/ARView.nitro.d.ts.map +1 -0
  98. package/lib/typescript/src/specs/ARVolume.nitro.d.ts +14 -0
  99. package/lib/typescript/src/specs/ARVolume.nitro.d.ts.map +1 -0
  100. package/lib/typescript/src/specs/ARWorldMap.nitro.d.ts +17 -0
  101. package/lib/typescript/src/specs/ARWorldMap.nitro.d.ts.map +1 -0
  102. package/nitro.json +23 -0
  103. package/nitrogen/generated/.gitattributes +1 -0
  104. package/nitrogen/generated/ios/NitroAR+autolinking.rb +60 -0
  105. package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Bridge.cpp +335 -0
  106. package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Bridge.hpp +934 -0
  107. package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Umbrella.hpp +169 -0
  108. package/nitrogen/generated/ios/NitroARAutolinking.mm +49 -0
  109. package/nitrogen/generated/ios/NitroARAutolinking.swift +50 -0
  110. package/nitrogen/generated/ios/c++/HybridARAnchorSpecSwift.cpp +11 -0
  111. package/nitrogen/generated/ios/c++/HybridARAnchorSpecSwift.hpp +99 -0
  112. package/nitrogen/generated/ios/c++/HybridARBoundingBoxBuilderSpecSwift.cpp +11 -0
  113. package/nitrogen/generated/ios/c++/HybridARBoundingBoxBuilderSpecSwift.hpp +95 -0
  114. package/nitrogen/generated/ios/c++/HybridARDepthDataSpecSwift.cpp +11 -0
  115. package/nitrogen/generated/ios/c++/HybridARDepthDataSpecSwift.hpp +103 -0
  116. package/nitrogen/generated/ios/c++/HybridARDirectionalLightEstimateSpecSwift.cpp +11 -0
  117. package/nitrogen/generated/ios/c++/HybridARDirectionalLightEstimateSpecSwift.hpp +88 -0
  118. package/nitrogen/generated/ios/c++/HybridARFrameSpecSwift.cpp +11 -0
  119. package/nitrogen/generated/ios/c++/HybridARFrameSpecSwift.hpp +135 -0
  120. package/nitrogen/generated/ios/c++/HybridARLightEstimateSpecSwift.cpp +11 -0
  121. package/nitrogen/generated/ios/c++/HybridARLightEstimateSpecSwift.hpp +80 -0
  122. package/nitrogen/generated/ios/c++/HybridARMeasurementSpecSwift.cpp +11 -0
  123. package/nitrogen/generated/ios/c++/HybridARMeasurementSpecSwift.hpp +90 -0
  124. package/nitrogen/generated/ios/c++/HybridARMeshAnchorSpecSwift.cpp +11 -0
  125. package/nitrogen/generated/ios/c++/HybridARMeshAnchorSpecSwift.hpp +107 -0
  126. package/nitrogen/generated/ios/c++/HybridARPlaneAnchorSpecSwift.cpp +11 -0
  127. package/nitrogen/generated/ios/c++/HybridARPlaneAnchorSpecSwift.hpp +116 -0
  128. package/nitrogen/generated/ios/c++/HybridARPlaneGeometrySpecSwift.cpp +11 -0
  129. package/nitrogen/generated/ios/c++/HybridARPlaneGeometrySpecSwift.hpp +90 -0
  130. package/nitrogen/generated/ios/c++/HybridARRaycastResultSpecSwift.cpp +11 -0
  131. package/nitrogen/generated/ios/c++/HybridARRaycastResultSpecSwift.hpp +97 -0
  132. package/nitrogen/generated/ios/c++/HybridARSessionSpecSwift.cpp +11 -0
  133. package/nitrogen/generated/ios/c++/HybridARSessionSpecSwift.hpp +296 -0
  134. package/nitrogen/generated/ios/c++/HybridARViewSpecSwift.cpp +11 -0
  135. package/nitrogen/generated/ios/c++/HybridARViewSpecSwift.hpp +243 -0
  136. package/nitrogen/generated/ios/c++/HybridARVolumeSpecSwift.cpp +11 -0
  137. package/nitrogen/generated/ios/c++/HybridARVolumeSpecSwift.hpp +94 -0
  138. package/nitrogen/generated/ios/c++/HybridARWorldMapSpecSwift.cpp +11 -0
  139. package/nitrogen/generated/ios/c++/HybridARWorldMapSpecSwift.hpp +97 -0
  140. package/nitrogen/generated/ios/c++/views/HybridARViewComponent.mm +152 -0
  141. package/nitrogen/generated/ios/swift/ARSessionConfiguration.swift +189 -0
  142. package/nitrogen/generated/ios/swift/ARViewHitResult.swift +39 -0
  143. package/nitrogen/generated/ios/swift/CameraPose.swift +46 -0
  144. package/nitrogen/generated/ios/swift/EnvironmentTexturing.swift +44 -0
  145. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  146. package/nitrogen/generated/ios/swift/Func_void_TrackingState_TrackingStateReason.swift +46 -0
  147. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  148. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_HybridARFrameSpec_.swift +50 -0
  149. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_HybridARWorldMapSpec_.swift +50 -0
  150. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__shared_ptr_HybridARAnchorSpec___std__vector_std__shared_ptr_HybridARAnchorSpec___std__vector_std__string_.swift +54 -0
  151. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__shared_ptr_HybridARMeshAnchorSpec___std__vector_std__shared_ptr_HybridARMeshAnchorSpec___std__vector_std__string_.swift +54 -0
  152. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__shared_ptr_HybridARPlaneAnchorSpec___std__vector_std__shared_ptr_HybridARPlaneAnchorSpec___std__vector_std__string_.swift +54 -0
  153. package/nitrogen/generated/ios/swift/HybridARAnchorSpec.swift +60 -0
  154. package/nitrogen/generated/ios/swift/HybridARAnchorSpec_cxx.swift +192 -0
  155. package/nitrogen/generated/ios/swift/HybridARBoundingBoxBuilderSpec.swift +56 -0
  156. package/nitrogen/generated/ios/swift/HybridARBoundingBoxBuilderSpec_cxx.swift +161 -0
  157. package/nitrogen/generated/ios/swift/HybridARDepthDataSpec.swift +59 -0
  158. package/nitrogen/generated/ios/swift/HybridARDepthDataSpec_cxx.swift +188 -0
  159. package/nitrogen/generated/ios/swift/HybridARDirectionalLightEstimateSpec.swift +57 -0
  160. package/nitrogen/generated/ios/swift/HybridARDirectionalLightEstimateSpec_cxx.swift +162 -0
  161. package/nitrogen/generated/ios/swift/HybridARFrameSpec.swift +65 -0
  162. package/nitrogen/generated/ios/swift/HybridARFrameSpec_cxx.swift +285 -0
  163. package/nitrogen/generated/ios/swift/HybridARLightEstimateSpec.swift +56 -0
  164. package/nitrogen/generated/ios/swift/HybridARLightEstimateSpec_cxx.swift +140 -0
  165. package/nitrogen/generated/ios/swift/HybridARMeasurementSpec.swift +58 -0
  166. package/nitrogen/generated/ios/swift/HybridARMeasurementSpec_cxx.swift +160 -0
  167. package/nitrogen/generated/ios/swift/HybridARMeshAnchorSpec.swift +62 -0
  168. package/nitrogen/generated/ios/swift/HybridARMeshAnchorSpec_cxx.swift +212 -0
  169. package/nitrogen/generated/ios/swift/HybridARPlaneAnchorSpec.swift +62 -0
  170. package/nitrogen/generated/ios/swift/HybridARPlaneAnchorSpec_cxx.swift +209 -0
  171. package/nitrogen/generated/ios/swift/HybridARPlaneGeometrySpec.swift +58 -0
  172. package/nitrogen/generated/ios/swift/HybridARPlaneGeometrySpec_cxx.swift +178 -0
  173. package/nitrogen/generated/ios/swift/HybridARRaycastResultSpec.swift +59 -0
  174. package/nitrogen/generated/ios/swift/HybridARRaycastResultSpec_cxx.swift +179 -0
  175. package/nitrogen/generated/ios/swift/HybridARSessionSpec.swift +78 -0
  176. package/nitrogen/generated/ios/swift/HybridARSessionSpec_cxx.swift +591 -0
  177. package/nitrogen/generated/ios/swift/HybridARViewSpec.swift +78 -0
  178. package/nitrogen/generated/ios/swift/HybridARViewSpec_cxx.swift +561 -0
  179. package/nitrogen/generated/ios/swift/HybridARVolumeSpec.swift +60 -0
  180. package/nitrogen/generated/ios/swift/HybridARVolumeSpec_cxx.swift +180 -0
  181. package/nitrogen/generated/ios/swift/HybridARWorldMapSpec.swift +58 -0
  182. package/nitrogen/generated/ios/swift/HybridARWorldMapSpec_cxx.swift +176 -0
  183. package/nitrogen/generated/ios/swift/LiDARCapabilities.swift +39 -0
  184. package/nitrogen/generated/ios/swift/MeshClassification.swift +64 -0
  185. package/nitrogen/generated/ios/swift/PlaneAlignment.swift +40 -0
  186. package/nitrogen/generated/ios/swift/PlaneClassification.swift +64 -0
  187. package/nitrogen/generated/ios/swift/PlaneDetectionMode.swift +40 -0
  188. package/nitrogen/generated/ios/swift/RaycastAlignment.swift +44 -0
  189. package/nitrogen/generated/ios/swift/RaycastQuery.swift +44 -0
  190. package/nitrogen/generated/ios/swift/RaycastTarget.swift +48 -0
  191. package/nitrogen/generated/ios/swift/SceneReconstructionMode.swift +44 -0
  192. package/nitrogen/generated/ios/swift/TrackingState.swift +44 -0
  193. package/nitrogen/generated/ios/swift/TrackingStateReason.swift +52 -0
  194. package/nitrogen/generated/ios/swift/WorldAlignment.swift +44 -0
  195. package/nitrogen/generated/ios/swift/WorldMappingStatus.swift +48 -0
  196. package/nitrogen/generated/shared/c++/ARSessionConfiguration.hpp +132 -0
  197. package/nitrogen/generated/shared/c++/ARViewHitResult.hpp +91 -0
  198. package/nitrogen/generated/shared/c++/CameraPose.hpp +87 -0
  199. package/nitrogen/generated/shared/c++/EnvironmentTexturing.hpp +80 -0
  200. package/nitrogen/generated/shared/c++/HybridARAnchorSpec.cpp +26 -0
  201. package/nitrogen/generated/shared/c++/HybridARAnchorSpec.hpp +69 -0
  202. package/nitrogen/generated/shared/c++/HybridARBoundingBoxBuilderSpec.cpp +23 -0
  203. package/nitrogen/generated/shared/c++/HybridARBoundingBoxBuilderSpec.hpp +68 -0
  204. package/nitrogen/generated/shared/c++/HybridARDepthDataSpec.cpp +26 -0
  205. package/nitrogen/generated/shared/c++/HybridARDepthDataSpec.hpp +66 -0
  206. package/nitrogen/generated/shared/c++/HybridARDirectionalLightEstimateSpec.cpp +24 -0
  207. package/nitrogen/generated/shared/c++/HybridARDirectionalLightEstimateSpec.hpp +67 -0
  208. package/nitrogen/generated/shared/c++/HybridARFrameSpec.cpp +32 -0
  209. package/nitrogen/generated/shared/c++/HybridARFrameSpec.hpp +83 -0
  210. package/nitrogen/generated/shared/c++/HybridARLightEstimateSpec.cpp +22 -0
  211. package/nitrogen/generated/shared/c++/HybridARLightEstimateSpec.hpp +63 -0
  212. package/nitrogen/generated/shared/c++/HybridARMeasurementSpec.cpp +24 -0
  213. package/nitrogen/generated/shared/c++/HybridARMeasurementSpec.hpp +67 -0
  214. package/nitrogen/generated/shared/c++/HybridARMeshAnchorSpec.cpp +28 -0
  215. package/nitrogen/generated/shared/c++/HybridARMeshAnchorSpec.hpp +72 -0
  216. package/nitrogen/generated/shared/c++/HybridARPlaneAnchorSpec.cpp +28 -0
  217. package/nitrogen/generated/shared/c++/HybridARPlaneAnchorSpec.hpp +79 -0
  218. package/nitrogen/generated/shared/c++/HybridARPlaneGeometrySpec.cpp +24 -0
  219. package/nitrogen/generated/shared/c++/HybridARPlaneGeometrySpec.hpp +65 -0
  220. package/nitrogen/generated/shared/c++/HybridARRaycastResultSpec.cpp +25 -0
  221. package/nitrogen/generated/shared/c++/HybridARRaycastResultSpec.hpp +70 -0
  222. package/nitrogen/generated/shared/c++/HybridARSessionSpec.cpp +45 -0
  223. package/nitrogen/generated/shared/c++/HybridARSessionSpec.hpp +131 -0
  224. package/nitrogen/generated/shared/c++/HybridARViewSpec.cpp +55 -0
  225. package/nitrogen/generated/shared/c++/HybridARViewSpec.hpp +101 -0
  226. package/nitrogen/generated/shared/c++/HybridARVolumeSpec.cpp +26 -0
  227. package/nitrogen/generated/shared/c++/HybridARVolumeSpec.hpp +67 -0
  228. package/nitrogen/generated/shared/c++/HybridARWorldMapSpec.cpp +25 -0
  229. package/nitrogen/generated/shared/c++/HybridARWorldMapSpec.hpp +66 -0
  230. package/nitrogen/generated/shared/c++/LiDARCapabilities.hpp +91 -0
  231. package/nitrogen/generated/shared/c++/MeshClassification.hpp +100 -0
  232. package/nitrogen/generated/shared/c++/PlaneAlignment.hpp +76 -0
  233. package/nitrogen/generated/shared/c++/PlaneClassification.hpp +100 -0
  234. package/nitrogen/generated/shared/c++/PlaneDetectionMode.hpp +76 -0
  235. package/nitrogen/generated/shared/c++/RaycastAlignment.hpp +80 -0
  236. package/nitrogen/generated/shared/c++/RaycastQuery.hpp +99 -0
  237. package/nitrogen/generated/shared/c++/RaycastTarget.hpp +84 -0
  238. package/nitrogen/generated/shared/c++/SceneReconstructionMode.hpp +80 -0
  239. package/nitrogen/generated/shared/c++/TrackingState.hpp +80 -0
  240. package/nitrogen/generated/shared/c++/TrackingStateReason.hpp +88 -0
  241. package/nitrogen/generated/shared/c++/WorldAlignment.hpp +80 -0
  242. package/nitrogen/generated/shared/c++/WorldMappingStatus.hpp +84 -0
  243. package/nitrogen/generated/shared/c++/views/HybridARViewComponent.cpp +182 -0
  244. package/nitrogen/generated/shared/c++/views/HybridARViewComponent.hpp +120 -0
  245. package/nitrogen/generated/shared/json/ARViewConfig.json +19 -0
  246. package/package.json +98 -0
  247. package/react-native-nitro-ar.podspec +40 -0
  248. package/src/index.ts +60 -0
  249. package/src/specs/ARAnchor.nitro.ts +21 -0
  250. package/src/specs/ARBoundingBoxBuilder.nitro.ts +11 -0
  251. package/src/specs/ARDepthData.nitro.ts +29 -0
  252. package/src/specs/ARFrame.nitro.ts +41 -0
  253. package/src/specs/ARLightEstimate.nitro.ts +20 -0
  254. package/src/specs/ARMeasurement.nitro.ts +10 -0
  255. package/src/specs/ARPlaneAnchor.nitro.ts +46 -0
  256. package/src/specs/ARRaycastResult.nitro.ts +32 -0
  257. package/src/specs/ARSceneMesh.nitro.ts +63 -0
  258. package/src/specs/ARSession.nitro.ts +112 -0
  259. package/src/specs/ARView.nitro.ts +84 -0
  260. package/src/specs/ARVolume.nitro.ts +15 -0
  261. package/src/specs/ARWorldMap.nitro.ts +20 -0
@@ -0,0 +1,505 @@
1
+ import ARKit
2
+ import NitroModules
3
+ import simd
4
+
5
+ final class HybridARSession: HybridARSessionSpec {
6
+ let session = ARSession()
7
+ private var sessionDelegate: ARSessionDelegateImpl?
8
+ private var anchorMap: [UUID: ARAnchor] = [:]
9
+
10
+ private var frameCallback: ((any HybridARFrameSpec) -> Void)?
11
+ private var trackingCallback: ((TrackingState, TrackingStateReason) -> Void)?
12
+ private var anchorsCallback: (([any HybridARAnchorSpec], [any HybridARAnchorSpec], [String]) -> Void)?
13
+ private var planesCallback: (([any HybridARPlaneAnchorSpec], [any HybridARPlaneAnchorSpec], [String]) -> Void)?
14
+ private var meshCallback: (([any HybridARMeshAnchorSpec], [any HybridARMeshAnchorSpec], [String]) -> Void)?
15
+
16
+ override init() {
17
+ super.init()
18
+ sessionDelegate = ARSessionDelegateImpl(session: self)
19
+ session.delegate = sessionDelegate
20
+ }
21
+
22
+ func start(config: ARSessionConfiguration?) throws {
23
+ let arConfig = ARWorldTrackingConfiguration()
24
+
25
+ if let config = config {
26
+ if let planes = config.planeDetection {
27
+ var detection: ARWorldTrackingConfiguration.PlaneDetection = []
28
+ for plane in planes {
29
+ switch plane {
30
+ case .horizontal: detection.insert(.horizontal)
31
+ case .vertical: detection.insert(.vertical)
32
+ }
33
+ }
34
+ arConfig.planeDetection = detection
35
+ } else {
36
+ arConfig.planeDetection = [.horizontal, .vertical]
37
+ }
38
+
39
+ arConfig.isLightEstimationEnabled = config.lightEstimation ?? true
40
+
41
+ if #available(iOS 14.0, *) {
42
+ // Scene depth
43
+ if ARWorldTrackingConfiguration.supportsFrameSemantics(.sceneDepth) {
44
+ if config.sceneDepth == true {
45
+ arConfig.frameSemantics.insert(.sceneDepth)
46
+ }
47
+ if config.smoothedSceneDepth == true {
48
+ arConfig.frameSemantics.insert(.smoothedSceneDepth)
49
+ }
50
+ }
51
+
52
+ // Scene reconstruction (LiDAR mesh)
53
+ if let sceneRecon = config.sceneReconstruction {
54
+ switch sceneRecon {
55
+ case .mesh:
56
+ if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
57
+ arConfig.sceneReconstruction = .mesh
58
+ }
59
+ case .meshwithclassification:
60
+ if ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification) {
61
+ arConfig.sceneReconstruction = .meshWithClassification
62
+ }
63
+ case .none:
64
+ arConfig.sceneReconstruction = []
65
+ }
66
+ }
67
+
68
+ // People occlusion
69
+ if config.peopleOcclusion == true {
70
+ if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) {
71
+ arConfig.frameSemantics.insert(.personSegmentationWithDepth)
72
+ }
73
+ }
74
+
75
+ // Object occlusion (requires scene reconstruction)
76
+ if config.objectOcclusion == true {
77
+ // Object occlusion is enabled by having scene reconstruction active
78
+ // The app can use the mesh for occlusion in rendering
79
+ }
80
+ }
81
+
82
+ if let envTex = config.environmentTexturing {
83
+ switch envTex {
84
+ case .manual: arConfig.environmentTexturing = .manual
85
+ case .automatic: arConfig.environmentTexturing = .automatic
86
+ case .none: arConfig.environmentTexturing = .none
87
+ }
88
+ }
89
+
90
+ if let alignment = config.worldAlignment {
91
+ switch alignment {
92
+ case .gravity: arConfig.worldAlignment = .gravity
93
+ case .gravityandheading: arConfig.worldAlignment = .gravityAndHeading
94
+ case .camera: arConfig.worldAlignment = .camera
95
+ }
96
+ }
97
+
98
+ if let mapData = config.initialWorldMap,
99
+ let worldMap = HybridARWorldMap.fromData(mapData) {
100
+ arConfig.initialWorldMap = worldMap
101
+ }
102
+ } else {
103
+ arConfig.planeDetection = [.horizontal, .vertical]
104
+ arConfig.isLightEstimationEnabled = true
105
+ }
106
+
107
+ session.run(arConfig)
108
+ }
109
+
110
+ func pause() throws {
111
+ session.pause()
112
+ }
113
+
114
+ func reset() throws {
115
+ let config = session.configuration ?? ARWorldTrackingConfiguration()
116
+ session.run(config, options: [.resetTracking, .removeExistingAnchors])
117
+ anchorMap.removeAll()
118
+ }
119
+
120
+ var isRunning: Bool {
121
+ session.currentFrame != nil
122
+ }
123
+
124
+ var trackingState: TrackingState {
125
+ switch session.currentFrame?.camera.trackingState {
126
+ case .normal: return .normal
127
+ case .limited: return .limited
128
+ default: return .notavailable
129
+ }
130
+ }
131
+
132
+ var trackingStateReason: TrackingStateReason {
133
+ guard case .limited(let reason) = session.currentFrame?.camera.trackingState else {
134
+ return .none
135
+ }
136
+ switch reason {
137
+ case .initializing: return .initializing
138
+ case .excessiveMotion: return .excessivemotion
139
+ case .insufficientFeatures: return .insufficientfeatures
140
+ case .relocalizing: return .relocalizing
141
+ @unknown default: return .none
142
+ }
143
+ }
144
+
145
+ var worldMappingStatus: WorldMappingStatus {
146
+ switch session.currentFrame?.worldMappingStatus {
147
+ case .notAvailable: return .notavailable
148
+ case .limited: return .limited
149
+ case .extending: return .extending
150
+ case .mapped: return .mapped
151
+ default: return .notavailable
152
+ }
153
+ }
154
+
155
+ func getCameraPose() throws -> CameraPose {
156
+ guard let frame = session.currentFrame else {
157
+ return CameraPose(
158
+ position: [0, 0, 0],
159
+ rotation: [0, 0, 0, 1]
160
+ )
161
+ }
162
+
163
+ let t = frame.camera.transform
164
+ let q = simd_quatf(t)
165
+
166
+ return CameraPose(
167
+ position: [
168
+ Double(t.columns.3.x),
169
+ Double(t.columns.3.y),
170
+ Double(t.columns.3.z)
171
+ ],
172
+ rotation: [
173
+ Double(q.vector.x),
174
+ Double(q.vector.y),
175
+ Double(q.vector.z),
176
+ Double(q.vector.w)
177
+ ]
178
+ )
179
+ }
180
+
181
+ var currentFrame: (any HybridARFrameSpec)? {
182
+ guard let frame = session.currentFrame else { return nil }
183
+ return HybridARFrame(frame: frame)
184
+ }
185
+
186
+ func raycast(x: Double, y: Double) throws -> (any HybridARRaycastResultSpec)? {
187
+ guard let frame = session.currentFrame else { return nil }
188
+
189
+ let query = frame.raycastQuery(
190
+ from: CGPoint(x: x, y: y),
191
+ allowing: .estimatedPlane,
192
+ alignment: .any
193
+ )
194
+
195
+ guard let result = session.raycast(query).first else {
196
+ return nil
197
+ }
198
+
199
+ return HybridARRaycastResult(result: result)
200
+ }
201
+
202
+ func raycastWithQuery(query: RaycastQuery) throws -> [any HybridARRaycastResultSpec] {
203
+ guard let frame = session.currentFrame else { return [] }
204
+
205
+ let target: ARRaycastQuery.Target
206
+ switch query.target {
207
+ case .existingplanegeometry: target = .existingPlaneGeometry
208
+ case .existingplaneinfinite: target = .existingPlaneInfinite
209
+ case .estimatedplane: target = .estimatedPlane
210
+ case .any: target = .estimatedPlane
211
+ }
212
+
213
+ let alignment: ARRaycastQuery.TargetAlignment
214
+ switch query.alignment {
215
+ case .horizontal: alignment = .horizontal
216
+ case .vertical: alignment = .vertical
217
+ case .any: alignment = .any
218
+ }
219
+
220
+ let arQuery = frame.raycastQuery(
221
+ from: CGPoint(x: query.x, y: query.y),
222
+ allowing: target,
223
+ alignment: alignment
224
+ )
225
+
226
+ return session.raycast(arQuery).map { HybridARRaycastResult(result: $0) }
227
+ }
228
+
229
+ func createAnchor(hit: any HybridARRaycastResultSpec) throws -> any HybridARAnchorSpec {
230
+ let result = hit as! HybridARRaycastResult
231
+ let arAnchor = ARAnchor(transform: result.result.worldTransform)
232
+ session.add(anchor: arAnchor)
233
+ anchorMap[arAnchor.identifier] = arAnchor
234
+ return HybridARAnchor(anchor: arAnchor, session: session)
235
+ }
236
+
237
+ func createAnchorAtPosition(
238
+ position: [Double],
239
+ rotation: [Double]?
240
+ ) throws -> any HybridARAnchorSpec {
241
+ var transform = matrix_identity_float4x4
242
+
243
+ if let rot = rotation, rot.count == 4 {
244
+ let quat = simd_quatf(
245
+ ix: Float(rot[0]),
246
+ iy: Float(rot[1]),
247
+ iz: Float(rot[2]),
248
+ r: Float(rot[3])
249
+ )
250
+ transform = simd_float4x4(quat)
251
+ }
252
+
253
+ transform.columns.3 = SIMD4(
254
+ Float(position[0]),
255
+ Float(position[1]),
256
+ Float(position[2]),
257
+ 1
258
+ )
259
+
260
+ let arAnchor = ARAnchor(transform: transform)
261
+ session.add(anchor: arAnchor)
262
+ anchorMap[arAnchor.identifier] = arAnchor
263
+ return HybridARAnchor(anchor: arAnchor, session: session)
264
+ }
265
+
266
+ func removeAnchor(anchor: any HybridARAnchorSpec) throws {
267
+ let hybrid = anchor as! HybridARAnchor
268
+ session.remove(anchor: hybrid.anchor)
269
+ anchorMap.removeValue(forKey: hybrid.anchor.identifier)
270
+ }
271
+
272
+ var anchors: [any HybridARAnchorSpec] {
273
+ session.currentFrame?.anchors
274
+ .filter { anchor in
275
+ !(anchor is ARPlaneAnchor) && !isMeshAnchor(anchor)
276
+ }
277
+ .map { HybridARAnchor(anchor: $0, session: session) } ?? []
278
+ }
279
+
280
+ private func isMeshAnchor(_ anchor: ARAnchor) -> Bool {
281
+ if #available(iOS 13.4, *) {
282
+ return anchor is ARMeshAnchor
283
+ }
284
+ return false
285
+ }
286
+
287
+ var planeAnchors: [any HybridARPlaneAnchorSpec] {
288
+ session.currentFrame?.anchors
289
+ .compactMap { $0 as? ARPlaneAnchor }
290
+ .map { HybridARPlaneAnchor(anchor: $0) } ?? []
291
+ }
292
+
293
+ func createMeasurement(
294
+ start: any HybridARAnchorSpec,
295
+ end: any HybridARAnchorSpec
296
+ ) throws -> any HybridARMeasurementSpec {
297
+ HybridARMeasurement(
298
+ start: start as! HybridARAnchor,
299
+ end: end as! HybridARAnchor
300
+ )
301
+ }
302
+
303
+ func getCurrentWorldMap() throws -> Promise<any HybridARWorldMapSpec> {
304
+ return Promise.async {
305
+ try await withCheckedThrowingContinuation { continuation in
306
+ self.session.getCurrentWorldMap { worldMap, error in
307
+ if let error = error {
308
+ continuation.resume(throwing: error)
309
+ } else if let worldMap = worldMap {
310
+ continuation.resume(returning: HybridARWorldMap(worldMap: worldMap))
311
+ } else {
312
+ continuation.resume(throwing: NSError(
313
+ domain: "ARSession",
314
+ code: -1,
315
+ userInfo: [NSLocalizedDescriptionKey: "Failed to get world map"]
316
+ ))
317
+ }
318
+ }
319
+ }
320
+ }
321
+ }
322
+
323
+ func onFrameUpdate(callback: @escaping (any HybridARFrameSpec) -> Void) throws -> () -> Void {
324
+ frameCallback = callback
325
+ return { [weak self] in
326
+ self?.frameCallback = nil
327
+ }
328
+ }
329
+
330
+ func onTrackingStateChanged(
331
+ callback: @escaping (TrackingState, TrackingStateReason) -> Void
332
+ ) throws -> () -> Void {
333
+ trackingCallback = callback
334
+ return { [weak self] in
335
+ self?.trackingCallback = nil
336
+ }
337
+ }
338
+
339
+ func onAnchorsUpdated(
340
+ callback: @escaping ([any HybridARAnchorSpec], [any HybridARAnchorSpec], [String]) -> Void
341
+ ) throws -> () -> Void {
342
+ anchorsCallback = callback
343
+ return { [weak self] in
344
+ self?.anchorsCallback = nil
345
+ }
346
+ }
347
+
348
+ func onPlanesUpdated(
349
+ callback: @escaping ([any HybridARPlaneAnchorSpec], [any HybridARPlaneAnchorSpec], [String]) -> Void
350
+ ) throws -> () -> Void {
351
+ planesCallback = callback
352
+ return { [weak self] in
353
+ self?.planesCallback = nil
354
+ }
355
+ }
356
+
357
+ // MARK: - LiDAR / Scene Mesh
358
+
359
+ func getLiDARCapabilities() throws -> LiDARCapabilities {
360
+ var isAvailable = false
361
+ var supportsSceneReconstruction = false
362
+ var supportsSceneDepth = false
363
+
364
+ if #available(iOS 14.0, *) {
365
+ supportsSceneReconstruction = ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh)
366
+ supportsSceneDepth = ARWorldTrackingConfiguration.supportsFrameSemantics(.sceneDepth)
367
+ isAvailable = supportsSceneReconstruction || supportsSceneDepth
368
+ }
369
+
370
+ return LiDARCapabilities(
371
+ isAvailable: isAvailable,
372
+ supportsSceneReconstruction: supportsSceneReconstruction,
373
+ supportsSceneDepth: supportsSceneDepth
374
+ )
375
+ }
376
+
377
+ var meshAnchors: [any HybridARMeshAnchorSpec] {
378
+ guard #available(iOS 13.4, *) else { return [] }
379
+ return session.currentFrame?.anchors
380
+ .compactMap { $0 as? ARMeshAnchor }
381
+ .map { HybridARMeshAnchor(anchor: $0) } ?? []
382
+ }
383
+
384
+ func onMeshUpdated(
385
+ callback: @escaping ([any HybridARMeshAnchorSpec], [any HybridARMeshAnchorSpec], [String]) -> Void
386
+ ) throws -> () -> Void {
387
+ meshCallback = callback
388
+ return { [weak self] in
389
+ self?.meshCallback = nil
390
+ }
391
+ }
392
+
393
+ // Called by delegate
394
+ func handleFrameUpdate(_ frame: ARFrame) {
395
+ frameCallback?(HybridARFrame(frame: frame))
396
+ }
397
+
398
+ func handleTrackingStateChange(_ state: TrackingState, _ reason: TrackingStateReason) {
399
+ trackingCallback?(state, reason)
400
+ }
401
+
402
+ func handleAnchorsUpdate(
403
+ added: [ARAnchor],
404
+ updated: [ARAnchor],
405
+ removed: [ARAnchor]
406
+ ) {
407
+ let addedHybrid = added
408
+ .filter { !($0 is ARPlaneAnchor) && !isMeshAnchor($0) }
409
+ .map { HybridARAnchor(anchor: $0, session: session) }
410
+ let updatedHybrid = updated
411
+ .filter { !($0 is ARPlaneAnchor) && !isMeshAnchor($0) }
412
+ .map { HybridARAnchor(anchor: $0, session: session) }
413
+ let removedIds = removed
414
+ .filter { !($0 is ARPlaneAnchor) && !isMeshAnchor($0) }
415
+ .map { $0.identifier.uuidString }
416
+
417
+ if !addedHybrid.isEmpty || !updatedHybrid.isEmpty || !removedIds.isEmpty {
418
+ anchorsCallback?(addedHybrid, updatedHybrid, removedIds)
419
+ }
420
+
421
+ let addedPlanes = added
422
+ .compactMap { $0 as? ARPlaneAnchor }
423
+ .map { HybridARPlaneAnchor(anchor: $0) }
424
+ let updatedPlanes = updated
425
+ .compactMap { $0 as? ARPlaneAnchor }
426
+ .map { HybridARPlaneAnchor(anchor: $0) }
427
+ let removedPlaneIds = removed
428
+ .compactMap { $0 as? ARPlaneAnchor }
429
+ .map { $0.identifier.uuidString }
430
+
431
+ if !addedPlanes.isEmpty || !updatedPlanes.isEmpty || !removedPlaneIds.isEmpty {
432
+ planesCallback?(addedPlanes, updatedPlanes, removedPlaneIds)
433
+ }
434
+
435
+ // Handle mesh anchors (iOS 13.4+)
436
+ if #available(iOS 13.4, *) {
437
+ let addedMeshes = added
438
+ .compactMap { $0 as? ARMeshAnchor }
439
+ .map { HybridARMeshAnchor(anchor: $0) }
440
+ let updatedMeshes = updated
441
+ .compactMap { $0 as? ARMeshAnchor }
442
+ .map { HybridARMeshAnchor(anchor: $0) }
443
+ let removedMeshIds = removed
444
+ .compactMap { $0 as? ARMeshAnchor }
445
+ .map { $0.identifier.uuidString }
446
+
447
+ if !addedMeshes.isEmpty || !updatedMeshes.isEmpty || !removedMeshIds.isEmpty {
448
+ meshCallback?(addedMeshes, updatedMeshes, removedMeshIds)
449
+ }
450
+ }
451
+ }
452
+ }
453
+
454
+ // MARK: - ARSession Delegate
455
+
456
+ private class ARSessionDelegateImpl: NSObject, ARSessionDelegate {
457
+ weak var hybridSession: HybridARSession?
458
+ private var lastTrackingState: TrackingState = .notavailable
459
+
460
+ init(session: HybridARSession) {
461
+ self.hybridSession = session
462
+ }
463
+
464
+ func session(_ session: ARSession, didUpdate frame: ARFrame) {
465
+ hybridSession?.handleFrameUpdate(frame)
466
+
467
+ let newState: TrackingState
468
+ let reason: TrackingStateReason
469
+
470
+ switch frame.camera.trackingState {
471
+ case .normal:
472
+ newState = .normal
473
+ reason = .none
474
+ case .limited(let r):
475
+ newState = .limited
476
+ switch r {
477
+ case .initializing: reason = .initializing
478
+ case .excessiveMotion: reason = .excessivemotion
479
+ case .insufficientFeatures: reason = .insufficientfeatures
480
+ case .relocalizing: reason = .relocalizing
481
+ @unknown default: reason = .none
482
+ }
483
+ case .notAvailable:
484
+ newState = .notavailable
485
+ reason = .none
486
+ }
487
+
488
+ if newState != lastTrackingState {
489
+ lastTrackingState = newState
490
+ hybridSession?.handleTrackingStateChange(newState, reason)
491
+ }
492
+ }
493
+
494
+ func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
495
+ hybridSession?.handleAnchorsUpdate(added: anchors, updated: [], removed: [])
496
+ }
497
+
498
+ func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
499
+ hybridSession?.handleAnchorsUpdate(added: [], updated: anchors, removed: [])
500
+ }
501
+
502
+ func session(_ session: ARSession, didRemove anchors: [ARAnchor]) {
503
+ hybridSession?.handleAnchorsUpdate(added: [], updated: [], removed: anchors)
504
+ }
505
+ }