ChunkRenderer.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #include "ChunkRenderer.h"
  2. #include "../../engine/Wrapper.h"
  3. ChunkRenderer::ChunkRenderer()
  4. {
  5. mesh = new ChunkMesh[chunkX * chunkZ * Chunk::HEIGHT_PARTIONS];
  6. }
  7. ChunkRenderer::~ChunkRenderer()
  8. {
  9. delete[] mesh;
  10. }
  11. void ChunkRenderer::renderTick(Shader& shader, Camera3D camera, DirectRenderer& dr, float lag)
  12. {
  13. //int frustumCull1 = 0;
  14. //int frustumCull2 = 0;
  15. for(int x = 0; x < chunkX; x++)
  16. {
  17. for(int z = 0; z < chunkZ; z++)
  18. {
  19. int sx = x * Chunk::WIDTH;
  20. int sz = z * Chunk::DEPTH;
  21. int ex = sx + Chunk::WIDTH;
  22. int ez = sz + Chunk::DEPTH;
  23. if(camera.isInFrustum(sx, 0, sz, ex, Chunk::HEIGHT, ez))
  24. {
  25. shader.translateTo(x * Chunk::WIDTH, 0, z * Chunk::DEPTH);
  26. Engine::setWorldModelMatrix(shader.getModelMatrix());
  27. for(int l = 0; l < Chunk::HEIGHT_PARTIONS; l++)
  28. {
  29. if(camera.isInFrustum(sx, l * Chunk::PARTION_HEIGHT, sz, ex, (l + 1) * Chunk::PARTION_HEIGHT, ez))
  30. {
  31. mesh[l + z * Chunk::HEIGHT_PARTIONS + x * chunkZ * Chunk::HEIGHT_PARTIONS].draw();
  32. }
  33. //else
  34. //{
  35. // frustumCull2++;
  36. //}
  37. }
  38. }
  39. //else
  40. //{
  41. // frustumCull1 += 16;
  42. //}
  43. }
  44. }
  45. //cout << "CULL :" << frustumCull1 << " " << frustumCull2 << endl;
  46. }
  47. void ChunkRenderer::updateChunk(Chunk& c, Chunk* north, Chunk* east, Chunk* south, Chunk* west)
  48. {
  49. int x = c.getChunkX();
  50. int z = c.getChunkZ();
  51. if(x < 0 || x >= chunkX || z < 0 || z >= chunkZ)
  52. {
  53. return;
  54. }
  55. cout << "UPDATE: " << x << " " << z << endl;
  56. for(int l = 0; l < Chunk::HEIGHT_PARTIONS; l++)
  57. {
  58. if(c.isDirty(l))
  59. {
  60. buildChunk(l, c, north, east, south, west);
  61. }
  62. }
  63. }
  64. void ChunkRenderer::buildChunk(int partionY, Chunk& c, Chunk* north, Chunk* east, Chunk* south, Chunk* west)
  65. {
  66. Mesh& m = mesh[partionY + c.getChunkZ() * Chunk::HEIGHT_PARTIONS + c.getChunkX() * chunkZ * Chunk::HEIGHT_PARTIONS];
  67. int max = (partionY + 1) * Chunk::PARTION_HEIGHT;
  68. for(int y = partionY * Chunk::PARTION_HEIGHT; y < max; y++)
  69. {
  70. for(int x = 0; x < Chunk::WIDTH; x++)
  71. {
  72. for(int z = 0; z < Chunk::DEPTH; z++)
  73. {
  74. if(c.getBlock(x, y, z) == 1)
  75. {
  76. // bottom
  77. if(y <= 0 || c.getBlock(x, y - 1, z) != 1)
  78. {
  79. for(int i = 0; i < 6; i++)
  80. {
  81. m.addColor(1, 0, 0, 1);
  82. }
  83. //m.addTexture(0.125f, 0.0f);
  84. //m.addTexture(0.1875f, 0.0f);
  85. //m.addTexture(0.125f, 0.0625f);
  86. //m.addTexture(0.1875f, 0.0f);
  87. //m.addTexture(0.1875f, 0.0625f);
  88. //m.addTexture(0.125f, 0.0625f);
  89. for(int i = 0; i < 6; i++)
  90. {
  91. m.addNormal(0.0f, -1.0f, 0.0f);
  92. }
  93. m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
  94. m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
  95. m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
  96. m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
  97. m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
  98. m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
  99. }
  100. // top
  101. if(y + 1 >= Chunk::HEIGHT || c.getBlock(x, y + 1, z) != 1)
  102. {
  103. for(int i = 0; i < 6; i++)
  104. {
  105. m.addColor(1, 0, 0, 1);
  106. }
  107. //m.addTexture(0.25f, 0.0f);
  108. //m.addTexture(0.25f, 0.0625f);
  109. //m.addTexture(0.3125f, 0.0f);
  110. //m.addTexture(0.3125f, 0.0f);
  111. //m.addTexture(0.25f, 0.0625f);
  112. //m.addTexture(0.3125f, 0.0625f);
  113. for(int i = 0; i < 6; i++)
  114. {
  115. m.addNormal(0.0f, 1.0f, 0.0f);
  116. }
  117. m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
  118. m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
  119. m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
  120. m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
  121. m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
  122. m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
  123. }
  124. // right
  125. if((x + 1 < Chunk::WIDTH && c.getBlock(x + 1, y, z) != 1) ||
  126. (x + 1 >= Chunk::WIDTH && (north == nullptr || north->getBlock(x + 1 - Chunk::WIDTH, y, z) != 1)))
  127. {
  128. for(int i = 0; i < 6; i++)
  129. {
  130. m.addColor(1, 0, 0, 1);
  131. }
  132. //m.addTexture(0.1875f, 0.0625f);
  133. //m.addTexture(0.25f, 0.0f);
  134. //m.addTexture(0.25f, 0.0625f);
  135. //m.addTexture(0.1875f, 0.0625f);
  136. //m.addTexture(0.1875f, 0.0f);
  137. //m.addTexture(0.25f, 0.0f);
  138. for(int i = 0; i < 6; i++)
  139. {
  140. m.addNormal(1.0f, 0.0f, 0.0f);
  141. }
  142. m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
  143. m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
  144. m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
  145. m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
  146. m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
  147. m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
  148. }
  149. // left
  150. if((x - 1 >= 0 && c.getBlock(x - 1, y, z) != 1) ||
  151. (x - 1 < 0 && (south == nullptr || south->getBlock(x - 1 + Chunk::WIDTH, y, z) != 1)))
  152. {
  153. for(int i = 0; i < 6; i++)
  154. {
  155. m.addColor(1, 0, 0, 1);
  156. }
  157. //m.addTexture(0.1875f, 0.0625f);
  158. //m.addTexture(0.25f, 0.0625f);
  159. //m.addTexture(0.25f, 0.0f);
  160. //m.addTexture(0.1875f, 0.0625f);
  161. //m.addTexture(0.25f, 0.0f);
  162. //m.addTexture(0.1875f, 0.0f);
  163. for(int i = 0; i < 6; i++)
  164. {
  165. m.addNormal(-1.0f, 0.0f, 0.0f);
  166. }
  167. m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
  168. m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
  169. m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
  170. m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
  171. m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
  172. m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
  173. }
  174. // back
  175. if((z + 1 < Chunk::DEPTH && c.getBlock(x, y, z + 1) != 1) ||
  176. (z + 1 >= Chunk::DEPTH && (east == nullptr || east->getBlock(x, y, z + 1 - Chunk::DEPTH) != 1)))
  177. {
  178. for(int i = 0; i < 6; i++)
  179. {
  180. m.addColor(1, 0, 0, 1);
  181. }
  182. //m.addTexture(0.1875f, 0.0625f);
  183. //m.addTexture(0.25f, 0.0625f);
  184. //m.addTexture(0.25f, 0.0f);
  185. //m.addTexture(0.1875f, 0.0625f);
  186. //m.addTexture(0.25f, 0.0f);
  187. //m.addTexture(0.1875f, 0.0f);
  188. for(int i = 0; i < 6; i++)
  189. {
  190. m.addNormal(0.0f, 0.0f, 1.0f);
  191. }
  192. m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
  193. m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
  194. m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
  195. m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
  196. m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
  197. m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
  198. }
  199. // front
  200. if((z - 1 >= 0 && c.getBlock(x, y, z - 1) != 1) ||
  201. (z - 1 < 0 && (west == nullptr || west->getBlock(x, y, z - 1 + Chunk::DEPTH) != 1)))
  202. {
  203. for(int i = 0; i < 6; i++)
  204. {
  205. m.addColor(1, 0, 0, 1);
  206. }
  207. //m.addTexture(0.1875f, 0.0625f);
  208. //m.addTexture(0.25f, 0.0f);
  209. //m.addTexture(0.25f, 0.0625f);
  210. //m.addTexture(0.1875f, 0.0625f);
  211. //m.addTexture(0.1875f, 0.0f);
  212. //m.addTexture(0.25f, 0.0f);
  213. for(int i = 0; i < 6; i++)
  214. {
  215. m.addNormal(0.0f, 0.0f, -1.0f);
  216. }
  217. m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
  218. m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
  219. m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
  220. m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
  221. m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
  222. m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
  223. }
  224. }
  225. }
  226. }
  227. }
  228. m.build();
  229. }