76 lines
4.2 KiB
C++
76 lines
4.2 KiB
C++
#ifndef MODEL_H
|
||
#define MODEL_H
|
||
|
||
#include "Buffers.h"
|
||
|
||
#include <GLM/glm.hpp>
|
||
#include <GLM/gtc/quaternion.hpp>
|
||
#include <GLM/gtc/matrix_transform.hpp>
|
||
|
||
#include <vector>
|
||
|
||
// Класс узла сцены
|
||
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<Node*>& getChildren() const; // Возвращает ссылку на вектор дочерних узлов
|
||
|
||
protected:
|
||
Node *parent; // Родительский узел
|
||
std::vector<Node*> 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
|
||
};
|
||
|
||
// Класс модели
|
||
class Model : public Node
|
||
{
|
||
public:
|
||
Model(Node *parent = NULL); // Конструктор по умолчанию
|
||
Model(const Model& copy); // Конструктор копирования
|
||
Model& operator=(const Model& other); // Оператор присваивания
|
||
virtual ~Model();
|
||
|
||
void render(const GLuint &model_uniform); // Вызов отрисовки
|
||
|
||
void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
|
||
void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер
|
||
void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов
|
||
|
||
private:
|
||
VAO vao;
|
||
BO vertex_vbo, index_vbo; // вершинный и индексный буферы
|
||
GLuint verteces_count; // Количество вершин
|
||
size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов
|
||
};
|
||
|
||
#endif // MODEL_H
|