[Metaballs] The ViewController is the bridge between the Field and the Renderer
This commit is contained in:
parent
ea3638d12c
commit
e971d0dbca
1 changed files with 48 additions and 7 deletions
|
@ -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
|
||||
}
|
||||
|
||||
override var representedObject: Any? {
|
||||
didSet {
|
||||
// Update the view, if already loaded.
|
||||
}
|
||||
do {
|
||||
renderer = try Renderer(view: metalView, field: field)
|
||||
} catch let e {
|
||||
print("\(e)")
|
||||
view = newErrorView()
|
||||
return
|
||||
}
|
||||
|
||||
metalView.delegate = renderer
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue