Initial commit: Final state of the master project
This commit is contained in:
71
Research/scene/Scene.h
Normal file
71
Research/scene/Scene.h
Normal file
@@ -0,0 +1,71 @@
|
||||
#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();
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user