git.iko.soy/metal-metaballs
on master help sign in
Reduces the number of metaballs sent to the shader.
commit038568f3050b666011719c392e09ed297052146b authorvinivendra <vinivendra@gmail.com> dateWed 10 Feb 2016, 14:30 (11 years ago) parent369fb00
2 files changed+14−4
PixelImage/MetalMetaballRenderer.swift+12−4 PixelImage/UIKit.swift+2
PixelImage/MetalMetaballRenderer.swift+12−4
@@ -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
PixelImage/UIKit.swift+2
@@ -44,6 +44,8 @@ extension CGFloat: DoubleValuable {
4444 }
4545}
4646
47+extension CGFloat: Numeric {}
48+
4749extension CGRect {
4850 var x: CGFloat {
4951 get { return origin.x }