99 lines
3.0 KiB
C++
99 lines
3.0 KiB
C++
#include "World.h"
|
|
#include <vector>
|
|
|
|
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<float> &vbo, std::vector<unsigned int> &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<float> vboData;
|
|
std::vector<unsigned int> 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);
|
|
}
|