[Metaballs] Renderer requires a delegate

This commit is contained in:
Eryn Wells 2017-08-05 09:31:51 -07:00
parent fd2f2251bf
commit 0875028e48
2 changed files with 13 additions and 20 deletions

View file

@ -17,6 +17,7 @@ enum RendererError: Error {
protocol RendererDelegate { protocol RendererDelegate {
var renderSize: CGSize { get set } var renderSize: CGSize { get set }
var field: Field { get } var field: Field { get }
var metalView: MTKView { get }
} }
struct Point { struct Point {
@ -30,23 +31,24 @@ struct Vertex {
} }
class Renderer: NSObject, MTKViewDelegate { class Renderer: NSObject, MTKViewDelegate {
var delegate: RendererDelegate? var delegate: RendererDelegate
private var device: MTLDevice private var device: MTLDevice
private var commandQueue: MTLCommandQueue private var commandQueue: MTLCommandQueue
private var renderPipelineState: MTLRenderPipelineState private var renderPipelineState: MTLRenderPipelineState
init(view: MTKView, field: Field) throws { init(delegate: RendererDelegate) throws {
self.delegate = delegate
guard let device = MTLCreateSystemDefaultDevice() else { guard let device = MTLCreateSystemDefaultDevice() else {
throw RendererError.MetalError("Unable to create Metal system device") throw RendererError.MetalError("Unable to create Metal system device")
} }
let view = delegate.metalView
self.device = device self.device = device
view.device = device view.device = device
do {
try field.setupMetal(withDevice: device) try delegate.field.setupMetal(withDevice: device)
} catch let e {
throw e
}
let library = try device.makeDefaultLibrary(bundle: Bundle.main) let library = try device.makeDefaultLibrary(bundle: Bundle.main)
let vertexShader = library.makeFunction(name: "passthroughVertexShader") let vertexShader = library.makeFunction(name: "passthroughVertexShader")
@ -66,14 +68,12 @@ class Renderer: NSObject, MTKViewDelegate {
/// MARK: - MTKViewDelegate /// MARK: - MTKViewDelegate
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
delegate?.renderSize = size delegate.renderSize = size
// TODO: Reallocate the sample buffer and texture // TODO: Reallocate the sample buffer and texture
} }
func draw(in view: MTKView) { func draw(in view: MTKView) {
guard let field = delegate?.field else { let field = delegate.field
return
}
// Two triangles, plus texture coordinates. // Two triangles, plus texture coordinates.
let points: [Vertex] = [ let points: [Vertex] = [

View file

@ -19,22 +19,15 @@ class ViewController: NSViewController, RendererDelegate {
private var renderer: Renderer! private var renderer: Renderer!
private var metalView: MTKView! { internal var metalView: MTKView {
return self.view as! MTKView return self.view as! MTKView
} }
override func viewDidLoad() { override func viewDidLoad() {
super.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 { do {
renderer = try Renderer(view: metalView, field: field) renderer = try Renderer(delegate: self)
renderer.delegate = self
} catch let e { } catch let e {
print("\(e)") print("\(e)")
view = newErrorView() view = newErrorView()