// // MarchingSquares.swift // Metaballs // // Created by Eryn Wells on 10/11/18. // Copyright © 2018 Eryn Wells. All rights reserved. // import Foundation import Metal class MarchingSquares { private var field: Field private var sampleGridSize: Size /// Samples of the field's current state. private(set) var samples: MTLTexture? /// Indexes of geometry to render. private(set) var indexes: MTLTexture? 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) let samplesDesc = MTLTextureDescriptor() samplesDesc.textureType = .type2D samplesDesc.width = xSamples samplesDesc.height = ySamples samplesDesc.pixelFormat = .depth32Float samples = device.makeTexture(descriptor: samplesDesc) let indexesDesc = MTLTextureDescriptor() indexesDesc.textureType = .type2D indexesDesc.width = xSamples - 1 indexesDesc.height = ySamples - 1 indexesDesc.pixelFormat = .a8Unorm indexes = device.makeTexture(descriptor: indexesDesc) } func sampleField() { guard let samples = samples else { return } let xSamples = Int(field.size.x / sampleGridSize.x) let ySamples = Int(field.size.y / sampleGridSize.y) for xSample in 0...stride samples.replace(region: region, mipmapLevel: 0, withBytes: sample, bytesPerRow: bytesPerRow) } } } }