72 lines
2.8 KiB
C++
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();
|
|
}
|
|
};
|
|
|