@@ -1,4 +1,3 @@
1−// TODO: Remove references to view size from shader
2// TODO: Make shader ignore metaballs that are outside a certain area of tolerance (eg ±100 from borders)
1// TODO: Make shader ignore metaballs that are outside a certain area of tolerance (eg ±100 from borders)
4// TODO: Metaballs from texture to buffer
3// TODO: Metaballs from texture to buffer
@@ -130,11 +129,20 @@ class MetalMetaballRenderer: MetaballRenderer {
131 func metaballTexture(metaballs: [Metaball]) -> MTLTexture {
130 func metaballTexture(metaballs: [Metaball]) -> MTLTexture {
132 // Create Float array for buffer
131 // Create Float array for buffer
132+ // Exclude metaballs far from the view's bounds
133+ let border: CGFloat = 100
133− let floats: [Float] = metaballs.reduce([Float(metaballs.count)]) { (var array, metaball) -> [Float] in
134+ var floats: [Float] = metaballs.reduce([Float(0)]) { (var array, metaball) -> [Float] in
134− array.append(Float(metaball.midX))
135+ let x = CGFloat(metaball.midX)
135− array.append(Float(metaball.midY))
136+ let y = CGFloat(metaball.midY)
137+ if -border < x ≤ targetView.width + border &&
138+ -border < y ≤ targetView.height + border {
139+ array.append(Float(x))
140+ array.append(Float(y))
136 return array
142 return array
144+ // Add array size to start of array so metal knows how far to go
145+ floats[0] = Float(floats.count) / 2
139 // Create texture
147 // Create texture
140 let size = floats.count
148 let size = floats.count