From 98eb73d1e90b9a3e8218feb7182efbc3aa1c4066 Mon Sep 17 00:00:00 2001 From: farandal Date: Tue, 24 Oct 2017 13:16:34 +0800 Subject: [PATCH 1/3] Fix issue 22 - ARSCNViewDelegate Handling Content Updates --- MapboxARKit/AnnotationManager.swift | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/MapboxARKit/AnnotationManager.swift b/MapboxARKit/AnnotationManager.swift index 93e2a5b..31b6888 100644 --- a/MapboxARKit/AnnotationManager.swift +++ b/MapboxARKit/AnnotationManager.swift @@ -7,6 +7,11 @@ import CoreLocation @objc optional func node(for annotation: Annotation) -> SCNNode? @objc optional func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) + @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, time: TimeInterval) + @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, addedNode: SCNNode, anchor: ARAnchor) + @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, updatedNode: SCNNode, anchor: ARAnchor) + @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, removedNode: SCNNode, anchor: ARAnchor) + } public class AnnotationManager: NSObject { @@ -85,6 +90,19 @@ extension AnnotationManager: ARSCNViewDelegate { delegate?.session?(session, cameraDidChangeTrackingState: camera) } + + public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { + delegate?.MBRenderer!(renderer, time: time) + } + + public func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { + delegate?.MBRenderer!(renderer, updatedNode: node,anchor: anchor ) + } + + public func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) { + delegate?.MBRenderer!(renderer, removedNode: node,anchor: anchor ) + } + public func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { // Handle MBARAnchor @@ -110,7 +128,7 @@ extension AnnotationManager: ARSCNViewDelegate { annotationsByNode[newNode] = annotation } - // TODO: let delegate provide a node for a non-MBARAnchor + delegate?.AMRenderer!(renderer, addedNode: node,anchor: anchor ) } // MARK: - Utility methods for ARSCNViewDelegate From 0084c44f1086002c1f496818d6b6696a82a5c060 Mon Sep 17 00:00:00 2001 From: farandal Date: Tue, 24 Oct 2017 13:21:13 +0800 Subject: [PATCH 2/3] fix typo --- MapboxARKit/AnnotationManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapboxARKit/AnnotationManager.swift b/MapboxARKit/AnnotationManager.swift index 31b6888..2d5ec83 100644 --- a/MapboxARKit/AnnotationManager.swift +++ b/MapboxARKit/AnnotationManager.swift @@ -128,7 +128,7 @@ extension AnnotationManager: ARSCNViewDelegate { annotationsByNode[newNode] = annotation } - delegate?.AMRenderer!(renderer, addedNode: node,anchor: anchor ) + delegate?.MBRenderer!(renderer, addedNode: node,anchor: anchor ) } // MARK: - Utility methods for ARSCNViewDelegate From c7dd03b1150d4c306745ccca943db2376b902428 Mon Sep 17 00:00:00 2001 From: farandal Date: Thu, 26 Oct 2017 10:25:43 +0800 Subject: [PATCH 3/3] change implementation approach --- MapboxARKit/AnnotationManager.swift | 42 ++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/MapboxARKit/AnnotationManager.swift b/MapboxARKit/AnnotationManager.swift index 2d5ec83..2d23ee3 100644 --- a/MapboxARKit/AnnotationManager.swift +++ b/MapboxARKit/AnnotationManager.swift @@ -7,10 +7,15 @@ import CoreLocation @objc optional func node(for annotation: Annotation) -> SCNNode? @objc optional func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) - @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, time: TimeInterval) - @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, addedNode: SCNNode, anchor: ARAnchor) - @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, updatedNode: SCNNode, anchor: ARAnchor) - @objc optional func MBRenderer(_ renderer: SCNSceneRenderer, removedNode: SCNNode, anchor: ARAnchor) + @objc optional func renderer(_ renderer: SCNSceneRenderer, time: TimeInterval) + + @objc optional func renderer(_ renderer: SCNSceneRenderer, addedNode: SCNNode, mbAnchor anchor: MBARAnchor) + @objc optional func renderer(_ renderer: SCNSceneRenderer, updatedNode: SCNNode, mbAnchor anchor: MBARAnchor) + @objc optional func renderer(_ renderer: SCNSceneRenderer, removedNode: SCNNode, mbAnchor anchor: MBARAnchor) + + @objc optional func renderer(_ renderer: SCNSceneRenderer, addedNode: SCNNode, arAnchor anchor: ARAnchor) + @objc optional func renderer(_ renderer: SCNSceneRenderer, updatedNode: SCNNode, arAnchor anchor: ARAnchor) + @objc optional func renderer(_ renderer: SCNSceneRenderer, removedNode: SCNNode, arAnchor anchor: ARAnchor) } @@ -92,21 +97,30 @@ extension AnnotationManager: ARSCNViewDelegate { public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { - delegate?.MBRenderer!(renderer, time: time) + delegate?.renderer?(renderer, time: time) } - + public func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { - delegate?.MBRenderer!(renderer, updatedNode: node,anchor: anchor ) + if let anchor = anchor as? MBARAnchor { + delegate?.renderer?(renderer, updatedNode: node, mbAnchor: anchor ) + } else { + delegate?.renderer?(renderer, updatedNode: node,arAnchor: anchor ) + } } public func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) { - delegate?.MBRenderer!(renderer, removedNode: node,anchor: anchor ) + if let anchor = anchor as? MBARAnchor { + delegate?.renderer?(renderer, removedNode: node,mbAnchor: anchor ) + } else { + delegate?.renderer?(renderer, removedNode: node,arAnchor: anchor ) + } } public func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { - + // Handle MBARAnchor if let anchor = anchor as? MBARAnchor { + let annotation = annotationsByAnchor[anchor]! var newNode: SCNNode! @@ -117,26 +131,28 @@ extension AnnotationManager: ARSCNViewDelegate { } else { newNode = createDefaultNode() } - + if let calloutImage = annotation.calloutImage { let calloutNode = createCalloutNode(with: calloutImage, node: newNode) newNode.addChildNode(calloutNode) } node.addChildNode(newNode) - annotationsByNode[newNode] = annotation + delegate?.renderer?(renderer, addedNode: node,mbAnchor: anchor ) + } else { + delegate?.renderer?(renderer, addedNode: node, arAnchor: anchor ) } - - delegate?.MBRenderer!(renderer, addedNode: node,anchor: anchor ) } // MARK: - Utility methods for ARSCNViewDelegate func createDefaultNode() -> SCNNode { + let geometry = SCNSphere(radius: 0.2) geometry.firstMaterial?.diffuse.contents = UIColor.red return SCNNode(geometry: geometry) + } func createCalloutNode(with image: UIImage, node: SCNNode) -> SCNNode {