Advertisement
Fiskmans

MarchingCubes.glsl

Apr 19th, 2025 (edited)
2,061
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Godot GLSL 28.06 KB | Source Code | 0 0
  1. #[compute]
  2. #version 450
  3.  
  4. // Invocations in the (x, y, z) dimension
  5. layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
  6.  
  7. layout(set = 0, binding = 0, std430) restrict buffer InputStatic
  8. {
  9.     uvec3 Size;
  10.     uint MaxTris;
  11. };
  12.  
  13. layout(set = 0, binding = 1, std430) restrict buffer InputUniform
  14. {
  15.     uint Surface;
  16.     float Scale;
  17. };
  18.  
  19. layout(set = 0, binding = 2, std430) restrict buffer Input
  20. {
  21.     int NodeData[];
  22. };
  23.  
  24.  
  25. struct Tri
  26. {
  27.     vec4 a;
  28.     vec4 b;
  29.     vec4 c;
  30. };
  31.  
  32. layout(set = 0, binding = 3, std430) restrict buffer OutputCount
  33. {
  34.     uint TriCount;
  35. };
  36.  
  37. layout(set = 0, binding = 4, std430) restrict buffer Output
  38. {
  39.     Tri Tris[];
  40. };
  41.  
  42. // blame the source for weird order
  43. // Adaptation of https://paulbourke.net/geometry/polygonise/
  44. const uvec3[8] Corners = uvec3[8]
  45. (
  46.     uvec3(0, 0, 0),
  47.     uvec3(1, 0, 0),
  48.     uvec3(1, 1, 0),
  49.     uvec3(0, 1, 0),
  50.     uvec3(0, 0, 1),
  51.     uvec3(1, 0, 1),
  52.     uvec3(1, 1, 1),
  53.     uvec3(0, 1, 1)
  54. );
  55.  
  56. const ivec3[256 * 5] TriTable = ivec3[256 * 5] (
  57.     ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  58.     ivec3( 0,  8,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  59.     ivec3( 0,  1,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  60.     ivec3( 1,  8,  3), ivec3( 9,  8,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  61.     ivec3( 1,  2, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  62.     ivec3( 0,  8,  3), ivec3( 1,  2, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  63.     ivec3( 9,  2, 10), ivec3( 0,  2,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  64.     ivec3( 2,  8,  3), ivec3( 2, 10,  8), ivec3(10,  9,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  65.     ivec3( 3, 11,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  66.     ivec3( 0, 11,  2), ivec3( 8, 11,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  67.     ivec3( 1,  9,  0), ivec3( 2,  3, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  68.     ivec3( 1, 11,  2), ivec3( 1,  9, 11), ivec3( 9,  8, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  69.     ivec3( 3, 10,  1), ivec3(11, 10,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  70.     ivec3( 0, 10,  1), ivec3( 0,  8, 10), ivec3( 8, 11, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  71.     ivec3( 3,  9,  0), ivec3( 3, 11,  9), ivec3(11, 10,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  72.     ivec3( 9,  8, 10), ivec3(10,  8, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x10
  73.     ivec3( 4,  7,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  74.     ivec3( 4,  3,  0), ivec3( 7,  3,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  75.     ivec3( 0,  1,  9), ivec3( 8,  4,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  76.     ivec3( 4,  1,  9), ivec3( 4,  7,  1), ivec3( 7,  3,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  77.     ivec3( 1,  2, 10), ivec3( 8,  4,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  78.     ivec3( 3,  4,  7), ivec3( 3,  0,  4), ivec3( 1,  2, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  79.     ivec3( 9,  2, 10), ivec3( 9,  0,  2), ivec3( 8,  4,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  80.     ivec3( 2, 10,  9), ivec3( 2,  9,  7), ivec3( 2,  7,  3), ivec3( 7,  9,  4), ivec3(-1, -1, -1),
  81.     ivec3( 8,  4,  7), ivec3( 3, 11,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  82.     ivec3(11,  4,  7), ivec3(11,  2,  4), ivec3( 2,  0,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  83.     ivec3( 9,  0,  1), ivec3( 8,  4,  7), ivec3( 2,  3, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  84.     ivec3( 4,  7, 11), ivec3( 9,  4, 11), ivec3( 9, 11,  2), ivec3( 9,  2,  1), ivec3(-1, -1, -1),
  85.     ivec3( 3, 10,  1), ivec3( 3, 11, 10), ivec3( 7,  8,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  86.     ivec3( 1, 11, 10), ivec3( 1,  4, 11), ivec3( 1,  0,  4), ivec3( 7, 11,  4), ivec3(-1, -1, -1),
  87.     ivec3( 4,  7,  8), ivec3( 9,  0, 11), ivec3( 9, 11, 10), ivec3(11,  0,  3), ivec3(-1, -1, -1),
  88.     ivec3( 4,  7, 11), ivec3( 4, 11,  9), ivec3( 9, 11, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x20
  89.     ivec3( 9,  5,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  90.     ivec3( 9,  5,  4), ivec3( 0,  8,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  91.     ivec3( 0,  5,  4), ivec3( 1,  5,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  92.     ivec3( 8,  5,  4), ivec3( 8,  3,  5), ivec3( 3,  1,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  93.     ivec3( 1,  2, 10), ivec3( 9,  5,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  94.     ivec3( 3,  0,  8), ivec3( 1,  2, 10), ivec3( 4,  9,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  95.     ivec3( 5,  2, 10), ivec3( 5,  4,  2), ivec3( 4,  0,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  96.     ivec3( 2, 10,  5), ivec3( 3,  2,  5), ivec3( 3,  5,  4), ivec3( 3,  4,  8), ivec3(-1, -1, -1),
  97.     ivec3( 9,  5,  4), ivec3( 2,  3, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  98.     ivec3( 0, 11,  2), ivec3( 0,  8, 11), ivec3( 4,  9,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  99.     ivec3( 0,  5,  4), ivec3( 0,  1,  5), ivec3( 2,  3, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  100.     ivec3( 2,  1,  5), ivec3( 2,  5,  8), ivec3( 2,  8, 11), ivec3( 4,  8,  5), ivec3(-1, -1, -1),
  101.     ivec3(10,  3, 11), ivec3(10,  1,  3), ivec3( 9,  5,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  102.     ivec3( 4,  9,  5), ivec3( 0,  8,  1), ivec3( 8, 10,  1), ivec3( 8, 11, 10), ivec3(-1, -1, -1),
  103.     ivec3( 5,  4,  0), ivec3( 5,  0, 11), ivec3( 5, 11, 10), ivec3(11,  0,  3), ivec3(-1, -1, -1),
  104.     ivec3( 5,  4,  8), ivec3( 5,  8, 10), ivec3(10,  8, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x30
  105.     ivec3( 9,  7,  8), ivec3( 5,  7,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  106.     ivec3( 9,  3,  0), ivec3( 9,  5,  3), ivec3( 5,  7,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  107.     ivec3( 0,  7,  8), ivec3( 0,  1,  7), ivec3( 1,  5,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  108.     ivec3( 1,  5,  3), ivec3( 3,  5,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  109.     ivec3( 9,  7,  8), ivec3( 9,  5,  7), ivec3(10,  1,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  110.     ivec3(10,  1,  2), ivec3( 9,  5,  0), ivec3( 5,  3,  0), ivec3( 5,  7,  3), ivec3(-1, -1, -1),
  111.     ivec3( 8,  0,  2), ivec3( 8,  2,  5), ivec3( 8,  5,  7), ivec3(10,  5,  2), ivec3(-1, -1, -1),
  112.     ivec3( 2, 10,  5), ivec3( 2,  5,  3), ivec3( 3,  5,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  113.     ivec3( 7,  9,  5), ivec3( 7,  8,  9), ivec3( 3, 11,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  114.     ivec3( 9,  5,  7), ivec3( 9,  7,  2), ivec3( 9,  2,  0), ivec3( 2,  7, 11), ivec3(-1, -1, -1),
  115.     ivec3( 2,  3, 11), ivec3( 0,  1,  8), ivec3( 1,  7,  8), ivec3( 1,  5,  7), ivec3(-1, -1, -1),
  116.     ivec3(11,  2,  1), ivec3(11,  1,  7), ivec3( 7,  1,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  117.     ivec3( 9,  5,  8), ivec3( 8,  5,  7), ivec3(10,  1,  3), ivec3(10,  3, 11), ivec3(-1, -1, -1),
  118.     ivec3( 5,  7,  0), ivec3( 5,  0,  9), ivec3( 7, 11,  0), ivec3( 1,  0, 10), ivec3(11, 10,  0),
  119.     ivec3(11, 10,  0), ivec3(11,  0,  3), ivec3(10,  5,  0), ivec3( 8,  0,  7), ivec3( 5,  7,  0),
  120.     ivec3(11, 10,  5), ivec3( 7, 11,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x40
  121.     ivec3(10,  6,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  122.     ivec3( 0,  8,  3), ivec3( 5, 10,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  123.     ivec3( 9,  0,  1), ivec3( 5, 10,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  124.     ivec3( 1,  8,  3), ivec3( 1,  9,  8), ivec3( 5, 10,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  125.     ivec3( 1,  6,  5), ivec3( 2,  6,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  126.     ivec3( 1,  6,  5), ivec3( 1,  2,  6), ivec3( 3,  0,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  127.     ivec3( 9,  6,  5), ivec3( 9,  0,  6), ivec3( 0,  2,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  128.     ivec3( 5,  9,  8), ivec3( 5,  8,  2), ivec3( 5,  2,  6), ivec3( 3,  2,  8), ivec3(-1, -1, -1),
  129.     ivec3( 2,  3, 11), ivec3(10,  6,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  130.     ivec3(11,  0,  8), ivec3(11,  2,  0), ivec3(10,  6,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  131.     ivec3( 0,  1,  9), ivec3( 2,  3, 11), ivec3( 5, 10,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  132.     ivec3( 5, 10,  6), ivec3( 1,  9,  2), ivec3( 9, 11,  2), ivec3( 9,  8, 11), ivec3(-1, -1, -1),
  133.     ivec3( 6,  3, 11), ivec3( 6,  5,  3), ivec3( 5,  1,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  134.     ivec3( 0,  8, 11), ivec3( 0, 11,  5), ivec3( 0,  5,  1), ivec3( 5, 11,  6), ivec3(-1, -1, -1),
  135.     ivec3( 3, 11,  6), ivec3( 0,  3,  6), ivec3( 0,  6,  5), ivec3( 0,  5,  9), ivec3(-1, -1, -1),
  136.     ivec3( 6,  5,  9), ivec3( 6,  9, 11), ivec3(11,  9,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x50
  137.     ivec3( 5, 10,  6), ivec3( 4,  7,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  138.     ivec3( 4,  3,  0), ivec3( 4,  7,  3), ivec3( 6,  5, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  139.     ivec3( 1,  9,  0), ivec3( 5, 10,  6), ivec3( 8,  4,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  140.     ivec3(10,  6,  5), ivec3( 1,  9,  7), ivec3( 1,  7,  3), ivec3( 7,  9,  4), ivec3(-1, -1, -1),
  141.     ivec3( 6,  1,  2), ivec3( 6,  5,  1), ivec3( 4,  7,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  142.     ivec3( 1,  2,  5), ivec3( 5,  2,  6), ivec3( 3,  0,  4), ivec3( 3,  4,  7), ivec3(-1, -1, -1),
  143.     ivec3( 8,  4,  7), ivec3( 9,  0,  5), ivec3( 0,  6,  5), ivec3( 0,  2,  6), ivec3(-1, -1, -1),
  144.     ivec3( 7,  3,  9), ivec3( 7,  9,  4), ivec3( 3,  2,  9), ivec3( 5,  9,  6), ivec3( 2,  6,  9),
  145.     ivec3( 3, 11,  2), ivec3( 7,  8,  4), ivec3(10,  6,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  146.     ivec3( 5, 10,  6), ivec3( 4,  7,  2), ivec3( 4,  2,  0), ivec3( 2,  7, 11), ivec3(-1, -1, -1),
  147.     ivec3( 0,  1,  9), ivec3( 4,  7,  8), ivec3( 2,  3, 11), ivec3( 5, 10,  6), ivec3(-1, -1, -1),
  148.     ivec3( 9,  2,  1), ivec3( 9, 11,  2), ivec3( 9,  4, 11), ivec3( 7, 11,  4), ivec3( 5, 10,  6),
  149.     ivec3( 8,  4,  7), ivec3( 3, 11,  5), ivec3( 3,  5,  1), ivec3( 5, 11,  6), ivec3(-1, -1, -1),
  150.     ivec3( 5,  1, 11), ivec3( 5, 11,  6), ivec3( 1,  0, 11), ivec3( 7, 11,  4), ivec3( 0,  4, 11),
  151.     ivec3( 0,  5,  9), ivec3( 0,  6,  5), ivec3( 0,  3,  6), ivec3(11,  6,  3), ivec3( 8,  4,  7),
  152.     ivec3( 6,  5,  9), ivec3( 6,  9, 11), ivec3( 4,  7,  9), ivec3( 7, 11,  9), ivec3(-1, -1, -1),  // 0x60
  153.     ivec3(10,  4,  9), ivec3( 6,  4, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  154.     ivec3( 4, 10,  6), ivec3( 4,  9, 10), ivec3( 0,  8,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  155.     ivec3(10,  0,  1), ivec3(10,  6,  0), ivec3( 6,  4,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  156.     ivec3( 8,  3,  1), ivec3( 8,  1,  6), ivec3( 8,  6,  4), ivec3( 6,  1, 10), ivec3(-1, -1, -1),
  157.     ivec3( 1,  4,  9), ivec3( 1,  2,  4), ivec3( 2,  6,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  158.     ivec3( 3,  0,  8), ivec3( 1,  2,  9), ivec3( 2,  4,  9), ivec3( 2,  6,  4), ivec3(-1, -1, -1),
  159.     ivec3( 0,  2,  4), ivec3( 4,  2,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  160.     ivec3( 8,  3,  2), ivec3( 8,  2,  4), ivec3( 4,  2,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  161.     ivec3(10,  4,  9), ivec3(10,  6,  4), ivec3(11,  2,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  162.     ivec3( 0,  8,  2), ivec3( 2,  8, 11), ivec3( 4,  9, 10), ivec3( 4, 10,  6), ivec3(-1, -1, -1),
  163.     ivec3( 3, 11,  2), ivec3( 0,  1,  6), ivec3( 0,  6,  4), ivec3( 6,  1, 10), ivec3(-1, -1, -1),
  164.     ivec3( 6,  4,  1), ivec3( 6,  1, 10), ivec3( 4,  8,  1), ivec3( 2,  1, 11), ivec3( 8, 11,  1),
  165.     ivec3( 9,  6,  4), ivec3( 9,  3,  6), ivec3( 9,  1,  3), ivec3(11,  6,  3), ivec3(-1, -1, -1),
  166.     ivec3( 8, 11,  1), ivec3( 8,  1,  0), ivec3(11,  6,  1), ivec3( 9,  1,  4), ivec3( 6,  4,  1),
  167.     ivec3( 3, 11,  6), ivec3( 3,  6,  0), ivec3( 0,  6,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  168.     ivec3( 6,  4,  8), ivec3(11,  6,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x70
  169.     ivec3( 7, 10,  6), ivec3( 7,  8, 10), ivec3( 8,  9, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  170.     ivec3( 0,  7,  3), ivec3( 0, 10,  7), ivec3( 0,  9, 10), ivec3( 6,  7, 10), ivec3(-1, -1, -1),
  171.     ivec3(10,  6,  7), ivec3( 1, 10,  7), ivec3( 1,  7,  8), ivec3( 1,  8,  0), ivec3(-1, -1, -1),
  172.     ivec3(10,  6,  7), ivec3(10,  7,  1), ivec3( 1,  7,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  173.     ivec3( 1,  2,  6), ivec3( 1,  6,  8), ivec3( 1,  8,  9), ivec3( 8,  6,  7), ivec3(-1, -1, -1),
  174.     ivec3( 2,  6,  9), ivec3( 2,  9,  1), ivec3( 6,  7,  9), ivec3( 0,  9,  3), ivec3( 7,  3,  9),
  175.     ivec3( 7,  8,  0), ivec3( 7,  0,  6), ivec3( 6,  0,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  176.     ivec3( 7,  3,  2), ivec3( 6,  7,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  177.     ivec3( 2,  3, 11), ivec3(10,  6,  8), ivec3(10,  8,  9), ivec3( 8,  6,  7), ivec3(-1, -1, -1),
  178.     ivec3( 2,  0,  7), ivec3( 2,  7, 11), ivec3( 0,  9,  7), ivec3( 6,  7, 10), ivec3( 9, 10,  7),
  179.     ivec3( 1,  8,  0), ivec3( 1,  7,  8), ivec3( 1, 10,  7), ivec3( 6,  7, 10), ivec3( 2,  3, 11),
  180.     ivec3(11,  2,  1), ivec3(11,  1,  7), ivec3(10,  6,  1), ivec3( 6,  7,  1), ivec3(-1, -1, -1),
  181.     ivec3( 8,  9,  6), ivec3( 8,  6,  7), ivec3( 9,  1,  6), ivec3(11,  6,  3), ivec3( 1,  3,  6),
  182.     ivec3( 0,  9,  1), ivec3(11,  6,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  183.     ivec3( 7,  8,  0), ivec3( 7,  0,  6), ivec3( 3, 11,  0), ivec3(11,  6,  0), ivec3(-1, -1, -1),
  184.     ivec3( 7, 11,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x80
  185.     ivec3( 7,  6, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  186.     ivec3( 3,  0,  8), ivec3(11,  7,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  187.     ivec3( 0,  1,  9), ivec3(11,  7,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  188.     ivec3( 8,  1,  9), ivec3( 8,  3,  1), ivec3(11,  7,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  189.     ivec3(10,  1,  2), ivec3( 6, 11,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  190.     ivec3( 1,  2, 10), ivec3( 3,  0,  8), ivec3( 6, 11,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  191.     ivec3( 2,  9,  0), ivec3( 2, 10,  9), ivec3( 6, 11,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  192.     ivec3( 6, 11,  7), ivec3( 2, 10,  3), ivec3(10,  8,  3), ivec3(10,  9,  8), ivec3(-1, -1, -1),
  193.     ivec3( 7,  2,  3), ivec3( 6,  2,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  194.     ivec3( 7,  0,  8), ivec3( 7,  6,  0), ivec3( 6,  2,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  195.     ivec3( 2,  7,  6), ivec3( 2,  3,  7), ivec3( 0,  1,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  196.     ivec3( 1,  6,  2), ivec3( 1,  8,  6), ivec3( 1,  9,  8), ivec3( 8,  7,  6), ivec3(-1, -1, -1),
  197.     ivec3(10,  7,  6), ivec3(10,  1,  7), ivec3( 1,  3,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  198.     ivec3(10,  7,  6), ivec3( 1,  7, 10), ivec3( 1,  8,  7), ivec3( 1,  0,  8), ivec3(-1, -1, -1),
  199.     ivec3( 0,  3,  7), ivec3( 0,  7, 10), ivec3( 0, 10,  9), ivec3( 6, 10,  7), ivec3(-1, -1, -1),
  200.     ivec3( 7,  6, 10), ivec3( 7, 10,  8), ivec3( 8, 10,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0x90
  201.     ivec3( 6,  8,  4), ivec3(11,  8,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  202.     ivec3( 3,  6, 11), ivec3( 3,  0,  6), ivec3( 0,  4,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  203.     ivec3( 8,  6, 11), ivec3( 8,  4,  6), ivec3( 9,  0,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  204.     ivec3( 9,  4,  6), ivec3( 9,  6,  3), ivec3( 9,  3,  1), ivec3(11,  3,  6), ivec3(-1, -1, -1),
  205.     ivec3( 6,  8,  4), ivec3( 6, 11,  8), ivec3( 2, 10,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  206.     ivec3( 1,  2, 10), ivec3( 3,  0, 11), ivec3( 0,  6, 11), ivec3( 0,  4,  6), ivec3(-1, -1, -1),
  207.     ivec3( 4, 11,  8), ivec3( 4,  6, 11), ivec3( 0,  2,  9), ivec3( 2, 10,  9), ivec3(-1, -1, -1),
  208.     ivec3(10,  9,  3), ivec3(10,  3,  2), ivec3( 9,  4,  3), ivec3(11,  3,  6), ivec3( 4,  6,  3),
  209.     ivec3( 8,  2,  3), ivec3( 8,  4,  2), ivec3( 4,  6,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  210.     ivec3( 0,  4,  2), ivec3( 4,  6,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  211.     ivec3( 1,  9,  0), ivec3( 2,  3,  4), ivec3( 2,  4,  6), ivec3( 4,  3,  8), ivec3(-1, -1, -1),
  212.     ivec3( 1,  9,  4), ivec3( 1,  4,  2), ivec3( 2,  4,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  213.     ivec3( 8,  1,  3), ivec3( 8,  6,  1), ivec3( 8,  4,  6), ivec3( 6, 10,  1), ivec3(-1, -1, -1),
  214.     ivec3(10,  1,  0), ivec3(10,  0,  6), ivec3( 6,  0,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  215.     ivec3( 4,  6,  3), ivec3( 4,  3,  8), ivec3( 6, 10,  3), ivec3( 0,  3,  9), ivec3(10,  9,  3),
  216.     ivec3(10,  9,  4), ivec3( 6, 10,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0xA0
  217.     ivec3( 4,  9,  5), ivec3( 7,  6, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  218.     ivec3( 0,  8,  3), ivec3( 4,  9,  5), ivec3(11,  7,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  219.     ivec3( 5,  0,  1), ivec3( 5,  4,  0), ivec3( 7,  6, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  220.     ivec3(11,  7,  6), ivec3( 8,  3,  4), ivec3( 3,  5,  4), ivec3( 3,  1,  5), ivec3(-1, -1, -1),
  221.     ivec3( 9,  5,  4), ivec3(10,  1,  2), ivec3( 7,  6, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  222.     ivec3( 6, 11,  7), ivec3( 1,  2, 10), ivec3( 0,  8,  3), ivec3( 4,  9,  5), ivec3(-1, -1, -1),
  223.     ivec3( 7,  6, 11), ivec3( 5,  4, 10), ivec3( 4,  2, 10), ivec3( 4,  0,  2), ivec3(-1, -1, -1),
  224.     ivec3( 3,  4,  8), ivec3( 3,  5,  4), ivec3( 3,  2,  5), ivec3(10,  5,  2), ivec3(11,  7,  6),
  225.     ivec3( 7,  2,  3), ivec3( 7,  6,  2), ivec3( 5,  4,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  226.     ivec3( 9,  5,  4), ivec3( 0,  8,  6), ivec3( 0,  6,  2), ivec3( 6,  8,  7), ivec3(-1, -1, -1),
  227.     ivec3( 3,  6,  2), ivec3( 3,  7,  6), ivec3( 1,  5,  0), ivec3( 5,  4,  0), ivec3(-1, -1, -1),
  228.     ivec3( 6,  2,  8), ivec3( 6,  8,  7), ivec3( 2,  1,  8), ivec3( 4,  8,  5), ivec3( 1,  5,  8),
  229.     ivec3( 9,  5,  4), ivec3(10,  1,  6), ivec3( 1,  7,  6), ivec3( 1,  3,  7), ivec3(-1, -1, -1),
  230.     ivec3( 1,  6, 10), ivec3( 1,  7,  6), ivec3( 1,  0,  7), ivec3( 8,  7,  0), ivec3( 9,  5,  4),
  231.     ivec3( 4,  0, 10), ivec3( 4, 10,  5), ivec3( 0,  3, 10), ivec3( 6, 10,  7), ivec3( 3,  7, 10),
  232.     ivec3( 7,  6, 10), ivec3( 7, 10,  8), ivec3( 5,  4, 10), ivec3( 4,  8, 10), ivec3(-1, -1, -1),  // 0xB0
  233.     ivec3( 6,  9,  5), ivec3( 6, 11,  9), ivec3(11,  8,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  234.     ivec3( 3,  6, 11), ivec3( 0,  6,  3), ivec3( 0,  5,  6), ivec3( 0,  9,  5), ivec3(-1, -1, -1),
  235.     ivec3( 0, 11,  8), ivec3( 0,  5, 11), ivec3( 0,  1,  5), ivec3( 5,  6, 11), ivec3(-1, -1, -1),
  236.     ivec3( 6, 11,  3), ivec3( 6,  3,  5), ivec3( 5,  3,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  237.     ivec3( 1,  2, 10), ivec3( 9,  5, 11), ivec3( 9, 11,  8), ivec3(11,  5,  6), ivec3(-1, -1, -1),
  238.     ivec3( 0, 11,  3), ivec3( 0,  6, 11), ivec3( 0,  9,  6), ivec3( 5,  6,  9), ivec3( 1,  2, 10),
  239.     ivec3(11,  8,  5), ivec3(11,  5,  6), ivec3( 8,  0,  5), ivec3(10,  5,  2), ivec3( 0,  2,  5),
  240.     ivec3( 6, 11,  3), ivec3( 6,  3,  5), ivec3( 2, 10,  3), ivec3(10,  5,  3), ivec3(-1, -1, -1),
  241.     ivec3( 5,  8,  9), ivec3( 5,  2,  8), ivec3( 5,  6,  2), ivec3( 3,  8,  2), ivec3(-1, -1, -1),
  242.     ivec3( 9,  5,  6), ivec3( 9,  6,  0), ivec3( 0,  6,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  243.     ivec3( 1,  5,  8), ivec3( 1,  8,  0), ivec3( 5,  6,  8), ivec3( 3,  8,  2), ivec3( 6,  2,  8),
  244.     ivec3( 1,  5,  6), ivec3( 2,  1,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  245.     ivec3( 1,  3,  6), ivec3( 1,  6, 10), ivec3( 3,  8,  6), ivec3( 5,  6,  9), ivec3( 8,  9,  6),
  246.     ivec3(10,  1,  0), ivec3(10,  0,  6), ivec3( 9,  5,  0), ivec3( 5,  6,  0), ivec3(-1, -1, -1),
  247.     ivec3( 0,  3,  8), ivec3( 5,  6, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  248.     ivec3(10,  5,  6), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0xC0
  249.     ivec3(11,  5, 10), ivec3( 7,  5, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  250.     ivec3(11,  5, 10), ivec3(11,  7,  5), ivec3( 8,  3,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  251.     ivec3( 5, 11,  7), ivec3( 5, 10, 11), ivec3( 1,  9,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  252.     ivec3(10,  7,  5), ivec3(10, 11,  7), ivec3( 9,  8,  1), ivec3( 8,  3,  1), ivec3(-1, -1, -1),
  253.     ivec3(11,  1,  2), ivec3(11,  7,  1), ivec3( 7,  5,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  254.     ivec3( 0,  8,  3), ivec3( 1,  2,  7), ivec3( 1,  7,  5), ivec3( 7,  2, 11), ivec3(-1, -1, -1),
  255.     ivec3( 9,  7,  5), ivec3( 9,  2,  7), ivec3( 9,  0,  2), ivec3( 2, 11,  7), ivec3(-1, -1, -1),
  256.     ivec3( 7,  5,  2), ivec3( 7,  2, 11), ivec3( 5,  9,  2), ivec3( 3,  2,  8), ivec3( 9,  8,  2),
  257.     ivec3( 2,  5, 10), ivec3( 2,  3,  5), ivec3( 3,  7,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  258.     ivec3( 8,  2,  0), ivec3( 8,  5,  2), ivec3( 8,  7,  5), ivec3(10,  2,  5), ivec3(-1, -1, -1),
  259.     ivec3( 9,  0,  1), ivec3( 5, 10,  3), ivec3( 5,  3,  7), ivec3( 3, 10,  2), ivec3(-1, -1, -1),
  260.     ivec3( 9,  8,  2), ivec3( 9,  2,  1), ivec3( 8,  7,  2), ivec3(10,  2,  5), ivec3( 7,  5,  2),
  261.     ivec3( 1,  3,  5), ivec3( 3,  7,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  262.     ivec3( 0,  8,  7), ivec3( 0,  7,  1), ivec3( 1,  7,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  263.     ivec3( 9,  0,  3), ivec3( 9,  3,  5), ivec3( 5,  3,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  264.     ivec3( 9,  8,  7), ivec3( 5,  9,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0xD0
  265.     ivec3( 5,  8,  4), ivec3( 5, 10,  8), ivec3(10, 11,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  266.     ivec3( 5,  0,  4), ivec3( 5, 11,  0), ivec3( 5, 10, 11), ivec3(11,  3,  0), ivec3(-1, -1, -1),
  267.     ivec3( 0,  1,  9), ivec3( 8,  4, 10), ivec3( 8, 10, 11), ivec3(10,  4,  5), ivec3(-1, -1, -1),
  268.     ivec3(10, 11,  4), ivec3(10,  4,  5), ivec3(11,  3,  4), ivec3( 9,  4,  1), ivec3( 3,  1,  4),
  269.     ivec3( 2,  5,  1), ivec3( 2,  8,  5), ivec3( 2, 11,  8), ivec3( 4,  5,  8), ivec3(-1, -1, -1),
  270.     ivec3( 0,  4, 11), ivec3( 0, 11,  3), ivec3( 4,  5, 11), ivec3( 2, 11,  1), ivec3( 5,  1, 11),
  271.     ivec3( 0,  2,  5), ivec3( 0,  5,  9), ivec3( 2, 11,  5), ivec3( 4,  5,  8), ivec3(11,  8,  5),
  272.     ivec3( 9,  4,  5), ivec3( 2, 11,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  273.     ivec3( 2,  5, 10), ivec3( 3,  5,  2), ivec3( 3,  4,  5), ivec3( 3,  8,  4), ivec3(-1, -1, -1),
  274.     ivec3( 5, 10,  2), ivec3( 5,  2,  4), ivec3( 4,  2,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  275.     ivec3( 3, 10,  2), ivec3( 3,  5, 10), ivec3( 3,  8,  5), ivec3( 4,  5,  8), ivec3( 0,  1,  9),
  276.     ivec3( 5, 10,  2), ivec3( 5,  2,  4), ivec3( 1,  9,  2), ivec3( 9,  4,  2), ivec3(-1, -1, -1),
  277.     ivec3( 8,  4,  5), ivec3( 8,  5,  3), ivec3( 3,  5,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  278.     ivec3( 0,  4,  5), ivec3( 1,  0,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  279.     ivec3( 8,  4,  5), ivec3( 8,  5,  3), ivec3( 9,  0,  5), ivec3( 0,  3,  5), ivec3(-1, -1, -1),
  280.     ivec3( 9,  4,  5), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0xE0
  281.     ivec3( 4, 11,  7), ivec3( 4,  9, 11), ivec3( 9, 10, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  282.     ivec3( 0,  8,  3), ivec3( 4,  9,  7), ivec3( 9, 11,  7), ivec3( 9, 10, 11), ivec3(-1, -1, -1),
  283.     ivec3( 1, 10, 11), ivec3( 1, 11,  4), ivec3( 1,  4,  0), ivec3( 7,  4, 11), ivec3(-1, -1, -1),
  284.     ivec3( 3,  1,  4), ivec3( 3,  4,  8), ivec3( 1, 10,  4), ivec3( 7,  4, 11), ivec3(10, 11,  4),
  285.     ivec3( 4, 11,  7), ivec3( 9, 11,  4), ivec3( 9,  2, 11), ivec3( 9,  1,  2), ivec3(-1, -1, -1),
  286.     ivec3( 9,  7,  4), ivec3( 9, 11,  7), ivec3( 9,  1, 11), ivec3( 2, 11,  1), ivec3( 0,  8,  3),
  287.     ivec3(11,  7,  4), ivec3(11,  4,  2), ivec3( 2,  4,  0), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  288.     ivec3(11,  7,  4), ivec3(11,  4,  2), ivec3( 8,  3,  4), ivec3( 3,  2,  4), ivec3(-1, -1, -1),
  289.     ivec3( 2,  9, 10), ivec3( 2,  7,  9), ivec3( 2,  3,  7), ivec3( 7,  4,  9), ivec3(-1, -1, -1),
  290.     ivec3( 9, 10,  7), ivec3( 9,  7,  4), ivec3(10,  2,  7), ivec3( 8,  7,  0), ivec3( 2,  0,  7),
  291.     ivec3( 3,  7, 10), ivec3( 3, 10,  2), ivec3( 7,  4, 10), ivec3( 1, 10,  0), ivec3( 4,  0, 10),
  292.     ivec3( 1, 10,  2), ivec3( 8,  7,  4), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  293.     ivec3( 4,  9,  1), ivec3( 4,  1,  7), ivec3( 7,  1,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  294.     ivec3( 4,  9,  1), ivec3( 4,  1,  7), ivec3( 0,  8,  1), ivec3( 8,  7,  1), ivec3(-1, -1, -1),
  295.     ivec3( 4,  0,  3), ivec3( 7,  4,  3), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  296.     ivec3( 4,  8,  7), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),  // 0xF0
  297.     ivec3( 9, 10,  8), ivec3(10, 11,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  298.     ivec3( 3,  0,  9), ivec3( 3,  9, 11), ivec3(11,  9, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  299.     ivec3( 0,  1, 10), ivec3( 0, 10,  8), ivec3( 8, 10, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  300.     ivec3( 3,  1, 10), ivec3(11,  3, 10), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  301.     ivec3( 1,  2, 11), ivec3( 1, 11,  9), ivec3( 9, 11,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  302.     ivec3( 3,  0,  9), ivec3( 3,  9, 11), ivec3( 1,  2,  9), ivec3( 2, 11,  9), ivec3(-1, -1, -1),
  303.     ivec3( 0,  2, 11), ivec3( 8,  0, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  304.     ivec3( 3,  2, 11), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  305.     ivec3( 2,  3,  8), ivec3( 2,  8, 10), ivec3(10,  8,  9), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  306.     ivec3( 9, 10,  2), ivec3( 0,  9,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  307.     ivec3( 2,  3,  8), ivec3( 2,  8, 10), ivec3( 0,  1,  8), ivec3( 1, 10,  8), ivec3(-1, -1, -1),
  308.     ivec3( 1, 10,  2), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  309.     ivec3( 1,  3,  8), ivec3( 9,  1,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  310.     ivec3( 0,  9,  1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  311.     ivec3( 0,  3,  8), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1),
  312.     ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1), ivec3(-1, -1, -1)
  313. );
  314.  
  315. float NodeAt(uvec3 aIndex)
  316. {
  317.     const uint WidthSlice = Size.x;
  318.     const uint DepthSlice = WidthSlice * Size.y;
  319.  
  320.     return float(NodeData[aIndex.x
  321.                     + aIndex.y * WidthSlice
  322.                     + aIndex.z * DepthSlice]);
  323. }
  324.  
  325. vec3 Lerp(vec3 a, vec3 b, float v)
  326. {
  327.     return a + (b - a) * v;
  328. }
  329.  
  330. float InverseLerp(float a, float b, float v)
  331. {
  332.     return (v - a) / (b - a);
  333. }
  334.  
  335. vec4 PointOnEdge(int aFirst, int aSecond)
  336. {
  337.     uvec3 at = gl_GlobalInvocationID.xyz;
  338.  
  339.     float weight = InverseLerp(
  340.                         NodeAt(at + Corners[aFirst]),
  341.                         NodeAt(at + Corners[aSecond]),
  342.                         Surface);
  343.  
  344.     return vec4(vec3(at) + Lerp(
  345.                         vec3(Corners[aFirst]),
  346.                         vec3(Corners[aSecond]),
  347.                         weight), 0);
  348. }
  349.  
  350.  
  351. void main() {
  352.    
  353.     //TriCount = 0;
  354.     //memoryBarrierBuffer();
  355.     //barrier();
  356.    
  357.     uint index = 0;
  358.     for (int i = 0; i < 8; i++)
  359.     {
  360.         if (NodeAt(gl_GlobalInvocationID.xyz + Corners[i]) >= Surface)
  361.         {
  362.             index += 1 << i;
  363.         }
  364.     }
  365.    
  366.     const vec4[12] edges = vec4[12]
  367.     (
  368.         PointOnEdge(0, 1),
  369.         PointOnEdge(1, 2),
  370.         PointOnEdge(2, 3),
  371.         PointOnEdge(3, 0),
  372.         PointOnEdge(4, 5),
  373.         PointOnEdge(5, 6),
  374.         PointOnEdge(6, 7),
  375.         PointOnEdge(7, 4),
  376.         PointOnEdge(0, 4),
  377.         PointOnEdge(1, 5),
  378.         PointOnEdge(2, 6),
  379.         PointOnEdge(3, 7)
  380.     );
  381.    
  382.     for (int i = 0; i < 5; i++)
  383.     {
  384.         ivec3 tri = TriTable[index * 5 + i];
  385.    
  386.         if (tri.x == -1)
  387.             break;
  388.    
  389.         uint index = atomicAdd(TriCount, 1);
  390.    
  391.         if (index >= MaxTris)
  392.             return;
  393.    
  394.    
  395.         Tris[index].a = edges[tri.x];
  396.         Tris[index].b = edges[tri.y];
  397.         Tris[index].c = edges[tri.z];
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement