87 lines
4.7 KiB
C++
87 lines
4.7 KiB
C++
#ifndef MODEL_H
|
||
#define MODEL_H
|
||
|
||
#include "Buffers.h"
|
||
#include "Texture.h"
|
||
#include "Shader.h"
|
||
|
||
#include <GLM/glm.hpp>
|
||
|
||
#include <vector>
|
||
|
||
#define DEFAULT_MTL_DIR "./"
|
||
class GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory = DEFAULT_MTL_DIR, const char* texture_directory = DEFAULT_MTL_DIR);
|
||
void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* verteces, const glm::vec2* texCords, glm::vec3* tangent, glm::vec3* bitangent);
|
||
|
||
struct Material
|
||
{
|
||
alignas(16) glm::vec3 ka; // коэф. фонового отражения (цвет фонового освещения)
|
||
alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта)
|
||
alignas(16) glm::vec3 ks; // коэф. зеркального блика
|
||
float p; // показатель глянцевости
|
||
// Значения по умолчанию
|
||
Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { };
|
||
};
|
||
|
||
// Класс определяющий положение, вращение и размер объекта
|
||
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(); // Вызов отрисовки без 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); // Загрузка бикасательных векторов в буфер
|
||
void set_texture(Texture& texture); // Привязка текстуры к модели
|
||
void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов
|
||
|
||
bool normalmapped; // Использование карт нормалей
|
||
bool parallaxmapped; // Использование параллакса
|
||
bool displacementmapped; // Использование карт высот для сдвига вершин
|
||
|
||
Material material; // Материал модели
|
||
private:
|
||
VAO vao;
|
||
BO vertex_vbo, index_vbo; // вершинный и индексный буферы
|
||
BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами
|
||
BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами
|
||
size_t verteces_count; // Количество вершин
|
||
size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов
|
||
Texture texture_diffuse; // Диффузная текстура
|
||
Texture texture_ambient; // Текстура фонового освщения
|
||
Texture texture_specular; // Текстура зеркального отражения
|
||
Texture texture_heights; // Текстура высот
|
||
Texture texture_normals; // Текстура нормалей
|
||
};
|
||
|
||
// Класс сгруппированной модели
|
||
class GrouptedModel: public Movable
|
||
{
|
||
public:
|
||
void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
|
||
std::vector<Model> parts;
|
||
|
||
Model& operator[](int index); // Оператор[i] для простого доступа к частям модели
|
||
};
|
||
|
||
#endif // MODEL_H
|