WorldRenderer.cpp 3.3 KB

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