#ifndef MODEL_H #define MODEL_H #include "Buffers.h" #include "Texture.h" #include "Shader.h" #include #include #define DEFAULT_MTL_DIR "./" class GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory = DEFAULT_MTL_DIR, const char* texture_directory = DEFAULT_MTL_DIR); void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* verteces, const glm::vec2* texCords, glm::vec3* tangent, glm::vec3* bitangent); struct Material { alignas(16) glm::vec3 base_color; // Базовый цвет материала float roughness; // Шероховатость поверхности float metallic; // Металличность поверхности float specular; // Интенсивность блика диэлектриков alignas(16) glm::vec3 emitted; // Излучаемый поверхностью свет // Значения по умолчанию Material() : base_color(0.8f), roughness(0.5f), metallic(0.0f), specular(0.5f), emitted(0.0f) { }; }; // Идентификатор модели struct ID { GLuint64 value = 0; // Идентификатор GLuint etc = 0; // Дополнительная информация }; class I_Movable { public: virtual void dPosition(const glm::vec3& dvec) = 0; // Сдвинуть объект на dvec virtual void dRotation(const glm::vec3& dvec) = 0; // Повернуть объект на dvec virtual void dScale(const glm::vec3& dvec) = 0; // Увеличить объект на dvec virtual const glm::vec3 getPos() = 0; // Получить позицию объекта }; // Класс определяющий положение, вращение и размер объекта class Movable : I_Movable { public: Movable(); // Конструктор без параметров Movable(const Movable& copy); // Конструктор копирования virtual void dPosition(const glm::vec3& dvec); // Сдвинуть объект на dvec virtual void dRotation(const glm::vec3& dvec); // Повернуть объект на dvec virtual void dScale(const glm::vec3& dvec); // Увеличить объект на dvec virtual const glm::vec3 getPos(); // Получить позицию объекта glm::vec3 position; // позиция модели glm::vec3 rotation; // поворот модели glm::vec3 scale; // масштабирование модели glm::mat4 getTransformMatrix(); // Матрица трансформации модели }; // Класс модели с примененным материалом class Model : public Movable { public: Model(); // Конструктор без параметров Model(const Model& copy); // Конструктор копирования ~Model(); void render(); // Вызов отрисовки без uniform-даных void render(ShaderProgram &shaderProgram, UBO &material_buffer, const glm::mat4& global_tranform = glm::mat4(1)); // Вызов отрисовки void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер void load_normals(glm::vec3* normals, GLuint count); // Загрузка нормалей в void load_tangent(glm::vec3* tangent, GLuint count); // Загрузка касательных векторов в буфер void load_bitangent(glm::vec3* bitangent, GLuint count); // Загрузка бикасательных векторов в буфер void set_texture(Texture& texture); // Привязка текстуры к модели void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов bool normalmapped; // Использование карт нормалей bool parallaxmapped; // Использование параллакса bool displacementmapped; // Использование карт высот для сдвига вершин ID id; // ID модели Material material; // Материал модели private: VAO *vao; BO *vertex_vbo, *index_vbo; // вершинный и индексный BO *normals_vbo, *texCoords_vbo; // буферы с нормалями и текстурными координатами BO *tangent_vbo, *bitangent_vbo; // буферы с касательными и бикасательными векторами GLuint verteces_count; // Количество вершин GLuint first_index, indices_count; // Первый и количество индексов Texture texture_albedo; // Текстура альбедо (цвет поверхности) Texture texture_roughness; // Текстура шероховатостей Texture texture_metallic; // Текстура металличности Texture texture_specular; // Текстура интенсивности блика диэлектриков Texture texture_emitted; // Текстура излучаемого света Texture texture_heights; // Текстура высот Texture texture_normals; // Текстура нормалей }; // Класс сгруппированной модели class GrouptedModel: public Movable { public: void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки void set_group_id(GLuint64 id, GLuint etc = 0); // Изменение флага записи идентификатора для всех моделей std::vector parts; }; #endif // MODEL_H