2022-12-20 11:44:38 +00:00
|
|
|
|
#ifndef LIGHTS_H
|
|
|
|
|
#define LIGHTS_H
|
|
|
|
|
|
|
|
|
|
#include <GLM/glm.hpp>
|
|
|
|
|
|
2023-10-24 13:02:29 +00:00
|
|
|
|
#include "Model.h"
|
2023-10-19 13:15:03 +00:00
|
|
|
|
|
|
|
|
|
// Максимальное число источников света
|
|
|
|
|
#define MAX_LIGHTS 300
|
|
|
|
|
|
2022-12-20 11:44:38 +00:00
|
|
|
|
// Точечный источник света
|
|
|
|
|
struct LightData
|
|
|
|
|
{
|
|
|
|
|
alignas(16) glm::vec3 position; // Позиция
|
|
|
|
|
alignas(16) glm::vec3 color; // Цвет
|
2023-10-24 16:21:50 +00:00
|
|
|
|
alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания
|
2022-12-20 11:44:38 +00:00
|
|
|
|
};
|
|
|
|
|
|
2023-10-19 13:15:03 +00:00
|
|
|
|
// Источник света
|
2023-10-24 13:02:29 +00:00
|
|
|
|
class Light : public Node
|
2023-10-19 13:15:03 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
static int getUBOsize(); // Возвращает размер буфера в байтах
|
|
|
|
|
static void upload(UBO& lights_data); // Загрузка данных в буфер
|
|
|
|
|
|
2023-10-24 14:14:52 +00:00
|
|
|
|
static Light& getNew(); // Возвращает ссылку на новый источник света
|
|
|
|
|
void destroy(); // Уничтожает источник света
|
|
|
|
|
|
2023-10-24 13:02:29 +00:00
|
|
|
|
const glm::vec3& c_color() const; // Константный доступ к цвету
|
|
|
|
|
glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета
|
2023-10-24 14:59:46 +00:00
|
|
|
|
|
2023-10-24 15:51:04 +00:00
|
|
|
|
const float& c_radius() const; // Константный доступ к радиусу
|
|
|
|
|
float& e_radius(); // Неконстантная ссылка для изменений радиуса
|
|
|
|
|
|
2023-10-24 14:59:46 +00:00
|
|
|
|
static void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Рисование отладочных лампочек
|
2023-10-24 13:02:29 +00:00
|
|
|
|
private:
|
2023-10-24 14:14:52 +00:00
|
|
|
|
Light(); // Конструктор без параметров
|
|
|
|
|
Light(const Light& copy) = delete; // Конструктор копирования ОТКЛЮЧЕН
|
|
|
|
|
Light& operator=(const Light& other); // Оператор присваивания
|
|
|
|
|
virtual ~Light();
|
|
|
|
|
|
2023-10-24 13:02:29 +00:00
|
|
|
|
glm::vec3 color; // Цвет
|
2023-10-24 15:51:04 +00:00
|
|
|
|
float radius; // Радиус действия источника
|
2023-10-24 13:02:29 +00:00
|
|
|
|
|
|
|
|
|
int index; // Индекс в массиве отправки (может не совпадать с lights) для дефрагментированного доступа
|
2023-10-24 14:14:52 +00:00
|
|
|
|
static Light& findByIndex(GLuint index); // Возвращает ссылку на источник с нужным индексом
|
2023-10-24 13:02:29 +00:00
|
|
|
|
|
|
|
|
|
bool uploadReq; // Необходимость загрузки в следствии изменений
|
|
|
|
|
void check_id(); // Проверка что не взаимодествуем с пустым источником
|
|
|
|
|
void toData(); // Преобразует информацию об источнике в структуру LightData
|
|
|
|
|
|
|
|
|
|
virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
|
|
|
|
|
|
2023-10-19 13:15:03 +00:00
|
|
|
|
static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
|
|
|
|
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
|
2023-10-24 14:14:52 +00:00
|
|
|
|
static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
2023-10-19 13:15:03 +00:00
|
|
|
|
};
|
|
|
|
|
|
2022-12-20 11:44:38 +00:00
|
|
|
|
#endif // LIGHTS_H
|