[app,fw] Pass color information into the shader
This commit is contained in:
parent
48748f53e7
commit
c84681559e
3 changed files with 48 additions and 44 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue