#include"lightCaster.h" ShaderProgram* lastShader = NULL; queue available = queue(); Illuminant::Illuminant(){ Logger::debug("We do not recommend to construct illuminant without parameter"); } // white color by default Illuminant::Illuminant(glm::vec3 position, LightType lightType){ _position = position; setType(lightType); } // set up with one color Illuminant::Illuminant(glm::vec3 position, glm::vec3 color, LightType lightType){ _position = position; _ambient = color * 0.05f; _diffuse = color * 0.8f; _specular = color; setType(lightType); } //set up by assign all colors Illuminant::Illuminant(glm::vec3 position, glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular, LightType lightType){ _position = position; _ambient = ambient; _diffuse = diffuse; _specular = specular; setType(lightType); } // set up with one color,建议平行光源使用这个 Illuminant::Illuminant(LightType lightType, glm::vec3 direction, glm::vec3 color) { _direction = direction; _ambient = color * 0.05f; _diffuse = color * 0.8f; _specular = color; setType(lightType); } // set up with one color,建议聚光灯光源使用这个 Illuminant::Illuminant(glm::vec3 position, glm::vec3 direction, glm::vec3 color, LightType lightType) { _direction = direction; _position = position; _ambient = color * 0.05f; _diffuse = color * 0.8f; _specular = color; setType(lightType); } Illuminant::~Illuminant() { switchOff(); if (_lightType == point) { available.push(this->pointID); } } void Illuminant::setAttenuation(float constant, float linear, float quadratic){ _constant = constant; _linear = linear; _quadratic = quadratic; } glm::vec3 Illuminant::direction(){ return _direction; } glm::vec3 Illuminant::position(){ return _position; } glm::vec3 Illuminant::ambient(){ return _ambient; } glm::vec3 Illuminant::diffuse(){ return _diffuse; } glm::vec3 Illuminant::specular(){ return _specular; } Illuminant::LightType Illuminant::type(){ return _lightType; } void Illuminant::move(glm::vec3 deltaPos){ _position += deltaPos; } void Illuminant::setPosition(glm::vec3 Pos){ _position = Pos; } void Illuminant::setColor(glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular){ _ambient = ambient; _diffuse = diffuse; _specular = specular; } // 使用默认的分配系数 void Illuminant::setColor(glm::vec3 color){ _ambient = color * 0.05f; _diffuse = color * 0.8f; _specular = color; } void Illuminant::setDirection(glm::vec3 direction) { _direction = direction; } void Illuminant::setType(LightType type){ if (available.size() == 0 and type == point) { Logger::error("Point light number exceed!\n"); return; } _lightType = type; if (type == point) { pointID = available.front(); available.pop(); } } void Illuminant::updateLight(ShaderProgram& shader) { if (_lightType == dir) { // directional light shader.setUniform("dirLight.direction", _direction); shader.setUniform("dirLight.ambient", _ambient); shader.setUniform("dirLight.diffuse", _diffuse); shader.setUniform("dirLight.specular",_specular); } else if (_lightType == point) { // point light 1 string prefix = "pointLights[" + std::to_string(pointID) + "]."; shader.setUniform(prefix+"position", _position); shader.setUniform(prefix + "ambient", _ambient); shader.setUniform(prefix + "diffuse", _diffuse); shader.setUniform(prefix + "specular", _specular); shader.setUniform(prefix + "constant",_constant); shader.setUniform(prefix + "linear", _linear); shader.setUniform(prefix + "quadratic", _quadratic); } else { // spotLight shader.setUniform("spotLight.position", _position); shader.setUniform("spotLight.direction", _direction); shader.setUniform("spotLight.ambient", _ambient); shader.setUniform("spotLight.diffuse", _diffuse); shader.setUniform("spotLight.specular", _specular); shader.setUniform("spotLight.constant", _constant); shader.setUniform("spotLight.linear", _linear); shader.setUniform("spotLight.quadratic", _quadratic); shader.setUniform("spotLight.cutOff", glm::cos(glm::radians(12.5f))); shader.setUniform("spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); } } void Illuminant::switchOff() { // 只要没有颜色就行了 setColor(glm::vec3(0.0f, 0.0f, 0.0f)); if (lastShader != NULL) { updateLight(*lastShader); } } void init_queue() { for (int i = 0; i < Illuminant::MAXPOINTLIGHT; i++) { available.push(i); Logger::info("23533423q543"); } } double r = 1; // 初始设置所有变量 void setAllLigntUniform(ShaderProgram& shader) { r = r + 1; double rr = sin(r / 20)*8; shader.setUniform("dirLight.direction",0,1,0); shader.setUniform("dirLight.ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("dirLight.diffuse", 0.0f, 100.0f, 220.0f); shader.setUniform("dirLight.specular", 00.0f, 0.0f, 0.0f); // point light 1 shader.setUniform("pointLights[0].position", 0, 0, 0); shader.setUniform("pointLights[0].ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[0].diffuse", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[0].specular", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[0].constant", 1.0f); shader.setUniform("pointLights[0].linear", 0.09f); shader.setUniform("pointLights[0].quadratic", 0.032f); // point light 2 shader.setUniform("pointLights[1].position", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[1].ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[1].diffuse", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[1].specular", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[1].constant", 1.0f); shader.setUniform("pointLights[1].linear", 0.09f); shader.setUniform("pointLights[1].quadratic", 0.032f); // point light 3 shader.setUniform("pointLights[2].position", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[2].ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[2].diffuse", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[2].specular", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[2].constant", 1.0f); shader.setUniform("pointLights[2].linear", 0.09f); shader.setUniform("pointLights[2].quadratic", 0.032f); // point light 4 shader.setUniform("pointLights[3].position", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[3].ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[3].diffuse", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[3].specular", 0.0f, 0.0f, 0.0f); shader.setUniform("pointLights[3].constant", 1.0f); shader.setUniform("pointLights[3].linear", 0.09f); shader.setUniform("pointLights[3].quadratic", 0.032f); // spotLight shader.setUniform("spotLight.position", 0.0f, 0.0f, 3.0f); shader.setUniform("spotLight.direction", -0.0f,-0.0f, -1.0f); shader.setUniform("spotLight.ambient", 0.0f, 0.0f, 0.0f); shader.setUniform("spotLight.diffuse", 0.0f, 0.0f, 0.0f); shader.setUniform("spotLight.specular", 0.0f, 0.0f, 0.0f); shader.setUniform("spotLight.constant", 1.0f); shader.setUniform("spotLight.linear", 0.09f); shader.setUniform("spotLight.quadratic", 0.032f); shader.setUniform("spotLight.cutOff", glm::cos(glm::radians(12.5f))); shader.setUniform("spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); }