Files
CDAG/Research/scene/Scene.h

72 lines
2.8 KiB
C++

#pragma once
#include<vector>
#include "../inc/glm/glm.hpp"
struct Mesh {
unsigned offset; // offset of mesh in indices
unsigned size; // number of vertices in mesh
bool hasUVs = false;
bool hasVertexColors = false;
float reflectivity = 0.f;
std::string texture;
};
struct Scene {
std::vector<unsigned> indices; // triangle has three indices pointing to correct vertex
std::vector<glm::vec3> vertices; // vertex positions
std::vector<glm::vec2> uvs; // vertex texture coordinates
std::vector<glm::vec3> normals; // vertex normals
std::vector<glm::vec3> colors; // vertex colors (used for example in .ply files)
std::vector<Mesh> meshes;
static Scene* merge(const Scene& scene1, const Scene& scene2)
{
// Simple merge: append the vertices of the second scene to that of the first scene
Scene* merged = new Scene;
merged->indices.resize(scene1.indices.size() + scene2.indices.size());
std::copy(scene1.indices.begin(), scene1.indices.end(), merged->indices.begin());
std::copy(scene2.indices.begin(), scene2.indices.end(), merged->indices.begin() + scene1.indices.size());
merged->vertices.resize(scene1.vertices.size() + scene2.vertices.size());
std::copy(scene1.vertices.begin(), scene1.vertices.end(), merged->vertices.begin());
std::copy(scene2.vertices.begin(), scene2.vertices.end(), merged->vertices.begin() + scene1.vertices.size());
if (!scene1.uvs.empty())
merged->uvs.resize(scene1.uvs.size() + scene2.uvs.size());
std::copy(scene1.uvs.begin(), scene1.uvs.end(), merged->uvs.begin());
std::copy(scene2.uvs.begin(), scene2.uvs.end(), merged->uvs.begin() + scene1.uvs.size());
merged->normals.resize(scene1.normals.size() + scene2.normals.size());
std::copy(scene1.normals.begin(), scene1.normals.end(), merged->normals.begin());
std::copy(scene2.normals.begin(), scene2.normals.end(), merged->normals.begin() + scene1.normals.size());
// If one of the scene has colors, load the colors for both scenes
if (!scene1.colors.empty() || !scene2.colors.empty())
{
merged->colors.resize(scene1.vertices.size() + scene2.vertices.size(), glm::vec3(1));
if (!scene1.colors.empty()) std::copy(scene1.colors.begin(), scene1.colors.end(), merged->colors.begin());
if (!scene2.colors.empty()) std::copy(scene2.colors.begin(), scene2.colors.end(), merged->colors.begin() + scene1.vertices.size());
}
merged->meshes.resize(scene1.meshes.size() + scene2.meshes.size());
for (unsigned i = 0; i < (unsigned)scene1.meshes.size(); i++)
merged->meshes[i] = scene1.meshes[i];
for (unsigned i = 0; i < (unsigned)scene2.meshes.size(); i++) {
merged->meshes[i + scene1.meshes.size()] = scene2.meshes[i];
merged->meshes[i + scene1.meshes.size()].offset += (unsigned)scene1.indices.size();
}
return merged;
}
~Scene()
{
vertices.clear();
uvs.clear();
normals.clear();
colors.clear();
indices.clear();
meshes.clear();
}
};