From f77eef76ebe9347d9625b5e76442dc026e8392f4 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 13 Oct 2018 22:22:10 -0700 Subject: [PATCH] Draw some gridlines from the marching squares object I kinda hate how I did this. --- MetaballsKit/MarchingSquares.swift | 66 +++++++++++++++++++++++++++++- MetaballsKit/Metaballs.swift | 3 +- MetaballsKit/Renderer.swift | 5 +-- MetaballsKit/Shaders.metal | 2 + 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/MetaballsKit/MarchingSquares.swift b/MetaballsKit/MarchingSquares.swift index fc4e563..81092ba 100644 --- a/MetaballsKit/MarchingSquares.swift +++ b/MetaballsKit/MarchingSquares.swift @@ -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.stride * gridVertexCount + gridGeometry = device.makeBuffer(length: gridGeometryLength, options: .storageModeShared) + populateGridGeometryBuffer() + } + + func fieldDidResize() { + guard let gridGeometry = gridGeometry else { + return + } + let gridGeometryLength = MemoryLayout.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...stride * vertices.count) } func sampleField() { diff --git a/MetaballsKit/Metaballs.swift b/MetaballsKit/Metaballs.swift index 90dee5f..5557bb0 100644 --- a/MetaballsKit/Metaballs.swift +++ b/MetaballsKit/Metaballs.swift @@ -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) }() diff --git a/MetaballsKit/Renderer.swift b/MetaballsKit/Renderer.swift index 6e70ae2..d68f902 100644 --- a/MetaballsKit/Renderer.swift +++ b/MetaballsKit/Renderer.swift @@ -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.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 } diff --git a/MetaballsKit/Shaders.metal b/MetaballsKit/Shaders.metal index 4f7b085..4247fb7 100644 --- a/MetaballsKit/Shaders.metal +++ b/MetaballsKit/Shaders.metal @@ -145,6 +145,8 @@ singleColor(float sample, return out; } +#pragma mark - Helpers + float mapValueFromRangeOntoRange(float value, float inputStart,