#ifndef MODEL_H #define MODEL_H #include "Buffers.h" #include "Texture.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); struct Material { alignas(16) glm::vec3 ka; // коэф. фонового отражения (цвет фонового освещения) alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта) alignas(16) glm::vec3 ks; // коэф. зеркального блика float p; // показатель глянцевости // Значения по умолчанию Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { }; }; // Класс определяющий положение, вращение и размер объекта class Movable { public: Movable(); // Конструктор без параметров Movable(const Movable& copy); // Конструктор копирования 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(const GLuint &model_uniform, 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 set_texture(Texture& texture); // Привязка текстуры к модели void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов Material material; // Материал модели private: VAO vao; BO vertex_vbo, index_vbo; // вершинный и индексный буферы BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами GLuint verteces_count; // Количество вершин GLuint first_index, indices_count; // Первый и количество индексов Texture texture_diffuse; // Диффузная текстура Texture texture_ambient; // Текстура фонового освщения Texture texture_specular; // Текстура зеркального отражения }; // Класс сгруппированной модели class GrouptedModel: public Movable { public: void render(const GLuint &model_uniform, UBO &material_buffer); // Вызов отрисовки std::vector parts; }; #endif // MODEL_H