#pragma once #include #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 indices; // triangle has three indices pointing to correct vertex std::vector vertices; // vertex positions std::vector uvs; // vertex texture coordinates std::vector normals; // vertex normals std::vector colors; // vertex colors (used for example in .ply files) std::vector 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(); } };