WorldRenderer.cpp 3.0 KB

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