Push Optimisation mesh. Generation des Chunks à revoir.
This commit is contained in:
		| @@ -110,28 +110,49 @@ 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(unsigned int x, unsigned int z, World* world) { | ||||
| NEIGHBOR_CHUNK_POSITION Chunk::CheckNeighbors(unsigned int x, unsigned int z, World* world) { | ||||
|     unsigned int cx, cy; | ||||
|  | ||||
|     world->GetScope(cx, cy); | ||||
|  | ||||
|     if (x == 0 && m_posX - cx >= 0 && | ||||
|         world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) | ||||
|     if (x == 0 && m_posX - cx >= 0 && world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) { | ||||
|         world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty(); | ||||
|     else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X &&  | ||||
|         world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) | ||||
|         return X_MINUS; | ||||
|     } | ||||
|     else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X && world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) { | ||||
|         world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty(); | ||||
|         return X_PLUS; | ||||
|     } | ||||
|  | ||||
|     if (z == 0 && m_posY - cy >= 0 &&  | ||||
|         world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)) | ||||
|     if (z == 0 && m_posY - cy >= 0 && world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)) { | ||||
|         world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)->MakeDirty(); | ||||
|     else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y && | ||||
|         world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)) | ||||
|         return Z_MINUS; | ||||
|     } | ||||
|     else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y && world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)) { | ||||
|         world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)->MakeDirty(); | ||||
|         return Z_PLUS; | ||||
|     } | ||||
|  | ||||
|     return NONE; | ||||
| } | ||||
|  | ||||
| void Chunk::GetPosition(unsigned int& x, unsigned int& y) const { x = m_posX; y = m_posY; } | ||||
|  | ||||
| void Chunk::AddAllVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int cx, int cy, int x, int y, int z, float u, float v, float s, World* world) { | ||||
|     if (world->BlockAt(cx + 1, y, cy) == BTYPE_AIR) { | ||||
|         AddXPlusVertices(vd, count, bt, x, y, z, u, v, s); | ||||
|     } | ||||
|     if (world->BlockAt(cx - 1, y, cy) == BTYPE_AIR) { | ||||
|         AddXMinusVertices(vd, count, bt, x, y, z, u, v, s); | ||||
|     } | ||||
|     if (world->BlockAt(cx, y, cy + 1) == BTYPE_AIR) { | ||||
|         AddZPlusVertices(vd, count, bt, x, y, z, u, v, s); | ||||
|     } | ||||
|     if (world->BlockAt(cx, y, cy - 1) == BTYPE_AIR) { | ||||
|         AddZMinusVertices(vd, count, bt, x, y, z, u, v, s); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void Chunk::FlushMeshToVBO() { | ||||
|     m_vertexBuffer.SetMeshData(m_vd, m_vcount); | ||||
|     m_vcount = 0; | ||||
| @@ -181,47 +202,66 @@ void Chunk::AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType b | ||||
|  | ||||
|     int cx = x + (m_posX - cex) * CHUNK_SIZE_X, cy = z + (m_posY - cey) * CHUNK_SIZE_Z; | ||||
|  | ||||
|     if (y == CHUNK_SIZE_Y - 1 || GetBlock(x, y + 1, z) == BTYPE_AIR) {                      //  y | ||||
|     bool isOnBorder = (x == 0 || x == CHUNK_SIZE_X - 1 || | ||||
|                        z == 0 || z == CHUNK_SIZE_Z - 1 || | ||||
|                        y == 0 || y == CHUNK_SIZE_Y - 1); | ||||
|  | ||||
|     NEIGHBOR_CHUNK_POSITION ncp = CheckNeighbors(x, z, world); | ||||
|  | ||||
|     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); | ||||
|     } | ||||
|  | ||||
|     if (y == 0 || GetBlock(x, y - 1, z) == BTYPE_AIR) {                                     // -y | ||||
|     if (y == 0 || GetBlock(x, y - 1, z) == BTYPE_AIR) {                                                             // Y- | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .2f, .2f, .2f, u, v); | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y, z, .2f, .2f, .2f, u, v + s); | ||||
|         vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, .2f, .2f, .2f, u + s, v + s); | ||||
|         vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .2f, .2f, .2f, u + s, v); | ||||
|     } | ||||
|  | ||||
|     if (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 (!isOnBorder || (x == CHUNK_SIZE_X - 1 && ncp == X_PLUS) || (x == CHUNK_SIZE_X - 1 && ncp == NONE)) {        // X+ | ||||
|         AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world); | ||||
|     } | ||||
|     else if (!isOnBorder || (x == 0 && ncp == X_MINUS) || (x == 0 && ncp == NONE)) {							    // X- | ||||
|         AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world); | ||||
| 	} | ||||
|     else if (!isOnBorder || (z == CHUNK_SIZE_Z - 1 && ncp == Z_PLUS) || (z == CHUNK_SIZE_Z - 1 && ncp == NONE)) {	// Z+ | ||||
|         AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world); | ||||
| 	} | ||||
|     else if (!isOnBorder || (z == 0 && ncp == Z_MINUS) || (z == 0 && ncp == NONE)) {								// Z- | ||||
|         AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world); | ||||
|     } | ||||
| } | ||||
|  | ||||
|     if (world->BlockAt(cx - 1, y, cy) == BTYPE_AIR) {                                     // -x | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .5f, .5f, .5f, u, v + s); | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .5f, .5f, .5f, u + s, v + s); | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y, z, .5f, .5f, .5f, u + s, v); | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .5f, .5f, .5f, u, v); | ||||
|     } | ||||
| void Chunk::AddXPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) { | ||||
|     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, y, cy + 1) == BTYPE_AIR) {                      //  z | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .4f, .4f, .4f, u, v); | ||||
|         vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .4f, .4f, .4f, u + s, v); | ||||
|         vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .4f, .4f, .4f, u + s, v + s); | ||||
|         vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .4f, .4f, .4f, u, v + s); | ||||
|     } | ||||
| void Chunk::AddXMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) { | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .5f, .5f, .5f, u, v + s); | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .5f, .5f, .5f, u + s, v + s); | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y, z, .5f, .5f, .5f, u + s, v); | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .5f, .5f, .5f, u, v); | ||||
| } | ||||
|  | ||||
|     if (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); | ||||
|     } | ||||
| void Chunk::AddZPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) { | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .4f, .4f, .4f, u, v); | ||||
|     vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .4f, .4f, .4f, u + s, v); | ||||
|     vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .4f, .4f, .4f, u + s, v + s); | ||||
|     vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .4f, .4f, .4f, u, v + s); | ||||
| } | ||||
|  | ||||
| void Chunk::AddZMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) { | ||||
|     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); | ||||
| } | ||||
|  | ||||
| void Chunk::Render() const { m_vertexBuffer.Render(); } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user