WorldRenderer.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "client/rendering/renderer/WorldRenderer.h"
  2. #include "utils/Logger.h"
  3. WorldRenderer::WorldRenderer(const World& world)
  4. : world(world), texture("resources/textures.png", 4) {
  5. }
  6. void WorldRenderer::render(float lag, ShaderMatrix& sm) {
  7. if(world.dirty) {
  8. TypedBuffer<Triangle> buffer(100);
  9. for(int x = 0; x < world.getSize(); x++) {
  10. for(int y = 0; y < world.getHeight(); y++) {
  11. for(int z = 0; z < world.getSize(); z++) {
  12. if(world.getBlock(x, y, z).getId() != 0) {
  13. addCube(buffer, x, y, z);
  14. }
  15. }
  16. }
  17. }
  18. mesh.build(buffer);
  19. world.dirty = false;
  20. LOG_DEBUG("world render update");
  21. }
  22. (void)lag;
  23. texture.bindTo(0);
  24. for(int x = -1; x <= 1; x++) {
  25. for(int z = -1; z <= 1; z++) {
  26. sm.translateTo(world.getSize() * x, 0.0f, world.getSize() * z)
  27. .update();
  28. mesh.draw();
  29. }
  30. }
  31. }
  32. bool WorldRenderer::isAir(int x, int y, int z) const {
  33. return world.getBlock(x, y, z).getId() == 0;
  34. }
  35. void WorldRenderer::addCube(TypedBuffer<Triangle>& buffer, float x, float y,
  36. float z) {
  37. Vector3 v000(x, y, z);
  38. Vector3 v001(x, y, z + 1);
  39. Vector3 v010(x, y + 1, z);
  40. Vector3 v011(x, y + 1, z + 1);
  41. Vector3 v100(x + 1, y, z);
  42. Vector3 v101(x + 1, y, z + 1);
  43. Vector3 v110(x + 1, y + 1, z);
  44. Vector3 v111(x + 1, y + 1, z + 1);
  45. const float ERROR = 0.0001f;
  46. Vector2 t1(0.1875f + ERROR, 0.0f + ERROR);
  47. Vector2 t2(0.25f - ERROR, 0.0f + ERROR);
  48. Vector2 t3(0.25f - ERROR, 0.0625f - ERROR);
  49. Vector2 t4(0.1875f + ERROR, 0.0625f - ERROR);
  50. if(isAir(x, y - 1, z)) {
  51. Vector2 tb(0.125f, 0.0625f);
  52. buffer.add(Triangle(Vertex(v000, Vector2(0.125f, 0.0f)),
  53. Vertex(v100, t1), Vertex(v001, tb)));
  54. buffer.add(
  55. Triangle(Vertex(v100, t1), Vertex(v101, t4), Vertex(v001, tb)));
  56. }
  57. if(isAir(x, y + 1, z)) {
  58. Vector2 tt(0.3125f, 0.0f);
  59. buffer.add(
  60. Triangle(Vertex(v010, t2), Vertex(v011, t3), Vertex(v110, tt)));
  61. buffer.add(Triangle(Vertex(v110, tt), Vertex(v011, t3),
  62. Vertex(v111, Vector2(0.3125f, 0.0625f))));
  63. }
  64. if(isAir(x - 1, y, z)) {
  65. buffer.add(
  66. Triangle(Vertex(v000, t4), Vertex(v001, t3), Vertex(v010, t1)));
  67. buffer.add(
  68. Triangle(Vertex(v001, t3), Vertex(v011, t2), Vertex(v010, t1)));
  69. }
  70. if(isAir(x + 1, y, z)) {
  71. buffer.add(
  72. Triangle(Vertex(v100, t3), Vertex(v110, t2), Vertex(v101, t4)));
  73. buffer.add(
  74. Triangle(Vertex(v101, t4), Vertex(v110, t2), Vertex(v111, t1)));
  75. }
  76. if(isAir(x, y, z + 1)) {
  77. buffer.add(
  78. Triangle(Vertex(v001, t4), Vertex(v101, t3), Vertex(v011, t1)));
  79. buffer.add(
  80. Triangle(Vertex(v111, t2), Vertex(v011, t1), Vertex(v101, t3)));
  81. }
  82. if(isAir(x, y, z - 1)) {
  83. buffer.add(
  84. Triangle(Vertex(v000, t3), Vertex(v010, t2), Vertex(v100, t4)));
  85. buffer.add(
  86. Triangle(Vertex(v110, t1), Vertex(v100, t4), Vertex(v010, t2)));
  87. }
  88. }