git.iko.soy/metal-metaballs
on master help sign in
Refactored recent changes.
d4dc21avinivendra
PixelImage/MetalMetaballRenderer.swift+7−27
@@ -9,14 +9,6 @@
9import Metal
9import Metal
10import UIKit
10import UIKit
11
11
12−class TextureRef {
13− var texture: MTLTexture
14−
15− init(texture: MTLTexture) {
16− self.texture = texture
17− }
18−}
19−
20class MetalMetaballRenderer: MetaballRenderer {
12class MetalMetaballRenderer: MetaballRenderer {
21
13
22 typealias TargetView = UIImageView
14 typealias TargetView = UIImageView
@@ -30,7 +22,7 @@ class MetalMetaballRenderer: MetaballRenderer {
30 var previousSize = CGSize.zero
22 var previousSize = CGSize.zero
31
23
32 let context = MTLContext()
24 let context = MTLContext()
33− var renderingTexture: TextureRef!
25+ var renderingTexture: MTLTexture!
34 var imageBuffer: UnsafeMutablePointer<Void>!
26 var imageBuffer: UnsafeMutablePointer<Void>!
35
27
36 let dataSource: MetaballDataSource
28 let dataSource: MetaballDataSource
@@ -50,31 +42,17 @@ class MetalMetaballRenderer: MetaballRenderer {
50 updateFrame()
42 updateFrame()
51 }
43 }
52
44
53− if metalIsBusy {
54− dirty = true
55− return
56− } else {
57− metalIsBusy = true
58− dirty = false
59− }
60−
61 dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INTERACTIVE.rawValue), 0)) { () -> Void in
45 dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INTERACTIVE.rawValue), 0)) { () -> Void in
62
46
63 // Render graphics to metal texture
47 // Render graphics to metal texture
64 self.renderToRenderingTexture()
48 self.renderToRenderingTexture()
65− self.metalIsBusy = false
66
49
67 // Transform metal texture into image
50 // Transform metal texture into image
68− let uiimage = self.image(texture: self.renderingTexture.texture)
51+ let uiimage = self.createImageFromTexture()
69
52
70 dispatch_async(dispatch_get_main_queue(), { () -> Void in
53 dispatch_async(dispatch_get_main_queue(), { () -> Void in
71 // Send image to view
54 // Send image to view
72 self.targetView.image = uiimage
55 self.targetView.image = uiimage
73−
74− // If the image is dirty, update it
75− if self.dirty {
76− self.updateTargetView()
77− }
78 })
56 })
79 }
57 }
80 }
58 }
@@ -87,7 +65,7 @@ class MetalMetaballRenderer: MetaballRenderer {
87 let textureDescriptor =
65 let textureDescriptor =
88 MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
66 MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
89
67
90− renderingTexture = TextureRef(texture: context.device.newTextureWithDescriptor(textureDescriptor))
68+ renderingTexture = context.device.newTextureWithDescriptor(textureDescriptor)
91 }
69 }
92
70
93 let kernelFunction: MTLFunction?
71 let kernelFunction: MTLFunction?
@@ -107,7 +85,7 @@ class MetalMetaballRenderer: MetaballRenderer {
107
85
108 let commandEncoder = commandBuffer.computeCommandEncoder()
86 let commandEncoder = commandBuffer.computeCommandEncoder()
109 commandEncoder.setComputePipelineState(pipeline)
87 commandEncoder.setComputePipelineState(pipeline)
110− commandEncoder.setTexture(renderingTexture.texture, atIndex: 0)
88+ commandEncoder.setTexture(renderingTexture, atIndex: 0)
111 let metaballInfoBuffer = metaballBuffer()
89 let metaballInfoBuffer = metaballBuffer()
112 commandEncoder.setBuffer(metaballInfoBuffer, offset: 0, atIndex: 0)
90 commandEncoder.setBuffer(metaballInfoBuffer, offset: 0, atIndex: 0)
113 commandEncoder.dispatchThreadgroups(threadGroups,
91 commandEncoder.dispatchThreadgroups(threadGroups,
@@ -122,7 +100,9 @@ class MetalMetaballRenderer: MetaballRenderer {
122 }
100 }
123 }
101 }
124
102
125− func image(texture texture: MTLTexture) -> UIImage {
103+ func createImageFromTexture() -> UIImage {
104+ let texture = renderingTexture
105+
126 // Get image info
106 // Get image info
127 let imageSize = CGSizeMake(CGFloat(texture.width),
107 let imageSize = CGSizeMake(CGFloat(texture.width),
128 CGFloat(texture.height))
108 CGFloat(texture.height))