#include using namespace metal; template struct tint_array { const constant T& operator[](size_t i) const constant { return elements[i]; } device T& operator[](size_t i) device { return elements[i]; } const device T& operator[](size_t i) const device { return elements[i]; } thread T& operator[](size_t i) thread { return elements[i]; } const thread T& operator[](size_t i) const thread { return elements[i]; } threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } T elements[N]; }; struct tint_private_vars_struct { float2 rand_seed; }; struct RenderParams_tint_packed_vec3 { /* 0x0000 */ float4x4 modelViewProjectionMatrix; /* 0x0040 */ packed_float3 right; /* 0x004c */ tint_array tint_pad; /* 0x0050 */ packed_float3 up; /* 0x005c */ tint_array tint_pad_1; }; struct Particle_tint_packed_vec3 { /* 0x0000 */ packed_float3 position; /* 0x000c */ float lifetime; /* 0x0010 */ float4 color; /* 0x0020 */ float2 velocity; /* 0x0028 */ tint_array tint_pad_2; }; struct Particles_tint_packed_vec3 { /* 0x0000 */ tint_array particles; }; struct Particle { float3 position; float lifetime; float4 color; float2 velocity; }; Particle tint_unpack_vec3_in_composite(Particle_tint_packed_vec3 in) { Particle result = {}; result.position = float3(in.position); result.lifetime = in.lifetime; result.color = in.color; result.velocity = in.velocity; return result; } void asinh_468a48() { half arg_0 = 0.0h; half res = asinh(arg_0); } struct tint_symbol_1 { float4 value [[position]]; }; float4 vertex_main_inner() { asinh_468a48(); return float4(0.0f); } vertex tint_symbol_1 vertex_main() { float4 const inner_result = vertex_main_inner(); tint_symbol_1 wrapper_result = {}; wrapper_result.value = inner_result; return wrapper_result; } fragment void fragment_main() { asinh_468a48(); return; } kernel void rgba32uintin() { asinh_468a48(); return; } struct TestData { tint_array dmat2atxa2; }; struct RenderParams { float4x4 modelViewProjectionMatrix; float3 right; float3 up; }; struct VertexInput { float3 position; float4 color; float2 quad_pos; }; struct VertexOutput { float4 position; float4 color; float2 quad_pos; }; struct tint_symbol_3 { float3 position [[attribute(0)]]; float4 color [[attribute(1)]]; float2 quad_pos [[attribute(2)]]; }; struct tint_symbol_4 { float4 color [[user(locn0)]]; float2 quad_pos [[user(locn1)]]; float4 position [[position]]; }; VertexOutput vs_main_inner(VertexInput in, const constant RenderParams_tint_packed_vec3* const tint_symbol_6) { float3 quad_pos = (float2x3(float3((*(tint_symbol_6)).right), float3((*(tint_symbol_6)).up)) * in.quad_pos); float3 position = (in.position - (quad_pos + 0.00999999977648258209f)); VertexOutput out = {}; out.position = ((*(tint_symbol_6)).modelViewProjectionMatrix * float4(position, 1.0f)); out.color = in.color; out.quad_pos = in.quad_pos; return out; } vertex tint_symbol_4 vs_main(const constant RenderParams_tint_packed_vec3* tint_symbol_7 [[buffer(0)]], tint_symbol_3 tint_symbol_2 [[stage_in]]) { VertexInput const tint_symbol_5 = {.position=tint_symbol_2.position, .color=tint_symbol_2.color, .quad_pos=tint_symbol_2.quad_pos}; VertexOutput const inner_result_1 = vs_main_inner(tint_symbol_5, tint_symbol_7); tint_symbol_4 wrapper_result_1 = {}; wrapper_result_1.position = inner_result_1.position; wrapper_result_1.color = inner_result_1.color; wrapper_result_1.quad_pos = inner_result_1.quad_pos; return wrapper_result_1; } struct SimulationParams { /* 0x0000 */ float deltaTime; /* 0x0004 */ tint_array tint_pad_3; /* 0x0010 */ float4 seed; }; struct Particles { tint_array particles; }; void assign_and_preserve_padding(device Particle_tint_packed_vec3* const dest, Particle value) { (*(dest)).position = packed_float3(value.position); (*(dest)).lifetime = value.lifetime; (*(dest)).color = value.color; (*(dest)).velocity = value.velocity; } void simulate_inner(uint3 GlobalInvocationID, thread tint_private_vars_struct* const tint_private_vars, const constant SimulationParams* const tint_symbol_8, device Particles_tint_packed_vec3* const tint_symbol_9) { (*(tint_private_vars)).rand_seed = (((*(tint_symbol_8)).seed.xy * float2(GlobalInvocationID.xy)) * (*(tint_symbol_8)).seed.zw); uint const idx = GlobalInvocationID[0]; Particle particle = tint_unpack_vec3_in_composite((*(tint_symbol_9)).particles[idx]); assign_and_preserve_padding(&((*(tint_symbol_9)).particles[idx]), particle); } kernel void simulate(const constant SimulationParams* tint_symbol_10 [[buffer(1)]], device Particles_tint_packed_vec3* tint_symbol_11 [[buffer(2)]], uint3 GlobalInvocationID [[thread_position_in_grid]]) { thread tint_private_vars_struct tint_private_vars = {}; simulate_inner(GlobalInvocationID, &(tint_private_vars), tint_symbol_10, tint_symbol_11); return; } struct UBO { /* 0x0000 */ uint width; }; struct Buffer { /* 0x0000 */ tint_array weights; }; void export_level_inner(uint3 coord, texture2d tint_symbol_12, const constant UBO* const tint_symbol_13, const device Buffer* const tint_symbol_14, device Buffer* const tint_symbol_15) { if (all((coord.xy < uint2(uint2(tint_symbol_12.get_width(), tint_symbol_12.get_height()))))) { uint const dst_offset = (coord[0] << ((coord[1] * (*(tint_symbol_13)).width) & 31u)); uint const src_offset = ((coord[0] - 2u) + ((coord[1] >> 2u) * (*(tint_symbol_13)).width)); float const a = (*(tint_symbol_14)).weights[(src_offset << 0u)]; float const b = (*(tint_symbol_14)).weights[(src_offset + 1u)]; float const c = (*(tint_symbol_14)).weights[((src_offset + 1u) + (*(tint_symbol_13)).width)]; float const d = (*(tint_symbol_14)).weights[((src_offset + 1u) + (*(tint_symbol_13)).width)]; float const sum = dot(float4(a, b, c, d), float4(1.0f)); (*(tint_symbol_15)).weights[dst_offset] = fmod(sum, 4.0f); float4 const probabilities = (float4(a, (a * b), ((a / b) + c), sum) + fmax(sum, 0.0f)); tint_symbol_12.write(probabilities, uint2(int2(coord.xy))); } } kernel void export_level(texture2d tint_symbol_16 [[texture(0)]], const constant UBO* tint_symbol_17 [[buffer(3)]], const device Buffer* tint_symbol_18 [[buffer(4)]], device Buffer* tint_symbol_19 [[buffer(0)]], uint3 coord [[thread_position_in_grid]]) { export_level_inner(coord, tint_symbol_16, tint_symbol_17, tint_symbol_18, tint_symbol_19); return; }