[solved] Marching cubes not working

Posted By: Joozey

[solved] Marching cubes not working - 12/06/11 23:40

Hello all,

Some time ago I tried implementing marching cubes in 3dgs, and it only worked half. I couldn't find the problem and went off doing something else. Now I thought I'd give it another shot; exactly the same problem:



At least the holes are ordered tongue. I have culling on 1, so the faces are all visible. There are two faces drawn on the top, but one of its vertices is wrong, causing a face overlap and a gap.

I used the code from this site: http://paulbourke.net/geometry/polygonise which seems to be used everywhere, so I doubt it's a flaw in the tables. What could be messed up between that code and 3dgs?

I create a new face with 3 unique (not merged) vertices for every triangle returned by the Polygonise function, stuff it in a new Mesh and set it to an entity.
Code translated to lite-c:
Code:
typedef VECTOR XYZ;

typedef struct {
   XYZ* p[3];
} TRIANGLE;

typedef struct {
   XYZ p[8];
   double val[8];
} GRIDCELL;



/*
   Linearly interpolate the position where an isosurface cuts
   an edge between two vertices, each with their own scalar value
*/
XYZ* VertexInterp( double isolevel, XYZ* p1, XYZ* p2, double valp1, double valp2 )
{
   double mu;
   XYZ* p = vector(0,0,0);

   if (abs(isolevel-valp1) < 0.00001)
      return(p1);
   if (abs(isolevel-valp2) < 0.00001)
      return(p2);
   if (abs(valp1-valp2) < 0.00001)
      return(p1);
   mu = (isolevel - valp1) / (valp2 - valp1);
   p->x = p1->x + mu * (p2->x - p1->x);
   p->y = p1->y + mu * (p2->y - p1->y);
   p->z = p1->z + mu * (p2->z - p1->z);

   return(p);
}



int edgeTable[256]={
0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   };


int triTable[4096] = 
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1,
3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1,
3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1,
3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1,
9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1,
9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1,
2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1,
8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1,
9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1,
4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1,
3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1,
1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1,
4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1,
4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1,
9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1,
5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1,
2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1,
9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1,
0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1,
2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1,
10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1,
4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1,
5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1,
5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1,
9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1,
0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1,
1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1,
10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1,
8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1,
2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1,
7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1,
9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1,
2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1,
11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1,
9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1,
5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1,
11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1,
11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1,
1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1,
9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1,
5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1,
2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1,
0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1,
5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1,
6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1,
0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1,
3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1,
6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1,
5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1,
1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1,
10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1,
6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1,
1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1,
8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1,
7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1,
3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1,
5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1,
0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1,
9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1,
8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1,
5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1,
0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1,
6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1,
10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1,
10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1,
8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1,
1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1,
3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1,
0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1,
10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1,
0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1,
3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1,
6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1,
9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1,
8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1,
3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1,
6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1,
0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1,
10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1,
10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1,
1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1,
2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1,
7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1,
7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1,
2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1,
1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1,
11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1,
8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1,
0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1,
7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1,
10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1,
2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1,
6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1,
7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1,
2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1,
1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1,
10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1,
10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1,
0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1,
7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1,
6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1,
8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1,
9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1,
6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1,
4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1,
10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1,
8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1,
0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1,
1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1,
8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1,
10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1,
4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1,
10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1,
5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1,
11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1,
9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1,
6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1,
7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1,
3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1,
7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1,
9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1,
3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1,
6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1,
9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1,
1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1,
4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1,
7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1,
6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1,
3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1,
0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1,
6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1,
0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1,
11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1,
6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1,
5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1,
9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1,
1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1,
1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1,
10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1,
0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1,
5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1,
10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1,
11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1,
9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1,
7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1,
2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1,
8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1,
9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1,
9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1,
1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1,
9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1,
9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1,
5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1,
0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1,
10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1,
2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1,
0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1,
0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1,
9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1,
5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1,
3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1,
5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1,
8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1,
0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1,
9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1,
0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1,
1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1,
3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1,
4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1,
9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1,
11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1,
11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1,
2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1,
9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1,
3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1,
1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1,
4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1,
4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1,
0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1,
3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1,
3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1,
0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1,
9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1,
1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};

/*
int triTable[4096] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  1,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  8,  3,  9,  8,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  3,  1,  2,  10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  2,  10, 0,  2,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 2,  8,  3,  2,  10, 8,  10, 9,  8, -1, -1, -1, -1, -1, -1, -1,
 3,  11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  11, 2,  8,  11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  9,  0,  2,  3,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  11, 2,  1,  9,  11, 9,  8,  11,-1, -1, -1, -1, -1, -1, -1,
 3,  10, 1,  11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  10, 1,  0,  8,  10, 8,  11, 10,-1, -1, -1, -1, -1, -1, -1,
 3,  9,  0,  3,  11, 9,  11, 10, 9, -1, -1, -1, -1, -1, -1, -1,
 9,  8,  10, 10, 8,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  3,  0,  7,  3,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  1,  9,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  1,  9,  4,  7,  1,  7,  3,  1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10, 8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  4,  7,  3,  0,  4,  1,  2,  10,-1, -1, -1, -1, -1, -1, -1,
 9,  2,  10, 9,  0,  2,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1,
 2,  10, 9,  2,  9,  7,  2,  7,  3,  7,  9,  4, -1, -1, -1, -1,
 8,  4,  7,  3,  11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 11, 4,  7,  11, 2,  4,  2,  0,  4, -1, -1, -1, -1, -1, -1, -1,
 9,  0,  1,  8,  4,  7,  2,  3,  11,-1, -1, -1, -1, -1, -1, -1,
 4,  7,  11, 9,  4,  11, 9,  11, 2,  9,  2,  1, -1, -1, -1, -1,
 3,  10, 1,  3,  11, 10, 7,  8,  4, -1, -1, -1, -1, -1, -1, -1,
 1,  11, 10, 1,  4,  11, 1,  0,  4,  7,  11, 4, -1, -1, -1, -1,
 4,  7,  8,  9,  0,  11, 9,  11, 10, 11, 0,  3, -1, -1, -1, -1,
 4,  7,  11, 4,  11, 9,  9,  11, 10,-1, -1, -1, -1, -1, -1, -1,
 9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  5,  4,  0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  5,  4,  1,  5,  0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 8,  5,  4,  8,  3,  5,  3,  1,  5, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10, 9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  0,  8,  1,  2,  10, 4,  9,  5, -1, -1, -1, -1, -1, -1, -1,
 5,  2,  10, 5,  4,  2,  4,  0,  2, -1, -1, -1, -1, -1, -1, -1,
 2,  10, 5,  3,  2,  5,  3,  5,  4,  3,  4,  8, -1, -1, -1, -1,
 9,  5,  4,  2,  3,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  11, 2,  0,  8,  11, 4,  9,  5, -1, -1, -1, -1, -1, -1, -1,
 0,  5,  4,  0,  1,  5,  2,  3,  11,-1, -1, -1, -1, -1, -1, -1,
 2,  1,  5,  2,  5,  8,  2,  8,  11, 4,  8,  5, -1, -1, -1, -1,
 10, 3,  11, 10, 1,  3,  9,  5,  4, -1, -1, -1, -1, -1, -1, -1,
 4,  9,  5,  0,  8,  1,  8,  10, 1,  8,  11, 10,-1, -1, -1, -1,
 5,  4,  0,  5,  0,  11, 5,  11, 10, 11, 0,  3, -1, -1, -1, -1,
 5,  4,  8,  5,  8,  10, 10, 8,  11,-1, -1, -1, -1, -1, -1, -1,
 9,  7,  8,  5,  7,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  3,  0,  9,  5,  3,  5,  7,  3, -1, -1, -1, -1, -1, -1, -1,
 0,  7,  8,  0,  1,  7,  1,  5,  7, -1, -1, -1, -1, -1, -1, -1,
 1,  5,  3,  3,  5,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  7,  8,  9,  5,  7,  10, 1,  2, -1, -1, -1, -1, -1, -1, -1,
 10, 1,  2,  9,  5,  0,  5,  3,  0,  5,  7,  3, -1, -1, -1, -1,
 8,  0,  2,  8,  2,  5,  8,  5,  7,  10, 5,  2, -1, -1, -1, -1,
 2,  10, 5,  2,  5,  3,  3,  5,  7, -1, -1, -1, -1, -1, -1, -1,
 7,  9,  5,  7,  8,  9,  3,  11, 2, -1, -1, -1, -1, -1, -1, -1,
 9,  5,  7,  9,  7,  2,  9,  2,  0,  2,  7,  11,-1, -1, -1, -1,
 2,  3,  11, 0,  1,  8,  1,  7,  8,  1,  5,  7, -1, -1, -1, -1,
 11, 2,  1,  11, 1,  7,  7,  1,  5, -1, -1, -1, -1, -1, -1, -1,
 9,  5,  8,  8,  5,  7,  10, 1,  3,  10, 3,  11,-1, -1, -1, -1,
 5,  7,  0,  5,  0,  9,  7,  11, 0,  1,  0,  10, 11, 10, 0, -1,
 11, 10, 0,  11, 0,  3,  10, 5,  0,  8,  0,  7,  5,  7,  0, -1,
 11, 10, 5,  7,  11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 10, 6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  3,  5,  10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  0,  1,  5,  10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  8,  3,  1,  9,  8,  5,  10, 6, -1, -1, -1, -1, -1, -1, -1,
 1,  6,  5,  2,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  6,  5,  1,  2,  6,  3,  0,  8, -1, -1, -1, -1, -1, -1, -1,
 9,  6,  5,  9,  0,  6,  0,  2,  6, -1, -1, -1, -1, -1, -1, -1,
 5,  9,  8,  5,  8,  2,  5,  2,  6,  3,  2,  8, -1, -1, -1, -1,
 2,  3,  11, 10, 6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 11, 0,  8,  11, 2,  0,  10, 6,  5, -1, -1, -1, -1, -1, -1, -1,
 0,  1,  9,  2,  3,  11, 5,  10, 6, -1, -1, -1, -1, -1, -1, -1,
 5,  10, 6,  1,  9,  2,  9,  11, 2,  9,  8,  11,-1, -1, -1, -1,
 6,  3,  11, 6,  5,  3,  5,  1,  3, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  11, 0,  11, 5,  0,  5,  1,  5,  11, 6, -1, -1, -1, -1,
 3,  11, 6,  0,  3,  6,  0,  6,  5,  0,  5,  9, -1, -1, -1, -1,
 6,  5,  9,  6,  9,  11, 11, 9,  8, -1, -1, -1, -1, -1, -1, -1,
 5,  10, 6,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  3,  0,  4,  7,  3,  6,  5,  10,-1, -1, -1, -1, -1, -1, -1,
 1,  9,  0,  5,  10, 6,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1,
 10, 6,  5,  1,  9,  7,  1,  7,  3,  7,  9,  4, -1, -1, -1, -1,
 6,  1,  2,  6,  5,  1,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  5,  5,  2,  6,  3,  0,  4,  3,  4,  7, -1, -1, -1, -1,
 8,  4,  7,  9,  0,  5,  0,  6,  5,  0,  2,  6, -1, -1, -1, -1,
 7,  3,  9,  7,  9,  4,  3,  2,  9,  5,  9,  6,  2,  6,  9, -1,
 3,  11, 2,  7,  8,  4,  10, 6,  5, -1, -1, -1, -1, -1, -1, -1,
 5,  10, 6,  4,  7,  2,  4,  2,  0,  2,  7,  11,-1, -1, -1, -1,
 0,  1,  9,  4,  7,  8,  2,  3,  11, 5,  10, 6, -1, -1, -1, -1,
 9,  2,  1,  9,  11, 2,  9,  4,  11, 7,  11, 4,  5,  10, 6, -1,
 8,  4,  7,  3,  11, 5,  3,  5,  1,  5,  11, 6, -1, -1, -1, -1,
 5,  1,  11, 5,  11, 6,  1,  0,  11, 7,  11, 4,  0,  4,  11,-1,
 0,  5,  9,  0,  6,  5,  0,  3,  6,  11, 6,  3,  8,  4,  7, -1,
 6,  5,  9,  6,  9,  11, 4,  7,  9,  7,  11, 9, -1, -1, -1, -1,
 10, 4,  9,  6,  4,  10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
 4,  10, 6,  4,  9,  10, 0,  8,  3, -1, -1, -1, -1, -1, -1, -1,
 10, 0,  1,  10, 6,  0,  6,  4,  0, -1, -1, -1, -1, -1, -1, -1, 
 8,  3,  1,  8,  1,  6,  8,  6,  4,  6,  1,  10,-1, -1, -1, -1,
 1,  4,  9,  1,  2,  4,  2,  6,  4, -1, -1, -1, -1, -1, -1, -1,
 3,  0,  8,  1,  2,  9,  2,  4,  9,  2,  6,  4, -1, -1, -1, -1,
 0,  2,  4,  4,  2,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 8,  3,  2,  8,  2,  4,  4,  2,  6, -1, -1, -1, -1, -1, -1, -1,
 10, 4,  9,  10, 6,  4,  11, 2,  3, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  2,  2,  8,  11, 4,  9,  10, 4,  10, 6, -1, -1, -1, -1,
 3,  11, 2,  0,  1,  6,  0,  6,  4,  6,  1,  10,-1, -1, -1, -1,
 6,  4,  1,  6,  1,  10, 4,  8,  1,  2,  1,  11, 8,  11, 1, -1,
 9,  6,  4,  9,  3,  6,  9,  1,  3,  11, 6,  3, -1, -1, -1, -1,
 8,  11, 1,  8,  1,  0,  11, 6,  1,  9,  1,  4,  6,  4,  1, -1,
 3,  11, 6,  3,  6,  0,  0,  6,  4, -1, -1, -1, -1, -1, -1, -1,
 6,  4,  8,  11, 6,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 7,  10, 6,  7,  8,  10, 8,  9,  10,-1, -1, -1, -1, -1, -1, -1,
 0,  7,  3,  0,  10, 7,  0,  9,  10, 6,  7,  10,-1, -1, -1, -1,
 10, 6,  7,  1,  10, 7,  1,  7,  8,  1,  8,  0, -1, -1, -1, -1,
 10, 6,  7,  10, 7,  1,  1,  7,  3, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  6,  1,  6,  8,  1,  8,  9,  8,  6,  7, -1, -1, -1, -1,
 2,  6,  9,  2,  9,  1,  6,  7,  9,  0,  9,  3,  7,  3,  9, -1,
 7,  8,  0,  7,  0,  6,  6,  0,  2, -1, -1, -1, -1, -1, -1, -1,
 7,  3,  2,  6,  7,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 2,  3,  11, 10, 6,  8,  10, 8,  9,  8,  6,  7, -1, -1, -1, -1,
 2,  0,  7,  2,  7,  11, 0,  9,  7,  6,  7,  10, 9,  10, 7, -1,
 1,  8,  0,  1,  7,  8,  1,  10, 7,  6,  7,  10, 2,  3,  11,-1,
 11, 2,  1,  11, 1,  7,  10, 6,  1,  6,  7,  1, -1, -1, -1, -1,
 8,  9,  6,  8,  6,  7,  9,  1,  6,  11, 6,  3,  1,  3,  6, -1,
 0,  9,  1,  11, 6,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 7,  8,  0,  7,  0,  6,  3,  11, 0,  11, 6,  0, -1, -1, -1, -1,
 7,  11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 7,  6,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  0,  8,  11, 7,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  1,  9,  11, 7,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 8,  1,  9,  8,  3,  1,  11, 7,  6, -1, -1, -1, -1, -1, -1, -1,
 10, 1,  2,  6,  11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10, 3,  0,  8,  6,  11, 7, -1, -1, -1, -1, -1, -1, -1,
 2,  9,  0,  2,  10, 9,  6,  11, 7, -1, -1, -1, -1, -1, -1, -1,
 6,  11, 7,  2,  10, 3,  10, 8,  3,  10, 9,  8, -1, -1, -1, -1,
 7,  2,  3,  6,  2,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 7,  0,  8,  7,  6,  0,  6,  2,  0, -1, -1, -1, -1, -1, -1, -1,
 2,  7,  6,  2,  3,  7,  0,  1,  9, -1, -1, -1, -1, -1, -1, -1,
 1,  6,  2,  1,  8,  6,  1,  9,  8,  8,  7,  6, -1, -1, -1, -1,
 10, 7,  6,  10, 1,  7,  1,  3,  7, -1, -1, -1, -1, -1, -1, -1,
 10, 7,  6,  1,  7,  10, 1,  8,  7,  1,  0,  8, -1, -1, -1, -1,
 0,  3,  7,  0,  7,  10, 0,  10, 9,  6,  10, 7, -1, -1, -1, -1,
 7,  6,  10, 7,  10, 8,  8,  10, 9, -1, -1, -1, -1, -1, -1, -1,
 6,  8,  4,  11, 8,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  6,  11, 3,  0,  6,  0,  4,  6, -1, -1, -1, -1, -1, -1, -1,
 8,  6,  11, 8,  4,  6,  9,  0,  1, -1, -1, -1, -1, -1, -1, -1,
 9,  4,  6,  9,  6,  3,  9,  3,  1,  11, 3,  6, -1, -1, -1, -1,
 6,  8,  4,  6,  11, 8,  2,  10, 1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10, 3,  0,  11, 0,  6,  11, 0,  4,  6, -1, -1, -1, -1,
 4,  11, 8,  4,  6,  11, 0,  2,  9,  2,  10, 9, -1, -1, -1, -1,
 10, 9,  3,  10, 3,  2,  9,  4,  3,  11, 3,  6,  4,  6,  3, -1,
 8,  2,  3,  8,  4,  2,  4,  6,  2, -1, -1, -1, -1, -1, -1, -1,
 0,  4,  2,  4,  6,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  9,  0,  2,  3,  4,  2,  4,  6,  4,  3,  8, -1, -1, -1, -1,
 1,  9,  4,  1,  4,  2,  2,  4,  6, -1, -1, -1, -1, -1, -1, -1,
 8,  1,  3,  8,  6,  1,  8,  4,  6,  6,  10, 1, -1, -1, -1, -1,
 10, 1,  0,  10, 0,  6,  6,  0,  4, -1, -1, -1, -1, -1, -1, -1,
 4,  6,  3,  4,  3,  8,  6,  10, 3,  0,  3,  9,  10, 9,  3, -1,
 10, 9,  4,  6,  10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  9,  5,  7,  6,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  3,  4,  9,  5,  11, 7,  6, -1, -1, -1, -1, -1, -1, -1,
 5,  0,  1,  5,  4,  0,  7,  6,  11,-1, -1, -1, -1, -1, -1, -1,
 11, 7,  6,  8,  3,  4,  3,  5,  4,  3,  1,  5, -1, -1, -1, -1,
 9,  5,  4,  10, 1,  2,  7,  6,  11,-1, -1, -1, -1, -1, -1, -1,
 6,  11, 7,  1,  2,  10, 0,  8,  3,  4,  9,  5, -1, -1, -1, -1,
 7,  6,  11, 5,  4,  10, 4,  2,  10, 4,  0,  2, -1, -1, -1, -1,
 3,  4,  8,  3,  5,  4,  3,  2,  5,  10, 5,  2,  11, 7,  6, -1,
 7,  2,  3,  7,  6,  2,  5,  4,  9, -1, -1, -1, -1, -1, -1, -1,
 9,  5,  4,  0,  8,  6,  0,  6,  2,  6,  8,  7, -1, -1, -1, -1,
 3,  6,  2,  3,  7,  6,  1,  5,  0,  5,  4,  0, -1, -1, -1, -1,
 6,  2,  8,  6,  8,  7,  2,  1,  8,  4,  8,  5,  1,  5,  8, -1,
 9,  5,  4,  10, 1,  6,  1,  7,  6,  1,  3,  7, -1, -1, -1, -1,
 1,  6,  10, 1,  7,  6,  1,  0,  7,  8,  7,  0,  9,  5,  4, -1,
 4,  0,  10, 4,  10, 5,  0,  3,  10, 6,  10, 7,  3,  7,  10,-1,
 7,  6,  10, 7,  10, 8,  5,  4,  10, 4,  8,  10,-1, -1, -1, -1,
 6,  9,  5,  6,  11, 9,  11, 8,  9, -1, -1, -1, -1, -1, -1, -1,
 3,  6,  11, 0,  6,  3,  0,  5,  6,  0,  9,  5, -1, -1, -1, -1,
 0,  11, 8,  0,  5,  11, 0,  1,  5,  5,  6,  11,-1, -1, -1, -1,
 6,  11, 3,  6,  3,  5,  5,  3,  1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  10, 9,  5,  11, 9,  11, 8,  11, 5,  6, -1, -1, -1, -1,
 0,  11, 3,  0,  6,  11, 0,  9,  6,  5,  6,  9,  1,  2,  10,-1,
 11, 8,  5,  11, 5,  6,  8,  0,  5,  10, 5,  2,  0,  2,  5, -1,
 6,  11, 3,  6,  3,  5,  2,  10, 3,  10, 5,  3, -1, -1, -1, -1,
 5,  8,  9,  5,  2,  8,  5,  6,  2,  3,  8,  2, -1, -1, -1, -1,
 9,  5,  6,  9,  6,  0,  0,  6,  2, -1, -1, -1, -1, -1, -1, -1,
 1,  5,  8,  1,  8,  0,  5,  6,  8,  3,  8,  2,  6,  2,  8, -1,
 1,  5,  6,  2,  1,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  3,  6,  1,  6,  10, 3,  8,  6,  5,  6,  9,  8,  9,  6, -1,
 10, 1,  0,  10, 0,  6,  9,  5,  0,  5,  6,  0, -1, -1, -1, -1,
 0,  3,  8,  5,  6,  10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 10, 5,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 11, 5,  10, 7,  5,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 11, 5,  10, 11, 7,  5,  8,  3,  0, -1, -1, -1, -1, -1, -1, -1,
 5,  11, 7,  5,  10, 11, 1,  9,  0, -1, -1, -1, -1, -1, -1, -1,
 10, 7,  5,  10, 11, 7,  9,  8,  1,  8,  3,  1, -1, -1, -1, -1,
 11, 1,  2,  11, 7,  1,  7,  5,  1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  3,  1,  2,  7,  1,  7,  5,  7,  2,  11,-1, -1, -1, -1,
 9,  7,  5,  9,  2,  7,  9,  0,  2,  2,  11, 7, -1, -1, -1, -1,
 7,  5,  2,  7,  2,  11, 5,  9,  2,  3,  2,  8,  9,  8,  2, -1,
 2,  5,  10, 2,  3,  5,  3,  7,  5, -1, -1, -1, -1, -1, -1, -1,
 8,  2,  0,  8,  5,  2,  8,  7,  5,  10, 2,  5, -1, -1, -1, -1,
 9,  0,  1,  5,  10, 3,  5,  3,  7,  3,  10, 2, -1, -1, -1, -1,
 9,  8,  2,  9,  2,  1,  8,  7,  2,  10, 2,  5,  7,  5,  2, -1,
 1,  3,  5,  3,  7,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  8,  7,  0,  7,  1,  1,  7,  5, -1, -1, -1, -1, -1, -1, -1,
 9,  0,  3,  9,  3,  5,  5,  3,  7, -1, -1, -1, -1, -1, -1, -1,
 9,  8,  7,  5,  9,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 5,  8,  4,  5,  10, 8,  10, 11, 8, -1, -1, -1, -1, -1, -1, -1,
 5,  0,  4,  5,  11, 0,  5,  10, 11, 11, 3,  0, -1, -1, -1, -1,
 0,  1,  9,  8,  4,  10, 8,  10, 11, 10, 4,  5, -1, -1, -1, -1,
 10, 11, 4,  10, 4,  5,  11, 3,  4,  9,  4,  1,  3,  1,  4, -1,
 2,  5,  1,  2,  8,  5,  2,  11, 8,  4,  5,  8, -1, -1, -1, -1,
 0,  4,  11, 0,  11, 3,  4,  5,  11, 2,  11, 1,  5,  1,  11,-1,
 0,  2,  5,  0,  5,  9,  2,  11, 5,  4,  5,  8,  11, 8,  5, -1,
 9,  4,  5,  2,  11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 2,  5,  10, 3,  5,  2,  3,  4,  5,  3,  8,  4, -1, -1, -1, -1,
 5,  10, 2,  5,  2,  4,  4,  2,  0, -1, -1, -1, -1, -1, -1, -1,
 3,  10, 2,  3,  5,  10, 3,  8,  5,  4,  5,  8,  0,  1,  9, -1,
 5,  10, 2,  5,  2,  4,  1,  9,  2,  9,  4,  2, -1, -1, -1, -1,
 8,  4,  5,  8,  5,  3,  3,  5,  1, -1, -1, -1, -1, -1, -1, -1,
 0,  4,  5,  1,  0,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 8,  4,  5,  8,  5,  3,  9,  0,  5,  0,  3,  5, -1, -1, -1, -1,
 9,  4,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  11, 7,  4,  9,  11, 9,  10, 11,-1, -1, -1, -1, -1, -1, -1,
 0,  8,  3,  4,  9,  7,  9,  11, 7,  9,  10, 11,-1, -1, -1, -1,
 1,  10, 11, 1,  11, 4,  1,  4,  0,  7,  4,  11,-1, -1, -1, -1,
 3,  1,  4,  3,  4,  8,  1,  10, 4,  7,  4,  11, 10, 11, 4, -1,
 4,  11, 7,  9,  11, 4,  9,  2,  11, 9,  1,  2, -1, -1, -1, -1,
 9,  7,  4,  9,  11, 7,  9,  1,  11, 2,  11, 1,  0,  8,  3, -1,
 11, 7,  4,  11, 4,  2,  2,  4,  0, -1, -1, -1, -1, -1, -1, -1,
 11, 7,  4,  11, 4,  2,  8,  3,  4,  3,  2,  4, -1, -1, -1, -1,
 2,  9,  10, 2,  7,  9,  2,  3,  7,  7,  4,  9, -1, -1, -1, -1,
 9,  10, 7,  9,  7,  4,  10, 2,  7,  8,  7,  0,  2,  0,  7, -1,
 3,  7,  10, 3,  10, 2,  7,  4,  10, 1,  10, 0,  4,  0,  10,-1,
 1,  10, 2,  8,  7,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  9,  1,  4,  1,  7,  7,  1,  3, -1, -1, -1, -1, -1, -1, -1,
 4,  9,  1,  4,  1,  7,  0,  8,  1,  8,  7,  1, -1, -1, -1, -1,
 4,  0,  3,  7,  4,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 4,  8,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 9,  10, 8,  10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  0,  9,  3,  9,  11, 11, 9,  10,-1, -1, -1, -1, -1, -1, -1,
 0,  1,  10, 0,  10, 8,  8,  10, 11,-1, -1, -1, -1, -1, -1, -1,
 3,  1,  10, 11, 3,  10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  2,  11, 1,  11, 9,  9,  11, 8, -1, -1, -1, -1, -1, -1, -1,
 3,  0,  9,  3,  9,  11, 1,  2,  9,  2,  11, 9, -1, -1, -1, -1,
 0,  2,  11, 8,  0,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 3,  2,  11,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 2,  3,  8,  2,  8,  10, 10, 8,  9, -1, -1, -1, -1, -1, -1, -1,
 9,  10, 2,  0,  9,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 2,  3,  8,  2,  8,  10, 0,  1,  8,  1,  10, 8, -1, -1, -1, -1,
 1,  10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 1,  3,  8,  9,  1,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  9,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 0,  3,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
*/


/*
   Given a grid cell and an isolevel, calculate the triangular
   facets required to represent the isosurface through the cell.
   Return the number of triangular facets, the array "triangles"
   will be loaded up with the vertices at most 5 triangular facets.
	0 will be returned if the grid cell is either totally above
   of totally below the isolevel.
*/
int Polygonise(GRIDCELL* grid,double isolevel,TRIANGLE **triangles)
{
   int i,ntriang;
   int cubeindex;
   XYZ* vertlist[12];

   /*
      Determine the index into the edge table which
      tells us which vertices are inside of the surface
   */
   cubeindex = 0;
   if (grid->val[0] < isolevel) cubeindex |= 1;
   if (grid->val[1] < isolevel) cubeindex |= 2;
   if (grid->val[2] < isolevel) cubeindex |= 4;
   if (grid->val[3] < isolevel) cubeindex |= 8;
   if (grid->val[4] < isolevel) cubeindex |= 16;
   if (grid->val[5] < isolevel) cubeindex |= 32;
   if (grid->val[6] < isolevel) cubeindex |= 64;
   if (grid->val[7] < isolevel) cubeindex |= 128;

   /* Cube is entirely in/out of the surface */
   if (edgeTable[cubeindex] == 0)
      return(0);

   /* Find the vertices where the surface intersects the cube */
   if (edgeTable[cubeindex] & 1)
      vertlist[0] =
         VertexInterp(isolevel,grid->p[0],grid->p[1],grid->val[0],grid->val[1]);
   if (edgeTable[cubeindex] & 2)
      vertlist[1] =
         VertexInterp(isolevel,grid->p[1],grid->p[2],grid->val[1],grid->val[2]);
   if (edgeTable[cubeindex] & 4)
      vertlist[2] =
         VertexInterp(isolevel,grid->p[2],grid->p[3],grid->val[2],grid->val[3]);
   if (edgeTable[cubeindex] & 8)
      vertlist[3] =
         VertexInterp(isolevel,grid->p[3],grid->p[0],grid->val[3],grid->val[0]);
   if (edgeTable[cubeindex] & 16)
      vertlist[4] =
         VertexInterp(isolevel,grid->p[4],grid->p[5],grid->val[4],grid->val[5]);
   if (edgeTable[cubeindex] & 32)
      vertlist[5] =
         VertexInterp(isolevel,grid->p[5],grid->p[6],grid->val[5],grid->val[6]);
   if (edgeTable[cubeindex] & 64)
      vertlist[6] =
         VertexInterp(isolevel,grid->p[6],grid->p[7],grid->val[6],grid->val[7]);
   if (edgeTable[cubeindex] & 128)
      vertlist[7] =
         VertexInterp(isolevel,grid->p[7],grid->p[4],grid->val[7],grid->val[4]);
   if (edgeTable[cubeindex] & 256)
      vertlist[8] =
         VertexInterp(isolevel,grid->p[0],grid->p[4],grid->val[0],grid->val[4]);
   if (edgeTable[cubeindex] & 512)
      vertlist[9] =
         VertexInterp(isolevel,grid->p[1],grid->p[5],grid->val[1],grid->val[5]);
   if (edgeTable[cubeindex] & 1024)
      vertlist[10] =
         VertexInterp(isolevel,grid->p[2],grid->p[6],grid->val[2],grid->val[6]);
   if (edgeTable[cubeindex] & 2048)
      vertlist[11] =
         VertexInterp(isolevel,grid->p[3],grid->p[7],grid->val[3],grid->val[7]);

   /* Create the triangle */
   ntriang = 0;
   for( i = 0; triTable[ cubeindex * 16 + i ] != -1; i += 3 )
   {
   	TRIANGLE* triangle = &(*triangles)[ntriang];
      triangle->p[0] = vertlist[ triTable[ cubeindex * 16 + i ] ];
      triangle->p[1] = vertlist[ triTable[ cubeindex * 16 + i + 1 ] ];
      triangle->p[2] = vertlist[ triTable[ cubeindex * 16 + i + 2 ] ];
      ntriang++;
   }

   return(ntriang);
}


Posted By: Joozey

Re: Marching cubes not working - 12/07/11 15:51

I found the bug laugh. Nothing to do with the algorithm, my scalar field had wrong values on positions. Values of identical positions from neighbouring boxes didn't match properly >_<.
Posted By: Roel

Re: Marching cubes not working - 12/07/11 16:24

At first i didn't get what marching cubes is all about...
The paper says voxels?
Posted By: Joozey

Re: Marching cubes not working - 12/07/11 16:57

A voxel is merely a weighted point in space. A scalar field is defined by many of such points, all contained in conceptual boxes (of 8 points each).
Now, between each point (on each edge of the box) is a linear set of values: between point 1 with value 1 and point 2 with value 5 lay the values 2, 3 and 4 somewhere on the edge. Supposing your "iso" value is 3, you could calculate the position on each edge where the value between two points is 3.
After collecting all points that hold value 3, you can draw triangles (or faces) and create a mesh resulting in an isosurface.

Exactly how you draw those triangles in a box of 8 points is calculated by an algorithm; marching cubes!




Result:

Posted By: Carlos3DGS

Re: Marching cubes not working - 12/07/11 19:59

After seeing this thread this morning I was curious to know what "marching cubes" was. After seeing a few videos and reading a bit on the subject this blew my mind, the possibilities seem amazing! I have been reading on the subject alot today and even though I still have alot to understand on how this works (or how to get it to work) I cannot avoid thinking how this could be applied for dynamic terrains in A8.
This question might seem a little noobish but...
When you have calculated all the triangles, how do you tell 3dgs to create a triangle?
Is there any function in 3dgs to create a polygon that I seem to be unable to find in the manuall?
like:
poly_create(v1*,v2*,v3*);
or:
face_create(v1*,v2*,v3*);
Posted By: Rei_Ayanami

Re: Marching cubes not working - 12/07/11 20:39

You got to do this with yourself, via DirectX laugh
Posted By: Carlos3DGS

Re: Marching cubes not working - 12/07/11 21:02

Originally Posted By: Rei_Ayanami
You got to do this with yourself, via DirectX laugh


Will that mean I also have to do the collision detection myself since they will not be 3dgs engine objects?
Learning marching cubes + learning directX + programming a new collision system from scratch = not worth it for my game.
Ouch! that hurt... :sadface
I guess no marching cubes for me then! Back to the mobile randomized terrains system I was working on, lol.
Posted By: Pappenheimer

Re: Marching cubes not working - 12/07/11 21:52

You don't have to start from scratch, though.
There are example codes for creating meshes in the forum and in resources, from fogman and ventilator as far as I know.
And, there is the dll from TechMuc to save a mesh as an mdl.
When you got your mesh as mdl, then you have the common collision system.
Posted By: Rei_Ayanami

Re: Marching cubes not working - 12/07/11 22:06

You only need to create it, collision [I only tested bouding boxes yet, but I am sure you can use polygon detection, too] is done by the engine wink
[you can just treat it like a normal entity]
© 2024 lite-C Forums