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.
- package/README.md +347 -0
- package/app.plugin.js +24 -0
- package/ios/Bridge.h +8 -0
- package/ios/HybridARAnchor.swift +58 -0
- package/ios/HybridARBoundingBoxBuilder.swift +142 -0
- package/ios/HybridARDepthData.swift +138 -0
- package/ios/HybridARFrame.swift +121 -0
- package/ios/HybridARLightEstimate.swift +58 -0
- package/ios/HybridARMeasurement.swift +33 -0
- package/ios/HybridARMeshAnchor.swift +108 -0
- package/ios/HybridARPlaneAnchor.swift +114 -0
- package/ios/HybridARRaycastResult.swift +53 -0
- package/ios/HybridARSession.swift +505 -0
- package/ios/HybridARView.swift +725 -0
- package/ios/HybridARVolume.swift +52 -0
- package/ios/HybridARWorldMap.swift +55 -0
- package/lib/commonjs/index.js +24 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +3 -0
- package/lib/commonjs/specs/ARAnchor.nitro.js +6 -0
- package/lib/commonjs/specs/ARAnchor.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARBoundingBoxBuilder.nitro.js +6 -0
- package/lib/commonjs/specs/ARBoundingBoxBuilder.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARDepthData.nitro.js +6 -0
- package/lib/commonjs/specs/ARDepthData.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARFrame.nitro.js +6 -0
- package/lib/commonjs/specs/ARFrame.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARLightEstimate.nitro.js +6 -0
- package/lib/commonjs/specs/ARLightEstimate.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARMeasurement.nitro.js +6 -0
- package/lib/commonjs/specs/ARMeasurement.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARPlaneAnchor.nitro.js +6 -0
- package/lib/commonjs/specs/ARPlaneAnchor.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARRaycastResult.nitro.js +6 -0
- package/lib/commonjs/specs/ARRaycastResult.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARSceneMesh.nitro.js +6 -0
- package/lib/commonjs/specs/ARSceneMesh.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARSession.nitro.js +6 -0
- package/lib/commonjs/specs/ARSession.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARView.nitro.js +6 -0
- package/lib/commonjs/specs/ARView.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARVolume.nitro.js +6 -0
- package/lib/commonjs/specs/ARVolume.nitro.js.map +1 -0
- package/lib/commonjs/specs/ARWorldMap.nitro.js +6 -0
- package/lib/commonjs/specs/ARWorldMap.nitro.js.map +1 -0
- package/lib/module/index.js +18 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/specs/ARAnchor.nitro.js +4 -0
- package/lib/module/specs/ARAnchor.nitro.js.map +1 -0
- package/lib/module/specs/ARBoundingBoxBuilder.nitro.js +4 -0
- package/lib/module/specs/ARBoundingBoxBuilder.nitro.js.map +1 -0
- package/lib/module/specs/ARDepthData.nitro.js +4 -0
- package/lib/module/specs/ARDepthData.nitro.js.map +1 -0
- package/lib/module/specs/ARFrame.nitro.js +4 -0
- package/lib/module/specs/ARFrame.nitro.js.map +1 -0
- package/lib/module/specs/ARLightEstimate.nitro.js +4 -0
- package/lib/module/specs/ARLightEstimate.nitro.js.map +1 -0
- package/lib/module/specs/ARMeasurement.nitro.js +4 -0
- package/lib/module/specs/ARMeasurement.nitro.js.map +1 -0
- package/lib/module/specs/ARPlaneAnchor.nitro.js +4 -0
- package/lib/module/specs/ARPlaneAnchor.nitro.js.map +1 -0
- package/lib/module/specs/ARRaycastResult.nitro.js +4 -0
- package/lib/module/specs/ARRaycastResult.nitro.js.map +1 -0
- package/lib/module/specs/ARSceneMesh.nitro.js +4 -0
- package/lib/module/specs/ARSceneMesh.nitro.js.map +1 -0
- package/lib/module/specs/ARSession.nitro.js +4 -0
- package/lib/module/specs/ARSession.nitro.js.map +1 -0
- package/lib/module/specs/ARView.nitro.js +4 -0
- package/lib/module/specs/ARView.nitro.js.map +1 -0
- package/lib/module/specs/ARVolume.nitro.js +4 -0
- package/lib/module/specs/ARVolume.nitro.js.map +1 -0
- package/lib/module/specs/ARWorldMap.nitro.js +4 -0
- package/lib/module/specs/ARWorldMap.nitro.js.map +1 -0
- package/lib/typescript/src/index.d.ts +20 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARAnchor.nitro.d.ts +18 -0
- package/lib/typescript/src/specs/ARAnchor.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARBoundingBoxBuilder.nitro.d.ts +11 -0
- package/lib/typescript/src/specs/ARBoundingBoxBuilder.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARDepthData.nitro.d.ts +26 -0
- package/lib/typescript/src/specs/ARDepthData.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARFrame.nitro.d.ts +32 -0
- package/lib/typescript/src/specs/ARFrame.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARLightEstimate.nitro.d.ts +18 -0
- package/lib/typescript/src/specs/ARLightEstimate.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARMeasurement.nitro.d.ts +11 -0
- package/lib/typescript/src/specs/ARMeasurement.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARPlaneAnchor.nitro.d.ts +32 -0
- package/lib/typescript/src/specs/ARPlaneAnchor.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARRaycastResult.nitro.d.ts +26 -0
- package/lib/typescript/src/specs/ARRaycastResult.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARSceneMesh.nitro.d.ts +47 -0
- package/lib/typescript/src/specs/ARSceneMesh.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARSession.nitro.d.ts +75 -0
- package/lib/typescript/src/specs/ARSession.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARView.nitro.d.ts +51 -0
- package/lib/typescript/src/specs/ARView.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARVolume.nitro.d.ts +14 -0
- package/lib/typescript/src/specs/ARVolume.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ARWorldMap.nitro.d.ts +17 -0
- package/lib/typescript/src/specs/ARWorldMap.nitro.d.ts.map +1 -0
- package/nitro.json +23 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/ios/NitroAR+autolinking.rb +60 -0
- package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Bridge.cpp +335 -0
- package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Bridge.hpp +934 -0
- package/nitrogen/generated/ios/NitroAR-Swift-Cxx-Umbrella.hpp +169 -0
- package/nitrogen/generated/ios/NitroARAutolinking.mm +49 -0
- package/nitrogen/generated/ios/NitroARAutolinking.swift +50 -0
- package/nitrogen/generated/ios/c++/HybridARAnchorSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARAnchorSpecSwift.hpp +99 -0
- package/nitrogen/generated/ios/c++/HybridARBoundingBoxBuilderSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARBoundingBoxBuilderSpecSwift.hpp +95 -0
- package/nitrogen/generated/ios/c++/HybridARDepthDataSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARDepthDataSpecSwift.hpp +103 -0
- package/nitrogen/generated/ios/c++/HybridARDirectionalLightEstimateSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARDirectionalLightEstimateSpecSwift.hpp +88 -0
- package/nitrogen/generated/ios/c++/HybridARFrameSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARFrameSpecSwift.hpp +135 -0
- package/nitrogen/generated/ios/c++/HybridARLightEstimateSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARLightEstimateSpecSwift.hpp +80 -0
- package/nitrogen/generated/ios/c++/HybridARMeasurementSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARMeasurementSpecSwift.hpp +90 -0
- package/nitrogen/generated/ios/c++/HybridARMeshAnchorSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARMeshAnchorSpecSwift.hpp +107 -0
- package/nitrogen/generated/ios/c++/HybridARPlaneAnchorSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARPlaneAnchorSpecSwift.hpp +116 -0
- package/nitrogen/generated/ios/c++/HybridARPlaneGeometrySpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARPlaneGeometrySpecSwift.hpp +90 -0
- package/nitrogen/generated/ios/c++/HybridARRaycastResultSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARRaycastResultSpecSwift.hpp +97 -0
- package/nitrogen/generated/ios/c++/HybridARSessionSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARSessionSpecSwift.hpp +296 -0
- package/nitrogen/generated/ios/c++/HybridARViewSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARViewSpecSwift.hpp +243 -0
- package/nitrogen/generated/ios/c++/HybridARVolumeSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARVolumeSpecSwift.hpp +94 -0
- package/nitrogen/generated/ios/c++/HybridARWorldMapSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridARWorldMapSpecSwift.hpp +97 -0
- package/nitrogen/generated/ios/c++/views/HybridARViewComponent.mm +152 -0
- package/nitrogen/generated/ios/swift/ARSessionConfiguration.swift +189 -0
- package/nitrogen/generated/ios/swift/ARViewHitResult.swift +39 -0
- package/nitrogen/generated/ios/swift/CameraPose.swift +46 -0
- package/nitrogen/generated/ios/swift/EnvironmentTexturing.swift +44 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_TrackingState_TrackingStateReason.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_HybridARFrameSpec_.swift +50 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_HybridARWorldMapSpec_.swift +50 -0
- 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
- 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
- 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
- package/nitrogen/generated/ios/swift/HybridARAnchorSpec.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridARAnchorSpec_cxx.swift +192 -0
- package/nitrogen/generated/ios/swift/HybridARBoundingBoxBuilderSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridARBoundingBoxBuilderSpec_cxx.swift +161 -0
- package/nitrogen/generated/ios/swift/HybridARDepthDataSpec.swift +59 -0
- package/nitrogen/generated/ios/swift/HybridARDepthDataSpec_cxx.swift +188 -0
- package/nitrogen/generated/ios/swift/HybridARDirectionalLightEstimateSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridARDirectionalLightEstimateSpec_cxx.swift +162 -0
- package/nitrogen/generated/ios/swift/HybridARFrameSpec.swift +65 -0
- package/nitrogen/generated/ios/swift/HybridARFrameSpec_cxx.swift +285 -0
- package/nitrogen/generated/ios/swift/HybridARLightEstimateSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridARLightEstimateSpec_cxx.swift +140 -0
- package/nitrogen/generated/ios/swift/HybridARMeasurementSpec.swift +58 -0
- package/nitrogen/generated/ios/swift/HybridARMeasurementSpec_cxx.swift +160 -0
- package/nitrogen/generated/ios/swift/HybridARMeshAnchorSpec.swift +62 -0
- package/nitrogen/generated/ios/swift/HybridARMeshAnchorSpec_cxx.swift +212 -0
- package/nitrogen/generated/ios/swift/HybridARPlaneAnchorSpec.swift +62 -0
- package/nitrogen/generated/ios/swift/HybridARPlaneAnchorSpec_cxx.swift +209 -0
- package/nitrogen/generated/ios/swift/HybridARPlaneGeometrySpec.swift +58 -0
- package/nitrogen/generated/ios/swift/HybridARPlaneGeometrySpec_cxx.swift +178 -0
- package/nitrogen/generated/ios/swift/HybridARRaycastResultSpec.swift +59 -0
- package/nitrogen/generated/ios/swift/HybridARRaycastResultSpec_cxx.swift +179 -0
- package/nitrogen/generated/ios/swift/HybridARSessionSpec.swift +78 -0
- package/nitrogen/generated/ios/swift/HybridARSessionSpec_cxx.swift +591 -0
- package/nitrogen/generated/ios/swift/HybridARViewSpec.swift +78 -0
- package/nitrogen/generated/ios/swift/HybridARViewSpec_cxx.swift +561 -0
- package/nitrogen/generated/ios/swift/HybridARVolumeSpec.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridARVolumeSpec_cxx.swift +180 -0
- package/nitrogen/generated/ios/swift/HybridARWorldMapSpec.swift +58 -0
- package/nitrogen/generated/ios/swift/HybridARWorldMapSpec_cxx.swift +176 -0
- package/nitrogen/generated/ios/swift/LiDARCapabilities.swift +39 -0
- package/nitrogen/generated/ios/swift/MeshClassification.swift +64 -0
- package/nitrogen/generated/ios/swift/PlaneAlignment.swift +40 -0
- package/nitrogen/generated/ios/swift/PlaneClassification.swift +64 -0
- package/nitrogen/generated/ios/swift/PlaneDetectionMode.swift +40 -0
- package/nitrogen/generated/ios/swift/RaycastAlignment.swift +44 -0
- package/nitrogen/generated/ios/swift/RaycastQuery.swift +44 -0
- package/nitrogen/generated/ios/swift/RaycastTarget.swift +48 -0
- package/nitrogen/generated/ios/swift/SceneReconstructionMode.swift +44 -0
- package/nitrogen/generated/ios/swift/TrackingState.swift +44 -0
- package/nitrogen/generated/ios/swift/TrackingStateReason.swift +52 -0
- package/nitrogen/generated/ios/swift/WorldAlignment.swift +44 -0
- package/nitrogen/generated/ios/swift/WorldMappingStatus.swift +48 -0
- package/nitrogen/generated/shared/c++/ARSessionConfiguration.hpp +132 -0
- package/nitrogen/generated/shared/c++/ARViewHitResult.hpp +91 -0
- package/nitrogen/generated/shared/c++/CameraPose.hpp +87 -0
- package/nitrogen/generated/shared/c++/EnvironmentTexturing.hpp +80 -0
- package/nitrogen/generated/shared/c++/HybridARAnchorSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridARAnchorSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridARBoundingBoxBuilderSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridARBoundingBoxBuilderSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridARDepthDataSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridARDepthDataSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridARDirectionalLightEstimateSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridARDirectionalLightEstimateSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridARFrameSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridARFrameSpec.hpp +83 -0
- package/nitrogen/generated/shared/c++/HybridARLightEstimateSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridARLightEstimateSpec.hpp +63 -0
- package/nitrogen/generated/shared/c++/HybridARMeasurementSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridARMeasurementSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridARMeshAnchorSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridARMeshAnchorSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridARPlaneAnchorSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridARPlaneAnchorSpec.hpp +79 -0
- package/nitrogen/generated/shared/c++/HybridARPlaneGeometrySpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridARPlaneGeometrySpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridARRaycastResultSpec.cpp +25 -0
- package/nitrogen/generated/shared/c++/HybridARRaycastResultSpec.hpp +70 -0
- package/nitrogen/generated/shared/c++/HybridARSessionSpec.cpp +45 -0
- package/nitrogen/generated/shared/c++/HybridARSessionSpec.hpp +131 -0
- package/nitrogen/generated/shared/c++/HybridARViewSpec.cpp +55 -0
- package/nitrogen/generated/shared/c++/HybridARViewSpec.hpp +101 -0
- package/nitrogen/generated/shared/c++/HybridARVolumeSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridARVolumeSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridARWorldMapSpec.cpp +25 -0
- package/nitrogen/generated/shared/c++/HybridARWorldMapSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/LiDARCapabilities.hpp +91 -0
- package/nitrogen/generated/shared/c++/MeshClassification.hpp +100 -0
- package/nitrogen/generated/shared/c++/PlaneAlignment.hpp +76 -0
- package/nitrogen/generated/shared/c++/PlaneClassification.hpp +100 -0
- package/nitrogen/generated/shared/c++/PlaneDetectionMode.hpp +76 -0
- package/nitrogen/generated/shared/c++/RaycastAlignment.hpp +80 -0
- package/nitrogen/generated/shared/c++/RaycastQuery.hpp +99 -0
- package/nitrogen/generated/shared/c++/RaycastTarget.hpp +84 -0
- package/nitrogen/generated/shared/c++/SceneReconstructionMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/TrackingState.hpp +80 -0
- package/nitrogen/generated/shared/c++/TrackingStateReason.hpp +88 -0
- package/nitrogen/generated/shared/c++/WorldAlignment.hpp +80 -0
- package/nitrogen/generated/shared/c++/WorldMappingStatus.hpp +84 -0
- package/nitrogen/generated/shared/c++/views/HybridARViewComponent.cpp +182 -0
- package/nitrogen/generated/shared/c++/views/HybridARViewComponent.hpp +120 -0
- package/nitrogen/generated/shared/json/ARViewConfig.json +19 -0
- package/package.json +98 -0
- package/react-native-nitro-ar.podspec +40 -0
- package/src/index.ts +60 -0
- package/src/specs/ARAnchor.nitro.ts +21 -0
- package/src/specs/ARBoundingBoxBuilder.nitro.ts +11 -0
- package/src/specs/ARDepthData.nitro.ts +29 -0
- package/src/specs/ARFrame.nitro.ts +41 -0
- package/src/specs/ARLightEstimate.nitro.ts +20 -0
- package/src/specs/ARMeasurement.nitro.ts +10 -0
- package/src/specs/ARPlaneAnchor.nitro.ts +46 -0
- package/src/specs/ARRaycastResult.nitro.ts +32 -0
- package/src/specs/ARSceneMesh.nitro.ts +63 -0
- package/src/specs/ARSession.nitro.ts +112 -0
- package/src/specs/ARView.nitro.ts +84 -0
- package/src/specs/ARVolume.nitro.ts +15 -0
- 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
|
+
}
|