Классы Bone и Sceleton, доработка Node и Model
This commit is contained in:
@@ -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; // Текстура альбедо (цвет поверхности)
|
||||
|
||||
Reference in New Issue
Block a user