Browse Source

consistent rotation of marching cube triangles

Kajetan Johannes Hammerle 3 years ago
parent
commit
c3bd673fd0
5 changed files with 248 additions and 170 deletions
  1. 3 0
      Main.cpp
  2. 72 0
      MarchingCubes.cpp
  3. 1 0
      MarchingCubes.h
  4. 3 2
      resources/fragment.fs
  5. 169 168
      resources/geometry.gs

+ 3 - 0
Main.cpp

@@ -1,10 +1,13 @@
 #include "Game.h"
 #include "LayeredFramebuffer.h"
+#include "MarchingCubes.h"
 #include "gaming-core/rendering/Shader.h"
 #include "gaming-core/rendering/Window.h"
 #include "gaming-core/wrapper/GL.h"
 
 int main() {
+    MarchingCubes::test();
+    // return 0;
     WindowOptions options(4, 0, {1024, 620}, false, "test");
     TextInput* input = nullptr;
     Window w(input, options);

+ 72 - 0
MarchingCubes.cpp

@@ -180,4 +180,76 @@ int MarchingCubes::getVectorAmount() {
 
 Vector3 MarchingCubes::getVector(int index, int i) {
     return vectors[table[index * 12 + i]];
+}
+
+static void swap(int index, int ia, int ib, int ic) {
+    if(ia == 0 || ib == 0 || ic == 0) {
+        printf("%2d, ", ia);
+        printf("%2d, ", ib);
+        printf("%2d, ", ic);
+        return;
+    }
+    Vector3 a = vectors[ia];
+    Vector3 b = vectors[ib];
+    Vector3 c = vectors[ic];
+
+    Vector3 ab = b - a;
+    Vector3 ac = c - a;
+    Vector3 normal = ab.cross(ac);
+    normal.normalize();
+
+    Vector3 mid = (a + b + c) / 3;
+
+    int bIndex = (mid[1] < 0.5f) * 4;
+    Vector3 corner(0.0f, (mid[1] >= 0.5f) * 1.0f, 0.0f);
+    if(mid[0] < 0.5f) {
+        if(mid[2] < 0.5f) {
+            bIndex += 4;
+        } else {
+            bIndex += 1;
+            corner += Vector3(0.0f, 0.0f, 1.0f);
+        }
+    } else {
+        if(mid[2] < 0.5f) {
+            bIndex += 3;
+            corner += Vector3(1.0f, 0.0f, 0.0f);
+        } else {
+            bIndex += 2;
+            corner += Vector3(1.0f, 0.0f, 1.0f);
+        }
+    }
+
+    bool massiv = (1 << (bIndex - 1)) & index;
+    Vector3 dir = mid - corner;
+    if(!massiv) {
+        dir = -dir;
+    }
+    dir.normalize();
+
+    float angle = dir.dot(normal);
+    if(angle < 0) {
+        int tmp = ia;
+        ia = ib;
+        ib = tmp;
+    }
+
+    printf("%2d, ", ia);
+    printf("%2d, ", ib);
+    printf("%2d, ", ic);
+}
+
+void MarchingCubes::test() {
+    for(int i = 0; i < 3072; i += 24) {
+        printf("    ");
+        for(int k = 0; k < 12; k += 3) {
+            swap((i + k) / 12, table[i + k], table[i + k + 1],
+                 table[i + k + 2]);
+        }
+        printf("    ");
+        for(int k = 12; k < 24; k += 3) {
+            swap((i + k) / 12, table[i + k], table[i + k + 1],
+                 table[i + k + 2]);
+        }
+        putchar('\n');
+    }
 }

+ 1 - 0
MarchingCubes.h

@@ -6,6 +6,7 @@
 namespace MarchingCubes {
     int getVectorAmount();
     Vector3 getVector(int index, int i);
+    void test();
 }
 
 #endif

+ 3 - 2
resources/fragment.fs

@@ -6,10 +6,11 @@ layout (binding = 1) uniform sampler3D textureSamp;
 uniform float height;
 
 in vec3 varTextureG;
+in vec3 varNormalG;
 
 out vec4 color;
 
 void main(void) {
-    vec3 f = texture(textureSamp, (varTextureG + vec3(0.0, height, 0.0)) * 8.0).xyz;
-    color = vec4(f, 1.0);
+    //vec3 f = texture(textureSamp, (varTextureG + vec3(0.0, height, 0.0)) * 8.0).xyz;
+    color = vec4(varNormalG, 1.0);
 }

+ 169 - 168
resources/geometry.gs

@@ -9,6 +9,7 @@ uniform mat4 view;
 in vec3 varTexture[];
 in int varIndex[];
 out vec3 varTextureG;
+out vec3 varNormalG;
 
 vec3 vectors[13] = {
     vec3(0.0, 0.0, 0.0), vec3(0.5, 1.0, 1.0), vec3(0.0, 0.5, 1.0), 
@@ -18,168 +19,134 @@ vec3 vectors[13] = {
     vec3(0.5, 0.0, 0.0)};
 
 int table[3072] = {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  4,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  5,
-    2,  5,  2,  4,  0,  0,  0,  0,  0,  0,  5,  6,  7,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  5,  6,  7,  3,  1,  2,  0,  0,  0,  0,  0,  0,  7,  4,  6,  4,
-    6,  1,  0,  0,  0,  0,  0,  0,  3,  6,  2,  7,  6,  2,  7,  2,  4,  0,  0,
-    0,  3,  8,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  1,  8,  1,  8,  2,
-    0,  0,  0,  0,  0,  0,  6,  3,  8,  1,  5,  4,  0,  0,  0,  0,  0,  0,  6,
-    5,  8,  4,  5,  8,  4,  8,  2,  0,  0,  0,  5,  3,  7,  3,  7,  8,  0,  0,
-    0,  0,  0,  0,  5,  1,  7,  2,  1,  7,  2,  7,  8,  0,  0,  0,  1,  3,  4,
-    8,  3,  4,  8,  4,  7,  0,  0,  0,  8,  7,  2,  4,  7,  2,  0,  0,  0,  0,
-    0,  0,  9,  2,  10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  3,  10, 3,  10,
-    1,  0,  0,  0,  0,  0,  0,  4,  1,  5,  2,  10, 9,  0,  0,  0,  0,  0,  0,
-    4,  10, 5,  9,  10, 5,  9,  5,  3,  0,  0,  0,  9,  2,  10, 5,  7,  6,  0,
-    0,  0,  0,  0,  0,  9,  3,  10, 3,  10, 1,  7,  6,  5,  0,  0,  0,  7,  4,
-    6,  4,  6,  1,  9,  10, 2,  0,  0,  0,  4,  10, 7,  3,  10, 7,  3,  10, 9,
-    3,  6,  7,  9,  2,  10, 3,  8,  6,  0,  0,  0,  0,  0,  0,  9,  8,  10, 6,
-    8,  10, 6,  10, 1,  0,  0,  0,  6,  8,  3,  10, 2,  9,  1,  4,  5,  0,  0,
-    0,  4,  5,  6,  4,  10, 6,  8,  10, 6,  8,  10, 9,  5,  3,  7,  3,  7,  8,
-    10, 2,  9,  0,  0,  0,  9,  7,  1,  9,  10, 1,  5,  7,  1,  9,  7,  8,  9,
-    10, 8,  4,  10, 8,  4,  10, 7,  3,  2,  1,  9,  10, 8,  4,  10, 8,  4,  8,
-    7,  0,  0,  0,  10, 4,  11, 0,  0,  0,  0,  0,  0,  0,  0,  0,  10, 4,  11,
-    1,  2,  3,  0,  0,  0,  0,  0,  0,  5,  11, 1,  11, 1,  10, 0,  0,  0,  0,
-    0,  0,  10, 2,  11, 3,  2,  11, 3,  11, 5,  0,  0,  0,  7,  5,  6,  4,  11,
-    10, 0,  0,  0,  0,  0,  0,  3,  2,  1,  11, 4,  10, 5,  7,  6,  0,  0,  0,
-    7,  11, 6,  10, 11, 6,  10, 6,  1,  0,  0,  0,  7,  6,  3,  7,  11, 3,  2,
-    11, 3,  2,  11, 10, 10, 4,  11, 6,  8,  3,  0,  0,  0,  0,  0,  0,  6,  1,
-    8,  1,  8,  2,  11, 4,  10, 0,  0,  0,  10, 1,  11, 1,  11, 5,  8,  3,  6,
-    0,  0,  0,  10, 8,  5,  10, 11, 5,  6,  8,  5,  10, 8,  2,  8,  7,  3,  7,
-    3,  5,  10, 11, 4,  0,  0,  0,  10, 11, 2,  7,  11, 2,  7,  11, 8,  1,  4,
-    5,  7,  11, 8,  1,  11, 8,  1,  11, 10, 1,  3,  8,  10, 11, 2,  7,  11, 2,
-    7,  2,  8,  0,  0,  0,  11, 9,  4,  9,  4,  2,  0,  0,  0,  0,  0,  0,  1,
-    4,  3,  11, 4,  3,  11, 3,  9,  0,  0,  0,  2,  1,  9,  5,  1,  9,  5,  9,
-    11, 0,  0,  0,  3,  5,  9,  11, 5,  9,  0,  0,  0,  0,  0,  0,  2,  4,  9,
-    4,  9,  11, 6,  5,  7,  0,  0,  0,  7,  6,  11, 3,  6,  11, 3,  6,  9,  4,
-    5,  1,  7,  1,  9,  7,  11, 9,  2,  1,  9,  7,  1,  6,  7,  6,  11, 3,  6,
-    11, 3,  11, 9,  0,  0,  0,  11, 9,  4,  9,  4,  2,  6,  8,  3,  0,  0,  0,
-    1,  4,  6,  9,  4,  6,  9,  4,  11, 9,  8,  6,  6,  8,  5,  9,  8,  5,  9,
-    8,  11, 1,  3,  2,  6,  8,  5,  9,  8,  5,  9,  5,  11, 0,  0,  0,  7,  11,
-    9,  7,  9,  9,  5,  4,  2,  5,  2,  2,  9,  11, 8,  11, 8,  7,  1,  4,  5,
-    0,  0,  0,  7,  8,  11, 8,  11, 9,  1,  3,  2,  0,  0,  0,  9,  11, 8,  11,
-    8,  7,  0,  0,  0,  0,  0,  0,  11, 7,  12, 0,  0,  0,  0,  0,  0,  0,  0,
-    0,  11, 7,  12, 3,  2,  1,  0,  0,  0,  0,  0,  0,  11, 7,  12, 5,  4,  1,
-    0,  0,  0,  0,  0,  0,  3,  5,  2,  5,  2,  4,  12, 7,  11, 0,  0,  0,  11,
-    5,  12, 5,  12, 6,  0,  0,  0,  0,  0,  0,  11, 5,  12, 5,  12, 6,  2,  1,
-    3,  0,  0,  0,  11, 4,  12, 1,  4,  12, 1,  12, 6,  0,  0,  0,  11, 2,  6,
-    11, 12, 6,  3,  2,  6,  11, 2,  4,  7,  12, 11, 8,  6,  3,  0,  0,  0,  0,
-    0,  0,  2,  8,  1,  8,  1,  6,  11, 12, 7,  0,  0,  0,  1,  4,  5,  12, 7,
-    11, 6,  8,  3,  0,  0,  0,  11, 12, 4,  8,  12, 4,  8,  12, 2,  5,  7,  6,
-    8,  12, 3,  11, 12, 3,  11, 3,  5,  0,  0,  0,  8,  12, 2,  5,  12, 2,  5,
-    12, 11, 5,  1,  2,  8,  3,  1,  8,  12, 1,  4,  12, 1,  4,  12, 11, 11, 12,
-    4,  8,  12, 4,  8,  4,  2,  0,  0,  0,  12, 11, 7,  10, 9,  2,  0,  0,  0,
-    0,  0,  0,  1,  10, 3,  10, 3,  9,  7,  11, 12, 0,  0,  0,  12, 7,  11, 1,
-    4,  5,  10, 2,  9,  0,  0,  0,  12, 7,  9,  5,  7,  9,  5,  7,  3,  10, 11,
-    4,  6,  12, 5,  12, 5,  11, 2,  9,  10, 0,  0,  0,  12, 9,  3,  12, 3,  3,
-    11, 10, 1,  11, 1,  1,  11, 4,  12, 1,  4,  12, 1,  4,  6,  9,  10, 2,  3,
-    9,  6,  9,  6,  12, 4,  10, 11, 0,  0,  0,  3,  6,  8,  11, 12, 7,  9,  10,
-    2,  0,  0,  0,  7,  11, 6,  10, 11, 6,  10, 11, 1,  8,  12, 9,  12, 8,  9,
-    6,  7,  5,  1,  2,  3,  6,  7,  5,  9,  8,  12, 5,  7,  6,  11, 4,  10, 0,
-    0,  0,  8,  12, 3,  11, 12, 3,  11, 12, 5,  2,  9,  10, 5,  11, 1,  11, 1,
-    10, 8,  12, 9,  0,  0,  0,  8,  12, 9,  4,  10, 11, 2,  1,  3,  0,  0,  0,
-    11, 10, 4,  9,  12, 8,  0,  0,  0,  0,  0,  0,  12, 10, 7,  10, 7,  4,  0,
-    0,  0,  0,  0,  0,  12, 10, 7,  10, 7,  4,  3,  2,  1,  0,  0,  0,  5,  7,
-    1,  12, 7,  1,  12, 1,  10, 0,  0,  0,  12, 7,  10, 3,  7,  10, 3,  7,  5,
-    3,  2,  10, 4,  5,  10, 6,  5,  10, 6,  10, 12, 0,  0,  0,  4,  5,  10, 6,
-    5,  10, 6,  5,  12, 2,  1,  3,  12, 6,  10, 1,  6,  10, 0,  0,  0,  0,  0,
-    0,  3,  2,  6,  10, 2,  6,  10, 6,  12, 0,  0,  0,  4,  7,  10, 7,  10, 12,
-    3,  6,  8,  0,  0,  0,  6,  8,  2,  6,  2,  2,  7,  12, 10, 7,  10, 10, 5,
-    7,  1,  12, 7,  1,  12, 7,  10, 3,  6,  8,  10, 12, 2,  12, 2,  8,  5,  7,
-    6,  0,  0,  0,  4,  12, 3,  4,  5,  3,  8,  12, 3,  4,  12, 10, 8,  2,  12,
-    2,  12, 10, 5,  1,  4,  0,  0,  0,  8,  3,  12, 1,  3,  12, 1,  12, 10, 0,
-    0,  0,  10, 12, 2,  12, 2,  8,  0,  0,  0,  0,  0,  0,  12, 9,  7,  2,  9,
-    7,  2,  7,  4,  0,  0,  0,  12, 4,  3,  12, 9,  3,  1,  4,  3,  12, 4,  7,
-    2,  1,  5,  2,  9,  5,  7,  9,  5,  7,  9,  12, 12, 7,  9,  5,  7,  9,  5,
-    9,  3,  0,  0,  0,  2,  9,  4,  6,  9,  4,  6,  9,  12, 6,  5,  4,  12, 6,
-    9,  6,  9,  3,  4,  5,  1,  0,  0,  0,  2,  9,  1,  12, 9,  1,  12, 1,  6,
-    0,  0,  0,  3,  9,  6,  9,  6,  12, 0,  0,  0,  0,  0,  0,  12, 9,  7,  2,
-    9,  7,  2,  9,  4,  6,  8,  3,  1,  6,  4,  6,  4,  7,  9,  8,  12, 0,  0,
-    0,  5,  7,  6,  9,  8,  12, 3,  2,  1,  0,  0,  0,  12, 8,  9,  6,  7,  5,
-    0,  0,  0,  0,  0,  0,  4,  2,  5,  2,  5,  3,  12, 9,  8,  0,  0,  0,  12,
-    8,  9,  1,  4,  5,  0,  0,  0,  0,  0,  0,  8,  9,  12, 2,  3,  1,  0,  0,
-    0,  0,  0,  0,  12, 8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  12, 8,  9,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  12, 2,  3,  1,  0,  0,  0,  0,
-    0,  0,  12, 8,  9,  1,  4,  5,  0,  0,  0,  0,  0,  0,  4,  2,  5,  2,  5,
-    3,  12, 9,  8,  0,  0,  0,  12, 8,  9,  6,  7,  5,  0,  0,  0,  0,  0,  0,
-    5,  7,  6,  9,  8,  12, 3,  2,  1,  0,  0,  0,  1,  6,  4,  6,  4,  7,  9,
-    8,  12, 0,  0,  0,  12, 9,  7,  2,  9,  7,  2,  9,  4,  6,  8,  3,  3,  9,
-    6,  9,  6,  12, 0,  0,  0,  0,  0,  0,  2,  9,  1,  12, 9,  1,  12, 1,  6,
-    0,  0,  0,  12, 6,  9,  6,  9,  3,  4,  5,  1,  0,  0,  0,  2,  9,  4,  6,
-    9,  4,  6,  9,  12, 6,  5,  4,  12, 7,  9,  5,  7,  9,  5,  9,  3,  0,  0,
-    0,  2,  1,  5,  2,  9,  5,  7,  9,  5,  7,  9,  12, 12, 4,  3,  12, 9,  3,
-    1,  4,  3,  12, 4,  7,  12, 9,  7,  2,  9,  7,  2,  7,  4,  0,  0,  0,  10,
-    12, 2,  12, 2,  8,  0,  0,  0,  0,  0,  0,  8,  3,  12, 1,  3,  12, 1,  12,
-    10, 0,  0,  0,  8,  2,  12, 2,  12, 10, 5,  1,  4,  0,  0,  0,  4,  12, 3,
-    4,  5,  3,  8,  12, 3,  4,  12, 10, 10, 12, 2,  12, 2,  8,  5,  7,  6,  0,
-    0,  0,  5,  7,  1,  12, 7,  1,  12, 7,  10, 3,  6,  8,  6,  8,  2,  6,  2,
-    2,  7,  12, 10, 7,  10, 10, 4,  7,  10, 7,  10, 12, 3,  6,  8,  0,  0,  0,
-    3,  2,  6,  10, 2,  6,  10, 6,  12, 0,  0,  0,  12, 6,  10, 1,  6,  10, 0,
-    0,  0,  0,  0,  0,  4,  5,  10, 6,  5,  10, 6,  5,  12, 2,  1,  3,  4,  5,
-    10, 6,  5,  10, 6,  10, 12, 0,  0,  0,  12, 7,  10, 3,  7,  10, 3,  7,  5,
-    3,  2,  10, 5,  7,  1,  12, 7,  1,  12, 1,  10, 0,  0,  0,  12, 10, 7,  10,
-    7,  4,  3,  2,  1,  0,  0,  0,  12, 10, 7,  10, 7,  4,  0,  0,  0,  0,  0,
-    0,  11, 10, 4,  9,  12, 8,  0,  0,  0,  0,  0,  0,  8,  12, 9,  4,  10, 11,
-    2,  1,  3,  0,  0,  0,  5,  11, 1,  11, 1,  10, 8,  12, 9,  0,  0,  0,  8,
-    12, 3,  11, 12, 3,  11, 12, 5,  2,  9,  10, 9,  8,  12, 5,  7,  6,  11, 4,
-    10, 0,  0,  0,  12, 8,  9,  6,  7,  5,  1,  2,  3,  6,  7,  5,  7,  11, 6,
-    10, 11, 6,  10, 11, 1,  8,  12, 9,  3,  6,  8,  11, 12, 7,  9,  10, 2,  0,
-    0,  0,  3,  9,  6,  9,  6,  12, 4,  10, 11, 0,  0,  0,  11, 4,  12, 1,  4,
-    12, 1,  4,  6,  9,  10, 2,  12, 9,  3,  12, 3,  3,  11, 10, 1,  11, 1,  1,
-    6,  12, 5,  12, 5,  11, 2,  9,  10, 0,  0,  0,  12, 7,  9,  5,  7,  9,  5,
-    7,  3,  10, 11, 4,  12, 7,  11, 1,  4,  5,  10, 2,  9,  0,  0,  0,  1,  10,
-    3,  10, 3,  9,  7,  11, 12, 0,  0,  0,  12, 11, 7,  10, 9,  2,  0,  0,  0,
-    0,  0,  0,  11, 12, 4,  8,  12, 4,  8,  4,  2,  0,  0,  0,  8,  3,  1,  8,
-    12, 1,  4,  12, 1,  4,  12, 11, 8,  12, 2,  5,  12, 2,  5,  12, 11, 5,  1,
-    2,  8,  12, 3,  11, 12, 3,  11, 3,  5,  0,  0,  0,  11, 12, 4,  8,  12, 4,
-    8,  12, 2,  5,  7,  6,  1,  4,  5,  12, 7,  11, 6,  8,  3,  0,  0,  0,  2,
-    8,  1,  8,  1,  6,  11, 12, 7,  0,  0,  0,  7,  12, 11, 8,  6,  3,  0,  0,
-    0,  0,  0,  0,  11, 2,  6,  11, 12, 6,  3,  2,  6,  11, 2,  4,  11, 4,  12,
-    1,  4,  12, 1,  12, 6,  0,  0,  0,  11, 5,  12, 5,  12, 6,  2,  1,  3,  0,
-    0,  0,  11, 5,  12, 5,  12, 6,  0,  0,  0,  0,  0,  0,  3,  5,  2,  5,  2,
-    4,  12, 7,  11, 0,  0,  0,  11, 7,  12, 5,  4,  1,  0,  0,  0,  0,  0,  0,
-    11, 7,  12, 3,  2,  1,  0,  0,  0,  0,  0,  0,  11, 7,  12, 0,  0,  0,  0,
-    0,  0,  0,  0,  0,  9,  11, 8,  11, 8,  7,  0,  0,  0,  0,  0,  0,  7,  8,
-    11, 8,  11, 9,  1,  3,  2,  0,  0,  0,  9,  11, 8,  11, 8,  7,  1,  4,  5,
-    0,  0,  0,  7,  11, 9,  7,  9,  9,  5,  4,  2,  5,  2,  2,  6,  8,  5,  9,
-    8,  5,  9,  5,  11, 0,  0,  0,  6,  8,  5,  9,  8,  5,  9,  8,  11, 1,  3,
-    2,  1,  4,  6,  9,  4,  6,  9,  4,  11, 9,  8,  6,  11, 9,  4,  9,  4,  2,
-    6,  8,  3,  0,  0,  0,  7,  6,  11, 3,  6,  11, 3,  11, 9,  0,  0,  0,  7,
-    1,  9,  7,  11, 9,  2,  1,  9,  7,  1,  6,  7,  6,  11, 3,  6,  11, 3,  6,
-    9,  4,  5,  1,  2,  4,  9,  4,  9,  11, 6,  5,  7,  0,  0,  0,  3,  5,  9,
-    11, 5,  9,  0,  0,  0,  0,  0,  0,  2,  1,  9,  5,  1,  9,  5,  9,  11, 0,
-    0,  0,  1,  4,  3,  11, 4,  3,  11, 3,  9,  0,  0,  0,  11, 9,  4,  9,  4,
-    2,  0,  0,  0,  0,  0,  0,  10, 11, 2,  7,  11, 2,  7,  2,  8,  0,  0,  0,
-    7,  11, 8,  1,  11, 8,  1,  11, 10, 1,  3,  8,  10, 11, 2,  7,  11, 2,  7,
-    11, 8,  1,  4,  5,  8,  7,  3,  7,  3,  5,  10, 11, 4,  0,  0,  0,  10, 8,
-    5,  10, 11, 5,  6,  8,  5,  10, 8,  2,  10, 1,  11, 1,  11, 5,  8,  3,  6,
-    0,  0,  0,  6,  1,  8,  1,  8,  2,  11, 4,  10, 0,  0,  0,  10, 4,  11, 6,
-    8,  3,  0,  0,  0,  0,  0,  0,  7,  6,  3,  7,  11, 3,  2,  11, 3,  2,  11,
-    10, 7,  11, 6,  10, 11, 6,  10, 6,  1,  0,  0,  0,  3,  2,  1,  11, 4,  10,
-    5,  7,  6,  0,  0,  0,  7,  5,  6,  4,  11, 10, 0,  0,  0,  0,  0,  0,  10,
-    2,  11, 3,  2,  11, 3,  11, 5,  0,  0,  0,  5,  11, 1,  11, 1,  10, 0,  0,
-    0,  0,  0,  0,  10, 4,  11, 1,  2,  3,  0,  0,  0,  0,  0,  0,  10, 4,  11,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  10, 8,  4,  10, 8,  4,  8,  7,  0,
-    0,  0,  9,  10, 8,  4,  10, 8,  4,  10, 7,  3,  2,  1,  9,  7,  1,  9,  10,
-    1,  5,  7,  1,  9,  7,  8,  5,  3,  7,  3,  7,  8,  10, 2,  9,  0,  0,  0,
-    4,  5,  6,  4,  10, 6,  8,  10, 6,  8,  10, 9,  6,  8,  3,  10, 2,  9,  1,
-    4,  5,  0,  0,  0,  9,  8,  10, 6,  8,  10, 6,  10, 1,  0,  0,  0,  9,  2,
-    10, 3,  8,  6,  0,  0,  0,  0,  0,  0,  4,  10, 7,  3,  10, 7,  3,  10, 9,
-    3,  6,  7,  7,  4,  6,  4,  6,  1,  9,  10, 2,  0,  0,  0,  9,  3,  10, 3,
-    10, 1,  7,  6,  5,  0,  0,  0,  9,  2,  10, 5,  7,  6,  0,  0,  0,  0,  0,
-    0,  4,  10, 5,  9,  10, 5,  9,  5,  3,  0,  0,  0,  4,  1,  5,  2,  10, 9,
-    0,  0,  0,  0,  0,  0,  9,  3,  10, 3,  10, 1,  0,  0,  0,  0,  0,  0,  9,
-    2,  10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  7,  2,  4,  7,  2,  0,  0,
-    0,  0,  0,  0,  1,  3,  4,  8,  3,  4,  8,  4,  7,  0,  0,  0,  5,  1,  7,
-    2,  1,  7,  2,  7,  8,  0,  0,  0,  5,  3,  7,  3,  7,  8,  0,  0,  0,  0,
-    0,  0,  6,  5,  8,  4,  5,  8,  4,  8,  2,  0,  0,  0,  6,  3,  8,  1,  5,
-    4,  0,  0,  0,  0,  0,  0,  6,  1,  8,  1,  8,  2,  0,  0,  0,  0,  0,  0,
-    3,  8,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  6,  2,  7,  6,  2,  7,
-    2,  4,  0,  0,  0,  7,  4,  6,  4,  6,  1,  0,  0,  0,  0,  0,  0,  5,  6,
-    7,  3,  1,  2,  0,  0,  0,  0,  0,  0,  5,  6,  7,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  3,  5,  2,  5,  2,  4,  0,  0,  0,  0,  0,  0,  4,  1,  5,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,      1,  2,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     4,  1,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,      3,  5,  2,  2,  5,  4,  0,  0,  0,  0,  0,  0, 
+     5,  6,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,      5,  6,  7,  3,  1,  2,  0,  0,  0,  0,  0,  0, 
+     7,  4,  6,  6,  4,  1,  0,  0,  0,  0,  0,  0,      3,  6,  2,  6,  7,  2,  2,  7,  4,  0,  0,  0, 
+     3,  8,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,      6,  1,  8,  8,  1,  2,  0,  0,  0,  0,  0,  0, 
+     6,  3,  8,  1,  5,  4,  0,  0,  0,  0,  0,  0,      6,  5,  8,  5,  4,  8,  8,  4,  2,  0,  0,  0, 
+     5,  3,  7,  7,  3,  8,  0,  0,  0,  0,  0,  0,      5,  1,  7,  1,  2,  7,  7,  2,  8,  0,  0,  0, 
+     1,  3,  4,  3,  8,  4,  4,  8,  7,  0,  0,  0,      8,  7,  2,  7,  4,  2,  0,  0,  0,  0,  0,  0, 
+     9,  2, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,      9,  3, 10, 10,  3,  1,  0,  0,  0,  0,  0,  0, 
+     4,  1,  5,  2, 10,  9,  0,  0,  0,  0,  0,  0,      4, 10,  5, 10,  9,  5,  5,  9,  3,  0,  0,  0, 
+     9,  2, 10,  7,  5,  6,  0,  0,  0,  0,  0,  0,      9,  3, 10, 10,  3,  1,  6,  7,  5,  0,  0,  0, 
+     7,  4,  6,  6,  4,  1, 10,  9,  2,  0,  0,  0,      4, 10,  7, 10,  3,  7,  3, 10,  9,  3,  6,  7, 
+     9,  2, 10,  3,  8,  6,  0,  0,  0,  0,  0,  0,      9,  8, 10,  8,  6, 10, 10,  6,  1,  0,  0,  0, 
+     8,  6,  3,  2, 10,  9,  4,  1,  5,  0,  0,  0,      5,  4,  6,  4, 10,  6, 10,  8,  6,  8, 10,  9, 
+     5,  3,  7,  7,  3,  8,  2, 10,  9,  0,  0,  0,      9,  7,  1, 10,  9,  1,  7,  5,  1,  7,  9,  8, 
+    10,  9,  8,  4, 10,  8,  4, 10,  7,  3,  2,  1,     10,  9,  8,  4, 10,  8,  4,  8,  7,  0,  0,  0, 
+    10,  4, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,     10,  4, 11,  1,  2,  3,  0,  0,  0,  0,  0,  0, 
+     5, 11,  1,  1, 11, 10,  0,  0,  0,  0,  0,  0,     10,  2, 11,  2,  3, 11, 11,  3,  5,  0,  0,  0, 
+     7,  5,  6,  4, 11, 10,  0,  0,  0,  0,  0,  0,      2,  3,  1,  4, 11, 10,  7,  5,  6,  0,  0,  0, 
+     7, 11,  6, 11, 10,  6,  6, 10,  1,  0,  0,  0,      6,  7,  3,  7, 11,  3, 11,  2,  3,  2, 11, 10, 
+    10,  4, 11,  8,  6,  3,  0,  0,  0,  0,  0,  0,      6,  1,  8,  8,  1,  2,  4, 11, 10,  0,  0,  0, 
+    10,  1, 11, 11,  1,  5,  3,  8,  6,  0,  0,  0,     10,  8,  5, 11, 10,  5,  8,  6,  5,  8, 10,  2, 
+     8,  7,  3,  3,  7,  5, 11, 10,  4,  0,  0,  0,     11, 10,  2,  7, 11,  2,  7, 11,  8,  1,  4,  5, 
+     7, 11,  8, 11,  1,  8,  1, 11, 10,  1,  3,  8,     11, 10,  2,  7, 11,  2,  7,  2,  8,  0,  0,  0, 
+    11,  9,  4,  4,  9,  2,  0,  0,  0,  0,  0,  0,      1,  4,  3,  4, 11,  3,  3, 11,  9,  0,  0,  0, 
+     2,  1,  9,  1,  5,  9,  9,  5, 11,  0,  0,  0,      3,  5,  9,  5, 11,  9,  0,  0,  0,  0,  0,  0, 
+     2,  4,  9,  9,  4, 11,  5,  6,  7,  0,  0,  0,      6,  7, 11,  3,  6, 11,  3,  6,  9,  4,  5,  1, 
+     1,  7,  9,  7, 11,  9,  2,  1,  9,  7,  1,  6,      6,  7, 11,  3,  6, 11,  3, 11,  9,  0,  0,  0, 
+    11,  9,  4,  4,  9,  2,  8,  6,  3,  0,  0,  0,      1,  4,  6,  9,  4,  6,  9,  4, 11,  9,  8,  6, 
+     8,  6,  5,  9,  8,  5,  9,  8, 11,  1,  3,  2,      8,  6,  5,  9,  8,  5,  9,  5, 11,  0,  0,  0, 
+     7, 11,  9,  7,  9,  9,  4,  5,  2,  5,  2,  2,     11,  9,  8, 11,  8,  7,  1,  4,  5,  0,  0,  0, 
+     8,  7, 11,  8, 11,  9,  1,  3,  2,  0,  0,  0,     11,  9,  8, 11,  8,  7,  0,  0,  0,  0,  0,  0, 
+    11,  7, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,     11,  7, 12,  2,  3,  1,  0,  0,  0,  0,  0,  0, 
+    11,  7, 12,  5,  4,  1,  0,  0,  0,  0,  0,  0,      3,  5,  2,  2,  5,  4,  7, 12, 11,  0,  0,  0, 
+    11,  5, 12, 12,  5,  6,  0,  0,  0,  0,  0,  0,     11,  5, 12, 12,  5,  6,  1,  2,  3,  0,  0,  0, 
+    11,  4, 12,  4,  1, 12, 12,  1,  6,  0,  0,  0,     11,  2,  6, 12, 11,  6,  2,  3,  6,  2, 11,  4, 
+     7, 12, 11,  8,  6,  3,  0,  0,  0,  0,  0,  0,      2,  8,  1,  1,  8,  6, 12, 11,  7,  0,  0,  0, 
+     4,  1,  5,  7, 12, 11,  8,  6,  3,  0,  0,  0,     12, 11,  4,  8, 12,  4,  8, 12,  2,  5,  7,  6, 
+     8, 12,  3, 12, 11,  3,  3, 11,  5,  0,  0,  0,      8, 12,  2, 12,  5,  2,  5, 12, 11,  5,  1,  2, 
+     3,  8,  1,  8, 12,  1, 12,  4,  1,  4, 12, 11,     12, 11,  4,  8, 12,  4,  8,  4,  2,  0,  0,  0, 
+    12, 11,  7, 10,  9,  2,  0,  0,  0,  0,  0,  0,      1, 10,  3,  3, 10,  9, 11,  7, 12,  0,  0,  0, 
+     7, 12, 11,  4,  1,  5,  2, 10,  9,  0,  0,  0,      7, 12,  9,  5,  7,  9,  5,  7,  3, 10, 11,  4, 
+     6, 12,  5,  5, 12, 11,  9,  2, 10,  0,  0,  0,     12,  9,  3, 12,  3,  3, 10, 11,  1, 11,  1,  1, 
+    11,  4, 12,  4,  1, 12,  4,  1,  6, 10,  9,  2,      9,  3,  6,  9,  6, 12,  4, 10, 11,  0,  0,  0, 
+     6,  3,  8, 12, 11,  7, 10,  9,  2,  0,  0,  0,     11,  7,  6, 10, 11,  6, 10, 11,  1,  8, 12,  9, 
+     8, 12,  9,  7,  6,  5,  2,  1,  3,  7,  6,  5,      9,  8, 12,  5,  7,  6, 11,  4, 10,  0,  0,  0, 
+     8, 12,  3, 12, 11,  3, 12, 11,  5,  9,  2, 10,     11,  5,  1, 11,  1, 10,  8, 12,  9,  0,  0,  0, 
+     8, 12,  9,  4, 10, 11,  2,  1,  3,  0,  0,  0,     10, 11,  4, 12,  9,  8,  0,  0,  0,  0,  0,  0, 
+    12, 10,  7,  7, 10,  4,  0,  0,  0,  0,  0,  0,     12, 10,  7,  7, 10,  4,  2,  3,  1,  0,  0,  0, 
+     5,  7,  1,  7, 12,  1,  1, 12, 10,  0,  0,  0,      7, 12, 10,  3,  7, 10,  7,  3,  5,  2,  3, 10, 
+     4,  5, 10,  5,  6, 10, 10,  6, 12,  0,  0,  0,      4,  5, 10,  5,  6, 10,  5,  6, 12,  1,  2,  3, 
+     6, 12, 10,  1,  6, 10,  0,  0,  0,  0,  0,  0,      2,  3,  6, 10,  2,  6, 10,  6, 12,  0,  0,  0, 
+     4,  7, 10, 10,  7, 12,  6,  3,  8,  0,  0,  0,      8,  6,  2,  6,  2,  2,  7, 12, 10,  7, 10, 10, 
+     5,  7,  1,  7, 12,  1,  7, 12, 10,  6,  3,  8,     12, 10,  2, 12,  2,  8,  5,  7,  6,  0,  0,  0, 
+     4, 12,  3,  4,  5,  3,  8, 12,  3,  4, 12, 10,      2,  8, 12,  2, 12, 10,  5,  1,  4,  0,  0,  0, 
+     3,  8, 12,  1,  3, 12,  1, 12, 10,  0,  0,  0,     12, 10,  2, 12,  2,  8,  0,  0,  0,  0,  0,  0, 
+    12,  9,  7,  9,  2,  7,  7,  2,  4,  0,  0,  0,      4, 12,  3, 12,  9,  3,  1,  4,  3, 12,  4,  7, 
+     2,  1,  5,  9,  2,  5,  7,  9,  5,  9,  7, 12,      7, 12,  9,  5,  7,  9,  5,  9,  3,  0,  0,  0, 
+     9,  2,  4,  6,  9,  4,  9,  6, 12,  5,  6,  4,      6, 12,  9,  6,  9,  3,  4,  5,  1,  0,  0,  0, 
+     9,  2,  1, 12,  9,  1, 12,  1,  6,  0,  0,  0,      9,  3,  6,  9,  6, 12,  0,  0,  0,  0,  0,  0, 
+    12,  9,  7,  9,  2,  7,  9,  2,  4,  8,  6,  3,      6,  1,  4,  6,  4,  7,  9,  8, 12,  0,  0,  0, 
+     5,  7,  6,  9,  8, 12,  3,  2,  1,  0,  0,  0,      8, 12,  9,  7,  6,  5,  0,  0,  0,  0,  0,  0, 
+     2,  4,  5,  2,  5,  3, 12,  9,  8,  0,  0,  0,      8, 12,  9,  1,  4,  5,  0,  0,  0,  0,  0,  0, 
+     9,  8, 12,  3,  2,  1,  0,  0,  0,  0,  0,  0,      8, 12,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+    12,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,      8,  9, 12,  2,  3,  1,  0,  0,  0,  0,  0,  0, 
+    12,  8,  9,  4,  1,  5,  0,  0,  0,  0,  0,  0,      4,  2,  5,  5,  2,  3,  9, 12,  8,  0,  0,  0, 
+    12,  8,  9,  6,  7,  5,  0,  0,  0,  0,  0,  0,      7,  5,  6,  8,  9, 12,  2,  3,  1,  0,  0,  0, 
+     1,  6,  4,  4,  6,  7,  8,  9, 12,  0,  0,  0,      9, 12,  7,  2,  9,  7,  2,  9,  4,  6,  8,  3, 
+     3,  9,  6,  6,  9, 12,  0,  0,  0,  0,  0,  0,      2,  9,  1,  9, 12,  1,  1, 12,  6,  0,  0,  0, 
+    12,  6,  9,  9,  6,  3,  5,  4,  1,  0,  0,  0,      2,  9,  4,  9,  6,  4,  6,  9, 12,  6,  5,  4, 
+    12,  7,  9,  7,  5,  9,  9,  5,  3,  0,  0,  0,      1,  2,  5,  2,  9,  5,  9,  7,  5,  7,  9, 12, 
+    12,  4,  3,  9, 12,  3,  4,  1,  3,  4, 12,  7,      9, 12,  7,  2,  9,  7,  2,  7,  4,  0,  0,  0, 
+    10, 12,  2,  2, 12,  8,  0,  0,  0,  0,  0,  0,      8,  3, 12,  3,  1, 12, 12,  1, 10,  0,  0,  0, 
+     8,  2, 12, 12,  2, 10,  1,  5,  4,  0,  0,  0,     12,  4,  3,  5,  4,  3, 12,  8,  3, 12,  4, 10, 
+    10, 12,  2,  2, 12,  8,  7,  5,  6,  0,  0,  0,      7,  5,  1, 12,  7,  1, 12,  7, 10,  3,  6,  8, 
+     6,  8,  2,  6,  2,  2, 12,  7, 10,  7, 10, 10,      7,  4, 10,  7, 10, 12,  3,  6,  8,  0,  0,  0, 
+     3,  2,  6,  2, 10,  6,  6, 10, 12,  0,  0,  0,     12,  6, 10,  6,  1, 10,  0,  0,  0,  0,  0,  0, 
+     5,  4, 10,  6,  5, 10,  6,  5, 12,  2,  1,  3,      5,  4, 10,  6,  5, 10,  6, 10, 12,  0,  0,  0, 
+    12,  7, 10,  7,  3, 10,  3,  7,  5,  3,  2, 10,      7,  5,  1, 12,  7,  1, 12,  1, 10,  0,  0,  0, 
+    10, 12,  7, 10,  7,  4,  3,  2,  1,  0,  0,  0,     10, 12,  7, 10,  7,  4,  0,  0,  0,  0,  0,  0, 
+    11, 10,  4,  9, 12,  8,  0,  0,  0,  0,  0,  0,     12,  8,  9, 10,  4, 11,  1,  2,  3,  0,  0,  0, 
+     5, 11,  1,  1, 11, 10, 12,  8,  9,  0,  0,  0,     12,  8,  3, 11, 12,  3, 11, 12,  5,  2,  9, 10, 
+     8,  9, 12,  7,  5,  6,  4, 11, 10,  0,  0,  0,     12,  8,  9,  6,  7,  5,  1,  2,  3,  6,  7,  5, 
+     7, 11,  6, 11, 10,  6, 11, 10,  1, 12,  8,  9,      3,  6,  8, 11, 12,  7,  9, 10,  2,  0,  0,  0, 
+     3,  9,  6,  6,  9, 12, 10,  4, 11,  0,  0,  0,      4, 11, 12,  1,  4, 12,  1,  4,  6,  9, 10,  2, 
+     9, 12,  3, 12,  3,  3, 11, 10,  1, 11,  1,  1,     12,  6,  5, 12,  5, 11,  2,  9, 10,  0,  0,  0, 
+    12,  7,  9,  7,  5,  9,  7,  5,  3, 11, 10,  4,     12,  7, 11,  1,  4,  5, 10,  2,  9,  0,  0,  0, 
+    10,  1,  3, 10,  3,  9,  7, 11, 12,  0,  0,  0,     11, 12,  7,  9, 10,  2,  0,  0,  0,  0,  0,  0, 
+    11, 12,  4, 12,  8,  4,  4,  8,  2,  0,  0,  0,      8,  3,  1, 12,  8,  1,  4, 12,  1, 12,  4, 11, 
+    12,  8,  2,  5, 12,  2, 12,  5, 11,  1,  5,  2,     12,  8,  3, 11, 12,  3, 11,  3,  5,  0,  0,  0, 
+    11, 12,  4, 12,  8,  4, 12,  8,  2,  7,  5,  6,      1,  4,  5, 12,  7, 11,  6,  8,  3,  0,  0,  0, 
+     8,  2,  1,  8,  1,  6, 11, 12,  7,  0,  0,  0,     12,  7, 11,  6,  8,  3,  0,  0,  0,  0,  0,  0, 
+     2, 11,  6, 11, 12,  6,  3,  2,  6, 11,  2,  4,      4, 11, 12,  1,  4, 12,  1, 12,  6,  0,  0,  0, 
+     5, 11, 12,  5, 12,  6,  2,  1,  3,  0,  0,  0,      5, 11, 12,  5, 12,  6,  0,  0,  0,  0,  0,  0, 
+     5,  3,  2,  5,  2,  4, 12,  7, 11,  0,  0,  0,      7, 11, 12,  4,  5,  1,  0,  0,  0,  0,  0,  0, 
+     7, 11, 12,  3,  2,  1,  0,  0,  0,  0,  0,  0,      7, 11, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     9, 11,  8,  8, 11,  7,  0,  0,  0,  0,  0,  0,      7,  8, 11, 11,  8,  9,  3,  1,  2,  0,  0,  0, 
+     9, 11,  8,  8, 11,  7,  4,  1,  5,  0,  0,  0,     11,  7,  9,  7,  9,  9,  5,  4,  2,  5,  2,  2, 
+     6,  8,  5,  8,  9,  5,  5,  9, 11,  0,  0,  0,      6,  8,  5,  8,  9,  5,  8,  9, 11,  3,  1,  2, 
+     4,  1,  6,  4,  9,  6,  4,  9, 11,  8,  9,  6,      9, 11,  4,  9,  4,  2,  6,  8,  3,  0,  0,  0, 
+     7,  6, 11,  6,  3, 11, 11,  3,  9,  0,  0,  0,      7,  1,  9, 11,  7,  9,  1,  2,  9,  1,  7,  6, 
+     7,  6, 11,  6,  3, 11,  6,  3,  9,  5,  4,  1,      4,  2,  9,  4,  9, 11,  6,  5,  7,  0,  0,  0, 
+     5,  3,  9, 11,  5,  9,  0,  0,  0,  0,  0,  0,      1,  2,  9,  5,  1,  9,  5,  9, 11,  0,  0,  0, 
+     4,  1,  3, 11,  4,  3, 11,  3,  9,  0,  0,  0,      9, 11,  4,  9,  4,  2,  0,  0,  0,  0,  0,  0, 
+    10, 11,  2, 11,  7,  2,  2,  7,  8,  0,  0,  0,     11,  7,  8,  1, 11,  8, 11,  1, 10,  3,  1,  8, 
+    10, 11,  2, 11,  7,  2, 11,  7,  8,  4,  1,  5,      7,  8,  3,  7,  3,  5, 10, 11,  4,  0,  0,  0, 
+     8, 10,  5, 10, 11,  5,  6,  8,  5, 10,  8,  2,      1, 10, 11,  1, 11,  5,  8,  3,  6,  0,  0,  0, 
+     1,  6,  8,  1,  8,  2, 11,  4, 10,  0,  0,  0,      4, 10, 11,  6,  8,  3,  0,  0,  0,  0,  0,  0, 
+     7,  6,  3, 11,  7,  3,  2, 11,  3, 11,  2, 10,     11,  7,  6, 10, 11,  6, 10,  6,  1,  0,  0,  0, 
+     3,  2,  1, 11,  4, 10,  5,  7,  6,  0,  0,  0,      5,  7,  6, 11,  4, 10,  0,  0,  0,  0,  0,  0, 
+     2, 10, 11,  3,  2, 11,  3, 11,  5,  0,  0,  0,     11,  5,  1, 11,  1, 10,  0,  0,  0,  0,  0,  0, 
+     4, 10, 11,  2,  1,  3,  0,  0,  0,  0,  0,  0,      4, 10, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     9, 10,  8, 10,  4,  8,  8,  4,  7,  0,  0,  0,      9, 10,  8, 10,  4,  8, 10,  4,  7,  2,  3,  1, 
+     7,  9,  1,  9, 10,  1,  5,  7,  1,  9,  7,  8,      3,  5,  7,  3,  7,  8, 10,  2,  9,  0,  0,  0, 
+     4,  5,  6, 10,  4,  6,  8, 10,  6, 10,  8,  9,      6,  8,  3, 10,  2,  9,  1,  4,  5,  0,  0,  0, 
+     8,  9, 10,  6,  8, 10,  6, 10,  1,  0,  0,  0,      2,  9, 10,  8,  3,  6,  0,  0,  0,  0,  0,  0, 
+    10,  4,  7,  3, 10,  7, 10,  3,  9,  6,  3,  7,      4,  7,  6,  4,  6,  1,  9, 10,  2,  0,  0,  0, 
+     3,  9, 10,  3, 10,  1,  7,  6,  5,  0,  0,  0,      2,  9, 10,  5,  7,  6,  0,  0,  0,  0,  0,  0, 
+    10,  4,  5,  9, 10,  5,  9,  5,  3,  0,  0,  0,      1,  4,  5, 10,  2,  9,  0,  0,  0,  0,  0,  0, 
+     3,  9, 10,  3, 10,  1,  0,  0,  0,  0,  0,  0,      2,  9, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     7,  8,  2,  4,  7,  2,  0,  0,  0,  0,  0,  0,      3,  1,  4,  8,  3,  4,  8,  4,  7,  0,  0,  0, 
+     1,  5,  7,  2,  1,  7,  2,  7,  8,  0,  0,  0,      3,  5,  7,  3,  7,  8,  0,  0,  0,  0,  0,  0, 
+     5,  6,  8,  4,  5,  8,  4,  8,  2,  0,  0,  0,      3,  6,  8,  5,  1,  4,  0,  0,  0,  0,  0,  0, 
+     1,  6,  8,  1,  8,  2,  0,  0,  0,  0,  0,  0,      8,  3,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     6,  3,  2,  7,  6,  2,  7,  2,  4,  0,  0,  0,      4,  7,  6,  4,  6,  1,  0,  0,  0,  0,  0,  0, 
+     6,  5,  7,  1,  3,  2,  0,  0,  0,  0,  0,  0,      6,  5,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     5,  3,  2,  5,  2,  4,  0,  0,  0,  0,  0,  0,      1,  4,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+     2,  1,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 };
 
 const float step = 1.0 / 63.0;
@@ -188,12 +155,46 @@ void main(void) {
     vec4 base = gl_in[0].gl_Position;
     int index = varIndex[0] * 12;
     for(int i = 0; i < 12; i += 3) {
-        for(int k = 0; k < 3; k++) {
-            vec3 offset = vectors[table[index + i + k]];
-            gl_Position = proj * view * (base + vec4(offset, 0.0));
-            varTextureG = varTexture[0] + offset * step;
-            EmitVertex();
-        }
+        vec3 offsetA = vectors[table[index + i + 0]];
+        vec3 offsetB = vectors[table[index + i + 1]];
+        vec3 offsetC = vectors[table[index + i + 2]];
+
+        // position
+        vec3 a = base.xyz + offsetA;
+        vec3 b = base.xyz + offsetB;
+        vec3 c = base.xyz + offsetC;
+        // texture coords
+        vec3 ta = varTexture[0] + offsetA * step;
+        vec3 tb = varTexture[0] + offsetB * step;
+        vec3 tc = varTexture[0] + offsetC * step;
+        // normal, same for all vertices
+        vec3 ab = b - a;
+        vec3 ac = c - a;
+        vec3 normal = normalize(cross(ab, ac));
+        // tangent, same for all vertices
+        //Vector2 abt = b.texture - a.texture;
+        //Vector2 act = c.texture - a.texture;
+        //float f = 1.0f / (abt[0] * act[1] - act[0] * abt[1]);
+        //tangentA = f * (act[1] * ab - abt[1] * ac);
+        //tangentA.normalize();
+        //tangentB = tangentA;
+        //tangentC = tangentA;
+
+        gl_Position = proj * view * vec4(a, 1.0);
+        varTextureG = ta;
+        varNormalG = normal;
+        EmitVertex();
+
+        gl_Position = proj * view * vec4(b, 1.0);
+        varTextureG = tb;
+        varNormalG = normal;
+        EmitVertex();
+
+        gl_Position = proj * view * vec4(c, 1.0);
+        varTextureG = tc;
+        varNormalG = normal;
+        EmitVertex();
+
         EndPrimitive();
     }
 }