[Metaballs] Renderer requires a delegate
This commit is contained in:
parent
fd2f2251bf
commit
0875028e48
2 changed files with 13 additions and 20 deletions
|
@ -17,6 +17,7 @@ enum RendererError: Error {
|
|||
protocol RendererDelegate {
|
||||
var renderSize: CGSize { get set }
|
||||
var field: Field { get }
|
||||
var metalView: MTKView { get }
|
||||
}
|
||||
|
||||
struct Point {
|
||||
|
@ -30,23 +31,24 @@ struct Vertex {
|
|||
}
|
||||
|
||||
class Renderer: NSObject, MTKViewDelegate {
|
||||
var delegate: RendererDelegate?
|
||||
var delegate: RendererDelegate
|
||||
|
||||
private var device: MTLDevice
|
||||
private var commandQueue: MTLCommandQueue
|
||||
private var renderPipelineState: MTLRenderPipelineState
|
||||
|
||||
init(view: MTKView, field: Field) throws {
|
||||
init(delegate: RendererDelegate) throws {
|
||||
self.delegate = delegate
|
||||
|
||||
guard let device = MTLCreateSystemDefaultDevice() else {
|
||||
throw RendererError.MetalError("Unable to create Metal system device")
|
||||
}
|
||||
let view = delegate.metalView
|
||||
|
||||
self.device = device
|
||||
view.device = device
|
||||
do {
|
||||
try field.setupMetal(withDevice: device)
|
||||
} catch let e {
|
||||
throw e
|
||||
}
|
||||
|
||||
try delegate.field.setupMetal(withDevice: device)
|
||||
|
||||
let library = try device.makeDefaultLibrary(bundle: Bundle.main)
|
||||
let vertexShader = library.makeFunction(name: "passthroughVertexShader")
|
||||
|
@ -66,14 +68,12 @@ class Renderer: NSObject, MTKViewDelegate {
|
|||
/// MARK: - MTKViewDelegate
|
||||
|
||||
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
|
||||
delegate?.renderSize = size
|
||||
delegate.renderSize = size
|
||||
// TODO: Reallocate the sample buffer and texture
|
||||
}
|
||||
|
||||
func draw(in view: MTKView) {
|
||||
guard let field = delegate?.field else {
|
||||
return
|
||||
}
|
||||
let field = delegate.field
|
||||
|
||||
// Two triangles, plus texture coordinates.
|
||||
let points: [Vertex] = [
|
||||
|
|
|
@ -19,22 +19,15 @@ class ViewController: NSViewController, RendererDelegate {
|
|||
|
||||
private var renderer: Renderer!
|
||||
|
||||
private var metalView: MTKView! {
|
||||
internal var metalView: MTKView {
|
||||
return self.view as! MTKView
|
||||
}
|
||||
|
||||
override func 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 {
|
||||
renderer = try Renderer(view: metalView, field: field)
|
||||
renderer.delegate = self
|
||||
renderer = try Renderer(delegate: self)
|
||||
} catch let e {
|
||||
print("\(e)")
|
||||
view = newErrorView()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue