Bientôt un monde infini?

This commit is contained in:
MarcEricMartel
2021-11-26 11:59:02 -05:00
parent 6446be1ceb
commit fe624fdafc
14 changed files with 815 additions and 146 deletions

View File

@@ -16,7 +16,7 @@ void Chunk::RemoveBlock(int x, int y, int z, World* world) {
void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
m_blocks.Set(x, y, z, type);
CheckNeighbors(x, y, world);
CheckNeighbors(x, z, world);
m_isDirty = true;
}
@@ -24,25 +24,25 @@ void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
BlockType Chunk::GetBlock(int x, int y, int z) { return m_blocks.Get(x, y, z); }
void Chunk::CheckNeighbors(int x, int z, World* world) {
if (x == 0 && m_posX > 0 &&
world->ChunkAt((m_posX - 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z) &&
!world->ChunkAt((m_posX - 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z)->IsDirty())
world->ChunkAt((m_posX - 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z)->MakeDirty();
else if (x == CHUNK_SIZE_X - 1 && m_posX < VIEW_DISTANCE &&
world->ChunkAt((m_posX + 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z) &&
!world->ChunkAt((m_posX + 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z)->IsDirty())
world->ChunkAt((m_posX + 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z)->MakeDirty();
if (x == 0 && m_posX >= 0 &&
world->ChunkAt((m_posX - 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z))
world->ChunkAt((m_posX - 1) * CHUNK_SIZE_X, 1, m_posY * CHUNK_SIZE_Z)->MakeDirty();
else if (x == CHUNK_SIZE_X - 1 && m_posX < WORLD_SIZE_X &&
world->ChunkAt((m_posX + 1) * CHUNK_SIZE_X - 1, 1, m_posY * CHUNK_SIZE_Z))
world->ChunkAt((m_posX + 1) * CHUNK_SIZE_X - 1, 1, m_posY * CHUNK_SIZE_Z)->MakeDirty();
if (z == 0 && m_posY > 0 &&
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY - 1) * CHUNK_SIZE_Z) &&
!world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY - 1) * CHUNK_SIZE_Z)->IsDirty())
if (z == 0 && m_posY >= 0 &&
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY - 1) * CHUNK_SIZE_Z))
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY - 1) * CHUNK_SIZE_Z)->MakeDirty();
else if (z == CHUNK_SIZE_X - 1 && m_posY < VIEW_DISTANCE &&
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY + 1) * CHUNK_SIZE_Z) &&
!world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY + 1) * CHUNK_SIZE_Z)->IsDirty())
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY + 1) * CHUNK_SIZE_Z)->MakeDirty();
else if (z == CHUNK_SIZE_X - 1 && m_posY < WORLD_SIZE_Y &&
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY + 1) * CHUNK_SIZE_Z - 1))
world->ChunkAt(m_posX * CHUNK_SIZE_X, 1, (m_posY + 1) * CHUNK_SIZE_Z - 1)->MakeDirty();
}
int Chunk::GetPosX() const { return m_posX; }
int Chunk::GetPosY() const { return m_posY; }
void Chunk::Update(BlockInfo* blockinfo[BTYPE_LAST], World* world) {
float u, v, s;
// Update mesh
@@ -81,45 +81,45 @@ void Chunk::AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType b
int cx = x + m_posX * CHUNK_SIZE_X, cy = z + m_posY * CHUNK_SIZE_Z;
if (y == CHUNK_SIZE_Y - 1 || GetBlock(x, y + 1, z) == BTYPE_AIR) { // y
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .8f, .8f, .8f, u, v);
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .8f, .8f, .8f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .8f, .8f, .8f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, .8f, .8f, .8f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z, .8f, .8f, .8f, u, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, .8f, .8f, .8f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, .8f, .8f, .8f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z, .8f, .8f, .8f, u + s, v);
}
if (y == 0 || GetBlock(x, y - 1, z) == BTYPE_AIR) { // -y
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .8f, .8f, .8f, u, v);
vd[count++] = VertexBuffer::VertexData(x, y, z, .8f, .8f, .8f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, .8f, .8f, .8f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .8f, .8f, .8f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z + 1.f, .8f, .8f, .8f, u, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z, .8f, .8f, .8f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z, .8f, .8f, .8f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z + 1.f, .8f, .8f, .8f, u + s, v);
}
if (cx == INT16_MAX - 1 || world->BlockAt(cx + 1, y, cy) == BTYPE_AIR) { // x
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, .9f, .9f, .9f, u, v);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, .9f, .9f, .9f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .9f, .9f, .9f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .9f, .9f, .9f, u + s, v);
if (world->BlockAt(cx + 1, y, cy) == BTYPE_AIR) { // x
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z, .9f, .9f, .9f, u, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z, .9f, .9f, .9f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, .9f, .9f, .9f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z + 1.f, .9f, .9f, .9f, u + s, v);
}
if (cx == 0 || world->BlockAt(cx - 1, y, cy) == BTYPE_AIR) { // -x
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .9f, .9f, .9f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .9f, .9f, .9f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x, y, z, .9f, .9f, .9f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .9f, .9f, .9f, u, v);
if (world->BlockAt(cx - 1, y, cy) == BTYPE_AIR) { // -x
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, .9f, .9f, .9f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z, .9f, .9f, .9f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z, .9f, .9f, .9f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z + 1.f, .9f, .9f, .9f, u, v);
}
if (cy == INT16_MAX - 1 || world->BlockAt(cx, y, cy + 1) == BTYPE_AIR) { // z
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, 1.f, 1.f, 1.f, u, v);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, 1.f, 1.f, 1.f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, 1.f, 1.f, 1.f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, 1.f, 1.f, 1.f, u, v + s);
if (world->BlockAt(cx, y, cy + 1) == BTYPE_AIR) { // z
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z + 1.f, 1.f, 1.f, 1.f, u, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z + 1.f, 1.f, 1.f, 1.f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, 1.f, 1.f, 1.f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z + 1.f, 1.f, 1.f, 1.f, u, v + s);
}
if (cy == 0 || world->BlockAt(cx, y, cy - 1) == BTYPE_AIR) { // -z
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, 1.f, 1.f, 1.f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, 1.f, 1.f, 1.f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, 1.f, 1.f, 1.f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x, y, z, 1.f, 1.f, 1.f, u, v);
if (world->BlockAt(cx, y, cy - 1) == BTYPE_AIR) { // -z
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y + 1.f, z + m_posY * CHUNK_SIZE_Z, 1.f, 1.f, 1.f, u, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y + 1.f, z + m_posY * CHUNK_SIZE_Z, 1.f, 1.f, 1.f, u + s, v + s);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X + 1.f, y, z + m_posY * CHUNK_SIZE_Z, 1.f, 1.f, 1.f, u + s, v);
vd[count++] = VertexBuffer::VertexData(x + m_posX * CHUNK_SIZE_X, y, z + m_posY * CHUNK_SIZE_Z, 1.f, 1.f, 1.f, u, v);
}
}
@@ -129,3 +129,5 @@ bool Chunk::IsDirty() const { return m_isDirty; }
void Chunk::MakeDirty() { m_isDirty = true; }
void Chunk::MakeModified() { m_isModified = true; }