#include "ChunkRenderer.h" ChunkRenderer::ChunkRenderer() { mesh = new ChunkMesh[chunkX * chunkZ * Chunk::HEIGHT_PARTIONS]; } ChunkRenderer::~ChunkRenderer() { delete[] mesh; } void ChunkRenderer::renderTick(Shader& shader, 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(shader.isInFrustum(sx, 0, sz, ex, Chunk::HEIGHT, ez)) { shader.translateTo(x * Chunk::WIDTH, 0, z * Chunk::DEPTH); shader.updateModelMatrix(); for(int l = 0; l < Chunk::HEIGHT_PARTIONS; l++) { if(shader.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) == 1) { // bottom if(y <= 0 || c.getBlock(x, y - 1, z) != 1) { 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) != 1) { 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) != 1) || (x + 1 >= Chunk::WIDTH && (north == nullptr || north->getBlock(x + 1 - Chunk::WIDTH, y, z) != 1))) { 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) != 1) || (x - 1 < 0 && (south == nullptr || south->getBlock(x - 1 + Chunk::WIDTH, y, z) != 1))) { 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) != 1) || (z + 1 >= Chunk::DEPTH && (east == nullptr || east->getBlock(x, y, z + 1 - Chunk::DEPTH) != 1))) { 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) != 1) || (z - 1 < 0 && (west == nullptr || west->getBlock(x, y, z - 1 + Chunk::DEPTH) != 1))) { 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(); }