git.iko.soy/metal-metaballs
on master help sign in
Refactored texture allocation.
commit22a5e7615f355d2c154e71c15a625b39c81c8fd4 authorvinivendra <vinivendra@gmail.com> dateWed 10 Feb 2016, 13:24 (11 years ago) parentae06ca5
3 files changed+23−14
PixelImage.xcodeproj/project.xcworkspace/xcuserdata/vini.xcuserdatad/UserInterfaceState.xcuserstate PixelImage.xcodeproj/xcuserdata/vini.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist+3−3 PixelImage/MetalMetaballRenderer.swift+20−11
PixelImage.xcodeproj/project.xcworkspace/xcuserdata/vini.xcuserdatad/UserInterfaceState.xcuserstate

Binary file not shown.

PixelImage.xcodeproj/xcuserdata/vini.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist+3−3
@@ -10,11 +10,11 @@
1010 ignoreCount = "0"
1111 continueAfterRunningActions = "No"
1212 filePath = "PixelImage/MetalMetaballRenderer.swift"
13− timestampString = "476814708.217603"
13+ timestampString = "476821456.932302"
1414 startingColumnNumber = "9223372036854775807"
1515 endingColumnNumber = "9223372036854775807"
16− startingLineNumber = "62"
17− endingLineNumber = "62"
16+ startingLineNumber = "69"
17+ endingLineNumber = "69"
1818 landmarkName = "updateTargetView(_:dataSource:)"
1919 landmarkType = "5">
2020 </BreakpointContent>
PixelImage/MetalMetaballRenderer.swift+20−11
@@ -1,7 +1,12 @@
1−// TODO: Render metaballs on layer/view instead of image
1+// TODO: Optimize resources (don't allocate textures and images every frame)
22// TODO: Remove references to view size from shader
33// TODO: Make shader ignore metaballs that are outside a certain area of tolerance (eg ±100 from borders)
44
5+// TODO: Metaballs from texture to buffer
6+// TODO: Use async dispatch to free up main queue
7+// TODO: Refactor update into 2 calls: metalRendering() and textureToImage()
8+// TODO: Use two textures/images to alternate the 2 calls (like OpenGL double buffers)
9+
510// TODO: Make graphics have edges only according to graph (instead of being a complete graph)
611
712// TODO: Interpolate metaball colors
@@ -16,30 +21,34 @@ class MetalMetaballRenderer: MetaballRenderer {
1621 typealias TargetView = UIImageView
1722
1823 static let context = MTLContext()
24+ static var internalTexture: MTLTexture!
1925
2026 static func updateTargetView(imageView: UIImageView, dataSource: MetaballDataSource) {
2127 let metaballs = dataSource.metaballs
2228
29+ let width = Int(imageView.width)
30+ let height = Int(imageView.height)
31+
32+ if internalTexture == nil {
33+ let textureDescriptor =
34+ MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
35+
36+ internalTexture = context.device.newTextureWithDescriptor(textureDescriptor)
37+ }
38+
2339 let kernelFunction: MTLFunction?
2440 let pipeline: MTLComputePipelineState
25− var internalTexture: MTLTexture! = nil
26−
2741 do {
42+ // Get long-lived objects
2843 kernelFunction = context.library.newFunctionWithName("drawMetaballs")
2944 pipeline = try context.device.newComputePipelineStateWithFunction(kernelFunction!)
3045
31− let width = Int(imageView.width)
32− let height = Int(imageView.height)
33−
34− let textureDescriptor =
35− MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
36−
37− internalTexture = context.device.newTextureWithDescriptor(textureDescriptor)
46+ // Configure info for computing
3847 let threadGroupCounts = MTLSizeMake(8, 8, 1)
3948 let threadGroups = MTLSizeMake(width / threadGroupCounts.width,
4049 height / threadGroupCounts.height, 1)
4150
42− //
51+ // Create up-to-date metaball buffer
4352 let metaballInfoTexture = metaballTexture(metaballs)
4453
4554 //