From 0875028e48e8b8f2ef94f967c9e4347e23577215 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 5 Aug 2017 09:31:51 -0700 Subject: [PATCH] [Metaballs] Renderer requires a delegate --- Metaballs/Renderer.swift | 22 +++++++++++----------- Metaballs/ViewController.swift | 11 ++--------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/Metaballs/Renderer.swift b/Metaballs/Renderer.swift index 2999764..e5271b8 100644 --- a/Metaballs/Renderer.swift +++ b/Metaballs/Renderer.swift @@ -17,6 +17,7 @@ enum RendererError: Error { protocol RendererDelegate { var renderSize: CGSize { get set } var field: Field { get } + var metalView: MTKView { get } } struct Point { @@ -30,23 +31,24 @@ struct Vertex { } class Renderer: NSObject, MTKViewDelegate { - var delegate: RendererDelegate? + var delegate: RendererDelegate private var device: MTLDevice private var commandQueue: MTLCommandQueue private var renderPipelineState: MTLRenderPipelineState - init(view: MTKView, field: Field) throws { + init(delegate: RendererDelegate) throws { + self.delegate = delegate + guard let device = MTLCreateSystemDefaultDevice() else { throw RendererError.MetalError("Unable to create Metal system device") } + let view = delegate.metalView + self.device = device view.device = device - do { - try field.setupMetal(withDevice: device) - } catch let e { - throw e - } + + try delegate.field.setupMetal(withDevice: device) let library = try device.makeDefaultLibrary(bundle: Bundle.main) let vertexShader = library.makeFunction(name: "passthroughVertexShader") @@ -66,14 +68,12 @@ class Renderer: NSObject, MTKViewDelegate { /// MARK: - MTKViewDelegate func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { - delegate?.renderSize = size + delegate.renderSize = size // TODO: Reallocate the sample buffer and texture } func draw(in view: MTKView) { - guard let field = delegate?.field else { - return - } + let field = delegate.field // Two triangles, plus texture coordinates. let points: [Vertex] = [ diff --git a/Metaballs/ViewController.swift b/Metaballs/ViewController.swift index ba8c280..6303d8a 100644 --- a/Metaballs/ViewController.swift +++ b/Metaballs/ViewController.swift @@ -19,22 +19,15 @@ class ViewController: NSViewController, RendererDelegate { private var renderer: Renderer! - private var metalView: MTKView! { + internal var metalView: MTKView { return self.view as! MTKView } override func viewDidLoad() { super.viewDidLoad() - guard let metalView = metalView else { - view = newErrorView() - print("self.view should be an MTKView; got \(type(of: self.view)) instead") - return - } - do { - renderer = try Renderer(view: metalView, field: field) - renderer.delegate = self + renderer = try Renderer(delegate: self) } catch let e { print("\(e)") view = newErrorView()