123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- #include "ChunkRenderer.h"
- #include "../../engine/Wrapper.h"
- ChunkRenderer::ChunkRenderer()
- {
- mesh = new ChunkMesh[chunkX * chunkZ * Chunk::HEIGHT_PARTIONS];
- }
- ChunkRenderer::~ChunkRenderer()
- {
- delete[] mesh;
- }
- void ChunkRenderer::renderTick(Shader& shader, Camera3D camera, DirectRenderer& dr, float lag)
- {
- //int frustumCull1 = 0;
- //int frustumCull2 = 0;
- for(int x = 0; x < chunkX; x++)
- {
- for(int z = 0; z < chunkZ; z++)
- {
- int sx = x * Chunk::WIDTH;
- int sz = z * Chunk::DEPTH;
- int ex = sx + Chunk::WIDTH;
- int ez = sz + Chunk::DEPTH;
-
- if(camera.isInFrustum(sx, 0, sz, ex, Chunk::HEIGHT, ez))
- {
- shader.translateTo(x * Chunk::WIDTH, 0, z * Chunk::DEPTH);
- Engine::setWorldModelMatrix(shader.getModelMatrix());
- for(int l = 0; l < Chunk::HEIGHT_PARTIONS; l++)
- {
- if(camera.isInFrustum(sx, l * Chunk::PARTION_HEIGHT, sz, ex, (l + 1) * Chunk::PARTION_HEIGHT, ez))
- {
- mesh[l + z * Chunk::HEIGHT_PARTIONS + x * chunkZ * Chunk::HEIGHT_PARTIONS].draw();
- }
- //else
- //{
- // frustumCull2++;
- //}
- }
- }
- //else
- //{
- // frustumCull1 += 16;
- //}
- }
- }
- //cout << "CULL :" << frustumCull1 << " " << frustumCull2 << endl;
- }
- void ChunkRenderer::updateChunk(Chunk& c, Chunk* north, Chunk* east, Chunk* south, Chunk* west)
- {
- int x = c.getChunkX();
- int z = c.getChunkZ();
- if(x < 0 || x >= chunkX || z < 0 || z >= chunkZ)
- {
- return;
- }
- cout << "UPDATE: " << x << " " << z << endl;
- for(int l = 0; l < Chunk::HEIGHT_PARTIONS; l++)
- {
- if(c.isDirty(l))
- {
- buildChunk(l, c, north, east, south, west);
- }
- }
- }
- void ChunkRenderer::buildChunk(int partionY, Chunk& c, Chunk* north, Chunk* east, Chunk* south, Chunk* west)
- {
- Mesh& m = mesh[partionY + c.getChunkZ() * Chunk::HEIGHT_PARTIONS + c.getChunkX() * chunkZ * Chunk::HEIGHT_PARTIONS];
-
- int max = (partionY + 1) * Chunk::PARTION_HEIGHT;
- for(int y = partionY * Chunk::PARTION_HEIGHT; y < max; y++)
- {
- for(int x = 0; x < Chunk::WIDTH; x++)
- {
- for(int z = 0; z < Chunk::DEPTH; z++)
- {
- if(!c.getBlock(x, y, z).isEmpty())
- {
- // bottom
- if(y <= 0 || !c.getBlock(x, y - 1, z).isBlockingFace(Face::UP))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
- //m.addTexture(0.125f, 0.0f);
- //m.addTexture(0.1875f, 0.0f);
- //m.addTexture(0.125f, 0.0625f);
- //m.addTexture(0.1875f, 0.0f);
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.125f, 0.0625f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(0.0f, -1.0f, 0.0f);
- }
- m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
- }
- // top
- if(y + 1 >= Chunk::HEIGHT || !c.getBlock(x, y + 1, z).isBlockingFace(Face::DOWN))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
-
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.3125f, 0.0f);
- //m.addTexture(0.3125f, 0.0f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.3125f, 0.0625f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(0.0f, 1.0f, 0.0f);
- }
- m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
- }
-
- // right
- if((x + 1 < Chunk::WIDTH && !c.getBlock(x + 1, y, z).isBlockingFace(Face::SOUTH)) ||
- (x + 1 >= Chunk::WIDTH && (north == nullptr || !north->getBlock(x + 1 - Chunk::WIDTH, y, z).isBlockingFace(Face::SOUTH))))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
-
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.1875f, 0.0f);
- //m.addTexture(0.25f, 0.0f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(1.0f, 0.0f, 0.0f);
- }
- m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
- }
-
- // left
- if((x - 1 >= 0 && !c.getBlock(x - 1, y, z).isBlockingFace(Face::NORTH)) ||
- (x - 1 < 0 && (south == nullptr || !south->getBlock(x - 1 + Chunk::WIDTH, y, z).isBlockingFace(Face::NORTH))))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
-
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.1875f, 0.0f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(-1.0f, 0.0f, 0.0f);
- }
- m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
- }
- // back
- if((z + 1 < Chunk::DEPTH && !c.getBlock(x, y, z + 1).isBlockingFace(Face::WEST)) ||
- (z + 1 >= Chunk::DEPTH && (east == nullptr || !east->getBlock(x, y, z + 1 - Chunk::DEPTH).isBlockingFace(Face::WEST))))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
-
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.1875f, 0.0f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(0.0f, 0.0f, 1.0f);
- }
- m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 1.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 1.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 1.0f);
- }
- // front
- if((z - 1 >= 0 && !c.getBlock(x, y, z - 1).isBlockingFace(Face::EAST)) ||
- (z - 1 < 0 && (west == nullptr || !west->getBlock(x, y, z - 1 + Chunk::DEPTH).isBlockingFace(Face::EAST))))
- {
- for(int i = 0; i < 6; i++)
- {
- m.addColor(1, 0, 0, 1);
- }
-
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.25f, 0.0f);
- //m.addTexture(0.25f, 0.0625f);
- //m.addTexture(0.1875f, 0.0625f);
- //m.addTexture(0.1875f, 0.0f);
- //m.addTexture(0.25f, 0.0f);
- for(int i = 0; i < 6; i++)
- {
- m.addNormal(0.0f, 0.0f, -1.0f);
- }
- m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 0.0f, z + 0.0f);
- m.addPosition(x + 0.0f, y + 1.0f, z + 0.0f);
- m.addPosition(x + 1.0f, y + 1.0f, z + 0.0f);
- }
- }
- }
- }
- }
-
- m.build();
- }
|