#pragma once #include "shader.h" #include "../event/event.h" #include "vao.h" #include "vbo.h" #include "../vertex.h" #include "../renderable.h" #include "../transformable.h" #include "material.h" #include #include namespace simpleengine::gfx { /** * @brief A Model is a object that will be shown on the screen by a renderer. * */ class Model : public simpleengine::Event, public simpleengine::Transformable { public: std::optional material; std::vector vertices; std::vector indicies; // Buffer objects gfx::VBO ebo; gfx::VBO vbo; gfx::VAO vao; Model(std::vector vertices, std::vector indicies, Material material); Model(std::vector vertices, std::vector indicies = std::vector(), std::optional material = std::nullopt); Model(Material material, std::string filename); Model(Material material, std::ifstream file_stream); virtual void destroy() override; virtual void update(const float& delta_time) override; glm::vec3 compute_face_normal(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& p3); /** * @brief Calculate the normals of the model. * * @note This **will** overwrite the existing normals. * */ void calculate_normals(); private: void process_vertex(const std::vector& vertex_data, const std::vector& in_textures, const std::vector& in_normals, std::vector& out_indicies, std::vector& out_textures, std::vector& out_normals); }; }