SCNScene.write () не вызывает делегата, как это исправить? - PullRequest
0 голосов
/ 22 ноября 2018

В SCNScene.write() подпись позволяет указать делегата, который используется для определения способа сохранения, главным образом, текстурных активов:

func write(to url: URL, options: [String : Any]? = nil, delegate: SCNSceneExportDelegate?, progressHandler: SCNSceneExportProgressHandler? = nil) -> Bool

Документация здесь

Однако, когда я пытаюсь использовать его, делегат никогда не вызывается, даже в ситуациях, в которых, я думаю, он должен:

...
guard let shipText = Bundle.main.url(forResource: "texture", withExtension: "png", subdirectory: "art.scnassets") else {
  print("Couldn't retrieve texture")
  return
}

do {
  let scene = SCNScene()
  let boxGeom = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
  boxGeom.firstMaterial!.diffuse.contents = shipText.path
  boxGeom.firstMaterial!.lightingModel = .constant
  let boxNode = SCNNode(geometry: boxGeom)
  scene.rootNode.addChildNode(boxNode)

  let fileMan = FileManager.default

  let docsDir = try fileMan.url(for: .documentDirectory,
                                in: .userDomainMask,
                                appropriateFor: nil, create: true)
  let uuid = UUID.init().uuidString
  let exportBaseName = docsDir.appendingPathComponent(uuid, isDirectory: false)
  print("exportBaseName: \(exportBaseName)")

  let daeExport = exportBaseName.appendingPathExtension("dae")
  let scnExport = exportBaseName.appendingPathExtension("scn")

  // This prints true
  print(scene.write(to: scnExport, options: nil, delegate: self, progressHandler: nil))

  // This prints true
  print(scene.write(to: daeExport, options: nil, delegate: self, progressHandler: nil))

}
catch {
  print(error.localizedDescription)
}

...

...

// This never gets called
extension ViewController: SCNSceneExportDelegate {
  func write(_ image: UIImage, withSceneDocumentURL documentURL: URL, originalImageURL: URL?) -> URL? {
    print("Delegate being called: ", image, documentURL, originalImageURL)
    return nil
  }
}

Это проблема для меня, потому что я пытаюсь экспортироватьПравильные сцены и возможность переписать расположение текстур, которые используются в материалах, - это особенность, которая мне нужна.

Может кто-нибудь сказать мне, если я делаю что-то не так, если что-нибудь?

...