[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 {
|
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] = [
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue