SHARE
TWEET

Untitled

a guest Jun 16th, 2019 70 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /*
  3. Given a grid cell and an isolevel, calculate the triangular
  4. facets required to represent the isosurface through the cell.
  5. Return the number of triangular facets, the array "triangles"
  6. will be loaded up with the vertices at most 5 triangular facets.
  7. 0 will be returned if the grid cell is either totally above
  8. of totally below the isolevel.
  9. */
  10. i32 edgeTable[256] = {
  11.     0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
  12.     0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
  13.     0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
  14.     0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
  15.     0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
  16.     0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
  17.     0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
  18.     0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
  19.     0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
  20.     0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
  21.     0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
  22.     0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
  23.     0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
  24.     0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
  25.     0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
  26.     0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
  27.     0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
  28.     0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
  29.     0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
  30.     0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
  31.     0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
  32.     0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
  33.     0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
  34.     0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
  35.     0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
  36.     0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
  37.     0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
  38.     0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
  39.     0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
  40.     0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
  41.     0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
  42.     0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 };
  43. i32 indextable[256][16] = {
  44.     { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  45. { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  46. { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  47. { 0,2,1,3,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  48. { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  49. { 0,4,3,1,2,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  50. { 2,1,3,0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  51. { 0,2,1,0,4,2,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
  52. { 1,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  53. { 0,3,1,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  54. { 1,4,0,2,3,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  55. { 0,4,1,0,3,4,3,2,4,-1,-1,-1,-1,-1,-1,-1 },
  56. { 1,2,0,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  57. { 0,3,1,0,2,3,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
  58. { 1,2,0,1,4,2,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
  59. { 1,0,2,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  60. { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  61. { 2,1,0,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  62. { 0,1,5,4,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  63. { 2,0,4,2,3,0,3,1,0,-1,-1,-1,-1,-1,-1,-1 },
  64. { 0,1,5,4,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  65. { 3,4,5,3,0,4,1,2,6,-1,-1,-1,-1,-1,-1,-1 },
  66. { 5,1,6,5,0,1,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
  67. { 0,5,4,0,4,3,0,3,1,3,4,2,-1,-1,-1,-1 },
  68. { 4,2,3,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  69. { 4,2,3,4,1,2,1,0,2,-1,-1,-1,-1,-1,-1,-1 },
  70. { 7,0,1,6,4,5,2,3,8,-1,-1,-1,-1,-1,-1,-1 },
  71. { 2,3,5,4,2,5,4,5,1,4,1,0,-1,-1,-1,-1 },
  72. { 1,5,0,1,6,5,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
  73. { 1,5,4,1,2,5,1,0,2,3,5,2,-1,-1,-1,-1 },
  74. { 2,3,4,5,0,7,5,7,6,7,0,1,-1,-1,-1,-1 },
  75. { 0,1,4,0,4,2,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
  76. { 2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  77. { 5,3,2,0,4,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  78. { 0,3,2,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  79. { 4,3,2,4,1,3,1,0,3,-1,-1,-1,-1,-1,-1,-1 },
  80. { 0,1,5,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  81. { 3,0,6,1,2,8,4,7,5,-1,-1,-1,-1,-1,-1,-1 },
  82. { 3,1,4,3,2,1,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
  83. { 0,5,3,1,0,3,1,3,2,1,2,4,-1,-1,-1,-1 },
  84. { 4,3,2,0,1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  85. { 0,6,1,0,4,6,2,5,3,-1,-1,-1,-1,-1,-1,-1 },
  86. { 0,5,4,0,1,5,2,3,6,-1,-1,-1,-1,-1,-1,-1 },
  87. { 1,0,3,1,3,4,1,4,5,2,4,3,-1,-1,-1,-1 },
  88. { 5,1,6,5,0,1,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
  89. { 2,5,3,0,4,1,4,6,1,4,7,6,-1,-1,-1,-1 },
  90. { 3,2,0,3,0,5,3,5,4,5,0,1,-1,-1,-1,-1 },
  91. { 1,0,2,1,2,3,3,2,4,-1,-1,-1,-1,-1,-1,-1 },
  92. { 3,1,2,0,1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  93. { 4,1,0,4,2,1,2,3,1,-1,-1,-1,-1,-1,-1,-1 },
  94. { 0,3,4,0,1,3,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
  95. { 0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  96. { 5,3,4,5,2,3,6,0,1,-1,-1,-1,-1,-1,-1,-1 },
  97. { 7,1,2,6,4,0,4,3,0,4,5,3,-1,-1,-1,-1 },
  98. { 4,0,1,4,1,2,4,2,3,5,2,1,-1,-1,-1,-1 },
  99. { 0,4,2,0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
  100. { 3,5,2,3,4,5,1,6,0,-1,-1,-1,-1,-1,-1,-1 },
  101. { 4,2,3,4,3,1,4,1,0,1,3,5,-1,-1,-1,-1 },
  102. { 2,3,7,0,1,6,1,5,6,1,4,5,-1,-1,-1,-1 },
  103. { 4,1,0,4,0,3,3,0,2,-1,-1,-1,-1,-1,-1,-1 },
  104. { 5,2,4,4,2,3,6,0,1,6,1,7,-1,-1,-1,-1 },
  105. { 2,3,0,2,0,4,3,6,0,1,0,5,6,5,0,-1 },
  106. { 6,5,0,6,0,1,5,2,0,4,0,3,2,3,0,-1 },
  107. { 3,2,0,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  108. { 2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  109. { 0,4,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  110. { 4,0,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  111. { 0,4,1,0,5,4,2,6,3,-1,-1,-1,-1,-1,-1,-1 },
  112. { 0,3,2,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  113. { 1,5,4,1,2,5,3,0,6,-1,-1,-1,-1,-1,-1,-1 },
  114. { 4,3,2,4,0,3,0,1,3,-1,-1,-1,-1,-1,-1,-1 },
  115. { 2,5,4,2,4,0,2,0,3,1,0,4,-1,-1,-1,-1 },
  116. { 0,1,5,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  117. { 6,0,4,6,1,0,5,3,2,-1,-1,-1,-1,-1,-1,-1 },
  118. { 0,1,6,2,3,8,4,7,5,-1,-1,-1,-1,-1,-1,-1 },
  119. { 2,6,3,0,5,1,5,7,1,5,4,7,-1,-1,-1,-1 },
  120. { 3,1,4,3,2,1,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
  121. { 0,4,5,0,5,2,0,2,1,2,5,3,-1,-1,-1,-1 },
  122. { 1,5,3,0,1,3,0,3,2,0,2,4,-1,-1,-1,-1 },
  123. { 1,0,3,1,3,4,4,3,2,-1,-1,-1,-1,-1,-1,-1 },
  124. { 1,5,2,0,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  125. { 2,1,0,2,5,1,4,3,6,-1,-1,-1,-1,-1,-1,-1 },
  126. { 1,7,0,3,8,4,6,2,5,-1,-1,-1,-1,-1,-1,-1 },
  127. { 7,4,3,0,6,5,0,5,1,5,6,2,-1,-1,-1,-1 },
  128. { 4,0,1,4,3,0,2,5,6,-1,-1,-1,-1,-1,-1,-1 },
  129. { 1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1 },
  130. { 6,2,5,7,0,3,0,4,3,0,1,4,-1,-1,-1,-1 },
  131. { 5,1,6,5,6,2,1,0,6,3,6,4,0,4,6,-1 },
  132. { 1,8,0,5,6,2,7,4,3,-1,-1,-1,-1,-1,-1,-1 },
  133. { 3,6,4,2,5,1,2,1,0,1,5,7,-1,-1,-1,-1 },
  134. { 0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1 },
  135. { 6,1,0,6,8,1,6,2,8,5,8,2,3,7,4,-1 },
  136. { 6,2,5,1,7,3,1,3,0,3,7,4,-1,-1,-1,-1 },
  137. { 3,1,6,3,6,4,1,0,6,5,6,2,0,2,6,-1 },
  138. { 0,3,7,0,4,3,0,1,4,8,4,1,6,2,5,-1 },
  139. { 2,1,4,2,4,5,0,3,4,3,5,4,-1,-1,-1,-1 },
  140. { 3,0,2,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  141. { 2,6,3,2,5,6,0,4,1,-1,-1,-1,-1,-1,-1,-1 },
  142. { 4,0,1,4,3,0,3,2,0,-1,-1,-1,-1,-1,-1,-1 },
  143. { 4,1,0,4,0,3,4,3,2,3,0,5,-1,-1,-1,-1 },
  144. { 0,2,4,0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
  145. { 3,0,6,1,2,7,2,4,7,2,5,4,-1,-1,-1,-1 },
  146. { 0,1,2,2,1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  147. { 4,1,0,4,0,2,2,0,3,-1,-1,-1,-1,-1,-1,-1 },
  148. { 5,2,4,5,3,2,6,0,1,-1,-1,-1,-1,-1,-1,-1 },
  149. { 0,4,1,1,4,7,2,5,6,2,6,3,-1,-1,-1,-1 },
  150. { 3,7,2,0,1,5,0,5,4,5,1,6,-1,-1,-1,-1 },
  151. { 3,2,0,3,0,5,2,4,0,1,0,6,4,6,0,-1 },
  152. { 4,3,2,4,1,3,4,0,1,5,3,1,-1,-1,-1,-1 },
  153. { 4,6,1,4,1,0,6,3,1,5,1,2,3,2,1,-1 },
  154. { 1,4,3,1,3,0,0,3,2,-1,-1,-1,-1,-1,-1,-1 },
  155. { 1,0,2,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  156. { 1,4,0,1,2,4,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
  157. { 0,3,1,0,5,3,0,4,5,2,3,5,-1,-1,-1,-1 },
  158. { 5,2,3,1,5,3,1,3,4,1,4,0,-1,-1,-1,-1 },
  159. { 4,2,3,4,3,0,0,3,1,-1,-1,-1,-1,-1,-1,-1 },
  160. { 0,1,2,0,2,4,0,4,5,4,2,3,-1,-1,-1,-1 },
  161. { 2,4,6,2,6,1,4,5,6,0,6,3,5,3,6,-1 },
  162. { 3,4,0,3,0,2,2,0,1,-1,-1,-1,-1,-1,-1,-1 },
  163. { 3,1,0,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  164. { 0,1,7,6,2,4,6,4,5,4,2,3,-1,-1,-1,-1 },
  165. { 1,0,3,1,3,6,0,4,3,2,3,5,4,5,3,-1 },
  166. { 1,6,0,1,5,6,1,7,5,4,5,7,2,3,8,-1 },
  167. { 5,1,0,5,0,3,4,2,0,2,3,0,-1,-1,-1,-1 },
  168. { 4,5,2,4,2,3,5,0,2,6,2,1,0,1,2,-1 },
  169. { 0,4,1,5,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  170. { 3,4,0,3,0,2,1,5,0,5,2,0,-1,-1,-1,-1 },
  171. { 1,2,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  172. { 1,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  173. { 1,0,4,5,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  174. { 0,1,4,5,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  175. { 4,0,5,4,1,0,6,3,2,-1,-1,-1,-1,-1,-1,-1 },
  176. { 4,0,1,2,5,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  177. { 1,2,7,3,0,6,4,8,5,-1,-1,-1,-1,-1,-1,-1 },
  178. { 1,4,0,1,5,4,2,6,3,-1,-1,-1,-1,-1,-1,-1 },
  179. { 2,7,3,0,6,1,6,4,1,6,5,4,-1,-1,-1,-1 },
  180. { 3,0,1,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  181. { 3,0,4,3,2,0,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
  182. { 2,5,4,2,3,5,0,1,6,-1,-1,-1,-1,-1,-1,-1 },
  183. { 0,2,1,0,4,2,0,5,4,4,3,2,-1,-1,-1,-1 },
  184. { 4,3,2,4,0,3,0,1,3,-1,-1,-1,-1,-1,-1,-1 },
  185. { 5,3,2,1,3,5,1,4,3,1,0,4,-1,-1,-1,-1 },
  186. { 0,1,3,0,3,5,0,5,4,2,5,3,-1,-1,-1,-1 },
  187. { 1,0,4,1,4,2,2,4,3,-1,-1,-1,-1,-1,-1,-1 },
  188. { 1,2,0,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  189. { 1,3,4,1,0,3,0,2,3,-1,-1,-1,-1,-1,-1,-1 },
  190. { 4,3,6,4,2,3,5,0,1,-1,-1,-1,-1,-1,-1,-1 },
  191. { 4,2,3,4,3,1,4,1,0,5,1,3,-1,-1,-1,-1 },
  192. { 3,4,2,3,6,4,1,5,0,-1,-1,-1,-1,-1,-1,-1 },
  193. { 1,2,6,3,0,7,0,5,7,0,4,5,-1,-1,-1,-1 },
  194. { 2,7,4,2,3,7,0,1,5,1,6,5,-1,-1,-1,-1 },
  195. { 5,4,1,5,1,0,4,2,1,6,1,3,2,3,1,-1 },
  196. { 4,0,1,4,2,0,2,3,0,-1,-1,-1,-1,-1,-1,-1 },
  197. { 0,2,1,2,3,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  198. { 1,7,0,2,3,4,2,4,5,4,3,6,-1,-1,-1,-1 },
  199. { 0,4,2,0,2,1,1,2,3,-1,-1,-1,-1,-1,-1,-1 },
  200. { 4,0,1,4,3,0,4,2,3,3,5,0,-1,-1,-1,-1 },
  201. { 4,1,0,4,0,3,3,0,2,-1,-1,-1,-1,-1,-1,-1 },
  202. { 2,3,1,2,1,4,3,6,1,0,1,5,6,5,1,-1 },
  203. { 3,2,0,1,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  204. { 0,4,1,3,2,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  205. { 0,6,1,2,7,3,8,5,4,-1,-1,-1,-1,-1,-1,-1 },
  206. { 3,0,1,3,2,0,5,4,6,-1,-1,-1,-1,-1,-1,-1 },
  207. { 7,5,4,6,1,2,1,3,2,1,0,3,-1,-1,-1,-1 },
  208. { 6,3,2,7,0,1,5,4,8,-1,-1,-1,-1,-1,-1,-1 },
  209. { 6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1 },
  210. { 5,4,7,3,2,6,2,1,6,2,0,1,-1,-1,-1,-1 },
  211. { 1,2,6,1,3,2,1,0,3,7,3,0,8,5,4,-1 },
  212. { 5,0,1,5,4,0,3,2,6,-1,-1,-1,-1,-1,-1,-1 },
  213. { 7,3,2,0,6,4,0,4,1,4,6,5,-1,-1,-1,-1 },
  214. { 3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1 },
  215. { 4,1,6,4,6,5,1,0,6,2,6,3,0,3,6,-1 },
  216. { 6,3,2,7,0,4,0,5,4,0,1,5,-1,-1,-1,-1 },
  217. { 1,4,8,1,5,4,1,0,5,6,5,0,7,3,2,-1 },
  218. { 2,0,6,2,6,3,0,1,6,4,6,5,1,5,6,-1 },
  219. { 3,2,5,3,5,4,1,0,5,0,4,5,-1,-1,-1,-1 },
  220. { 1,3,0,1,4,3,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
  221. { 1,3,5,0,3,1,0,2,3,0,4,2,-1,-1,-1,-1 },
  222. { 0,5,4,0,2,5,0,1,2,2,3,5,-1,-1,-1,-1 },
  223. { 3,4,1,3,1,2,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
  224. { 0,1,6,5,2,7,5,7,4,7,2,3,-1,-1,-1,-1 },
  225. { 0,8,3,0,5,8,0,6,5,4,5,6,1,2,7,-1 },
  226. { 6,4,2,6,2,3,4,0,2,5,2,1,0,1,2,-1 },
  227. { 3,5,1,3,1,2,0,4,1,4,2,1,-1,-1,-1,-1 },
  228. { 2,4,5,2,0,4,2,3,0,1,4,0,-1,-1,-1,-1 },
  229. { 4,2,3,4,3,0,0,3,1,-1,-1,-1,-1,-1,-1,-1 },
  230. { 1,4,6,1,6,0,4,5,6,3,6,2,5,2,6,-1 },
  231. { 0,2,3,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  232. { 0,1,3,0,3,6,1,4,3,2,3,5,4,5,3,-1 },
  233. { 5,1,0,5,0,3,4,2,0,2,3,0,-1,-1,-1,-1 },
  234. { 0,1,4,2,3,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  235. { 2,0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  236. { 3,0,2,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  237. { 6,2,5,6,3,2,4,1,0,-1,-1,-1,-1,-1,-1,-1 },
  238. { 2,6,3,2,5,6,1,4,0,-1,-1,-1,-1,-1,-1,-1 },
  239. { 6,3,2,6,7,3,5,4,0,4,1,0,-1,-1,-1,-1 },
  240. { 4,0,1,4,3,0,3,2,0,-1,-1,-1,-1,-1,-1,-1 },
  241. { 0,6,3,1,2,5,1,5,4,5,2,7,-1,-1,-1,-1 },
  242. { 4,3,2,4,1,3,4,0,1,1,5,3,-1,-1,-1,-1 },
  243. { 3,2,0,3,0,6,2,5,0,1,0,4,5,4,0,-1 },
  244. { 0,2,4,0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
  245. { 4,1,0,4,2,1,4,3,2,5,1,2,-1,-1,-1,-1 },
  246. { 6,0,1,4,7,3,4,3,5,3,7,2,-1,-1,-1,-1 },
  247. { 5,4,1,5,1,0,4,3,1,6,1,2,3,2,1,-1 },
  248. { 0,1,2,1,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  249. { 0,4,3,0,3,1,1,3,2,-1,-1,-1,-1,-1,-1,-1 },
  250. { 4,0,1,4,1,2,2,1,3,-1,-1,-1,-1,-1,-1,-1 },
  251. { 3,2,1,0,3,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  252. { 1,2,0,1,3,2,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
  253. { 3,0,2,3,5,0,3,4,5,5,1,0,-1,-1,-1,-1 },
  254. { 0,1,5,4,2,6,4,6,7,6,2,3,-1,-1,-1,-1 },
  255. { 5,6,2,5,2,3,6,1,2,4,2,0,1,0,2,-1 },
  256. { 1,3,0,1,4,3,1,5,4,2,3,4,-1,-1,-1,-1 },
  257. { 0,4,6,0,6,3,4,5,6,2,6,1,5,1,6,-1 },
  258. { 0,1,3,0,3,5,1,6,3,2,3,4,6,4,3,-1 },
  259. { 4,2,3,0,5,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  260. { 0,3,5,1,3,0,1,2,3,1,4,2,-1,-1,-1,-1 },
  261. { 3,4,1,3,1,2,2,1,0,-1,-1,-1,-1,-1,-1,-1 },
  262. { 3,8,2,3,5,8,3,6,5,4,5,6,0,1,7,-1 },
  263. { 3,5,1,3,1,2,0,4,1,4,2,1,-1,-1,-1,-1 },
  264. { 4,2,3,4,3,1,1,3,0,-1,-1,-1,-1,-1,-1,-1 },
  265. { 0,2,3,1,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  266. { 4,2,3,4,3,1,5,0,3,0,1,3,-1,-1,-1,-1 },
  267. { 2,0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  268. { 0,4,1,0,2,4,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
  269. { 0,4,1,2,5,3,5,7,3,5,6,7,-1,-1,-1,-1 },
  270. { 1,4,5,1,5,2,1,2,0,3,2,5,-1,-1,-1,-1 },
  271. { 1,0,2,1,2,4,0,5,2,3,2,6,5,6,2,-1 },
  272. { 2,5,3,4,5,2,4,1,5,4,0,1,-1,-1,-1,-1 },
  273. { 7,5,4,7,8,5,7,1,8,2,8,1,0,6,3,-1 },
  274. { 4,3,2,4,2,1,1,2,0,-1,-1,-1,-1,-1,-1,-1 },
  275. { 5,3,2,5,2,0,4,1,2,1,0,2,-1,-1,-1,-1 },
  276. { 0,4,5,0,3,4,0,1,3,3,2,4,-1,-1,-1,-1 },
  277. { 5,6,3,5,3,2,6,1,3,4,3,0,1,0,3,-1 },
  278. { 3,5,6,3,6,2,5,4,6,1,6,0,4,0,6,-1 },
  279. { 0,5,1,4,3,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  280. { 2,4,0,2,0,3,3,0,1,-1,-1,-1,-1,-1,-1,-1 },
  281. { 2,5,1,2,1,3,0,4,1,4,3,1,-1,-1,-1,-1 },
  282. { 2,0,1,3,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  283. { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  284. { 1,2,0,2,3,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  285. { 1,0,2,1,2,4,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
  286. { 0,1,3,0,3,2,2,3,4,-1,-1,-1,-1,-1,-1,-1 },
  287. { 1,0,2,3,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  288. { 0,1,4,0,4,3,3,4,2,-1,-1,-1,-1,-1,-1,-1 },
  289. { 3,0,4,3,4,5,1,2,4,2,5,4,-1,-1,-1,-1 },
  290. { 0,1,3,2,0,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  291. { 1,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  292. { 0,1,2,0,2,4,4,2,3,-1,-1,-1,-1,-1,-1,-1 },
  293. { 2,3,1,0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  294. { 2,3,4,2,4,5,0,1,4,1,5,4,-1,-1,-1,-1 },
  295. { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  296. { 0,1,2,3,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  297. { 0,2,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  298. { 0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  299. { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },
  300. };
  301. ivec2 calculateMemorySizes(Grid *grid, f32 isolevel)
  302. {
  303.     i32 cubeindex = 0;
  304.     u32 vertcount = 0, indexCount = 0;
  305.     for (u32 i = 0; i < grid->w * grid->h * grid->d; ++i)
  306.     {
  307.         cubeindex = 0;
  308.         if (grid->cell[i].val[0] < isolevel) cubeindex |= 1;
  309.         if (grid->cell[i].val[1] < isolevel) cubeindex |= 2;
  310.         if (grid->cell[i].val[2] < isolevel) cubeindex |= 4;
  311.         if (grid->cell[i].val[3] < isolevel) cubeindex |= 8;
  312.         if (grid->cell[i].val[4] < isolevel) cubeindex |= 16;
  313.         if (grid->cell[i].val[5] < isolevel) cubeindex |= 32;
  314.         if (grid->cell[i].val[6] < isolevel) cubeindex |= 64;
  315.         if (grid->cell[i].val[7] < isolevel) cubeindex |= 128;
  316.         if (edgeTable[cubeindex] != 0)
  317.         {
  318.             if (edgeTable[cubeindex] & 1)
  319.                 vertcount++;
  320.             if (edgeTable[cubeindex] & 2)
  321.                 vertcount++;
  322.             if (edgeTable[cubeindex] & 4)
  323.                 vertcount++;
  324.             if (edgeTable[cubeindex] & 8)
  325.                 vertcount++;
  326.             if (edgeTable[cubeindex] & 16)
  327.                 vertcount++;
  328.             if (edgeTable[cubeindex] & 32)
  329.                 vertcount++;
  330.             if (edgeTable[cubeindex] & 64)
  331.                 vertcount++;
  332.             if (edgeTable[cubeindex] & 128)
  333.                 vertcount++;
  334.             if (edgeTable[cubeindex] & 256)
  335.                 vertcount++;
  336.             if (edgeTable[cubeindex] & 512)
  337.                 vertcount++;
  338.             if (edgeTable[cubeindex] & 1024)
  339.                 vertcount++;
  340.             if (edgeTable[cubeindex] & 2048)
  341.                 vertcount++;
  342.             for (u32 j = 0; indextable[cubeindex][j] != -1; ++j)
  343.                 indexCount++;
  344.         }
  345.     }
  346.     return (ivec2) { vertcount, indexCount };
  347. }
  348.  
  349. Grid *makeGrid(i32 width, i32 height, i32 depth, f32(*sdf)(vec3 x))
  350. {
  351.     Grid *grid = malloc(sizeof(Grid));
  352.     grid->w = width;
  353.     grid->h = height;
  354.     grid->d = depth;
  355.     grid->cell = malloc(sizeof(Cell) * width * height * depth);
  356.     for (i32 z = 0; z < depth; ++z)
  357.         for (i32 y = 0; y < height; ++y)
  358.             for (i32 x = 0; x < width; ++x)
  359.             {
  360.                 i32 iter = (x)+width * ((y)* height + (z));
  361.                 grid->cell[iter].val[0] = sdf((vec3) { x, y, z });
  362.                 grid->cell[iter].val[1] = sdf((vec3) { x + 1, y, z });
  363.                 grid->cell[iter].val[2] = sdf((vec3) { x, y + 1, z });
  364.                 grid->cell[iter].val[3] = sdf((vec3) { x + 1, y + 1, z });
  365.                 grid->cell[iter].val[4] = sdf((vec3) { x, y, z + 1 });
  366.                 grid->cell[iter].val[5] = sdf((vec3) { x + 1, y, z + 1 });
  367.                 grid->cell[iter].val[6] = sdf((vec3) { x, y + 1, z + 1 });
  368.                 grid->cell[iter].val[7] = sdf((vec3) { x + 1, y + 1, z + 1 });
  369.                 grid->cell[iter].p[0] = ((vec3) { x, y, z });
  370.                 grid->cell[iter].p[1] = ((vec3) { x + 1, y, z });
  371.                 grid->cell[iter].p[2] = ((vec3) { x, y + 1, z });
  372.                 grid->cell[iter].p[3] = ((vec3) { x + 1, y + 1, z });
  373.                 grid->cell[iter].p[4] = ((vec3) { x, y, z + 1 });
  374.                 grid->cell[iter].p[5] = ((vec3) { x + 1, y, z + 1 });
  375.                 grid->cell[iter].p[6] = ((vec3) { x, y + 1, z + 1 });
  376.                 grid->cell[iter].p[7] = ((vec3) { x + 1, y + 1, z + 1 });
  377.             }
  378.     return grid;
  379. }
  380. vec3 VertexInterp(f32 isolevel, vec3 p1, vec3 p2, f32 valp1, f32 valp2)
  381. {
  382.     f32 mu;
  383.     vec3 p;
  384.  
  385.     if (fabs(isolevel - valp1) < 0.0001)
  386.         return(p1);
  387.     if (fabs(isolevel - valp2) < 0.0001)
  388.         return(p2);
  389.     if (fabs(valp1 - valp2) < 0.0001)
  390.         return(p1);
  391.     mu = (isolevel - valp1) / (valp2 - valp1);
  392.     p.x = p1.x + mu * (p2.x - p1.x);
  393.     p.y = p1.y + mu * (p2.y - p1.y);
  394.     p.z = p1.z + mu * (p2.z - p1.z);
  395.  
  396.     return(p);
  397. }
  398. Mesh *polygoniseGrid(Grid *grid, f32 isolevel)
  399. {
  400.     i32 cubeindex;
  401.     u32 vertOffset = 0, indicesOffset = 0, vertexBeforeOffset = 0;
  402.  
  403.     ivec2 sizes = calculateMemorySizes(grid, isolevel);
  404.     vec3 *vertices = malloc(sizes.x * sizeof(f32) * 3);
  405.     u32  *indices = malloc(sizes.y * sizeof(u32)); 
  406.     printf("%i %i\n", sizes.x, sizes.y);
  407.     for (u32 i = 0; i < grid->w * grid->h * grid->d; ++i)
  408.     {
  409.         cubeindex = 0;
  410.         if (grid->cell[i].val[0] < isolevel) cubeindex |= 1;
  411.         if (grid->cell[i].val[1] < isolevel) cubeindex |= 2;
  412.         if (grid->cell[i].val[2] < isolevel) cubeindex |= 4;
  413.         if (grid->cell[i].val[3] < isolevel) cubeindex |= 8;
  414.         if (grid->cell[i].val[4] < isolevel) cubeindex |= 16;
  415.         if (grid->cell[i].val[5] < isolevel) cubeindex |= 32;
  416.         if (grid->cell[i].val[6] < isolevel) cubeindex |= 64;
  417.         if (grid->cell[i].val[7] < isolevel) cubeindex |= 128;
  418.  
  419.  
  420.         /* Cube is entirely in/out of the surface */
  421.         if (edgeTable[cubeindex] != 0)
  422.         {
  423.             vertexBeforeOffset = vertOffset;
  424.             /* Find the vertices where the surface intersects the cube */
  425.             if (edgeTable[cubeindex] & 1)
  426.                 vertices[vertOffset++] =
  427.                 VertexInterp(isolevel, grid->cell[i].p[0], grid->cell[i].p[1], grid->cell[i].val[0], grid->cell[i].val[1]);
  428.             if (edgeTable[cubeindex] & 2)
  429.                 vertices[vertOffset++] =
  430.                 VertexInterp(isolevel, grid->cell[i].p[1], grid->cell[i].p[2], grid->cell[i].val[1], grid->cell[i].val[2]);
  431.             if (edgeTable[cubeindex] & 4)
  432.                 vertices[vertOffset++] =
  433.                 VertexInterp(isolevel, grid->cell[i].p[2], grid->cell[i].p[3], grid->cell[i].val[2], grid->cell[i].val[3]);
  434.             if (edgeTable[cubeindex] & 8)
  435.                 vertices[vertOffset++] =
  436.                 VertexInterp(isolevel, grid->cell[i].p[3], grid->cell[i].p[0], grid->cell[i].val[3], grid->cell[i].val[0]);
  437.             if (edgeTable[cubeindex] & 16)
  438.                 vertices[vertOffset++] =
  439.                 VertexInterp(isolevel, grid->cell[i].p[4], grid->cell[i].p[5], grid->cell[i].val[4], grid->cell[i].val[5]);
  440.             if (edgeTable[cubeindex] & 32)
  441.                 vertices[vertOffset++] =
  442.                 VertexInterp(isolevel, grid->cell[i].p[5], grid->cell[i].p[6], grid->cell[i].val[5], grid->cell[i].val[6]);
  443.             if (edgeTable[cubeindex] & 64)
  444.                 vertices[vertOffset++] =
  445.                 VertexInterp(isolevel, grid->cell[i].p[6], grid->cell[i].p[7], grid->cell[i].val[6], grid->cell[i].val[7]);
  446.             if (edgeTable[cubeindex] & 128)
  447.                 vertices[vertOffset++] =
  448.                 VertexInterp(isolevel, grid->cell[i].p[7], grid->cell[i].p[4], grid->cell[i].val[7], grid->cell[i].val[4]);
  449.             if (edgeTable[cubeindex] & 256)
  450.                 vertices[vertOffset++] =
  451.                 VertexInterp(isolevel, grid->cell[i].p[0], grid->cell[i].p[4], grid->cell[i].val[0], grid->cell[i].val[4]);
  452.             if (edgeTable[cubeindex] & 512)
  453.                 vertices[vertOffset++] =
  454.                 VertexInterp(isolevel, grid->cell[i].p[1], grid->cell[i].p[5], grid->cell[i].val[1], grid->cell[i].val[5]);
  455.             if (edgeTable[cubeindex] & 1024)
  456.                 vertices[vertOffset++] =
  457.                 VertexInterp(isolevel, grid->cell[i].p[2], grid->cell[i].p[6], grid->cell[i].val[2], grid->cell[i].val[6]);
  458.             if (edgeTable[cubeindex] & 2048)
  459.                 vertices[vertOffset++] =
  460.                 VertexInterp(isolevel, grid->cell[i].p[3], grid->cell[i].p[7], grid->cell[i].val[3], grid->cell[i].val[7]);
  461.             u32 j = 0;
  462.             for (j = 0; indextable[cubeindex][j] != -1; j++)
  463.                 indices[indicesOffset++] = vertexBeforeOffset + indextable[cubeindex][j];
  464.         }
  465.     }
  466.     printf("sizes : %i %i\n", sizes.x, sizes.y);
  467.     Mesh *mesh = arrayToMesh(indicesOffset + 6, vertOffset, indices, vertices, NULL, NULL);
  468.     free(indices);
  469.     free(vertices);
  470.     return mesh;
  471. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top