-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSceneLocationView+ARSCNViewDelegate.swift
151 lines (124 loc) · 5.53 KB
/
SceneLocationView+ARSCNViewDelegate.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// SceneLocationView+ARSCNViewDelegate.swift
// ARKit+CoreLocation
//
// Created by Ilya Seliverstov on 08/08/2017.
// Copyright © 2017 Project Dent. All rights reserved.
//
import Foundation
import ARKit
import CoreLocation
import MapKit
// MARK: - ARSCNViewDelegate
@available(iOS 11.0, *)
extension SceneLocationView: ARSCNViewDelegate {
public func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
return arViewDelegate?.renderer?(renderer, nodeFor: anchor) ?? nil
}
public func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
arViewDelegate?.renderer?(renderer, didAdd: node, for: anchor)
}
public func renderer(_ renderer: SCNSceneRenderer, willUpdate node: SCNNode, for anchor: ARAnchor) {
arViewDelegate?.renderer?(renderer, willUpdate: node, for: anchor)
}
public func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
arViewDelegate?.renderer?(renderer, didUpdate: node, for: anchor)
}
public func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) {
arViewDelegate?.renderer?(renderer, didRemove: node, for: anchor)
}
}
// MARK: - ARSessionObserver
@available(iOS 11.0, *)
extension SceneLocationView {
public func session(_ session: ARSession, didFailWithError error: Error) {
defer {
arViewDelegate?.session?(session, didFailWithError: error)
}
print("session did fail with error: \(error)")
sceneTrackingDelegate?.session(session, didFailWithError: error)
}
public func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) {
defer {
arViewDelegate?.session?(session, cameraDidChangeTrackingState: camera)
}
switch camera.trackingState {
case .limited(.insufficientFeatures):
print("camera did change tracking state: limited, insufficient features")
case .limited(.excessiveMotion):
print("camera did change tracking state: limited, excessive motion")
case .limited(.initializing):
print("camera did change tracking state: limited, initializing")
case .normal:
print("camera did change tracking state: normal")
case .notAvailable:
print("camera did change tracking state: not available")
case .limited(.relocalizing):
print("camera did change tracking state: limited, relocalizing")
default:
print("camera did change tracking state: unknown...")
}
sceneTrackingDelegate?.session(session, cameraDidChangeTrackingState: camera)
}
public func sessionWasInterrupted(_ session: ARSession) {
defer {
arViewDelegate?.sessionWasInterrupted?(session)
}
print("session was interrupted")
sceneTrackingDelegate?.sessionWasInterrupted(session)
}
public func sessionInterruptionEnded(_ session: ARSession) {
defer {
arViewDelegate?.sessionInterruptionEnded?(session)
}
print("session interruption ended")
sceneTrackingDelegate?.sessionInterruptionEnded(session)
}
@available(iOS 11.3, *)
public func sessionShouldAttemptRelocalization(_ session: ARSession) -> Bool {
return arViewDelegate?.sessionShouldAttemptRelocalization?(session) ?? true
}
public func session(_ session: ARSession, didOutputAudioSampleBuffer audioSampleBuffer: CMSampleBuffer) {
arViewDelegate?.session?(session, didOutputAudioSampleBuffer: audioSampleBuffer)
}
}
// MARK: - SCNSceneRendererDelegate
@available(iOS 11.0, *)
extension SceneLocationView {
public func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
defer {
arViewDelegate?.renderer?(renderer, didRenderScene: scene, atTime: time)
}
if sceneNode == nil {
sceneNode = SCNNode()
scene.rootNode.addChildNode(sceneNode!)
if showAxesNode {
let axesNode = SCNNode.axesNode(quiverLength: 0.1, quiverThickness: 0.5)
sceneNode?.addChildNode(axesNode)
}
}
if !didFetchInitialLocation {
//Current frame and current location are required for this to be successful
if session.currentFrame != nil,
let currentLocation = sceneLocationManager.currentLocation {
didFetchInitialLocation = true
sceneLocationManager.addSceneLocationEstimate(location: currentLocation)
}
}
}
public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
arViewDelegate?.renderer?(renderer, updateAtTime: time)
}
public func renderer(_ renderer: SCNSceneRenderer, didApplyAnimationsAtTime time: TimeInterval) {
arViewDelegate?.renderer?(renderer, didApplyAnimationsAtTime: time)
}
public func renderer(_ renderer: SCNSceneRenderer, didSimulatePhysicsAtTime time: TimeInterval) {
arViewDelegate?.renderer?(renderer, didSimulatePhysicsAtTime: time)
}
public func renderer(_ renderer: SCNSceneRenderer, didApplyConstraintsAtTime time: TimeInterval) {
arViewDelegate?.renderer?(renderer, didApplyConstraintsAtTime: time)
}
public func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
arViewDelegate?.renderer?(renderer, willRenderScene: scene, atTime: time)
}
}