voxel-engine/src/World.cpp
2025-11-10 23:39:58 -06:00

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);
}