Draw some gridlines from the marching squares object

I kinda hate how I did this.
This commit is contained in:
Eryn Wells 2018-10-13 22:22:10 -07:00
parent 3399bbcd53
commit f77eef76eb
4 changed files with 70 additions and 6 deletions

View file

@ -18,14 +18,36 @@ class MarchingSquares {
/// Indexes of geometry to render.
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) {
self.field = field
sampleGridSize = Size(16)
}
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 {
return
}
@ -43,6 +65,46 @@ class MarchingSquares {
indexesDesc.height = ySamples - 1
indexesDesc.pixelFormat = .a8Unorm
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() {

View file

@ -109,6 +109,7 @@ public class Field {
// Update Metal state as needed.
populateParametersBuffer()
populateBallBuffer()
marchingSquares.fieldDidResize()
parameters.size = newValue
}
@ -119,7 +120,7 @@ public class Field {
public var defaults = UserDefaults.standard
private var parameters: Parameters
private lazy var marchingSquares: MarchingSquares = {
lazy var marchingSquares: MarchingSquares = {
return MarchingSquares(field: self)
}()

View file

@ -231,10 +231,9 @@ public class Renderer: NSObject, MTKViewDelegate {
let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) {
encoder.label = "Marching Squares Render"
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.setTriangleFillMode(.lines)
encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6)
encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: field.marchingSquares.gridVertexCount)
encoder.endEncoding()
didEncode = true
}

View file

@ -145,6 +145,8 @@ singleColor(float sample,
return out;
}
#pragma mark - Helpers
float
mapValueFromRangeOntoRange(float value,
float inputStart,