#include "Chunk.h" #include Chunk::Chunk(int chunkX, int chunkZ) : chunkX(chunkX), chunkZ(chunkZ) { mesh = new Mesh*[HEIGHT_PARTIONS]; for(int i = 0; i < HEIGHT_PARTIONS; i++) { mesh[i] = new Mesh(Mesh::COLOR | Mesh::NORMAL); dirty[i] = true; } for(int y = 0; y < HEIGHT; y++) { for(int x = 0; x < WIDTH; x++) { for(int z = 0; z < DEPTH; z++) { blocks[y][x][z] = (rand() < RAND_MAX / 2); } } } } Chunk::Chunk(const Chunk& orig) { } Chunk::~Chunk() { for(int i = 0; i < HEIGHT_PARTIONS; i++) { delete mesh[i]; } 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) { for(int i = 0; i < HEIGHT_PARTIONS; i++) { if(dirty[i]) { buildChunk(i); dirty[i] = false; } mesh[i]->draw(); } } void Chunk::buildChunk(int partionY) { cout << "BUILD " << partionY << endl; Mesh& m = *mesh[partionY]; for(int y = 0; y < HEIGHT; 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 //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 //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 //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 //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 //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 //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(); }