#include using namespace metal; template inline vec operator*(matrix lhs, packed_vec rhs) { return lhs * vec(rhs); } template inline vec operator*(packed_vec lhs, matrix rhs) { return vec(lhs) * rhs; } struct tint_array_wrapper { /* 0x0000 */ uint arr[256]; }; struct tint_array_wrapper_1 { /* 0x0000 */ int arr[4096]; }; struct Tables { /* 0x0000 */ tint_array_wrapper edges; /* 0x0400 */ tint_array_wrapper_1 tris; }; struct IsosurfaceVolume { /* 0x0000 */ packed_float3 min; /* 0x000c */ int8_t tint_pad[4]; /* 0x0010 */ packed_float3 max; /* 0x001c */ int8_t tint_pad_1[4]; /* 0x0020 */ packed_float3 step; /* 0x002c */ int8_t tint_pad_2[4]; /* 0x0030 */ packed_uint3 size; /* 0x003c */ float threshold; /* 0x0040 */ float values[1]; /* 0x0044 */ int8_t tint_pad_3[12]; }; struct PositionBuffer { /* 0x0000 */ float values[1]; }; struct NormalBuffer { /* 0x0000 */ float values[1]; }; struct IndexBuffer { /* 0x0000 */ uint tris[1]; }; struct DrawIndirectArgs { /* 0x0000 */ uint vc; /* 0x0004 */ atomic_uint vertexCount; /* 0x0008 */ uint firstVertex; /* 0x000c */ uint firstInstance; /* 0x0010 */ atomic_uint indexCount; /* 0x0014 */ uint indexedInstanceCount; /* 0x0018 */ uint indexedFirstIndex; /* 0x001c */ uint indexedBaseVertex; /* 0x0020 */ uint indexedFirstInstance; }; struct tint_array_wrapper_2 { float3 arr[12]; }; struct tint_array_wrapper_3 { uint arr[12]; }; float valueAt(uint3 index, device IsosurfaceVolume* const tint_symbol) { if (any((index >= (*(tint_symbol)).size))) { return 0.0f; } uint const valueIndex = ((index[0] + (index[1] * (*(tint_symbol)).size[0])) + ((index[2] * (*(tint_symbol)).size[0]) * (*(tint_symbol)).size[1])); return (*(tint_symbol)).values[valueIndex]; } float3 positionAt(uint3 index, device IsosurfaceVolume* const tint_symbol_1) { return ((*(tint_symbol_1)).min + ((*(tint_symbol_1)).step * float3(uint3(index).xyz))); } float3 normalAt(uint3 index, device IsosurfaceVolume* const tint_symbol_2) { return float3((valueAt((index - uint3(1u, 0u, 0u)), tint_symbol_2) - valueAt((index + uint3(1u, 0u, 0u)), tint_symbol_2)), (valueAt((index - uint3(0u, 1u, 0u)), tint_symbol_2) - valueAt((index + uint3(0u, 1u, 0u)), tint_symbol_2)), (valueAt((index - uint3(0u, 0u, 1u)), tint_symbol_2) - valueAt((index + uint3(0u, 0u, 1u)), tint_symbol_2))); } void interpX(uint index, uint3 i, float va, float vb, device IsosurfaceVolume* const tint_symbol_3, thread tint_array_wrapper_2* const tint_symbol_4, thread uint* const tint_symbol_5, thread tint_array_wrapper_2* const tint_symbol_6, thread tint_array_wrapper_3* const tint_symbol_7) { float const mu = (((*(tint_symbol_3)).threshold - va) / (vb - va)); (*(tint_symbol_4)).arr[*(tint_symbol_5)] = (positionAt(i, tint_symbol_3) + float3(((*(tint_symbol_3)).step[0] * mu), 0.0f, 0.0f)); float3 const na = normalAt(i, tint_symbol_3); float3 const nb = normalAt((i + uint3(1u, 0u, 0u)), tint_symbol_3); (*(tint_symbol_6)).arr[*(tint_symbol_5)] = mix(na, nb, float3(mu, mu, mu)); (*(tint_symbol_7)).arr[index] = *(tint_symbol_5); *(tint_symbol_5) = (*(tint_symbol_5) + 1u); } void interpY(uint index, uint3 i, float va, float vb, device IsosurfaceVolume* const tint_symbol_8, thread tint_array_wrapper_2* const tint_symbol_9, thread uint* const tint_symbol_10, thread tint_array_wrapper_2* const tint_symbol_11, thread tint_array_wrapper_3* const tint_symbol_12) { float const mu = (((*(tint_symbol_8)).threshold - va) / (vb - va)); (*(tint_symbol_9)).arr[*(tint_symbol_10)] = (positionAt(i, tint_symbol_8) + float3(0.0f, ((*(tint_symbol_8)).step[1] * mu), 0.0f)); float3 const na = normalAt(i, tint_symbol_8); float3 const nb = normalAt((i + uint3(0u, 1u, 0u)), tint_symbol_8); (*(tint_symbol_11)).arr[*(tint_symbol_10)] = mix(na, nb, float3(mu, mu, mu)); (*(tint_symbol_12)).arr[index] = *(tint_symbol_10); *(tint_symbol_10) = (*(tint_symbol_10) + 1u); } void interpZ(uint index, uint3 i, float va, float vb, device IsosurfaceVolume* const tint_symbol_13, thread tint_array_wrapper_2* const tint_symbol_14, thread uint* const tint_symbol_15, thread tint_array_wrapper_2* const tint_symbol_16, thread tint_array_wrapper_3* const tint_symbol_17) { float const mu = (((*(tint_symbol_13)).threshold - va) / (vb - va)); (*(tint_symbol_14)).arr[*(tint_symbol_15)] = (positionAt(i, tint_symbol_13) + float3(0.0f, 0.0f, ((*(tint_symbol_13)).step[2] * mu))); float3 const na = normalAt(i, tint_symbol_13); float3 const nb = normalAt((i + uint3(0u, 0u, 1u)), tint_symbol_13); (*(tint_symbol_16)).arr[*(tint_symbol_15)] = mix(na, nb, float3(mu, mu, mu)); (*(tint_symbol_17)).arr[index] = *(tint_symbol_15); *(tint_symbol_15) = (*(tint_symbol_15) + 1u); } void computeMain_inner(uint3 global_id, device IsosurfaceVolume* const tint_symbol_18, const device Tables* const tint_symbol_19, thread tint_array_wrapper_2* const tint_symbol_20, thread uint* const tint_symbol_21, thread tint_array_wrapper_2* const tint_symbol_22, thread tint_array_wrapper_3* const tint_symbol_23, device DrawIndirectArgs* const tint_symbol_24, device PositionBuffer* const tint_symbol_25, device NormalBuffer* const tint_symbol_26, device IndexBuffer* const tint_symbol_27) { uint3 const i0 = global_id; uint3 const i1 = (global_id + uint3(1u, 0u, 0u)); uint3 const i2 = (global_id + uint3(1u, 1u, 0u)); uint3 const i3 = (global_id + uint3(0u, 1u, 0u)); uint3 const i4 = (global_id + uint3(0u, 0u, 1u)); uint3 const i5 = (global_id + uint3(1u, 0u, 1u)); uint3 const i6 = (global_id + uint3(1u, 1u, 1u)); uint3 const i7 = (global_id + uint3(0u, 1u, 1u)); float const v0 = valueAt(i0, tint_symbol_18); float const v1 = valueAt(i1, tint_symbol_18); float const v2 = valueAt(i2, tint_symbol_18); float const v3 = valueAt(i3, tint_symbol_18); float const v4 = valueAt(i4, tint_symbol_18); float const v5 = valueAt(i5, tint_symbol_18); float const v6 = valueAt(i6, tint_symbol_18); float const v7 = valueAt(i7, tint_symbol_18); uint cubeIndex = 0u; if ((v0 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 1u); } if ((v1 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 2u); } if ((v2 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 4u); } if ((v3 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 8u); } if ((v4 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 16u); } if ((v5 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 32u); } if ((v6 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 64u); } if ((v7 < (*(tint_symbol_18)).threshold)) { cubeIndex = (cubeIndex | 128u); } uint const edges = (*(tint_symbol_19)).edges.arr[cubeIndex]; if (((edges & 1u) != 0u)) { interpX(0u, i0, v0, v1, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 2u) != 0u)) { interpY(1u, i1, v1, v2, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 4u) != 0u)) { interpX(2u, i3, v3, v2, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 8u) != 0u)) { interpY(3u, i0, v0, v3, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 16u) != 0u)) { interpX(4u, i4, v4, v5, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 32u) != 0u)) { interpY(5u, i5, v5, v6, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 64u) != 0u)) { interpX(6u, i7, v7, v6, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 128u) != 0u)) { interpY(7u, i4, v4, v7, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 256u) != 0u)) { interpZ(8u, i0, v0, v4, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 512u) != 0u)) { interpZ(9u, i1, v1, v5, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 1024u) != 0u)) { interpZ(10u, i2, v2, v6, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } if (((edges & 2048u) != 0u)) { interpZ(11u, i3, v3, v7, tint_symbol_18, tint_symbol_20, tint_symbol_21, tint_symbol_22, tint_symbol_23); } uint const triTableOffset = ((cubeIndex << 4u) + 1u); uint const indexCount = uint((*(tint_symbol_19)).tris.arr[(triTableOffset - 1u)]); uint firstVertex = atomic_fetch_add_explicit(&((*(tint_symbol_24)).vertexCount), *(tint_symbol_21), memory_order_relaxed); uint const bufferOffset = ((global_id[0] + (global_id[1] * (*(tint_symbol_18)).size[0])) + ((global_id[2] * (*(tint_symbol_18)).size[0]) * (*(tint_symbol_18)).size[1])); uint const firstIndex = (bufferOffset * 15u); for(uint i = 0u; (i < *(tint_symbol_21)); i = (i + 1u)) { (*(tint_symbol_25)).values[((firstVertex * 3u) + (i * 3u))] = (*(tint_symbol_20)).arr[i][0]; (*(tint_symbol_25)).values[(((firstVertex * 3u) + (i * 3u)) + 1u)] = (*(tint_symbol_20)).arr[i][1]; (*(tint_symbol_25)).values[(((firstVertex * 3u) + (i * 3u)) + 2u)] = (*(tint_symbol_20)).arr[i][2]; (*(tint_symbol_26)).values[((firstVertex * 3u) + (i * 3u))] = (*(tint_symbol_22)).arr[i][0]; (*(tint_symbol_26)).values[(((firstVertex * 3u) + (i * 3u)) + 1u)] = (*(tint_symbol_22)).arr[i][1]; (*(tint_symbol_26)).values[(((firstVertex * 3u) + (i * 3u)) + 2u)] = (*(tint_symbol_22)).arr[i][2]; } for(uint i = 0u; (i < indexCount); i = (i + 1u)) { int const index = (*(tint_symbol_19)).tris.arr[(triTableOffset + i)]; (*(tint_symbol_27)).tris[(firstIndex + i)] = (firstVertex + (*(tint_symbol_23)).arr[index]); } for(uint i = indexCount; (i < 15u); i = (i + 1u)) { (*(tint_symbol_27)).tris[(firstIndex + i)] = firstVertex; } } kernel void computeMain(device IsosurfaceVolume* tint_symbol_28 [[buffer(0)]], const device Tables* tint_symbol_29 [[buffer(5)]], device DrawIndirectArgs* tint_symbol_34 [[buffer(1)]], device PositionBuffer* tint_symbol_35 [[buffer(2)]], device NormalBuffer* tint_symbol_36 [[buffer(3)]], device IndexBuffer* tint_symbol_37 [[buffer(4)]], uint3 global_id [[thread_position_in_grid]]) { thread tint_array_wrapper_2 tint_symbol_30 = {}; thread uint tint_symbol_31 = 0u; thread tint_array_wrapper_2 tint_symbol_32 = {}; thread tint_array_wrapper_3 tint_symbol_33 = {}; computeMain_inner(global_id, tint_symbol_28, tint_symbol_29, &(tint_symbol_30), &(tint_symbol_31), &(tint_symbol_32), &(tint_symbol_33), tint_symbol_34, tint_symbol_35, tint_symbol_36, tint_symbol_37); return; }