Let the delegate provide the marchingSquares instance
This commit is contained in:
parent
4cc2b315a1
commit
7399d2d187
3 changed files with 27 additions and 23 deletions
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,19 +225,21 @@ public class Renderer: NSObject, MTKViewDelegate {
|
||||||
didEncode = true
|
didEncode = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render the marching squares version over top of the pixel version.
|
if let marchingSquares = delegate?.marchingSquares {
|
||||||
// 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.
|
// Render the marching squares version over top of the pixel version.
|
||||||
let pass = renderPass.copy() as! MTLRenderPassDescriptor
|
// 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.
|
||||||
pass.colorAttachments[0].loadAction = .load
|
let pass = renderPass.copy() as! MTLRenderPassDescriptor
|
||||||
if let pipeline = marchingSquaresPipeline,
|
pass.colorAttachments[0].loadAction = .load
|
||||||
let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) {
|
if let pipeline = marchingSquaresPipeline,
|
||||||
encoder.label = "Marching Squares Render"
|
let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) {
|
||||||
encoder.setRenderPipelineState(pipeline)
|
encoder.label = "Marching Squares Render"
|
||||||
encoder.setVertexBuffer(field.marchingSquares.gridGeometry, offset: 0, index: 0)
|
encoder.setRenderPipelineState(pipeline)
|
||||||
encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1)
|
encoder.setVertexBuffer(marchingSquares.gridGeometry, offset: 0, index: 0)
|
||||||
encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: field.marchingSquares.gridVertexCount)
|
encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1)
|
||||||
encoder.endEncoding()
|
encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: marchingSquares.gridVertexCount)
|
||||||
didEncode = true
|
encoder.endEncoding()
|
||||||
|
didEncode = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue