10/src/Lights.cpp

78 lines
2.8 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.

#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};
}