Классы Bone и Sceleton, доработка Node и Model

This commit is contained in:
2024-02-28 11:00:24 +03:00
parent 2f89354ae8
commit 7af8fbb143
2 changed files with 144 additions and 7 deletions

View File

@@ -1,6 +1,8 @@
#ifndef MODEL_H
#define MODEL_H
#define MAX_BONES 100
#include "Buffers.h"
#include "Texture.h"
#include "Shader.h"
@@ -27,6 +29,7 @@ class Node
void setParent(Node * parent); // Устанавливает родителя для узла
virtual const glm::mat4& getTransformMatrix(); // Возвращает матрицу трансформации модели
virtual const glm::mat4& getIsolatedTransformMatrix(); // Возвращает матрицу трансформации модели без учета родительских
bool isChanged(); // Возвращает необходимость пересчета матрицы трансформации
const glm::vec3& c_position() const; // Константный доступ к позиции
@@ -78,6 +81,23 @@ struct ID
GLuint etc = 0; // Дополнительная информация
};
// Кость скелета
class Bone
{
public:
Bone(Node* node = NULL, const glm::mat4& inverseBindMatrix = glm::mat4(1)); // Конструктор с параметрами по умолчанию
Node* node; // Узел, выступающий костью
glm::mat4 inverseBindMatrix; // Матрица обратного связывания
};
// Скелет
class Skeleton
{
public:
std::vector<Bone*> bones; // Вектор указателей на кости (хранятся в сцене)
void upload(UBO *bones_buffer); // Формирует массив матриц и загружает его в буфер
};
// Класс модели
class Model : public Node
{
@@ -88,7 +108,7 @@ class Model : public Node
virtual ~Model();
void render(); // Вызов отрисовки без uniform-данных
void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
void render(ShaderProgram &shaderProgram, UBO &material_buffer, UBO *bones_buffer = NULL); // Вызов отрисовки
void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер
@@ -96,6 +116,7 @@ class Model : public Node
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 load_bonesData(glm::ivec4* ids, glm::vec4 *weights, GLuint count); // Загрузка индексов и весов костей
void set_index_range(size_t first_byteOffset, size_t count, size_t type = GL_UNSIGNED_INT); // Ограничение диапазона из буфера индексов
void set_texture(Texture& texture); // Привязка текстуры к модели
void setBO(int attribute, BO & bo); // Замена вершинного буфера по номеру его привязки
@@ -103,12 +124,15 @@ class Model : public Node
Material material; // Материал модели
Skeleton* skeleton; // Указатель на скелет
ID id; // ID модели
private:
VAO vao;
BO vertex_vbo, index_vbo; // вершинный и индексный буферы
BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами
BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами
BO bonesIds_vbo, bonesWeights_vbo; // буферы с индексами и весами костей
GLuint verteces_count; // Количество вершин
size_t first_index_byteOffset, indices_count, indices_datatype; // Сдвиг в байтах для первого, количество индексов и тип данных индексов
Texture texture_albedo; // Текстура альбедо (цвет поверхности)