@@ -11,7 +11,7 @@ import UIKit
14−class MetalMetaballRenderer: MetaballRenderer {
14+class MetalMetaballRenderer {
16 typealias TargetView = UIImageView
16 typealias TargetView = UIImageView
@@ -20,10 +20,10 @@ class MetalMetaballRenderer: MetaballRenderer {
23− let targetView = TargetView()
23+ let targetView: TargetView
25 let context = MTLContext()
25 let context = MTLContext()
26− var computeContext: MTLComputeContext!
26+ var computeContext: MTLComputeContext
28 let dataSource: MetaballDataSource
28 let dataSource: MetaballDataSource
@@ -46,8 +46,17 @@ class MetalMetaballRenderer: MetaballRenderer {
49− required init(dataSource: MetaballDataSource) {
49+ required init(dataSource: MetaballDataSource, frame: CGRect) {
50 self.dataSource = dataSource
50 self.dataSource = dataSource
52+ targetView = TargetView(frame: frame)
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)
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)
84− if computeContext == nil {
85− let textureDescriptor =
86− MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
88− let texture = context.device.newTextureWithDescriptor(textureDescriptor)
89− computeContext = MTLComputeContext(size: targetView.size, texture: texture)
92 let kernelFunction: MTLFunction?
93 let kernelFunction: MTLFunction?
93 let pipeline: MTLComputePipelineState
94 let pipeline: MTLComputePipelineState