git.iko.soy/metal-metaballs
on master help sign in
Refactored renderers to keep internal instances (instead of requesting info at every call).
commitc124fcf953fe56d1425c9a3b8ef959b720343897 authorvinivendra <vinivendra@gmail.com> dateWed 10 Feb 2016, 13:35 (11 years ago) parente66dd09
6 files changed+39−23
PixelImage.xcodeproj/project.xcworkspace/xcuserdata/vini.xcuserdatad/UserInterfaceState.xcuserstate PixelImage.xcodeproj/xcuserdata/vini.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist+4−4 PixelImage/ImageMetaballRenderer.swift+12−4 PixelImage/MetaballRenderer.swift+4−6 PixelImage/MetalMetaballRenderer.swift+12−4 PixelImage/ViewController.swift+7−5
PixelImage.xcodeproj/project.xcworkspace/xcuserdata/vini.xcuserdatad/UserInterfaceState.xcuserstate

Binary file not shown.

PixelImage.xcodeproj/xcuserdata/vini.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist+4−4
@@ -10,12 +10,12 @@
1010 ignoreCount = "0"
1111 continueAfterRunningActions = "No"
1212 filePath = "PixelImage/MetalMetaballRenderer.swift"
13− timestampString = "476821456.932302"
13+ timestampString = "476822048.152874"
1414 startingColumnNumber = "9223372036854775807"
1515 endingColumnNumber = "9223372036854775807"
16− startingLineNumber = "69"
17− endingLineNumber = "69"
18− landmarkName = "updateTargetView(_:dataSource:)"
16+ startingLineNumber = "77"
17+ endingLineNumber = "77"
18+ landmarkName = "updateTargetView()"
1919 landmarkType = "5">
2020 </BreakpointContent>
2121 </BreakpointProxy>
PixelImage/ImageMetaballRenderer.swift+12−4
@@ -4,9 +4,17 @@ import UIKit
44class ImageMetaballRenderer: MetaballRenderer {
55 typealias TargetView = UIImageView
66
7− func updateTargetView(imageView: TargetView, dataSource: MetaballDataSource) {
8− let width = Int(imageView.width)
9− let height = Int(imageView.height)
7+ let targetView = TargetView()
8+
9+ let dataSource: MetaballDataSource
10+
11+ required init(dataSource: MetaballDataSource) {
12+ self.dataSource = dataSource
13+ }
14+
15+ func updateTargetView() {
16+ let width = Int(targetView.width)
17+ let height = Int(targetView.height)
1018 let metaballs = dataSource.metaballs
1119
1220 let bytesPerPixel = 4;
@@ -57,7 +65,7 @@ class ImageMetaballRenderer: MetaballRenderer {
5765
5866 let cgImage = CGBitmapContextCreateImage(context)
5967 let image = UIImage(CGImage: cgImage!)
60− imageView.image = image
68+ targetView.image = image
6169 }
6270}
6371
PixelImage/MetaballRenderer.swift+4−6
@@ -8,11 +8,9 @@ protocol MetaballDataSource {
88protocol MetaballRenderer {
99 typealias TargetView: UIView
1010
11− func updateTargetView(targetView: TargetView, dataSource: MetaballDataSource)
12−}
11+ var targetView: TargetView { get }
12+
13+ init(dataSource: MetaballDataSource)
1314
14−extension MetaballRenderer {
15− func createTargetView(frame frame: CGRect) -> TargetView {
16− return TargetView(frame: frame)
17− }
15+ func updateTargetView()
1816}
PixelImage/MetalMetaballRenderer.swift+12−4
@@ -20,14 +20,22 @@ class MetalMetaballRenderer: MetaballRenderer {
2020
2121 typealias TargetView = UIImageView
2222
23+ let targetView = TargetView()
24+
2325 let context = MTLContext()
2426 var internalTexture: MTLTexture!
2527
26− func updateTargetView(imageView: UIImageView, dataSource: MetaballDataSource) {
28+ let dataSource: MetaballDataSource
29+
30+ required init(dataSource: MetaballDataSource) {
31+ self.dataSource = dataSource
32+ }
33+
34+ func updateTargetView() {
2735 let metaballs = dataSource.metaballs
2836
29− let width = Int(imageView.width)
30− let height = Int(imageView.height)
37+ let width = Int(targetView.width)
38+ let height = Int(targetView.height)
3139
3240 if internalTexture == nil {
3341 let textureDescriptor =
@@ -69,7 +77,7 @@ class MetalMetaballRenderer: MetaballRenderer {
6977 print("Error!")
7078 }
7179
72− imageView.image = image(texture: internalTexture)
80+ targetView.image = image(texture: internalTexture)
7381 }
7482
7583 func image(texture texture: MTLTexture) -> UIImage {
PixelImage/ViewController.swift+7−5
@@ -8,7 +8,7 @@ class ViewController: UIViewController, MetaballDataSource {
88 typealias TargetView = Renderer.TargetView
99
1010 var metaballView: TargetView!
11− let renderer = Renderer()
11+ var renderer: Renderer!
1212
1313 let width = 350
1414 let height = 600
@@ -21,6 +21,7 @@ class ViewController: UIViewController, MetaballDataSource {
2121 override func viewDidLoad() {
2222 super.viewDidLoad()
2323
24+ renderer = Renderer(dataSource: self)
2425
2526 let recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
2627 view.addGestureRecognizer(recognizer)
@@ -28,7 +29,8 @@ class ViewController: UIViewController, MetaballDataSource {
2829
2930 let border = 20
3031 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
31− metaballView = renderer.createTargetView(frame: metaballViewFrame)
32+ metaballView = renderer.targetView
33+ metaballView.frame = metaballViewFrame
3234
3335 let bigView = UIView(frame: CGRect(x: 10, y: 70, width: width + border, height: height + border))
3436 bigView.backgroundColor = UIColor.redColor()
@@ -41,7 +43,7 @@ class ViewController: UIViewController, MetaballDataSource {
4143 }
4244
4345
44− renderer.updateTargetView(metaballView, dataSource: self)
46+ renderer.updateTargetView()
4547 }
4648
4749 func handlePan(recognizer: UIPanGestureRecognizer) {
@@ -58,10 +60,10 @@ class ViewController: UIViewController, MetaballDataSource {
5860 selectedMetaball?.middle = location
5961
6062 if recognizer.state == .Changed && dynamicRendering {
61− renderer.updateTargetView(metaballView, dataSource: self)
63+ renderer.updateTargetView()
6264 }
6365 if recognizer.state == .Ended {
64− renderer.updateTargetView(metaballView, dataSource: self)
66+ renderer.updateTargetView()
6567 }
6668 }
6769}