Draw some gridlines from the marching squares object
I kinda hate how I did this.
This commit is contained in:
parent
3399bbcd53
commit
f77eef76eb
4 changed files with 70 additions and 6 deletions
|
@ -18,14 +18,36 @@ class MarchingSquares {
|
||||||
/// Indexes of geometry to render.
|
/// Indexes of geometry to render.
|
||||||
private(set) var indexes: MTLTexture?
|
private(set) var indexes: MTLTexture?
|
||||||
|
|
||||||
|
private(set) var gridGeometry: MTLBuffer?
|
||||||
|
|
||||||
|
private var xSamples: Int {
|
||||||
|
return Int(field.size.x / sampleGridSize.x)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var ySamples: Int {
|
||||||
|
return Int(field.size.y / sampleGridSize.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var xGridlinesCount: Int {
|
||||||
|
let xSamples = Int(field.size.x / sampleGridSize.x)
|
||||||
|
return xSamples - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
private var yGridlinesCount: Int {
|
||||||
|
let ySamples = Int(field.size.y / sampleGridSize.y)
|
||||||
|
return ySamples - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
var gridVertexCount: Int {
|
||||||
|
return xGridlinesCount * 2 + yGridlinesCount * 2
|
||||||
|
}
|
||||||
|
|
||||||
init(field: Field) {
|
init(field: Field) {
|
||||||
self.field = field
|
self.field = field
|
||||||
sampleGridSize = Size(16)
|
sampleGridSize = Size(16)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupMetal(withDevice device: MTLDevice) {
|
func setupMetal(withDevice device: MTLDevice) {
|
||||||
let xSamples = Int(field.size.x / sampleGridSize.x)
|
|
||||||
let ySamples = Int(field.size.y / sampleGridSize.y)
|
|
||||||
guard xSamples > 1 && ySamples > 1 else {
|
guard xSamples > 1 && ySamples > 1 else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -43,6 +65,46 @@ class MarchingSquares {
|
||||||
indexesDesc.height = ySamples - 1
|
indexesDesc.height = ySamples - 1
|
||||||
indexesDesc.pixelFormat = .a8Unorm
|
indexesDesc.pixelFormat = .a8Unorm
|
||||||
indexes = device.makeTexture(descriptor: indexesDesc)
|
indexes = device.makeTexture(descriptor: indexesDesc)
|
||||||
|
|
||||||
|
let gridGeometryLength = MemoryLayout<Vertex>.stride * gridVertexCount
|
||||||
|
gridGeometry = device.makeBuffer(length: gridGeometryLength, options: .storageModeShared)
|
||||||
|
populateGridGeometryBuffer()
|
||||||
|
}
|
||||||
|
|
||||||
|
func fieldDidResize() {
|
||||||
|
guard let gridGeometry = gridGeometry else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let gridGeometryLength = MemoryLayout<Vertex>.stride * gridVertexCount
|
||||||
|
self.gridGeometry = gridGeometry.device.makeBuffer(length: gridGeometryLength, options: .storageModeShared)
|
||||||
|
populateGridGeometryBuffer()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func populateGridGeometryBuffer() {
|
||||||
|
guard let gridGeometry = gridGeometry else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Rebuilding gridlines")
|
||||||
|
|
||||||
|
var vertices = [Vertex]()
|
||||||
|
|
||||||
|
let fieldSizeX = Float(field.size.x)
|
||||||
|
let fieldSizeY = Float(field.size.y)
|
||||||
|
|
||||||
|
for x in 1..<xSamples {
|
||||||
|
let xCoord = Float(x * Int(sampleGridSize.x))
|
||||||
|
vertices.append(Vertex(position: Float2(xCoord, 0), textureCoordinate: Float2()))
|
||||||
|
vertices.append(Vertex(position: Float2(xCoord, fieldSizeY), textureCoordinate: Float2()))
|
||||||
|
}
|
||||||
|
|
||||||
|
for y in 1..<ySamples {
|
||||||
|
let yCoord = Float(y * Int(sampleGridSize.y))
|
||||||
|
vertices.append(Vertex(position: Float2(0, yCoord), textureCoordinate: Float2()))
|
||||||
|
vertices.append(Vertex(position: Float2(fieldSizeX, yCoord), textureCoordinate: Float2()))
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(gridGeometry.contents(), vertices, MemoryLayout<Vertex>.stride * vertices.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
func sampleField() {
|
func sampleField() {
|
||||||
|
|
|
@ -109,6 +109,7 @@ 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
|
||||||
}
|
}
|
||||||
|
@ -119,7 +120,7 @@ public class Field {
|
||||||
|
|
||||||
public var defaults = UserDefaults.standard
|
public var defaults = UserDefaults.standard
|
||||||
private var parameters: Parameters
|
private var parameters: Parameters
|
||||||
private lazy var marchingSquares: MarchingSquares = {
|
lazy var marchingSquares: MarchingSquares = {
|
||||||
return MarchingSquares(field: self)
|
return MarchingSquares(field: self)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
|
@ -231,10 +231,9 @@ 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.setVertexBytes(pixelGeometry, length: pixelGeometry.count * MemoryLayout<Vertex>.stride, index: 0)
|
encoder.setVertexBuffer(field.marchingSquares.gridGeometry, offset: 0, index: 0)
|
||||||
encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1)
|
encoder.setVertexBuffer(parametersBuffer, offset: 0, index: 1)
|
||||||
encoder.setTriangleFillMode(.lines)
|
encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: field.marchingSquares.gridVertexCount)
|
||||||
encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6)
|
|
||||||
encoder.endEncoding()
|
encoder.endEncoding()
|
||||||
didEncode = true
|
didEncode = true
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,8 @@ singleColor(float sample,
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - Helpers
|
||||||
|
|
||||||
float
|
float
|
||||||
mapValueFromRangeOntoRange(float value,
|
mapValueFromRangeOntoRange(float value,
|
||||||
float inputStart,
|
float inputStart,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue