diff --git a/Metaballs-macOS/ViewController.swift b/Metaballs-macOS/ViewController.swift index 8a95c48..5d5e65c 100644 --- a/Metaballs-macOS/ViewController.swift +++ b/Metaballs-macOS/ViewController.swift @@ -76,6 +76,9 @@ class ViewController: NSViewController, RendererDelegate { override func viewWillAppear() { super.viewWillAppear() + + view.window?.makeFirstResponder(self) + renderer.mtkView(metalView, drawableSizeWillChange: metalView.drawableSize) for _ in 1...10 { addBallWithRandomRadius() @@ -93,6 +96,14 @@ class ViewController: NSViewController, RendererDelegate { } } + override func keyDown(with event: NSEvent) { + print("key down: \(event)") + } + + override var acceptsFirstResponder: Bool { + return true + } + // MARK: - Private private func newErrorView() -> NSView { diff --git a/MetaballsKit/MarchingSquares.swift b/MetaballsKit/MarchingSquares.swift index dfce055..528aea8 100644 --- a/MetaballsKit/MarchingSquares.swift +++ b/MetaballsKit/MarchingSquares.swift @@ -55,18 +55,36 @@ class MarchingSquares { fatalError("Error building compute pipeline state for sampling kernel: \(e)") } + createParametersBuffer(withDevice: device) + createSamplesBuffer(withDevice: device) + } + + func createParametersBuffer(withDevice device: MTLDevice) { + // TODO: I'm cheating on this cause I didn't want to make a parallel struct in Swift and deal with alignment crap. >_> I should make a real struct for this. let parametersLength = MemoryLayout.stride * 3 + MemoryLayout.stride parametersBuffer = device.makeBuffer(length: parametersLength, options: .storageModeShared) - populateParametersBuffer() + } + + func createSamplesBuffer(withDevice device: MTLDevice) { + // Only reallocate the buffer if the length changed. + let samplesLength = MemoryLayout.stride * samplesCount + guard samplesBuffer?.length != samplesLength else { + return + } + samplesBuffer = device.makeBuffer(length: samplesLength, options: .storageModePrivate) + if samplesBuffer == nil { + fatalError("Couldn't create samplesBuffer!") + } } func fieldDidResize() { - guard let device = gridGeometry?.device else { + // Please just get the device from somewhere. 😅 + guard let device = gridGeometry?.device ?? samplesBuffer?.device else { return } populateParametersBuffer() populateGrid(withDevice: device) - populateSamples(withDevice: device) + createSamplesBuffer(withDevice: device) lastSamplesCount = samplesCount } @@ -75,6 +93,7 @@ class MarchingSquares { print("Tried to copy parameters buffer before buffer was allocated!") return } + // TODO: I'm cheating on this cause I didn't want to make a parallel struct in Swift and deal with alignment crap. >_> I should make a real struct for this. let params: [uint] = [ field.size.x, field.size.y, uint(xSamples), uint(ySamples), @@ -114,26 +133,6 @@ class MarchingSquares { } } - func populateSamples(withDevice device: MTLDevice) { -// var samples = [Float]() -// samples.reserveCapacity(samplesCount) - -// for ys in 0...stride * samplesCount - samplesBuffer = device.makeBuffer(length: samplesLength, options: .storageModePrivate) - if samplesBuffer == nil { - fatalError("Couldn't create samplesBuffer!") - } - } - func encodeSamplingKernel(intoBuffer buffer: MTLCommandBuffer) { guard let samplingPipeline = samplingPipeline else { print("Encode called before sampling pipeline was set up!") diff --git a/MetaballsKit/Renderer.swift b/MetaballsKit/Renderer.swift index 731d0c7..5377b5b 100644 --- a/MetaballsKit/Renderer.swift +++ b/MetaballsKit/Renderer.swift @@ -45,7 +45,6 @@ public class Renderer: NSObject, MTKViewDelegate { delegate.field.setupMetal(withDevice: device) delegate.marchingSquares.setupMetal(withDevice: device, library: library) delegate.marchingSquares.populateGrid(withDevice: device) - delegate.marchingSquares.populateSamples(withDevice: device) } }