Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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.
- */
- i32 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 };
- i32 indextable[256][16] = {
- { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,3,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,3,1,2,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,1,3,0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,0,4,2,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,1,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,4,0,2,3,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,0,3,4,3,2,4,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,1,0,2,3,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,1,4,2,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,1,0,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,5,4,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,0,4,2,3,0,3,1,0,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,5,4,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,4,5,3,0,4,1,2,6,-1,-1,-1,-1,-1,-1,-1 },
- { 5,1,6,5,0,1,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,5,4,0,4,3,0,3,1,3,4,2,-1,-1,-1,-1 },
- { 4,2,3,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,2,3,4,1,2,1,0,2,-1,-1,-1,-1,-1,-1,-1 },
- { 7,0,1,6,4,5,2,3,8,-1,-1,-1,-1,-1,-1,-1 },
- { 2,3,5,4,2,5,4,5,1,4,1,0,-1,-1,-1,-1 },
- { 1,5,0,1,6,5,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
- { 1,5,4,1,2,5,1,0,2,3,5,2,-1,-1,-1,-1 },
- { 2,3,4,5,0,7,5,7,6,7,0,1,-1,-1,-1,-1 },
- { 0,1,4,0,4,2,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
- { 2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 5,3,2,0,4,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,2,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,3,2,4,1,3,1,0,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,5,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,6,1,2,8,4,7,5,-1,-1,-1,-1,-1,-1,-1 },
- { 3,1,4,3,2,1,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,5,3,1,0,3,1,3,2,1,2,4,-1,-1,-1,-1 },
- { 4,3,2,0,1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,6,1,0,4,6,2,5,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,5,4,0,1,5,2,3,6,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,3,1,3,4,1,4,5,2,4,3,-1,-1,-1,-1 },
- { 5,1,6,5,0,1,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 2,5,3,0,4,1,4,6,1,4,7,6,-1,-1,-1,-1 },
- { 3,2,0,3,0,5,3,5,4,5,0,1,-1,-1,-1,-1 },
- { 1,0,2,1,2,3,3,2,4,-1,-1,-1,-1,-1,-1,-1 },
- { 3,1,2,0,1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,1,0,4,2,1,2,3,1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,4,0,1,3,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 5,3,4,5,2,3,6,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 7,1,2,6,4,0,4,3,0,4,5,3,-1,-1,-1,-1 },
- { 4,0,1,4,1,2,4,2,3,5,2,1,-1,-1,-1,-1 },
- { 0,4,2,0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 3,5,2,3,4,5,1,6,0,-1,-1,-1,-1,-1,-1,-1 },
- { 4,2,3,4,3,1,4,1,0,1,3,5,-1,-1,-1,-1 },
- { 2,3,7,0,1,6,1,5,6,1,4,5,-1,-1,-1,-1 },
- { 4,1,0,4,0,3,3,0,2,-1,-1,-1,-1,-1,-1,-1 },
- { 5,2,4,4,2,3,6,0,1,6,1,7,-1,-1,-1,-1 },
- { 2,3,0,2,0,4,3,6,0,1,0,5,6,5,0,-1 },
- { 6,5,0,6,0,1,5,2,0,4,0,3,2,3,0,-1 },
- { 3,2,0,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,0,5,4,2,6,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,2,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,5,4,1,2,5,3,0,6,-1,-1,-1,-1,-1,-1,-1 },
- { 4,3,2,4,0,3,0,1,3,-1,-1,-1,-1,-1,-1,-1 },
- { 2,5,4,2,4,0,2,0,3,1,0,4,-1,-1,-1,-1 },
- { 0,1,5,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 6,0,4,6,1,0,5,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,6,2,3,8,4,7,5,-1,-1,-1,-1,-1,-1,-1 },
- { 2,6,3,0,5,1,5,7,1,5,4,7,-1,-1,-1,-1 },
- { 3,1,4,3,2,1,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,5,0,5,2,0,2,1,2,5,3,-1,-1,-1,-1 },
- { 1,5,3,0,1,3,0,3,2,0,2,4,-1,-1,-1,-1 },
- { 1,0,3,1,3,4,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 1,5,2,0,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,1,0,2,5,1,4,3,6,-1,-1,-1,-1,-1,-1,-1 },
- { 1,7,0,3,8,4,6,2,5,-1,-1,-1,-1,-1,-1,-1 },
- { 7,4,3,0,6,5,0,5,1,5,6,2,-1,-1,-1,-1 },
- { 4,0,1,4,3,0,2,5,6,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1 },
- { 6,2,5,7,0,3,0,4,3,0,1,4,-1,-1,-1,-1 },
- { 5,1,6,5,6,2,1,0,6,3,6,4,0,4,6,-1 },
- { 1,8,0,5,6,2,7,4,3,-1,-1,-1,-1,-1,-1,-1 },
- { 3,6,4,2,5,1,2,1,0,1,5,7,-1,-1,-1,-1 },
- { 0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1 },
- { 6,1,0,6,8,1,6,2,8,5,8,2,3,7,4,-1 },
- { 6,2,5,1,7,3,1,3,0,3,7,4,-1,-1,-1,-1 },
- { 3,1,6,3,6,4,1,0,6,5,6,2,0,2,6,-1 },
- { 0,3,7,0,4,3,0,1,4,8,4,1,6,2,5,-1 },
- { 2,1,4,2,4,5,0,3,4,3,5,4,-1,-1,-1,-1 },
- { 3,0,2,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,6,3,2,5,6,0,4,1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,1,4,3,0,3,2,0,-1,-1,-1,-1,-1,-1,-1 },
- { 4,1,0,4,0,3,4,3,2,3,0,5,-1,-1,-1,-1 },
- { 0,2,4,0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,6,1,2,7,2,4,7,2,5,4,-1,-1,-1,-1 },
- { 0,1,2,2,1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,1,0,4,0,2,2,0,3,-1,-1,-1,-1,-1,-1,-1 },
- { 5,2,4,5,3,2,6,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,1,4,7,2,5,6,2,6,3,-1,-1,-1,-1 },
- { 3,7,2,0,1,5,0,5,4,5,1,6,-1,-1,-1,-1 },
- { 3,2,0,3,0,5,2,4,0,1,0,6,4,6,0,-1 },
- { 4,3,2,4,1,3,4,0,1,5,3,1,-1,-1,-1,-1 },
- { 4,6,1,4,1,0,6,3,1,5,1,2,3,2,1,-1 },
- { 1,4,3,1,3,0,0,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,4,0,1,2,4,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,1,0,5,3,0,4,5,2,3,5,-1,-1,-1,-1 },
- { 5,2,3,1,5,3,1,3,4,1,4,0,-1,-1,-1,-1 },
- { 4,2,3,4,3,0,0,3,1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,0,2,4,0,4,5,4,2,3,-1,-1,-1,-1 },
- { 2,4,6,2,6,1,4,5,6,0,6,3,5,3,6,-1 },
- { 3,4,0,3,0,2,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,1,0,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,7,6,2,4,6,4,5,4,2,3,-1,-1,-1,-1 },
- { 1,0,3,1,3,6,0,4,3,2,3,5,4,5,3,-1 },
- { 1,6,0,1,5,6,1,7,5,4,5,7,2,3,8,-1 },
- { 5,1,0,5,0,3,4,2,0,2,3,0,-1,-1,-1,-1 },
- { 4,5,2,4,2,3,5,0,2,6,2,1,0,1,2,-1 },
- { 0,4,1,5,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,4,0,3,0,2,1,5,0,5,2,0,-1,-1,-1,-1 },
- { 1,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,4,5,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,4,5,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,5,4,1,0,6,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,7,3,0,6,4,8,5,-1,-1,-1,-1,-1,-1,-1 },
- { 1,4,0,1,5,4,2,6,3,-1,-1,-1,-1,-1,-1,-1 },
- { 2,7,3,0,6,1,6,4,1,6,5,4,-1,-1,-1,-1 },
- { 3,0,1,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,4,3,2,0,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
- { 2,5,4,2,3,5,0,1,6,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,0,4,2,0,5,4,4,3,2,-1,-1,-1,-1 },
- { 4,3,2,4,0,3,0,1,3,-1,-1,-1,-1,-1,-1,-1 },
- { 5,3,2,1,3,5,1,4,3,1,0,4,-1,-1,-1,-1 },
- { 0,1,3,0,3,5,0,5,4,2,5,3,-1,-1,-1,-1 },
- { 1,0,4,1,4,2,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,3,4,1,0,3,0,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 4,3,6,4,2,3,5,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,2,3,4,3,1,4,1,0,5,1,3,-1,-1,-1,-1 },
- { 3,4,2,3,6,4,1,5,0,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,6,3,0,7,0,5,7,0,4,5,-1,-1,-1,-1 },
- { 2,7,4,2,3,7,0,1,5,1,6,5,-1,-1,-1,-1 },
- { 5,4,1,5,1,0,4,2,1,6,1,3,2,3,1,-1 },
- { 4,0,1,4,2,0,2,3,0,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,2,3,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,7,0,2,3,4,2,4,5,4,3,6,-1,-1,-1,-1 },
- { 0,4,2,0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,1,4,3,0,4,2,3,3,5,0,-1,-1,-1,-1 },
- { 4,1,0,4,0,3,3,0,2,-1,-1,-1,-1,-1,-1,-1 },
- { 2,3,1,2,1,4,3,6,1,0,1,5,6,5,1,-1 },
- { 3,2,0,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,3,2,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,6,1,2,7,3,8,5,4,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,1,3,2,0,5,4,6,-1,-1,-1,-1,-1,-1,-1 },
- { 7,5,4,6,1,2,1,3,2,1,0,3,-1,-1,-1,-1 },
- { 6,3,2,7,0,1,5,4,8,-1,-1,-1,-1,-1,-1,-1 },
- { 6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1 },
- { 5,4,7,3,2,6,2,1,6,2,0,1,-1,-1,-1,-1 },
- { 1,2,6,1,3,2,1,0,3,7,3,0,8,5,4,-1 },
- { 5,0,1,5,4,0,3,2,6,-1,-1,-1,-1,-1,-1,-1 },
- { 7,3,2,0,6,4,0,4,1,4,6,5,-1,-1,-1,-1 },
- { 3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1 },
- { 4,1,6,4,6,5,1,0,6,2,6,3,0,3,6,-1 },
- { 6,3,2,7,0,4,0,5,4,0,1,5,-1,-1,-1,-1 },
- { 1,4,8,1,5,4,1,0,5,6,5,0,7,3,2,-1 },
- { 2,0,6,2,6,3,0,1,6,4,6,5,1,5,6,-1 },
- { 3,2,5,3,5,4,1,0,5,0,4,5,-1,-1,-1,-1 },
- { 1,3,0,1,4,3,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 1,3,5,0,3,1,0,2,3,0,4,2,-1,-1,-1,-1 },
- { 0,5,4,0,2,5,0,1,2,2,3,5,-1,-1,-1,-1 },
- { 3,4,1,3,1,2,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,6,5,2,7,5,7,4,7,2,3,-1,-1,-1,-1 },
- { 0,8,3,0,5,8,0,6,5,4,5,6,1,2,7,-1 },
- { 6,4,2,6,2,3,4,0,2,5,2,1,0,1,2,-1 },
- { 3,5,1,3,1,2,0,4,1,4,2,1,-1,-1,-1,-1 },
- { 2,4,5,2,0,4,2,3,0,1,4,0,-1,-1,-1,-1 },
- { 4,2,3,4,3,0,0,3,1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,4,6,1,6,0,4,5,6,3,6,2,5,2,6,-1 },
- { 0,2,3,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,3,0,3,6,1,4,3,2,3,5,4,5,3,-1 },
- { 5,1,0,5,0,3,4,2,0,2,3,0,-1,-1,-1,-1 },
- { 0,1,4,2,3,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,2,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 6,2,5,6,3,2,4,1,0,-1,-1,-1,-1,-1,-1,-1 },
- { 2,6,3,2,5,6,1,4,0,-1,-1,-1,-1,-1,-1,-1 },
- { 6,3,2,6,7,3,5,4,0,4,1,0,-1,-1,-1,-1 },
- { 4,0,1,4,3,0,3,2,0,-1,-1,-1,-1,-1,-1,-1 },
- { 0,6,3,1,2,5,1,5,4,5,2,7,-1,-1,-1,-1 },
- { 4,3,2,4,1,3,4,0,1,1,5,3,-1,-1,-1,-1 },
- { 3,2,0,3,0,6,2,5,0,1,0,4,5,4,0,-1 },
- { 0,2,4,0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 4,1,0,4,2,1,4,3,2,5,1,2,-1,-1,-1,-1 },
- { 6,0,1,4,7,3,4,3,5,3,7,2,-1,-1,-1,-1 },
- { 5,4,1,5,1,0,4,3,1,6,1,2,3,2,1,-1 },
- { 0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,3,0,3,1,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
- { 4,0,1,4,1,2,2,1,3,-1,-1,-1,-1,-1,-1,-1 },
- { 3,2,1,0,3,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,1,3,2,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,2,3,5,0,3,4,5,5,1,0,-1,-1,-1,-1 },
- { 0,1,5,4,2,6,4,6,7,6,2,3,-1,-1,-1,-1 },
- { 5,6,2,5,2,3,6,1,2,4,2,0,1,0,2,-1 },
- { 1,3,0,1,4,3,1,5,4,2,3,4,-1,-1,-1,-1 },
- { 0,4,6,0,6,3,4,5,6,2,6,1,5,1,6,-1 },
- { 0,1,3,0,3,5,1,6,3,2,3,4,6,4,3,-1 },
- { 4,2,3,0,5,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,3,5,1,3,0,1,2,3,1,4,2,-1,-1,-1,-1 },
- { 3,4,1,3,1,2,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
- { 3,8,2,3,5,8,3,6,5,4,5,6,0,1,7,-1 },
- { 3,5,1,3,1,2,0,4,1,4,2,1,-1,-1,-1,-1 },
- { 4,2,3,4,3,1,1,3,0,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,3,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 4,2,3,4,3,1,5,0,3,0,1,3,-1,-1,-1,-1 },
- { 2,0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,0,2,4,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
- { 0,4,1,2,5,3,5,7,3,5,6,7,-1,-1,-1,-1 },
- { 1,4,5,1,5,2,1,2,0,3,2,5,-1,-1,-1,-1 },
- { 1,0,2,1,2,4,0,5,2,3,2,6,5,6,2,-1 },
- { 2,5,3,4,5,2,4,1,5,4,0,1,-1,-1,-1,-1 },
- { 7,5,4,7,8,5,7,1,8,2,8,1,0,6,3,-1 },
- { 4,3,2,4,2,1,1,2,0,-1,-1,-1,-1,-1,-1,-1 },
- { 5,3,2,5,2,0,4,1,2,1,0,2,-1,-1,-1,-1 },
- { 0,4,5,0,3,4,0,1,3,3,2,4,-1,-1,-1,-1 },
- { 5,6,3,5,3,2,6,1,3,4,3,0,1,0,3,-1 },
- { 3,5,6,3,6,2,5,4,6,1,6,0,4,0,6,-1 },
- { 0,5,1,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,4,0,2,0,3,3,0,1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,5,1,2,1,3,0,4,1,4,3,1,-1,-1,-1,-1 },
- { 2,0,1,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,2,0,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,1,2,4,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,3,0,3,2,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,4,0,4,3,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
- { 3,0,4,3,4,5,1,2,4,2,5,4,-1,-1,-1,-1 },
- { 0,1,3,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 1,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,0,2,4,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
- { 2,3,1,0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 2,3,4,2,4,5,0,1,4,1,5,4,-1,-1,-1,-1 },
- { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,3,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
- { 0,1,2,-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 },
- };
- ivec2 calculateMemorySizes(Grid *grid, f32 isolevel)
- {
- i32 cubeindex = 0;
- u32 vertcount = 0, indexCount = 0;
- for (u32 i = 0; i < grid->w * grid->h * grid->d; ++i)
- {
- cubeindex = 0;
- if (grid->cell[i].val[0] < isolevel) cubeindex |= 1;
- if (grid->cell[i].val[1] < isolevel) cubeindex |= 2;
- if (grid->cell[i].val[2] < isolevel) cubeindex |= 4;
- if (grid->cell[i].val[3] < isolevel) cubeindex |= 8;
- if (grid->cell[i].val[4] < isolevel) cubeindex |= 16;
- if (grid->cell[i].val[5] < isolevel) cubeindex |= 32;
- if (grid->cell[i].val[6] < isolevel) cubeindex |= 64;
- if (grid->cell[i].val[7] < isolevel) cubeindex |= 128;
- if (edgeTable[cubeindex] != 0)
- {
- if (edgeTable[cubeindex] & 1)
- vertcount++;
- if (edgeTable[cubeindex] & 2)
- vertcount++;
- if (edgeTable[cubeindex] & 4)
- vertcount++;
- if (edgeTable[cubeindex] & 8)
- vertcount++;
- if (edgeTable[cubeindex] & 16)
- vertcount++;
- if (edgeTable[cubeindex] & 32)
- vertcount++;
- if (edgeTable[cubeindex] & 64)
- vertcount++;
- if (edgeTable[cubeindex] & 128)
- vertcount++;
- if (edgeTable[cubeindex] & 256)
- vertcount++;
- if (edgeTable[cubeindex] & 512)
- vertcount++;
- if (edgeTable[cubeindex] & 1024)
- vertcount++;
- if (edgeTable[cubeindex] & 2048)
- vertcount++;
- for (u32 j = 0; indextable[cubeindex][j] != -1; ++j)
- indexCount++;
- }
- }
- return (ivec2) { vertcount, indexCount };
- }
- Grid *makeGrid(i32 width, i32 height, i32 depth, f32(*sdf)(vec3 x))
- {
- Grid *grid = malloc(sizeof(Grid));
- grid->w = width;
- grid->h = height;
- grid->d = depth;
- grid->cell = malloc(sizeof(Cell) * width * height * depth);
- for (i32 z = 0; z < depth; ++z)
- for (i32 y = 0; y < height; ++y)
- for (i32 x = 0; x < width; ++x)
- {
- i32 iter = (x)+width * ((y)* height + (z));
- grid->cell[iter].val[0] = sdf((vec3) { x, y, z });
- grid->cell[iter].val[1] = sdf((vec3) { x + 1, y, z });
- grid->cell[iter].val[2] = sdf((vec3) { x, y + 1, z });
- grid->cell[iter].val[3] = sdf((vec3) { x + 1, y + 1, z });
- grid->cell[iter].val[4] = sdf((vec3) { x, y, z + 1 });
- grid->cell[iter].val[5] = sdf((vec3) { x + 1, y, z + 1 });
- grid->cell[iter].val[6] = sdf((vec3) { x, y + 1, z + 1 });
- grid->cell[iter].val[7] = sdf((vec3) { x + 1, y + 1, z + 1 });
- grid->cell[iter].p[0] = ((vec3) { x, y, z });
- grid->cell[iter].p[1] = ((vec3) { x + 1, y, z });
- grid->cell[iter].p[2] = ((vec3) { x, y + 1, z });
- grid->cell[iter].p[3] = ((vec3) { x + 1, y + 1, z });
- grid->cell[iter].p[4] = ((vec3) { x, y, z + 1 });
- grid->cell[iter].p[5] = ((vec3) { x + 1, y, z + 1 });
- grid->cell[iter].p[6] = ((vec3) { x, y + 1, z + 1 });
- grid->cell[iter].p[7] = ((vec3) { x + 1, y + 1, z + 1 });
- }
- return grid;
- }
- vec3 VertexInterp(f32 isolevel, vec3 p1, vec3 p2, f32 valp1, f32 valp2)
- {
- f32 mu;
- vec3 p;
- if (fabs(isolevel - valp1) < 0.0001)
- return(p1);
- if (fabs(isolevel - valp2) < 0.0001)
- return(p2);
- if (fabs(valp1 - valp2) < 0.0001)
- 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);
- }
- Mesh *polygoniseGrid(Grid *grid, f32 isolevel)
- {
- i32 cubeindex;
- u32 vertOffset = 0, indicesOffset = 0, vertexBeforeOffset = 0;
- ivec2 sizes = calculateMemorySizes(grid, isolevel);
- vec3 *vertices = malloc(sizes.x * sizeof(f32) * 3);
- u32 *indices = malloc(sizes.y * sizeof(u32));
- printf("%i %i\n", sizes.x, sizes.y);
- for (u32 i = 0; i < grid->w * grid->h * grid->d; ++i)
- {
- cubeindex = 0;
- if (grid->cell[i].val[0] < isolevel) cubeindex |= 1;
- if (grid->cell[i].val[1] < isolevel) cubeindex |= 2;
- if (grid->cell[i].val[2] < isolevel) cubeindex |= 4;
- if (grid->cell[i].val[3] < isolevel) cubeindex |= 8;
- if (grid->cell[i].val[4] < isolevel) cubeindex |= 16;
- if (grid->cell[i].val[5] < isolevel) cubeindex |= 32;
- if (grid->cell[i].val[6] < isolevel) cubeindex |= 64;
- if (grid->cell[i].val[7] < isolevel) cubeindex |= 128;
- /* Cube is entirely in/out of the surface */
- if (edgeTable[cubeindex] != 0)
- {
- vertexBeforeOffset = vertOffset;
- /* Find the vertices where the surface intersects the cube */
- if (edgeTable[cubeindex] & 1)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[0], grid->cell[i].p[1], grid->cell[i].val[0], grid->cell[i].val[1]);
- if (edgeTable[cubeindex] & 2)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[1], grid->cell[i].p[2], grid->cell[i].val[1], grid->cell[i].val[2]);
- if (edgeTable[cubeindex] & 4)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[2], grid->cell[i].p[3], grid->cell[i].val[2], grid->cell[i].val[3]);
- if (edgeTable[cubeindex] & 8)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[3], grid->cell[i].p[0], grid->cell[i].val[3], grid->cell[i].val[0]);
- if (edgeTable[cubeindex] & 16)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[4], grid->cell[i].p[5], grid->cell[i].val[4], grid->cell[i].val[5]);
- if (edgeTable[cubeindex] & 32)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[5], grid->cell[i].p[6], grid->cell[i].val[5], grid->cell[i].val[6]);
- if (edgeTable[cubeindex] & 64)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[6], grid->cell[i].p[7], grid->cell[i].val[6], grid->cell[i].val[7]);
- if (edgeTable[cubeindex] & 128)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[7], grid->cell[i].p[4], grid->cell[i].val[7], grid->cell[i].val[4]);
- if (edgeTable[cubeindex] & 256)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[0], grid->cell[i].p[4], grid->cell[i].val[0], grid->cell[i].val[4]);
- if (edgeTable[cubeindex] & 512)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[1], grid->cell[i].p[5], grid->cell[i].val[1], grid->cell[i].val[5]);
- if (edgeTable[cubeindex] & 1024)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[2], grid->cell[i].p[6], grid->cell[i].val[2], grid->cell[i].val[6]);
- if (edgeTable[cubeindex] & 2048)
- vertices[vertOffset++] =
- VertexInterp(isolevel, grid->cell[i].p[3], grid->cell[i].p[7], grid->cell[i].val[3], grid->cell[i].val[7]);
- u32 j = 0;
- for (j = 0; indextable[cubeindex][j] != -1; j++)
- indices[indicesOffset++] = vertexBeforeOffset + indextable[cubeindex][j];
- }
- }
- printf("sizes : %i %i\n", sizes.x, sizes.y);
- Mesh *mesh = arrayToMesh(indicesOffset + 6, vertOffset, indices, vertices, NULL, NULL);
- free(indices);
- free(vertices);
- return mesh;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement