18/include/Model.h

112 lines
6.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 base_color; // Базовый цвет материала
float roughness; // Шероховатость поверхности
float metallic; // Металличность поверхности
float specular; // Интенсивность блика диэлектриков
alignas(16) glm::vec3 emitted; // Излучаемый поверхностью свет
// Значения по умолчанию
Material() : base_color(0.8f), roughness(0.5f), metallic(0.0f), specular(0.5f), emitted(0.0f) { };
};
// Идентификатор модели
struct ID
{
GLuint64 value = 0; // Идентификатор
GLuint etc = 0; // Дополнительная информация
};
class I_Movable
{
public:
virtual void dPosition(const glm::vec3& dvec) = 0; // Сдвинуть объект на dvec
virtual void dRotation(const glm::vec3& dvec) = 0; // Повернуть объект на dvec
virtual void dScale(const glm::vec3& dvec) = 0; // Увеличить объект на dvec
virtual const glm::vec3 getPos() = 0; // Получить позицию объекта
};
// Класс определяющий положение, вращение и размер объекта
class Movable : I_Movable
{
public:
Movable(); // Конструктор без параметров
Movable(const Movable& copy); // Конструктор копирования
virtual void dPosition(const glm::vec3& dvec); // Сдвинуть объект на dvec
virtual void dRotation(const glm::vec3& dvec); // Повернуть объект на dvec
virtual void dScale(const glm::vec3& dvec); // Увеличить объект на dvec
virtual const glm::vec3 getPos(); // Получить позицию объекта
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, const glm::mat4& global_tranform = glm::mat4(1)); // Вызов отрисовки
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(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов
bool normalmapped; // Использование карт нормалей
bool parallaxmapped; // Использование параллакса
bool displacementmapped; // Использование карт высот для сдвига вершин
ID id; // ID модели
Material material; // Материал модели
private:
VAO *vao;
BO *vertex_vbo, *index_vbo; // вершинный и индексный
BO *normals_vbo, *texCoords_vbo; // буферы с нормалями и текстурными координатами
BO *tangent_vbo, *bitangent_vbo; // буферы с касательными и бикасательными векторами
GLuint verteces_count; // Количество вершин
GLuint first_index, indices_count; // Первый и количество индексов
Texture texture_albedo; // Текстура альбедо (цвет поверхности)
Texture texture_roughness; // Текстура шероховатостей
Texture texture_metallic; // Текстура металличности
Texture texture_specular; // Текстура интенсивности блика диэлектриков
Texture texture_emitted; // Текстура излучаемого света
Texture texture_heights; // Текстура высот
Texture texture_normals; // Текстура нормалей
};
// Класс сгруппированной модели
class GrouptedModel: public Movable
{
public:
void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
void set_group_id(GLuint64 id, GLuint etc = 0); // Изменение флага записи идентификатора для всех моделей
std::vector<Model> parts;
};
#endif // MODEL_H