|
@@ -1,36 +1,38 @@
|
|
|
#include "Chunk.h"
|
|
|
#include <cstdlib>
|
|
|
+#include <cmath>
|
|
|
|
|
|
Chunk::Chunk(int chunkX, int chunkZ) : chunkX(chunkX), chunkZ(chunkZ)
|
|
|
{
|
|
|
- mesh = new Mesh*[HEIGHT_PARTIONS];
|
|
|
+ mesh = new ChunkMesh[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 z = 0; z < DEPTH; z++)
|
|
|
{
|
|
|
for(int x = 0; x < WIDTH; x++)
|
|
|
{
|
|
|
- for(int z = 0; z < DEPTH; z++)
|
|
|
+ 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] = (rand() < RAND_MAX / 2);
|
|
|
+ blocks[y][x][z] = 1;
|
|
|
+ }
|
|
|
+ for(int y = maxY; y < HEIGHT; y++)
|
|
|
+ {
|
|
|
+ blocks[y][x][z] = 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-Chunk::Chunk(const Chunk& orig)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
Chunk::~Chunk()
|
|
|
{
|
|
|
- for(int i = 0; i < HEIGHT_PARTIONS; i++)
|
|
|
- {
|
|
|
- delete mesh[i];
|
|
|
- }
|
|
|
delete[] mesh;
|
|
|
}
|
|
|
|
|
@@ -46,6 +48,8 @@ unsigned short Chunk::getBlock(int x, int y, int z)
|
|
|
|
|
|
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])
|
|
@@ -53,16 +57,16 @@ void Chunk::renderTick(Shader& shader, DirectRenderer& dr, float lag)
|
|
|
buildChunk(i);
|
|
|
dirty[i] = false;
|
|
|
}
|
|
|
- mesh[i]->draw();
|
|
|
+ mesh[i].draw();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void Chunk::buildChunk(int partionY)
|
|
|
{
|
|
|
- cout << "BUILD " << partionY << endl;
|
|
|
- Mesh& m = *mesh[partionY];
|
|
|
+ Mesh& m = mesh[partionY];
|
|
|
|
|
|
- for(int y = 0; y < HEIGHT; y++)
|
|
|
+ int max = (partionY + 1) * PARTION_HEIGHT;
|
|
|
+ for(int y = partionY * PARTION_HEIGHT; y < max; y++)
|
|
|
{
|
|
|
for(int x = 0; x < WIDTH; x++)
|
|
|
{
|
|
@@ -76,129 +80,147 @@ void Chunk::buildChunk(int partionY)
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(y <= 0 || blocks[y - 1][x][z] != 1)
|
|
|
{
|
|
|
- m.addNormal(0.0f, -1.0f, 0.0f);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(y + 1 >= HEIGHT || blocks[y + 1][x][z] != 1)
|
|
|
{
|
|
|
- m.addNormal(0.0f, 1.0f, 0.0f);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(x + 1 >= WIDTH || blocks[y][x + 1][z] != 1)
|
|
|
{
|
|
|
- m.addNormal(1.0f, 0.0f, 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);
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(x <= 0 || blocks[y][x - 1][z] != 1)
|
|
|
{
|
|
|
- m.addNormal(-1.0f, 0.0f, 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);
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(z + 1 >= DEPTH || blocks[y][x][z + 1] != 1)
|
|
|
{
|
|
|
- m.addNormal(0.0f, 0.0f, -1.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);
|
|
|
}
|
|
|
|
|
|
- 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);
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for(int i = 0; i < 6; i++)
|
|
|
+ if(z <= 0 || blocks[y][x][z - 1] != 1)
|
|
|
{
|
|
|
- m.addNormal(0.0f, 0.0f, 1.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.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();
|
|
|
+ m.build();
|
|
|
}
|
|
|
|