#ifndef MODEL_H #define MODEL_H #include "Buffers.h" #include "Texture.h" #include "Shader.h" #include #include #include #include class Model genShpere(float radius, int sectorsCount, class Node* parent = NULL); // Генерирует сферу заданного радиуса с определенным количеством сегментов void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* verteces, const glm::vec2* texCords, glm::vec3* tangent, glm::vec3* bitangent); // Расчет касательных и бикасательных векторов // Класс узла сцены class Node { public: Node(Node* parent = NULL); // Конструктор с заданным родителем (по умолчанию NULL) Node(const Node& copy); // Конструктор копирования Node& operator=(const Node& other); // Оператор присваивания virtual ~Node(); void setParent(Node * parent); // Устанавливает родителя для узла virtual const glm::mat4& getTransformMatrix(); // Возвращает матрицу трансформации модели bool isChanged(); // Возвращает необходимость пересчета матрицы трансформации const glm::vec3& c_position() const; // Константный доступ к позиции const glm::quat& c_rotation() const; // Константный доступ к повороту const glm::vec3& c_scale() const; // Константный доступ к масштабированию virtual glm::vec3& e_position(); // Неконстантная ссылка для изменений позиции virtual glm::quat& e_rotation(); // Неконстантная ссылка для изменений поворота virtual glm::vec3& e_scale(); // Неконстантная ссылка для изменений масштабирования Node* getParent(); // Возвращает указатель на родителя const std::vector& getChildren() const; // Возвращает ссылку на вектор дочерних узлов protected: Node *parent; // Родительский узел std::vector children; // Узлы-потомки !Не должны указывать на NULL! glm::vec3 position; // позиция модели glm::quat rotation; // поворот модели glm::vec3 scale; // масштабирование модели bool changed; // Флаг необходимости пересчета матрицы трансформации glm::mat4 transform; // Матрица трансформации модели bool parent_changed; // Флаг изменений у родителя - необходимость пересчета итоговой трансформации glm::mat4 result_transform; // Итоговая трансформация с учетом родительской virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed void invalidateParent(); // Проход потомков в глубину с изменением флага parent_changed }; // Материал модели struct Material { alignas(16) glm::vec3 base_color; // Базовый цвет материала float roughness; // Шероховатость поверхности float metallic; // Металличность поверхности float specular; // Интенсивность блика диэлектриков alignas(16) glm::vec3 emitted; // Излучаемый поверхностью свет int normalmapped; // Использование карт нормалей int parallaxmapped; // Использование параллакса int displacementmapped; // Использование карт высот для сдвига вершин // Значения по умолчанию Material() : base_color(0.8f), roughness(0.5f), metallic(0.0f), specular(0.5f), emitted(0.0f), normalmapped(false), parallaxmapped(false), displacementmapped(false) { }; }; // Идентификатор модели struct ID { GLuint64 value = 0; // Идентификатор GLuint etc = 0; // Дополнительная информация }; // Класс модели class Model : public Node { public: Model(Node *parent = NULL); // Конструктор по умолчанию Model(const Model& copy); // Конструктор копирования Model& operator=(const Model& other); // Оператор присваивания virtual ~Model(); void render(); // Вызов отрисовки без uniform-данных void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки 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_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов void set_texture(Texture& texture); // Привязка текстуры к модели Material material; // Материал модели ID id; // ID модели private: VAO vao; BO vertex_vbo, index_vbo; // вершинный и индексный буферы BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами GLuint verteces_count; // Количество вершин size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов Texture texture_albedo; // Текстура альбедо (цвет поверхности) Texture texture_roughness; // Текстура шероховатостей Texture texture_metallic; // Текстура металличности Texture texture_specular; // Текстура интенсивности блика диэлектриков Texture texture_emitted; // Текстура излучаемого света Texture texture_heights; // Текстура высот Texture texture_normals; // Текстура нормалей }; #endif // MODEL_H