Loading Reference Node Causes Runtime Error

Hi,


I have an ARKit facial tracking app. Whenever I try to load a reference node inside renderer(_:didAdd:for:) I get a SceneKit error on the console.


[SceneKit] Error: Scene <SCNScene: 0x283692c60> is modified within a rendering callback of another scene (<SCNScene: 0x2836943c0>). This is not allowed and may lead to crash


Here's the part of the code that is relevant to this problem.


func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
  guard let faceAnchor = anchor as? ARFaceAnchor else { return }
  currentFaceAnchor = faceAnchor
    
  if node.childNodes.isEmpty, let contentNode = self.renderer(renderer, nodeFor: faceAnchor) {
    node.addChildNode(contentNode)
  }
}
  
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
  guard anchor is ARFaceAnchor else { return nil }
  
  let refNode = SCNReferenceNode(named: "my_model")
  return refNode
}


This setup is similar to the setup on Creating Face-Based AR Experiences sample code, which can be found here. When I run Apple's sample code and view the robot model I do not receive any errors at runtime.


I understand the error and I have a way of fixing it, however what I don't understand is why Apple's sample code doesn't have the same issue. What am I missing here?


By the way the fix is the following:


  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    DispatchQueue.global().async {
      guard let faceAnchor = anchor as? ARFaceAnchor else { return }
      self.currentFaceAnchor = faceAnchor
      
      DispatchQueue.main.async {
        if node.childNodes.isEmpty, let contentNode = self.loadRefNode() {
          node.addChildNode(contentNode)
        }
      }
    }
  }
  
  func loadRefNode() -> SCNNode? {
    let refNode = SCNReferenceNode(named: "my_model")
    return refNode
  }


Looking forward to your answers!

Replies

Hello,


I am unable to reproduce the issue using your first code snippet, if you continue to have this issue, please request support at https://developer.apple.com/support/technical/