@@ -1,4 +1,3 @@
1−// TODO: Remove references to view size from shader
21// TODO: Make shader ignore metaballs that are outside a certain area of tolerance (eg ±100 from borders)
32
43// TODO: Metaballs from texture to buffer
@@ -130,11 +129,20 @@ class MetalMetaballRenderer: MetaballRenderer {
130129
131130 func metaballTexture(metaballs: [Metaball]) -> MTLTexture {
132131 // Create Float array for buffer
133− let floats: [Float] = metaballs.reduce([Float(metaballs.count)]) { (var array, metaball) -> [Float] in
134− array.append(Float(metaball.midX))
135− array.append(Float(metaball.midY))
132+ // Exclude metaballs far from the view's bounds
133+ let border: CGFloat = 100
134+ var floats: [Float] = metaballs.reduce([Float(0)]) { (var array, metaball) -> [Float] in
135+ let x = CGFloat(metaball.midX)
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))
141+ }
136142 return array
137143 }
144+ // Add array size to start of array so metal knows how far to go
145+ floats[0] = Float(floats.count) / 2
138146
139147 // Create texture
140148 let size = floats.count