#include "Chunk.h" #include #include Chunk::Chunk(int chunkX, int chunkZ) : chunkX(chunkX), chunkZ(chunkZ) { mesh = new ChunkMesh[HEIGHT_PARTIONS]; for(int i = 0; i < HEIGHT_PARTIONS; i++) { dirty[i] = true; } for(int z = 0; z < DEPTH; z++) { for(int x = 0; x < WIDTH; x++) { int maxY = (int) (sin((x + chunkX * WIDTH) * 0.3) * 20 + 22) + (sin((z + chunkZ * DEPTH) * 0.3) * 20 + 22); if(maxY > HEIGHT) { maxY = HEIGHT; } for(int y = 0; y < maxY; y++) { blocks[y][x][z] = 1; } for(int y = maxY; y < HEIGHT; y++) { blocks[y][x][z] = 0; } } } } Chunk::~Chunk() { delete[] mesh; } void Chunk::setBlock(int x, int y, int z, unsigned short block) { blocks[y & BITMASK_HEIGHT][x & BITMASK_WIDTH][z & BITMASK_DEPTH] = block; } unsigned short Chunk::getBlock(int x, int y, int z) { return blocks[y & BITMASK_HEIGHT][x & BITMASK_WIDTH][z & BITMASK_DEPTH]; } void Chunk::renderTick(Shader& shader, DirectRenderer& dr, float lag) { shader.translateTo(chunkX * WIDTH, 0, chunkZ * DEPTH); shader.updateModelMatrix(); for(int i = 0; i < HEIGHT_PARTIONS; i++) { if(dirty[i]) { buildChunk(i); dirty[i] = false; } mesh[i].draw(); } } void Chunk::buildChunk(int partionY) { Mesh& m = mesh[partionY]; int max = (partionY + 1) * PARTION_HEIGHT; for(int y = partionY * PARTION_HEIGHT; y < max; y++) { for(int x = 0; x < WIDTH; x++) { for(int z = 0; z < DEPTH; z++) { if(blocks[y][x][z] == 1) { for(int i = 0; i < 36; i++) { m.addColor(1, 0, 0, 1); } // bottom if(y <= 0 || blocks[y - 1][x][z] != 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 >= HEIGHT || blocks[y + 1][x][z] != 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 >= WIDTH || blocks[y][x + 1][z] != 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 <= 0 || blocks[y][x - 1][z] != 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 >= DEPTH || blocks[y][x][z + 1] != 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 <= 0 || blocks[y][x][z - 1] != 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(); }