Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.95 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement