From 21fa4c6d6fd2c97234a3ab9a79b77077daf5f205 Mon Sep 17 00:00:00 2001 From: tovjemam Date: Wed, 6 Aug 2025 20:21:16 +0200 Subject: [PATCH] Mesh loading --- CMakeLists.txt | 7 ++-- src/assets/load_mesh.cpp | 0 src/assets/load_mesh.hpp | 15 --------- src/assets/mesh.cpp | 73 ++++++++++++++++++++++++++++++++++++++++ src/assets/mesh.hpp | 44 ++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 19 deletions(-) delete mode 100644 src/assets/load_mesh.cpp delete mode 100644 src/assets/load_mesh.hpp create mode 100644 src/assets/mesh.cpp create mode 100644 src/assets/mesh.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a15727..ab61e14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.15) project(PortalGame) -# Enable C++17 -set(CMAKE_CXX_STANDARD 17) +# Enable C++20 +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Add src directory @@ -12,8 +12,7 @@ add_executable(PortalGame "src/app.cpp" "src/gl.hpp" "src/utils.hpp" - "src/assets/load_mesh.hpp" - "src/assets/load_mesh.cpp" + "src/assets/mesh.cpp" "src/gfx/buffer_object.cpp" "src/gfx/buffer_object.hpp" "src/gfx/texture.cpp" diff --git a/src/assets/load_mesh.cpp b/src/assets/load_mesh.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/load_mesh.hpp b/src/assets/load_mesh.hpp deleted file mode 100644 index a258cab..0000000 --- a/src/assets/load_mesh.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "gfx/vertex_array.hpp" - -namespace assets -{ - -std::shared_ptr LoadMesh(const std::string& filename); - -} - - diff --git a/src/assets/mesh.cpp b/src/assets/mesh.cpp new file mode 100644 index 0000000..fb0f104 --- /dev/null +++ b/src/assets/mesh.cpp @@ -0,0 +1,73 @@ +#include "mesh.hpp" +#include +#include +#include +#include +#include + +std::shared_ptr assets::Mesh::LoadFromFile(const std::string& filename) +{ + std::ifstream file(filename, std::ios::binary); + + if (!file.is_open()) + { + throw std::runtime_error("Failed to open mesh file: " + filename); + } + + std::vector verts; + std::vector tris; + std::vector materials; + + std::string line; + + while (std::getline(file, line)) + { + if (line.empty() || line[0] == '#') // Skip empty lines and comments + continue; + + std::istringstream iss(line); + + std::string command; + iss >> command; + + if (command == "v") // Vertex + { + MeshVertex& vertex = verts.emplace_back(); + iss >> vertex.pos.x >> vertex.pos.y >> vertex.pos.z; + iss >> vertex.normal.x >> vertex.normal.y >> vertex.normal.z; + iss >> vertex.uv.x >> vertex.uv.y; + iss >> vertex.lightmap_uv.x >> vertex.lightmap_uv.y; + } + else if (command == "m") // Material switch + { + if (materials.size() > 0) + { + MeshMaterialSlot& last_material = materials.back(); + last_material.num_tris = tris.size() - last_material.first_tri; + } + + MeshMaterialSlot& material = materials.emplace_back(); + iss >> material.name; + material.first_tri = tris.size(); + + } + else if (command == "f") // Face + { + MeshTriangle& tri = tris.emplace_back(); + iss >> tri.vert[0] >> tri.vert[1] >> tri.vert[2]; + } + } + + if (materials.size() > 0) + { + MeshMaterialSlot& last_material = materials.back(); + last_material.num_tris = tris.size() - last_material.first_tri; + } + + file.close(); + if (verts.empty() || tris.empty()) + { + throw std::runtime_error("Mesh file is empty or malformed: " + filename); + } + return std::make_shared(verts, tris, materials); +} diff --git a/src/assets/mesh.hpp b/src/assets/mesh.hpp new file mode 100644 index 0000000..2e0c4de --- /dev/null +++ b/src/assets/mesh.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include +#include + +#include "gfx/vertex_array.hpp" +#include "gfx/texture.hpp" + +namespace assets +{ + struct MeshVertex + { + glm::vec3 pos; + glm::vec3 normal; + glm::vec2 uv; + glm::vec2 lightmap_uv; + }; + + struct MeshTriangle + { + uint32_t vert[3]; + }; + + struct MeshMaterialSlot + { + std::string name; + std::shared_ptr texture; + size_t first_tri = 0; + size_t num_tris = 0; + }; + + class Mesh + { + gfx::VertexArray va_; + std::vector materials_; + + public: + Mesh(std::span verts, std::span tris, std::span materials); + + static std::shared_ptr LoadFromFile(const std::string& filename); + }; +}