diff --git a/include/Model.h b/include/Model.h index 9dc1688..52ed279 100644 --- a/include/Model.h +++ b/include/Model.h @@ -11,13 +11,27 @@ #define DEFAULT_MTL_DIR "./" void loadOBJtoVector(const char* filename, std::vector& scene, const char* mtl_directory = DEFAULT_MTL_DIR, const char* texture_directory = DEFAULT_MTL_DIR); -class Model +// Класс определяющий положение, вращение и размер объекта +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 &mvp_uniform); // Вызов отрисовки + void render(const GLuint &mvp_uniform, 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); // Загрузка текстурных координат в буфер @@ -25,11 +39,6 @@ class Model void set_texture(Texture& texture); // Привязка текстуры к модели void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов - glm::vec3 position; // позиция модели - glm::vec3 rotation; // поворот модели - glm::vec3 scale; // мастабирование модели - glm::mat4 getTransformMatrix(); // Матрица трансформации модели - private: VAO *vao; VBO *vertex_vbo, *index_vbo; // вершинный и индексный @@ -39,4 +48,12 @@ class Model Texture texture_diffuse; // Диффузная текстура }; +// Класс сгруппированной модели +class GrouptedModel: public Movable +{ + public: + void render(const GLuint &mvp_uniform); // Вызов отрисовки + std::vector parts; +}; + #endif // MODEL_H diff --git a/src/Model.cpp b/src/Model.cpp index a602146..ead8b7b 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -8,11 +8,15 @@ extern Camera camera; // Словарь для хранения количества моделей, использующих общие VAO std::map vaos_count; +// Конструктор без параметров +Movable::Movable() : position(0), rotation(0), scale(1) {} +// Конструктор копирования +Movable::Movable(const Movable& copy) : position(copy.position), rotation(copy.rotation), scale(copy.scale) {} + // Конструктор без параметров Model::Model() : verteces_count(0), first_index(0), indices_count(0), -vertex_vbo(0), index_vbo(0), normals_vbo(0), texCoords_vbo(0), -position(0), rotation(0), scale(1) +vertex_vbo(0), index_vbo(0), normals_vbo(0), texCoords_vbo(0) { // Создаем новый буфер vao = new VAO(); @@ -25,8 +29,7 @@ Model::Model(const Model& copy) : vao(copy.vao), verteces_count(copy.verteces_count), first_index(copy.first_index), indices_count(copy.indices_count), vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals_vbo), texCoords_vbo(copy.texCoords_vbo), -texture_diffuse(copy.texture_diffuse), -position(copy.position), rotation(copy.rotation), scale(copy.scale) +texture_diffuse(copy.texture_diffuse) { // Если создается копия модели, то запоминаем поля и инкрементируем словарь с количеством vaos_count[vao->get_handler()]++; @@ -50,10 +53,10 @@ Model::~Model() } // Вызов отрисовки -void Model::render(const GLuint &mvp_uniform) +void Model::render(const GLuint &mvp_uniform, const glm::mat4& global_tranform) { // Расчитаем матрицу трансформации - glm::mat4 mvp = camera.getVP() * this->getTransformMatrix(); + glm::mat4 mvp = camera.getVP() * global_tranform * this->getTransformMatrix(); glUniformMatrix4fv(mvp_uniform, 1, GL_FALSE, &mvp[0][0]); // Подключаем текстуры @@ -187,7 +190,7 @@ void Model::load_normals(glm::vec3* normals, GLuint count) #include // Матрица трансформации модели -glm::mat4 Model::getTransformMatrix() +glm::mat4 Movable::getTransformMatrix() { glm::mat4 transformMatrix = glm::mat4(1.0f); // Перемещение модели @@ -339,3 +342,11 @@ void loadOBJtoVector(const char* filename, std::vector& scene, const char s->set_texture(diffuse); } } + +// Вызов отрисовки групповой модели +void GrouptedModel::render(const GLuint &mvp_uniform) +{ + glm::mat4 transform = this->getTransformMatrix(); + for (auto& model : parts) + model.render(mvp_uniform, transform); +}