18/include/Lights.h
2023-06-20 16:09:10 +03:00

74 lines
3.3 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 LIGHTS_H
#define LIGHTS_H
#include <GLM/glm.hpp>
#include <vector>
#include "Model.h"
#include "Camera.h"
// Максимальное число источников света
#define MAX_LIGHTS 64
// Максимальное число образцов для SSAO
#define MAX_SSAO 64
class Bulb
{
public:
Bulb(const glm::vec3 &pos = glm::vec3(0.0f, 0.0f, 0.0f), const glm::vec3 &color = glm::vec3(0.0f, 0.0f, 0.0f), float radius = 10.0f, float angle = 180, const glm::vec3 &direction = glm::vec3(0,0,1)); // Конструктор с координатами, цветом, радиусом и направлением
void setRadius(float radius); // Задание радиуса и расчет коэф. угасания
void recalc_pov(); // Пересчитывает матрицы проекции и трансформации в пространство источника
alignas(16) glm::vec3 position; // Позиция
alignas(16) glm::vec3 color; // Цвет
float angle; // Угол освещенности
alignas(16) glm::vec3 direction; // Направление для прожектора
private:
float radius; // Радиус действия источника
alignas(16) glm::vec2 K; // линейный и квадратичный компоненты затухания
alignas(16) glm::mat4 vp[6]; // Матрицы проекции и трансформации в пространство источника
friend class BulbDebug;
};
// Класс лампочки (точечный источник с возможностью отладочного вывода)
class BulbDebug : public I_Movable
{
public:
BulbDebug(Bulb* ref = NULL); // Конструктор с привязкой к источнику
void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Отрисовка отладочной лампы и сферы
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(); // Получить позицию объекта
Bulb* data;
private:
static GrouptedModel bulb_model;
};
// Класс направленного источника освещения
class Sun
{
public:
Sun(const glm::vec3 &direction = glm::vec3(0.0f, 1.0f, 0.0f), const glm::vec3 &color = glm::vec3(0.4f, 0.4f, 0.4f));
alignas(16) glm::vec3 direction; // Направление лучей на источник
alignas(16) glm::vec3 color; // Цвет
void upload(ShaderProgram &shaderProgram); // Загрузка данных об источнике на шейдер
void pov(ShaderProgram &shaderProgram, Camera camera); // Загружает матрицу проекции и трансформации в пространство источника
};
// Данные для SSAO
struct SSAO_data
{
float radius = 0.05f;
float bias = 0.025f;
int size = MAX_SSAO;
alignas(16) glm::vec2 scale;
glm::vec3 samples[MAX_SSAO];
};
#endif // LIGHTS_H