2023-06-26 05:53:07 +00:00
|
|
|
|
#ifndef MODEL_H
|
|
|
|
|
#define MODEL_H
|
|
|
|
|
|
|
|
|
|
#include "Buffers.h"
|
|
|
|
|
#include "Texture.h"
|
|
|
|
|
#include "Shader.h"
|
|
|
|
|
|
|
|
|
|
#include <GLM/glm.hpp>
|
|
|
|
|
#include <GLM/gtc/quaternion.hpp>
|
|
|
|
|
#include <GLM/gtc/matrix_transform.hpp>
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
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<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
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Материал модели
|
|
|
|
|
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); // Загрузка бикасательных векторов в буфер
|
2023-07-19 17:58:49 +00:00
|
|
|
|
void set_index_range(size_t first_byteOffset, size_t count, size_t type = GL_UNSIGNED_INT); // Ограничение диапазона из буфера индексов
|
2023-06-26 05:53:07 +00:00
|
|
|
|
void set_texture(Texture& texture); // Привязка текстуры к модели
|
2023-07-19 17:58:49 +00:00
|
|
|
|
void setBO(int attribute, BO & bo); // Замена вершинного буфера по номеру его привязки
|
|
|
|
|
void setIndicesBO(BO & data); // Замена индексного буфера
|
|
|
|
|
|
2023-06-26 05:53:07 +00:00
|
|
|
|
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; // Количество вершин
|
2023-07-19 17:58:49 +00:00
|
|
|
|
size_t first_index_byteOffset, indices_count, indices_datatype; // Сдвиг в байтах для первого, количество индексов и тип данных индексов
|
2023-06-26 05:53:07 +00:00
|
|
|
|
Texture texture_albedo; // Текстура альбедо (цвет поверхности)
|
|
|
|
|
Texture texture_roughness; // Текстура шероховатостей
|
|
|
|
|
Texture texture_metallic; // Текстура металличности
|
|
|
|
|
Texture texture_specular; // Текстура интенсивности блика диэлектриков
|
|
|
|
|
Texture texture_emitted; // Текстура излучаемого света
|
|
|
|
|
Texture texture_heights; // Текстура высот
|
|
|
|
|
Texture texture_normals; // Текстура нормалей
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // MODEL_H
|