git.iko.soy/metal-metaballs
on master help sign in
Refactored MetaballRenderer to manage instances instead of classes.
e66dd09vinivendra
PixelImage.xcodeproj/project.xcworkspace/xcuserdata/vini.xcuserdatad/UserInterfaceState.xcuserstate

Binary file not shown.

PixelImage/ImageMetaballRenderer.swift+1−1
@@ -4,7 +4,7 @@ import UIKit
4class ImageMetaballRenderer: MetaballRenderer {
4class ImageMetaballRenderer: MetaballRenderer {
5 typealias TargetView = UIImageView
5 typealias TargetView = UIImageView
6
6
7− static func updateTargetView(imageView: TargetView, dataSource: MetaballDataSource) {
7+ func updateTargetView(imageView: TargetView, dataSource: MetaballDataSource) {
8 let width = Int(imageView.width)
8 let width = Int(imageView.width)
9 let height = Int(imageView.height)
9 let height = Int(imageView.height)
10 let metaballs = dataSource.metaballs
10 let metaballs = dataSource.metaballs
PixelImage/MetaballRenderer.swift+2−2
@@ -8,11 +8,11 @@ protocol MetaballDataSource {
8protocol MetaballRenderer {
8protocol MetaballRenderer {
9 typealias TargetView: UIView
9 typealias TargetView: UIView
10
10
11− static func updateTargetView(targetView: TargetView, dataSource: MetaballDataSource)
11+ func updateTargetView(targetView: TargetView, dataSource: MetaballDataSource)
12}
12}
13
13
14extension MetaballRenderer {
14extension MetaballRenderer {
15− static func createTargetView(frame frame: CGRect) -> TargetView {
15+ func createTargetView(frame frame: CGRect) -> TargetView {
16 return TargetView(frame: frame)
16 return TargetView(frame: frame)
17 }
17 }
18}
18}
PixelImage/MetalMetaballRenderer.swift+5−5
@@ -20,10 +20,10 @@ class MetalMetaballRenderer: MetaballRenderer {
20
20
21 typealias TargetView = UIImageView
21 typealias TargetView = UIImageView
22
22
23− static let context = MTLContext()
23+ let context = MTLContext()
24− static var internalTexture: MTLTexture!
24+ var internalTexture: MTLTexture!
25
25
26− static func updateTargetView(imageView: UIImageView, dataSource: MetaballDataSource) {
26+ func updateTargetView(imageView: UIImageView, dataSource: MetaballDataSource) {
27 let metaballs = dataSource.metaballs
27 let metaballs = dataSource.metaballs
28
28
29 let width = Int(imageView.width)
29 let width = Int(imageView.width)
@@ -72,7 +72,7 @@ class MetalMetaballRenderer: MetaballRenderer {
72 imageView.image = image(texture: internalTexture)
72 imageView.image = image(texture: internalTexture)
73 }
73 }
74
74
75− static func image(texture texture: MTLTexture) -> UIImage {
75+ func image(texture texture: MTLTexture) -> UIImage {
76 let imageSize = CGSizeMake(CGFloat(texture.width),
76 let imageSize = CGSizeMake(CGFloat(texture.width),
77 CGFloat(texture.height))
77 CGFloat(texture.height))
78
78
@@ -109,7 +109,7 @@ class MetalMetaballRenderer: MetaballRenderer {
109 return image
109 return image
110 }
110 }
111
111
112− static func metaballTexture(metaballs: [Metaball]) -> MTLTexture {
112+ func metaballTexture(metaballs: [Metaball]) -> MTLTexture {
113 let floats: [Float] = metaballs.reduce([Float(metaballs.count)]) { (var array, metaball) -> [Float] in
113 let floats: [Float] = metaballs.reduce([Float(metaballs.count)]) { (var array, metaball) -> [Float] in
114 array.append(Float(metaball.midX))
114 array.append(Float(metaball.midX))
115 array.append(Float(metaball.midY))
115 array.append(Float(metaball.midY))
PixelImage/ViewController.swift+5−4
@@ -8,6 +8,7 @@ class ViewController: UIViewController, MetaballDataSource {
8 typealias TargetView = Renderer.TargetView
8 typealias TargetView = Renderer.TargetView
9
9
10 var metaballView: TargetView!
10 var metaballView: TargetView!
11+ let renderer = Renderer()
11
12
12 let width = 350
13 let width = 350
13 let height = 600
14 let height = 600
@@ -27,7 +28,7 @@ class ViewController: UIViewController, MetaballDataSource {
27
28
28 let border = 20
29 let border = 20
29 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
30 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
30− metaballView = Renderer.createTargetView(frame: metaballViewFrame)
31+ metaballView = renderer.createTargetView(frame: metaballViewFrame)
31
32
32 let bigView = UIView(frame: CGRect(x: 10, y: 70, width: width + border, height: height + border))
33 let bigView = UIView(frame: CGRect(x: 10, y: 70, width: width + border, height: height + border))
33 bigView.backgroundColor = UIColor.redColor()
34 bigView.backgroundColor = UIColor.redColor()
@@ -40,7 +41,7 @@ class ViewController: UIViewController, MetaballDataSource {
40 }
41 }
41
42
42
43
43− Renderer.updateTargetView(metaballView, dataSource: self)
44+ renderer.updateTargetView(metaballView, dataSource: self)
44 }
45 }
45
46
46 func handlePan(recognizer: UIPanGestureRecognizer) {
47 func handlePan(recognizer: UIPanGestureRecognizer) {
@@ -57,10 +58,10 @@ class ViewController: UIViewController, MetaballDataSource {
57 selectedMetaball?.middle = location
58 selectedMetaball?.middle = location
58
59
59 if recognizer.state == .Changed && dynamicRendering {
60 if recognizer.state == .Changed && dynamicRendering {
60− Renderer.updateTargetView(metaballView, dataSource: self)
61+ renderer.updateTargetView(metaballView, dataSource: self)
61 }
62 }
62 if recognizer.state == .Ended {
63 if recognizer.state == .Ended {
63− Renderer.updateTargetView(metaballView, dataSource: self)
64+ renderer.updateTargetView(metaballView, dataSource: self)
64 }
65 }
65 }
66 }
66}
67}