78 lines
2.8 KiB
C++
78 lines
2.8 KiB
C++
#include "Lights.h"
|
||
|
||
void genShpere(Model& model, float radius, int sectorsCount); // Model.cpp
|
||
|
||
std::vector<Model> Bulb::bulb_model; // Статическое поле для модели лампочки
|
||
|
||
// Конструктор с координатами, цветом и радиусом
|
||
Bulb::Bulb(const glm::vec3 &pos, const glm::vec3 &c, float r, float a, const glm::vec3 &dir)
|
||
{
|
||
// Если отладочная модель не загружена - загрузим
|
||
if (!bulb_model.size())
|
||
{
|
||
// Загрузка модели лампочки
|
||
loadOBJtoVector("../resources/models/bulb.obj", bulb_model, "../resources/models/", "../resources/textures/");
|
||
|
||
Model sphere;
|
||
// Сгенерируем и загрузим меш сферы
|
||
genShpere(sphere, 1, 16);
|
||
// Зададим размеры сферы
|
||
sphere.scale = {r, r, r};
|
||
bulb_model.insert(bulb_model.begin(), sphere);
|
||
}
|
||
|
||
// Сохраним данные о параметрах источника:
|
||
position = pos;
|
||
color = c;
|
||
radius = r;
|
||
K[0] = 4.5/radius;
|
||
K[1] = 4 * K[0] * K[0];
|
||
angle = a;
|
||
direction = dir;
|
||
}
|
||
|
||
// Отрисовка отладочной лампы и сферы
|
||
void Bulb::render(ShaderProgram &shaderProgram, UBO &material_buffer)
|
||
{
|
||
// Расположение uniform-переменных
|
||
GLuint model_uniform = shaderProgram.getUniformLoc("model");
|
||
GLuint angle_uniform = shaderProgram.getUniformLoc("angle");
|
||
GLuint direction_uniform = shaderProgram.getUniformLoc("direction");
|
||
|
||
// Загрузим направление
|
||
glUniform3fv(direction_uniform, 1, &direction[0]);
|
||
// Угол для лампочки = 180 (рисуем целую модель)
|
||
glUniform1f(angle_uniform, 180);
|
||
|
||
// Зададим цвет для колбы
|
||
bulb_model[1].material.ka = color;
|
||
// Рисуем лампочку
|
||
for (int i = 1; i < bulb_model.size(); i++)
|
||
{
|
||
bulb_model[i].position = position;
|
||
bulb_model[i].render(shaderProgram, material_buffer);
|
||
}
|
||
|
||
// Зададим параметры сферы
|
||
bulb_model[0].material.ka = color;
|
||
bulb_model[0].position = position;
|
||
|
||
// Угол для сферы (рисуем направленный конус)
|
||
glUniform1f(angle_uniform, angle);
|
||
// Рисование сферы покрытия источника в режиме линий
|
||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||
bulb_model[0].render(shaderProgram, material_buffer);
|
||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||
}
|
||
|
||
// Задание радиуса и расчет коэф. угасания
|
||
void Bulb::setRadius(float r)
|
||
{
|
||
radius = r;
|
||
K[0] = 4.5/radius;
|
||
K[1] = 4 * K[0] * K[0];
|
||
|
||
// Зададим размеры сферы
|
||
bulb_model[0].scale = {r, r, r};
|
||
}
|