[Metaballs] The ViewController is the bridge between the Field and the Renderer

This commit is contained in:
Eryn Wells 2017-08-04 21:16:07 -07:00
parent ea3638d12c
commit e971d0dbca

View file

@ -7,21 +7,62 @@
// //
import Cocoa 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() { override func viewDidLoad() {
super.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? { override func viewWillAppear() {
didSet { super.viewWillAppear()
// Update the view, if already loaded. 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
} }
} }
} }