|
@@ -1,18 +1,21 @@
|
|
#include "Chunk.h"
|
|
#include "Chunk.h"
|
|
|
|
+#include <cstdlib>
|
|
|
|
|
|
Chunk::Chunk(int chunkX, int chunkZ) : chunkX(chunkX), chunkZ(chunkZ)
|
|
Chunk::Chunk(int chunkX, int chunkZ) : chunkX(chunkX), chunkZ(chunkZ)
|
|
{
|
|
{
|
|
- for(int i = 0; i < WORLD_HIGH; i++)
|
|
|
|
|
|
+ mesh = new Mesh*[HEIGHT_PARTIONS];
|
|
|
|
+ for(int i = 0; i < HEIGHT_PARTIONS; i++)
|
|
{
|
|
{
|
|
|
|
+ mesh[i] = new Mesh(Mesh::COLOR | Mesh::NORMAL);
|
|
dirty[i] = true;
|
|
dirty[i] = true;
|
|
}
|
|
}
|
|
- for(int y = 0; y < MAX_Y; y++)
|
|
|
|
|
|
+ for(int y = 0; y < HEIGHT; y++)
|
|
{
|
|
{
|
|
- for(int x = 0; x < CHUNK_SIZE; x++)
|
|
|
|
|
|
+ for(int x = 0; x < WIDTH; x++)
|
|
{
|
|
{
|
|
- for(int z = 0; z < CHUNK_SIZE; z++)
|
|
|
|
|
|
+ for(int z = 0; z < DEPTH; z++)
|
|
{
|
|
{
|
|
- blocks[y][x][z] = 0;
|
|
|
|
|
|
+ blocks[y][x][z] = (rand() < RAND_MAX / 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -24,92 +27,178 @@ Chunk::Chunk(const Chunk& orig)
|
|
|
|
|
|
Chunk::~Chunk()
|
|
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)
|
|
void Chunk::setBlock(int x, int y, int z, unsigned short block)
|
|
{
|
|
{
|
|
- if(x >= 0 && x < CHUNK_SIZE && y >= 0 && y < MAX_Y && z >= 0 && z < CHUNK_SIZE)
|
|
|
|
- {
|
|
|
|
- blocks[y][x][z] = block;
|
|
|
|
- }
|
|
|
|
|
|
+ blocks[y & BITMASK_HEIGHT][x & BITMASK_WIDTH][z & BITMASK_DEPTH] = block;
|
|
}
|
|
}
|
|
|
|
|
|
unsigned short Chunk::getBlock(int x, int y, int z)
|
|
unsigned short Chunk::getBlock(int x, int y, int z)
|
|
{
|
|
{
|
|
- if(x >= 0 && x < CHUNK_SIZE && y >= 0 && y < MAX_Y && z >= 0 && z < CHUNK_SIZE)
|
|
|
|
- {
|
|
|
|
- return blocks[y][x][z];
|
|
|
|
- }
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return blocks[y & BITMASK_HEIGHT][x & BITMASK_WIDTH][z & BITMASK_DEPTH];
|
|
}
|
|
}
|
|
|
|
|
|
-void Chunk::init()
|
|
|
|
|
|
+void Chunk::renderTick(Shader& shader, DirectRenderer& dr, float lag)
|
|
{
|
|
{
|
|
- for(int i = 0; i < WORLD_HIGH; i++)
|
|
|
|
|
|
+ for(int i = 0; i < HEIGHT_PARTIONS; i++)
|
|
{
|
|
{
|
|
- mesh[i].init();
|
|
|
|
|
|
+ if(dirty[i])
|
|
|
|
+ {
|
|
|
|
+ buildChunk(i);
|
|
|
|
+ dirty[i] = false;
|
|
|
|
+ }
|
|
|
|
+ mesh[i]->draw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void Chunk::renderTick(float lag)
|
|
|
|
-{
|
|
|
|
- for(int i = 0; i < WORLD_HIGH; i++)
|
|
|
|
|
|
+void Chunk::buildChunk(int partionY)
|
|
|
|
+{
|
|
|
|
+ cout << "BUILD " << partionY << endl;
|
|
|
|
+ Mesh& m = *mesh[partionY];
|
|
|
|
+
|
|
|
|
+ for(int y = 0; y < HEIGHT; y++)
|
|
{
|
|
{
|
|
- if(dirty[i])
|
|
|
|
|
|
+ for(int x = 0; x < WIDTH; x++)
|
|
{
|
|
{
|
|
- mesh[i].build();
|
|
|
|
- /*
|
|
|
|
- // bottom
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 0.0f, 0.125f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 0.0f, 0.1875f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 1.0f, 0.125f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 0.0f, 0.1875f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 1.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 1.0f, 0.125f, 0.0625f);
|
|
|
|
-
|
|
|
|
- // top
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 0.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 1.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 0.0f, 0.3125f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 0.0f, 0.3125f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 1.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 1.0f, 0.3125f, 0.0625f);
|
|
|
|
-
|
|
|
|
- // right
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 1.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 0.0f, 0.1875f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
-
|
|
|
|
- // left
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 1.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 0.0f, 0.1875f, 0.0f);
|
|
|
|
-
|
|
|
|
- // back
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 1.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 1.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 1.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 1.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 1.0f, 0.1875f, 0.0f);
|
|
|
|
-
|
|
|
|
- // front
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 0.0f, 0.25f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 0.0f, 0.0f, 0.25f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 0.0f, 0.0f, 0.1875f, 0.0625f);
|
|
|
|
- tmesh.addPoint(0.0f, 1.0f, 0.0f, 0.1875f, 0.0f);
|
|
|
|
- tmesh.addPoint(1.0f, 1.0f, 0.0f, 0.25f, 0.0f);
|
|
|
|
-
|
|
|
|
- */
|
|
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- mesh[i].draw();
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ m.build();
|
|
}
|
|
}
|
|
|
|
|