123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "Chunk.h"
- #include <cstdlib>
- #include <cmath>
- 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();
- }
|