2017-07-30 14:04:39 -07:00
|
|
|
//
|
|
|
|
// ViewController.swift
|
|
|
|
// Metaballs
|
|
|
|
//
|
|
|
|
// Created by Eryn Wells on 7/30/17.
|
|
|
|
// Copyright © 2017 Eryn Wells. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Cocoa
|
2017-08-04 21:16:07 -07:00
|
|
|
import MetalKit
|
|
|
|
import MetaballsKit
|
2017-07-30 14:04:39 -07:00
|
|
|
|
2017-08-04 21:16:07 -07:00
|
|
|
class ViewController: NSViewController, RendererDelegate {
|
2017-08-05 09:05:27 -07:00
|
|
|
internal var field = Field(size: CGSize()) {
|
2017-08-04 21:16:07 -07:00
|
|
|
didSet {
|
|
|
|
field.size = metalView.drawableSize
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private var renderer: Renderer!
|
|
|
|
|
|
|
|
private var metalView: MTKView! {
|
|
|
|
return self.view as! MTKView
|
|
|
|
}
|
2017-07-30 14:04:39 -07:00
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
|
2017-08-04 21:16:07 -07:00
|
|
|
guard let metalView = metalView else {
|
|
|
|
view = newErrorView()
|
|
|
|
print("self.view should be an MTKView; got \(type(of: self.view)) instead")
|
|
|
|
return
|
|
|
|
}
|
2017-07-30 14:04:39 -07:00
|
|
|
|
2017-08-04 21:16:07 -07:00
|
|
|
do {
|
|
|
|
renderer = try Renderer(view: metalView, field: field)
|
2017-08-05 09:05:27 -07:00
|
|
|
renderer.delegate = self
|
2017-08-04 21:16:07 -07:00
|
|
|
} catch let e {
|
|
|
|
print("\(e)")
|
|
|
|
view = newErrorView()
|
|
|
|
return
|
2017-07-30 14:04:39 -07:00
|
|
|
}
|
2017-08-04 21:16:07 -07:00
|
|
|
|
|
|
|
metalView.delegate = renderer
|
|
|
|
}
|
|
|
|
|
|
|
|
override func viewWillAppear() {
|
|
|
|
super.viewWillAppear()
|
|
|
|
renderer.mtkView(metalView, drawableSizeWillChange: metalView.drawableSize)
|
2017-08-05 09:05:27 -07:00
|
|
|
field.add(ballWithRadius: 10.0)
|
2017-08-04 21:16:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
private func newErrorView() -> NSView {
|
|
|
|
let view = NSView()
|
|
|
|
view.layer?.backgroundColor = NSColor.red.cgColor
|
|
|
|
return view
|
2017-07-30 14:04:39 -07:00
|
|
|
}
|
|
|
|
|
2017-08-04 21:16:07 -07:00
|
|
|
// MARK: - RendererDelegate
|
2017-07-30 14:04:39 -07:00
|
|
|
|
2017-08-04 21:16:07 -07:00
|
|
|
var renderSize: CGSize {
|
|
|
|
get {
|
|
|
|
return field.size
|
|
|
|
}
|
|
|
|
set {
|
|
|
|
field.size = newValue
|
|
|
|
}
|
|
|
|
}
|
2017-07-30 14:04:39 -07:00
|
|
|
}
|
|
|
|
|