[app,fw] Pass color information into the shader

This commit is contained in:
Eryn Wells 2017-08-08 11:52:48 -07:00
parent 48748f53e7
commit c84681559e
3 changed files with 48 additions and 44 deletions

View file

@ -27,6 +27,13 @@ typedef struct {
typedef struct { typedef struct {
short2 size; short2 size;
ushort numberOfBalls; ushort numberOfBalls;
ushort unused1;
uint unused2;
ushort unused3;
ushort colorStyle;
float4 colors[4];
} Parameters; } Parameters;
typedef float3 Ball; typedef float3 Ball;

View file

@ -15,3 +15,11 @@ extension UnsafeMutableRawPointer {
return advanced(by: stride) return advanced(by: stride)
} }
} }
/// Metal's float4 type. 4 bytes per float, 16 bytes total, 16 byte aligned.
struct Float4 {
var x: Float = 0
var y: Float = 0
var z: Float = 0
var w: Float = 0
}

View file

@ -13,58 +13,47 @@ public enum MetaballsError: Error {
case metalError(String) case metalError(String)
} }
public enum ColorStyle: UInt16 {
/// Single flat color
case singleColor = 1
/// Two color horizontal gradient
case gradient2Horizontal = 2
/// Two color vertical gradient
case gradient2Vertical = 3
/// Four color gradient from corners
case gradient4Corners = 4
/// Four color gradient from middle of sides
case gradient4Sides = 5
}
public struct Parameters { public struct Parameters {
/// Metal's short type. 2 bytes, 2 byte aligned
typealias Short = UInt16
/// Metal's short2 type. 2 bytes per int, 4 bytes, 4 byte aligned
typealias Short2 = (UInt16, UInt16)
/// Metal's float4 type. 4 bytes per float, 16 bytes total, 16 byte aligned.
typealias Color4 = (r: Float, g: Float, b: Float, a: Float)
// Simulation parameters
var size: Size
var numberOfBalls: Short
// 4 bytes unused
// Color parameters
var topLeft: Color4
var topRight: Color4
var bottomLeft: Color4
var bottomRight: Color4
public static var size: Int { public static var size: Int {
var size = 0 let size = MemoryLayout<Parameters>.stride
size += MemoryLayout<Size>.stride
size += MemoryLayout<Short>.stride
size += 2+8
size += 4 * MemoryLayout<Color4>.stride
return size return size
} }
public init() { // Simulation parameters
size = Size(width: 0, height: 0) var size = Size(width: 0, height: 0)
numberOfBalls = 0 var numberOfBalls: Short = 0
topLeft = (0, 0, 0, 0)
topRight = (0, 0, 0, 0) let unused1: UInt16 = 0xAB
bottomLeft = (0, 0, 0, 0) let unused2: UInt32 = 0xCDEF
bottomRight = (0, 0, 0, 0) let unused3: UInt16 = 0xBA
}
// Color parameters
var colorStyle = ColorStyle.gradient2Horizontal
var color0 = Float4()
var color1 = Float4()
var color2 = Float4()
var color3 = Float4()
public mutating func write(to buffer: MTLBuffer, offset: Int = 0) { public mutating func write(to buffer: MTLBuffer, offset: Int = 0) {
let start = buffer.contents().advanced(by: offset) let head = buffer.contents()
var ptr = start let start = head.advanced(by: offset)
let simBegin = ptr let stride = MemoryLayout.stride(ofValue: self)
ptr = ptr.writeAndAdvance(value: &size) start.copyBytes(from: &self, count: stride)
ptr = ptr.writeAndAdvance(value: &numberOfBalls)
ptr = ptr.advanced(by: 2+8) // Skip 10 bytes to maintain alignment.
let simLength = simBegin.distance(to: ptr)
buffer.addDebugMarker("Simulation Parameters", range: NSRange(location: start.distance(to: simBegin), length: simLength))
ptr = ptr.writeAndAdvance(value: &topLeft)
ptr = ptr.writeAndAdvance(value: &topRight)
ptr = ptr.writeAndAdvance(value: &bottomLeft)
ptr = ptr.writeAndAdvance(value: &bottomRight)
NSLog("Populated parameters: size:\(size), n:\(numberOfBalls)") NSLog("Populated parameters: size:\(size), n:\(numberOfBalls)")
} }
@ -200,7 +189,7 @@ public class Field {
} }
if let parametersBuffer = parametersBuffer { if let parametersBuffer = parametersBuffer {
parameters.numberOfBalls = Parameters.Short(balls.count) parameters.numberOfBalls = Short(balls.count)
self.parameters.write(to: parametersBuffer) self.parameters.write(to: parametersBuffer)
} }
} }