metaballs.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. /*
  2. * Copyright 2011-2012 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #include <bgfx.h>
  6. #include <bx/bx.h>
  7. #include <bx/timer.h>
  8. #include "../common/dbg.h"
  9. #include "../common/math.h"
  10. #include <stdio.h>
  11. #include <string.h>
  12. bgfx::VertexDecl s_PosNormalColorDecl;
  13. void fatalCb(bgfx::Fatal::Enum _code, const char* _str)
  14. {
  15. DBG("%x: %s", _code, _str);
  16. }
  17. struct PosNormalColorVertex
  18. {
  19. float m_pos[3];
  20. float m_normal[3];
  21. uint32_t m_abgr;
  22. };
  23. struct Grid
  24. {
  25. Grid()
  26. : m_val(0.0f)
  27. {
  28. m_normal[0] = 0.0f;
  29. m_normal[1] = 0.0f;
  30. m_normal[2] = 0.0f;
  31. }
  32. float m_val;
  33. float m_normal[3];
  34. };
  35. static const char* s_shaderPath = NULL;
  36. static void shaderFilePath(char* _out, const char* _name)
  37. {
  38. strcpy(_out, s_shaderPath);
  39. strcat(_out, _name);
  40. strcat(_out, ".bin");
  41. }
  42. long int fsize(FILE* _file)
  43. {
  44. long int pos = ftell(_file);
  45. fseek(_file, 0L, SEEK_END);
  46. long int size = ftell(_file);
  47. fseek(_file, pos, SEEK_SET);
  48. return size;
  49. }
  50. static const bgfx::Memory* load(const char* _filePath)
  51. {
  52. FILE* file = fopen(_filePath, "rb");
  53. if (NULL != file)
  54. {
  55. uint32_t size = (uint32_t)fsize(file);
  56. const bgfx::Memory* mem = bgfx::alloc(size+1);
  57. fread(mem->data, 1, size, file);
  58. fclose(file);
  59. mem->data[mem->size-1] = '\0';
  60. return mem;
  61. }
  62. return NULL;
  63. }
  64. static const bgfx::Memory* loadShader(const char* _name, const char* _default = NULL)
  65. {
  66. char filePath[512];
  67. shaderFilePath(filePath, _name);
  68. BX_UNUSED(_default);
  69. return load(filePath);
  70. }
  71. // Triangulation tables taken from:
  72. // http://paulbourke.net/geometry/polygonise/
  73. static const uint16_t s_edges[256] =
  74. {
  75. 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
  76. 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
  77. 0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
  78. 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
  79. 0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c,
  80. 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
  81. 0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac,
  82. 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
  83. 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
  84. 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
  85. 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc,
  86. 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
  87. 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c,
  88. 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
  89. 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc,
  90. 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
  91. 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
  92. 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
  93. 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
  94. 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
  95. 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
  96. 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
  97. 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
  98. 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460,
  99. 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
  100. 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0,
  101. 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
  102. 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230,
  103. 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
  104. 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190,
  105. 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
  106. 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000,
  107. };
  108. static const int8_t s_indices[256][16] =
  109. {
  110. { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  111. { 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  112. { 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  113. { 1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  114. { 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  115. { 0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  116. { 9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  117. { 2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1 },
  118. { 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  119. { 0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  120. { 1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  121. { 1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1 },
  122. { 3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  123. { 0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1 },
  124. { 3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1 },
  125. { 9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  126. { 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  127. { 4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  128. { 0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  129. { 4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1 },
  130. { 1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  131. { 3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1 },
  132. { 9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1 },
  133. { 2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1 },
  134. { 8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  135. { 11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1 },
  136. { 9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1 },
  137. { 4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1 },
  138. { 3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1 },
  139. { 1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1 },
  140. { 4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1 },
  141. { 4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1 },
  142. { 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  143. { 9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  144. { 0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  145. { 8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1 },
  146. { 1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  147. { 3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1 },
  148. { 5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1 },
  149. { 2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1 },
  150. { 9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  151. { 0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1 },
  152. { 0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1 },
  153. { 2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1 },
  154. { 10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1 },
  155. { 4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1 },
  156. { 5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1 },
  157. { 5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1 },
  158. { 9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  159. { 9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1 },
  160. { 0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1 },
  161. { 1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  162. { 9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1 },
  163. { 10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1 },
  164. { 8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1 },
  165. { 2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1 },
  166. { 7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1 },
  167. { 9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1 },
  168. { 2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1 },
  169. { 11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1 },
  170. { 9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1 },
  171. { 5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1 },
  172. { 11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1 },
  173. { 11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  174. { 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  175. { 0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  176. { 9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  177. { 1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1 },
  178. { 1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  179. { 1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1 },
  180. { 9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1 },
  181. { 5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1 },
  182. { 2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  183. { 11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1 },
  184. { 0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1 },
  185. { 5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1 },
  186. { 6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1 },
  187. { 0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1 },
  188. { 3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1 },
  189. { 6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1 },
  190. { 5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  191. { 4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1 },
  192. { 1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1 },
  193. { 10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1 },
  194. { 6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1 },
  195. { 1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1 },
  196. { 8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1 },
  197. { 7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1 },
  198. { 3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1 },
  199. { 5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1 },
  200. { 0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1 },
  201. { 9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1 },
  202. { 8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1 },
  203. { 5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1 },
  204. { 0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1 },
  205. { 6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1 },
  206. { 10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  207. { 4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1 },
  208. { 10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1 },
  209. { 8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1 },
  210. { 1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1 },
  211. { 3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1 },
  212. { 0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  213. { 8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1 },
  214. { 10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1 },
  215. { 0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1 },
  216. { 3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1 },
  217. { 6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1 },
  218. { 9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1 },
  219. { 8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1 },
  220. { 3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1 },
  221. { 6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  222. { 7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1 },
  223. { 0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1 },
  224. { 10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1 },
  225. { 10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1 },
  226. { 1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1 },
  227. { 2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1 },
  228. { 7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1 },
  229. { 7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  230. { 2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1 },
  231. { 2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1 },
  232. { 1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1 },
  233. { 11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1 },
  234. { 8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1 },
  235. { 0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  236. { 7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1 },
  237. { 7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  238. { 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  239. { 3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  240. { 0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  241. { 8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1 },
  242. { 10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  243. { 1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1 },
  244. { 2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1 },
  245. { 6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1 },
  246. { 7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  247. { 7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1 },
  248. { 2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1 },
  249. { 1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1 },
  250. { 10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1 },
  251. { 10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1 },
  252. { 0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1 },
  253. { 7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1 },
  254. { 6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  255. { 3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1 },
  256. { 8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1 },
  257. { 9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1 },
  258. { 6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1 },
  259. { 1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1 },
  260. { 4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1 },
  261. { 10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1 },
  262. { 8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1 },
  263. { 0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  264. { 1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1 },
  265. { 1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1 },
  266. { 8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1 },
  267. { 10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1 },
  268. { 4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1 },
  269. { 10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  270. { 4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  271. { 0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1 },
  272. { 5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1 },
  273. { 11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1 },
  274. { 9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1 },
  275. { 6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1 },
  276. { 7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1 },
  277. { 3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1 },
  278. { 7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1 },
  279. { 9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1 },
  280. { 3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1 },
  281. { 6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1 },
  282. { 9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1 },
  283. { 1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1 },
  284. { 4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1 },
  285. { 7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1 },
  286. { 6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1 },
  287. { 3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1 },
  288. { 0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1 },
  289. { 6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1 },
  290. { 1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1 },
  291. { 0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1 },
  292. { 11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1 },
  293. { 6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1 },
  294. { 5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1 },
  295. { 9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1 },
  296. { 1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1 },
  297. { 1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  298. { 1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1 },
  299. { 10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1 },
  300. { 0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  301. { 10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  302. { 11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  303. { 11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1 },
  304. { 5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1 },
  305. { 10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1 },
  306. { 11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1 },
  307. { 0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1 },
  308. { 9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1 },
  309. { 7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1 },
  310. { 2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1 },
  311. { 8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1 },
  312. { 9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1 },
  313. { 9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1 },
  314. { 1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  315. { 0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1 },
  316. { 9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1 },
  317. { 9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  318. { 5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1 },
  319. { 5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1 },
  320. { 0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1 },
  321. { 10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1 },
  322. { 2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1 },
  323. { 0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1 },
  324. { 0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1 },
  325. { 9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  326. { 2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1 },
  327. { 5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1 },
  328. { 3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1 },
  329. { 5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1 },
  330. { 8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1 },
  331. { 0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  332. { 8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1 },
  333. { 9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  334. { 4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1 },
  335. { 0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1 },
  336. { 1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1 },
  337. { 3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1 },
  338. { 4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1 },
  339. { 9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1 },
  340. { 11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1 },
  341. { 11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1 },
  342. { 2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1 },
  343. { 9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1 },
  344. { 3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1 },
  345. { 1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  346. { 4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1 },
  347. { 4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1 },
  348. { 4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  349. { 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  350. { 9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  351. { 3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1 },
  352. { 0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1 },
  353. { 3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  354. { 1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1 },
  355. { 3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1 },
  356. { 0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  357. { 3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  358. { 2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1 },
  359. { 9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  360. { 2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1 },
  361. { 1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  362. { 1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  363. { 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  364. { 0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  365. { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
  366. };
  367. static const float s_cube[8][3] =
  368. {
  369. { 0.0f, 1.0f, 1.0f }, // 0
  370. { 1.0f, 1.0f, 1.0f }, // 1
  371. { 1.0f, 1.0f, 0.0f }, // 2
  372. { 0.0f, 1.0f, 0.0f }, // 3
  373. { 0.0f, 0.0f, 1.0f }, // 4
  374. { 1.0f, 0.0f, 1.0f }, // 5
  375. { 1.0f, 0.0f, 0.0f }, // 6
  376. { 0.0f, 0.0f, 0.0f }, // 7
  377. };
  378. float vertLerp(float* __restrict _result, float _iso, uint32_t _idx0, float _v0, uint32_t _idx1, float _v1)
  379. {
  380. const float* __restrict edge0 = s_cube[_idx0];
  381. const float* __restrict edge1 = s_cube[_idx1];
  382. if (fabsf(_iso-_v1) < 0.00001f)
  383. {
  384. _result[0] = edge1[0];
  385. _result[1] = edge1[1];
  386. _result[2] = edge1[2];
  387. return 1.0f;
  388. }
  389. if (fabsf(_iso-_v0) < 0.00001f
  390. || fabsf(_v0-_v1) < 0.00001f)
  391. {
  392. _result[0] = edge0[0];
  393. _result[1] = edge0[1];
  394. _result[2] = edge0[2];
  395. return 0.0f;
  396. }
  397. float lerp = (_iso - _v0) / (_v1 - _v0);
  398. _result[0] = edge0[0] + lerp * (edge1[0] - edge0[0]);
  399. _result[1] = edge0[1] + lerp * (edge1[1] - edge0[1]);
  400. _result[2] = edge0[2] + lerp * (edge1[2] - edge0[2]);
  401. return lerp;
  402. }
  403. uint32_t triangulate(uint8_t* _result, uint32_t _stride, const float* __restrict _rgb, const float* __restrict _xyz, const Grid* _val[8], float _iso)
  404. {
  405. uint8_t cubeindex = 0;
  406. cubeindex |= (_val[0]->m_val < _iso) ? 0x01 : 0;
  407. cubeindex |= (_val[1]->m_val < _iso) ? 0x02 : 0;
  408. cubeindex |= (_val[2]->m_val < _iso) ? 0x04 : 0;
  409. cubeindex |= (_val[3]->m_val < _iso) ? 0x08 : 0;
  410. cubeindex |= (_val[4]->m_val < _iso) ? 0x10 : 0;
  411. cubeindex |= (_val[5]->m_val < _iso) ? 0x20 : 0;
  412. cubeindex |= (_val[6]->m_val < _iso) ? 0x40 : 0;
  413. cubeindex |= (_val[7]->m_val < _iso) ? 0x80 : 0;
  414. if (0 == s_edges[cubeindex])
  415. {
  416. return 0;
  417. }
  418. float verts[12][6];
  419. uint16_t flags = s_edges[cubeindex];
  420. for (uint32_t ii = 0; ii < 12; ++ii)
  421. {
  422. if (flags & (1<<ii) )
  423. {
  424. uint32_t idx0 = ii&7;
  425. uint32_t idx1 = "\x1\x2\x3\x0\x5\x6\x7\x4\x4\x5\x6\x7"[ii];
  426. float* vertex = verts[ii];
  427. float lerp = vertLerp(vertex, _iso, idx0, _val[idx0]->m_val, idx1, _val[idx1]->m_val);
  428. const float* na = _val[idx0]->m_normal;
  429. const float* nb = _val[idx1]->m_normal;
  430. vertex[3] = na[0] + lerp * (nb[0] - na[0]);
  431. vertex[4] = na[1] + lerp * (nb[1] - na[1]);
  432. vertex[5] = na[2] + lerp * (nb[2] - na[2]);
  433. }
  434. }
  435. float dr = _rgb[3] - _rgb[0];
  436. float dg = _rgb[4] - _rgb[1];
  437. float db = _rgb[5] - _rgb[2];
  438. uint32_t num = 0;
  439. const int8_t* indices = s_indices[cubeindex];
  440. for (uint32_t ii = 0; indices[ii] != -1; ++ii)
  441. {
  442. const float* vertex = verts[indices[ii] ];
  443. float* xyz = (float*)_result;
  444. xyz[0] = _xyz[0] + vertex[0];
  445. xyz[1] = _xyz[1] + vertex[1];
  446. xyz[2] = _xyz[2] + vertex[2];
  447. xyz[3] = vertex[3];
  448. xyz[4] = vertex[4];
  449. xyz[5] = vertex[5];
  450. uint32_t rr = uint8_t( (_rgb[0] + vertex[0]*dr)*255.0f);
  451. uint32_t gg = uint8_t( (_rgb[1] + vertex[1]*dg)*255.0f);
  452. uint32_t bb = uint8_t( (_rgb[2] + vertex[2]*db)*255.0f);
  453. uint32_t* abgr = (uint32_t*)&_result[24];
  454. *abgr = 0xff000000
  455. | (bb<<16)
  456. | (gg<<8)
  457. | rr
  458. ;
  459. _result += _stride;
  460. ++num;
  461. }
  462. return num;
  463. }
  464. int _main_(int _argc, char** _argv)
  465. {
  466. bgfx::init(BX_PLATFORM_WINDOWS, fatalCb);
  467. bgfx::reset(1280, 720);
  468. // Enable debug text.
  469. bgfx::setDebug(BGFX_DEBUG_TEXT);
  470. // Set view 0 default viewport.
  471. bgfx::setViewRect(0, 0, 0, 1280, 720);
  472. // Set view 0 clear state.
  473. bgfx::setViewClear(0
  474. , BGFX_CLEAR_COLOR_BIT|BGFX_CLEAR_DEPTH_BIT
  475. , 0x303030ff
  476. , 1.0f
  477. , 0
  478. );
  479. // Setup root path for binary shaders. Shader binaries are different
  480. // for each renderer.
  481. switch (bgfx::getRendererType() )
  482. {
  483. case bgfx::RendererType::Null:
  484. case bgfx::RendererType::Direct3D9:
  485. s_shaderPath = "shaders/dx9/";
  486. break;
  487. case bgfx::RendererType::Direct3D11:
  488. s_shaderPath = "shaders/dx11/";
  489. break;
  490. case bgfx::RendererType::OpenGL:
  491. s_shaderPath = "shaders/glsl/";
  492. break;
  493. case bgfx::RendererType::OpenGLES2:
  494. s_shaderPath = "shaders/gles/";
  495. break;
  496. }
  497. // Create vertex stream declaration.
  498. s_PosNormalColorDecl.begin();
  499. s_PosNormalColorDecl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float);
  500. s_PosNormalColorDecl.add(bgfx::Attrib::Normal, 3, bgfx::AttribType::Float);
  501. s_PosNormalColorDecl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true);
  502. s_PosNormalColorDecl.end();
  503. const bgfx::Memory* mem;
  504. // Load vertex shader.
  505. mem = loadShader("vs_metaballs");
  506. bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem);
  507. // Load fragment shader.
  508. mem = loadShader("fs_metaballs");
  509. bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem);
  510. // Create program from shaders.
  511. bgfx::ProgramHandle program = bgfx::createProgram(vsh, fsh);
  512. // We can destroy vertex and fragment shader here since
  513. // their reference is kept inside bgfx after calling createProgram.
  514. // Vertex and fragment shader will be destroyed once program is
  515. // destroyed.
  516. bgfx::destroyVertexShader(vsh);
  517. bgfx::destroyFragmentShader(fsh);
  518. #define DIMS 32
  519. Grid* grid = new Grid[DIMS*DIMS*DIMS];
  520. const uint32_t ypitch = DIMS;
  521. const uint32_t zpitch = DIMS*DIMS;
  522. const float invdim = 1.0f/float(DIMS-1);
  523. while (true)
  524. {
  525. // This dummy draw call is here to make sure that view 0 is cleared
  526. // if not other draw calls are submitted to view 0.
  527. bgfx::submit(0);
  528. int64_t now = bx::getHPCounter();
  529. static int64_t last = now;
  530. const int64_t frameTime = now - last;
  531. last = now;
  532. const double freq = double(bx::getHPFrequency() );
  533. const double toMs = 1000.0/freq;
  534. // Use debug font to print information about this example.
  535. bgfx::dbgTextClear();
  536. bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/02-metaball");
  537. bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Rendering with transient buffers.");
  538. float at[3] = { 0.0f, 0.0f, 0.0f };
  539. float eye[3] = { 0.0f, 0.0f, -50.0f };
  540. float view[16];
  541. float proj[16];
  542. mtxLookAt(view, eye, at);
  543. mtxProj(proj, 60.0f, 16.0f/9.0f, 0.1f, 100.0f);
  544. // Set view and projection matrix for view 0.
  545. bgfx::setViewTransform(0, view, proj);
  546. float time = (float)(bx::getHPCounter()/double(bx::getHPFrequency() ) );
  547. // Stats.
  548. uint32_t numVertices = 0;
  549. int64_t profUpdate = 0;
  550. int64_t profNormal = 0;
  551. int64_t profTriangulate = 0;
  552. // Allocate 32K vertices in transient vertex buffer.
  553. uint32_t maxVertices = (32<<10);
  554. const bgfx::TransientVertexBuffer* tvb = bgfx::allocTransientVertexBuffer(maxVertices, s_PosNormalColorDecl);
  555. // If there is no enough space in transient vertex buffer alloc will return NULL.
  556. if (NULL != tvb)
  557. {
  558. const uint32_t numSpheres = 16;
  559. float sphere[numSpheres][4];
  560. for (uint32_t ii = 0; ii < numSpheres; ++ii)
  561. {
  562. sphere[ii][0] = sin(time*(ii*0.21f)+ii*0.37f) * (DIMS * 0.5f - 8.0f);
  563. sphere[ii][1] = sin(time*(ii*0.37f)+ii*0.67f) * (DIMS * 0.5f - 8.0f);
  564. sphere[ii][2] = cos(time*(ii*0.11f)+ii*0.13f) * (DIMS * 0.5f - 8.0f);
  565. sphere[ii][3] = 1.0f/(2.0f + (sin(time*(ii*0.13f) )*0.5f+0.5f)*2.0f);
  566. }
  567. profUpdate = bx::getHPCounter();
  568. for (uint32_t zz = 0; zz < DIMS; ++zz)
  569. {
  570. for (uint32_t yy = 0; yy < DIMS; ++yy)
  571. {
  572. uint32_t offset = (zz*DIMS+yy)*DIMS;
  573. for (uint32_t xx = 0; xx < DIMS; ++xx)
  574. {
  575. uint32_t xoffset = offset + xx;
  576. float dist = 0.0f;
  577. float prod = 1.0f;
  578. for (uint32_t ii = 0; ii < numSpheres; ++ii)
  579. {
  580. const float* pos = sphere[ii];
  581. float dx = pos[0] - (-DIMS*0.5f + float(xx) );
  582. float dy = pos[1] - (-DIMS*0.5f + float(yy) );
  583. float dz = pos[2] - (-DIMS*0.5f + float(zz) );
  584. float invr = pos[3];
  585. float dot = dx*dx + dy*dy + dz*dz;
  586. dot *= invr*invr;
  587. dist *= dot;
  588. dist += prod;
  589. prod *= dot;
  590. }
  591. grid[xoffset].m_val = dist / prod - 1.0f;
  592. }
  593. }
  594. }
  595. profUpdate = bx::getHPCounter() - profUpdate;
  596. profNormal = bx::getHPCounter();
  597. for (uint32_t zz = 1; zz < DIMS-1; ++zz)
  598. {
  599. for (uint32_t yy = 1; yy < DIMS-1; ++yy)
  600. {
  601. uint32_t offset = (zz*DIMS+yy)*DIMS;
  602. for (uint32_t xx = 1; xx < DIMS-1; ++xx)
  603. {
  604. uint32_t xoffset = offset + xx;
  605. float normal[3] =
  606. {
  607. grid[xoffset-1 ].m_val - grid[xoffset+1 ].m_val,
  608. grid[xoffset-ypitch].m_val - grid[xoffset+ypitch].m_val,
  609. grid[xoffset-zpitch].m_val - grid[xoffset+zpitch].m_val,
  610. };
  611. vec3Norm(grid[xoffset].m_normal, normal);
  612. }
  613. }
  614. }
  615. profNormal = bx::getHPCounter() - profNormal;
  616. profTriangulate = bx::getHPCounter();
  617. PosNormalColorVertex* vertex = (PosNormalColorVertex*)tvb->data;
  618. for (uint32_t zz = 0; zz < DIMS-1 && numVertices+12 < maxVertices; ++zz)
  619. {
  620. float rgb[6];
  621. rgb[2] = zz*invdim;
  622. rgb[5] = (zz+1)*invdim;
  623. for (uint32_t yy = 0; yy < DIMS-1 && numVertices+12 < maxVertices; ++yy)
  624. {
  625. uint32_t offset = (zz*DIMS+yy)*DIMS;
  626. rgb[1] = yy*invdim;
  627. rgb[4] = (yy+1)*invdim;
  628. for (uint32_t xx = 0; xx < DIMS-1 && numVertices+12 < maxVertices; ++xx)
  629. {
  630. uint32_t xoffset = offset + xx;
  631. rgb[0] = xx*invdim;
  632. rgb[3] = (xx+1)*invdim;
  633. float pos[3] =
  634. {
  635. -DIMS*0.5f + float(xx),
  636. -DIMS*0.5f + float(yy),
  637. -DIMS*0.5f + float(zz)
  638. };
  639. const Grid* val[8] = {
  640. &grid[xoffset+zpitch+ypitch ],
  641. &grid[xoffset+zpitch+ypitch+1],
  642. &grid[xoffset+ypitch+1 ],
  643. &grid[xoffset+ypitch ],
  644. &grid[xoffset+zpitch ],
  645. &grid[xoffset+zpitch+1 ],
  646. &grid[xoffset+1 ],
  647. &grid[xoffset ],
  648. };
  649. uint32_t num = triangulate( (uint8_t*)vertex, s_PosNormalColorDecl.m_stride, rgb, pos, val, 0.5f);
  650. vertex += num;
  651. numVertices += num;
  652. }
  653. }
  654. }
  655. profTriangulate = bx::getHPCounter() - profTriangulate;
  656. float mtx[16];
  657. mtxRotateXY(mtx, time*0.67f, time);
  658. // Set model matrix for rendering.
  659. bgfx::setTransform(mtx);
  660. // Set vertex and fragment shaders.
  661. bgfx::setProgram(program);
  662. // Set vertex and index buffer.
  663. bgfx::setVertexBuffer(tvb, numVertices);
  664. // Set render states.
  665. bgfx::setState(BGFX_STATE_RGB_WRITE
  666. |BGFX_STATE_DEPTH_WRITE
  667. |BGFX_STATE_DEPTH_TEST_LESS
  668. );
  669. // Submit primitive for rendering to view 0.
  670. bgfx::submit(0);
  671. }
  672. // Display stats.
  673. bgfx::dbgTextPrintf(1, 4, 0x0f, "Num vertices: %5d (%6.4f%%)", numVertices, float(numVertices)/maxVertices * 100);
  674. bgfx::dbgTextPrintf(1, 5, 0x0f, " Update: % 7.3f[ms]", double(profUpdate)*toMs);
  675. bgfx::dbgTextPrintf(1, 6, 0x0f, "Calc normals: % 7.3f[ms]", double(profNormal)*toMs);
  676. bgfx::dbgTextPrintf(1, 7, 0x0f, " Triangulate: % 7.3f[ms]", double(profTriangulate)*toMs);
  677. bgfx::dbgTextPrintf(1, 8, 0x0f, " Frame: % 7.3f[ms]", double(frameTime)*toMs);
  678. // Advance to next frame. Rendering thread will be kicked to
  679. // process submitted rendering primitives.
  680. bgfx::frame();
  681. }
  682. delete [] grid;
  683. // Cleanup.
  684. bgfx::destroyProgram(program);
  685. // Shutdown bgfx.
  686. bgfx::shutdown();
  687. return 0;
  688. }