git.iko.soy/metal-metaballs
on master help sign in
Refactored init, remove protocol conformance (now useless).
b666890vinivendra
PixelImage/MetalMetaballRenderer.swift+13−12
@@ -11,7 +11,7 @@ import UIKit
11
11
12var i = 0
12var i = 0
13
13
14−class MetalMetaballRenderer: MetaballRenderer {
14+class MetalMetaballRenderer {
15
15
16 typealias TargetView = UIImageView
16 typealias TargetView = UIImageView
17
17
@@ -20,10 +20,10 @@ class MetalMetaballRenderer: MetaballRenderer {
20 }
20 }
21 }
21 }
22
22
23− let targetView = TargetView()
23+ let targetView: TargetView
24
24
25 let context = MTLContext()
25 let context = MTLContext()
26− var computeContext: MTLComputeContext!
26+ var computeContext: MTLComputeContext
27
27
28 let dataSource: MetaballDataSource
28 let dataSource: MetaballDataSource
29
29
@@ -46,8 +46,17 @@ class MetalMetaballRenderer: MetaballRenderer {
46 }
46 }
47 }
47 }
48
48
49− required init(dataSource: MetaballDataSource) {
49+ required init(dataSource: MetaballDataSource, frame: CGRect) {
50 self.dataSource = dataSource
50 self.dataSource = dataSource
51+
52+ targetView = TargetView(frame: frame)
53+
54+ let width = Int(frame.width)
55+ let height = Int(frame.height)
56+ let textureDescriptor =
57+ MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
58+ let texture = context.device.newTextureWithDescriptor(textureDescriptor)
59+ computeContext = MTLComputeContext(size: targetView.size, texture: texture)
51 }
60 }
52
61
53 func updateTargetView() {
62 func updateTargetView() {
@@ -81,14 +90,6 @@ class MetalMetaballRenderer: MetaballRenderer {
81 let width = Int(targetView.width)
90 let width = Int(targetView.width)
82 let height = Int(targetView.height)
91 let height = Int(targetView.height)
83
92
84− if computeContext == nil {
85− let textureDescriptor =
86− MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
87−
88− let texture = context.device.newTextureWithDescriptor(textureDescriptor)
89− computeContext = MTLComputeContext(size: targetView.size, texture: texture)
90− }
91−
92 let kernelFunction: MTLFunction?
93 let kernelFunction: MTLFunction?
93 let pipeline: MTLComputePipelineState
94 let pipeline: MTLComputePipelineState
94 do {
95 do {
PixelImage/ViewController.swift+1−4
@@ -20,16 +20,13 @@ class ViewController: UIViewController, MetaballDataSource {
20 override func viewDidLoad() {
20 override func viewDidLoad() {
21 super.viewDidLoad()
21 super.viewDidLoad()
22
22
23− renderer = Renderer(dataSource: self)
24−
25 let recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
23 let recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
26 view.addGestureRecognizer(recognizer)
24 view.addGestureRecognizer(recognizer)
27
25
28−
29 let border = 20
26 let border = 20
30 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
27 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
28+ renderer = Renderer(dataSource: self, frame: metaballViewFrame)
31 metaballView = renderer.targetView
29 metaballView = renderer.targetView
32− metaballView.frame = metaballViewFrame
33
30
34 let bigView = UIView(frame: CGRect(x: 10, y: 70, width: width + border, height: height + border))
31 let bigView = UIView(frame: CGRect(x: 10, y: 70, width: width + border, height: height + border))
35 bigView.backgroundColor = UIColor.redColor()
32 bigView.backgroundColor = UIColor.redColor()