Let the delegate provide the marchingSquares instance

This commit is contained in:
Eryn Wells 2018-10-14 08:27:45 -07:00
parent 4cc2b315a1
commit 7399d2d187
3 changed files with 27 additions and 23 deletions

View file

@ -38,6 +38,8 @@ class ViewController: NSViewController, RendererDelegate {
} }
} }
var marchingSquares: MarchingSquares
private var renderer: Renderer! private var renderer: Renderer!
internal var metalView: MTKView { internal var metalView: MTKView {
@ -47,12 +49,14 @@ class ViewController: NSViewController, RendererDelegate {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
let params = ViewController.defaultParameters() let params = ViewController.defaultParameters()
field = Field(parameters: params) field = Field(parameters: params)
marchingSquares = MarchingSquares(field: field)
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
let params = ViewController.defaultParameters() let params = ViewController.defaultParameters()
field = Field(parameters: params) field = Field(parameters: params)
marchingSquares = MarchingSquares(field: field)
super.init(coder: coder) super.init(coder: coder)
} }
@ -112,6 +116,7 @@ class ViewController: NSViewController, RendererDelegate {
} }
set { set {
field.size = newValue field.size = newValue
marchingSquares.fieldDidResize()
} }
} }
} }

View file

@ -109,7 +109,6 @@ public class Field {
// Update Metal state as needed. // Update Metal state as needed.
populateParametersBuffer() populateParametersBuffer()
populateBallBuffer() populateBallBuffer()
marchingSquares.fieldDidResize()
parameters.size = newValue parameters.size = newValue
} }
@ -120,9 +119,6 @@ public class Field {
public var defaults = UserDefaults.standard public var defaults = UserDefaults.standard
private var parameters: Parameters private var parameters: Parameters
lazy var marchingSquares: MarchingSquares = {
return MarchingSquares(field: self)
}()
internal var bounds: CGRect { internal var bounds: CGRect {
return CGRect(origin: CGPoint(), size: CGSize(size: size)) return CGRect(origin: CGPoint(), size: CGSize(size: size))
@ -263,7 +259,7 @@ public class Field {
return ptr.advanced(by: sizeOfType) return ptr.advanced(by: sizeOfType)
} }
public func setupMetal(withDevice device: MTLDevice) throws { func setupMetal(withDevice device: MTLDevice) {
guard self.device == nil else { guard self.device == nil else {
return return
} }
@ -271,7 +267,6 @@ public class Field {
self.device = device self.device = device
populateParametersBuffer() populateParametersBuffer()
populateBallBuffer() populateBallBuffer()
marchingSquares.setupMetal(withDevice: device)
} }
// MARK: - Notifications // MARK: - Notifications

View file

@ -13,9 +13,10 @@ public enum RendererError: Error {
case MetalError(String) case MetalError(String)
} }
public protocol RendererDelegate { protocol RendererDelegate {
var renderSize: Size { get set } var renderSize: Size { get set }
var field: Field { get } var field: Field { get }
var marchingSquares: MarchingSquares { get }
var metalView: MTKView { get } var metalView: MTKView { get }
} }
@ -29,7 +30,7 @@ struct Vertex {
} }
public class Renderer: NSObject, MTKViewDelegate { public class Renderer: NSObject, MTKViewDelegate {
public var delegate: RendererDelegate? = nil { var delegate: RendererDelegate? = nil {
didSet { didSet {
guard let delegate = delegate else { guard let delegate = delegate else {
return return
@ -41,7 +42,8 @@ public class Renderer: NSObject, MTKViewDelegate {
configurePixelPipeline(withPixelFormat: view.colorPixelFormat) configurePixelPipeline(withPixelFormat: view.colorPixelFormat)
configureMarchingSquaresPipeline(withPixelFormat: view.colorPixelFormat) configureMarchingSquaresPipeline(withPixelFormat: view.colorPixelFormat)
try! delegate.field.setupMetal(withDevice: device) delegate.field.setupMetal(withDevice: device)
delegate.marchingSquares.setupMetal(withDevice: device)
} }
} }
@ -80,7 +82,7 @@ public class Renderer: NSObject, MTKViewDelegate {
super.init() super.init()
} }
public convenience init(delegate: RendererDelegate) throws { convenience init(delegate: RendererDelegate) throws {
self.init() self.init()
self.delegate = delegate self.delegate = delegate
} }
@ -223,6 +225,7 @@ public class Renderer: NSObject, MTKViewDelegate {
didEncode = true didEncode = true
} }
if let marchingSquares = delegate?.marchingSquares {
// Render the marching squares version over top of the pixel version. // Render the marching squares version over top of the pixel version.
// We need our own render pass descriptor that specifies that we load the results of the previous pass to make this render pass appear on top of the other. // We need our own render pass descriptor that specifies that we load the results of the previous pass to make this render pass appear on top of the other.
let pass = renderPass.copy() as! MTLRenderPassDescriptor let pass = renderPass.copy() as! MTLRenderPassDescriptor
@ -231,13 +234,14 @@ public class Renderer: NSObject, MTKViewDelegate {
let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) { let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) {
encoder.label = "Marching Squares Render" encoder.label = "Marching Squares Render"
encoder.setRenderPipelineState(pipeline) encoder.setRenderPipelineState(pipeline)
encoder.setVertexBuffer(field.marchingSquares.gridGeometry, offset: 0, index: 0) encoder.setVertexBuffer(marchingSquares.gridGeometry, offset: 0, index: 0)
encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1) encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1)
encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: field.marchingSquares.gridVertexCount) encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: marchingSquares.gridVertexCount)
encoder.endEncoding() encoder.endEncoding()
didEncode = true didEncode = true
} }
} }
}
if didEncode, let drawable = view.currentDrawable { if didEncode, let drawable = view.currentDrawable {
buffer.present(drawable) buffer.present(drawable)