ChunkRenderer.cpp 10 KB

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