#include "World.h" #include const int VERTEX_SIZE = 6; const float topFace[24] = { // x, y, z, nx, ny, nz -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f }; const float bottomFace[24] = { -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f }; const float rightFace[24] = { 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f }; const float leftFace[24] = { -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f }; const float frontFace[24] = { -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f }; const float backFace[24] = { -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f }; void addFace(glm::ivec3 pos, const float *faceVertices, std::vector &vbo, std::vector &ebo) { unsigned int vIndex = vbo.size() / VERTEX_SIZE; for (int i = 0; i < 4; i++) { const float* v = &faceVertices[i * VERTEX_SIZE]; vbo.push_back(v[0] + pos.x); vbo.push_back(v[1] + pos.y); vbo.push_back(v[2] + pos.z); vbo.push_back(v[3]); vbo.push_back(v[4]); vbo.push_back(v[5]); } ebo.push_back(vIndex + 0); ebo.push_back(vIndex + 1); ebo.push_back(vIndex + 2); ebo.push_back(vIndex + 0); ebo.push_back(vIndex + 2); ebo.push_back(vIndex + 3); } World::World() { m_mesh.init(); } Mesh& World::getMesh() { return m_mesh; } void World::generateMesh() { std::vector vboData; std::vector eboData; for (const glm::ivec3 pos : voxels) { if (voxels.count(pos + glm::ivec3(0, 1, 0)) == 0) { addFace(pos, topFace, vboData, eboData); } if (voxels.count(pos + glm::ivec3(0, -1, 0)) == 0) { addFace(pos, bottomFace, vboData, eboData); } if (voxels.count(pos + glm::ivec3(1, 0, 0)) == 0) { addFace(pos, rightFace, vboData, eboData); } if (voxels.count(pos + glm::ivec3(-1, 0, 0)) == 0) { addFace(pos, leftFace, vboData, eboData); } if (voxels.count(pos + glm::ivec3(0, 0, 1)) == 0) { addFace(pos, frontFace, vboData, eboData); } if (voxels.count(pos + glm::ivec3(0, 0, -1)) == 0) { addFace(pos, backFace, vboData, eboData); } } // Now, upload this data to our mesh object m_mesh.uploadData(vboData, eboData); }