#include "Lights.h" void genShpere(Model& model, float radius, int sectorsCount); // Model.cpp std::vector 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}; }