WorldRenderer.cpp 3.3 KB

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