From e971d0dbca7085eb88b7f338804a1de4e26d9a3e Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Fri, 4 Aug 2017 21:16:07 -0700 Subject: [PATCH] [Metaballs] The ViewController is the bridge between the Field and the Renderer --- Metaballs/ViewController.swift | 55 +++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/Metaballs/ViewController.swift b/Metaballs/ViewController.swift index 58f5694..24082e5 100644 --- a/Metaballs/ViewController.swift +++ b/Metaballs/ViewController.swift @@ -7,21 +7,62 @@ // import Cocoa +import MetalKit +import MetaballsKit -class ViewController: NSViewController { +class ViewController: NSViewController, RendererDelegate { + private var field = Field(size: CGSize()) { + didSet { + field.size = metalView.drawableSize + } + } + + private var renderer: Renderer! + + private var metalView: MTKView! { + return self.view as! MTKView + } override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + 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) + } catch let e { + print("\(e)") + view = newErrorView() + return + } + + metalView.delegate = renderer } - override var representedObject: Any? { - didSet { - // Update the view, if already loaded. + override func viewWillAppear() { + super.viewWillAppear() + renderer.mtkView(metalView, drawableSizeWillChange: metalView.drawableSize) + } + + private func newErrorView() -> NSView { + let view = NSView() + view.layer?.backgroundColor = NSColor.red.cgColor + return view + } + + // MARK: - RendererDelegate + + var renderSize: CGSize { + get { + return field.size + } + set { + field.size = newValue } } - - }