void LightManager::updateLights(bool const cullVisible) { std::vector<LightSource*> visibleLights; getVisibleLights(visibleLights, cullVisible); buildGPUBuffer(static_cast<uint32_t>(visibleLights.size())); // Builds a new buffer if current is NULL or too small fillGPUBuffer(visibleLights); // Also performs the binding operation m_PrevNumVisible = static_cast<uint32_t>(visibleLights.size()); }
void LightManager::loadLights() { const std::vector<Light *> &lights = getVisibleLights(); for(unsigned int i=0;i<maxLights; ++i) { if(lights.size()>i) { const Light *light = lights[i]; glUniform1i(lightsInfo[i].isExistLoc, true); glUniform1i(lightsInfo[i].produceShadowLoc, light->isProduceShadow()); glUniform1i(lightsInfo[i].hasParallelBeamsLoc, light->hasParallelBeams()); if(lights[i]->getLightType()==Light::SUN) { const SunLight *sunLight = static_cast<const SunLight *>(light); glUniform3fv(lightsInfo[i].positionOrDirectionLoc, 1, (const float *)sunLight->getDirections()[0]); }else if(lights[i]->getLightType()==Light::OMNIDIRECTIONAL) { const OmnidirectionalLight *omnidirectionalLight = static_cast<const OmnidirectionalLight *>(light); glUniform3fv(lightsInfo[i].positionOrDirectionLoc, 1, (const float *)omnidirectionalLight->getPosition()); glUniform1f(lightsInfo[i].exponentialAttLoc, omnidirectionalLight->getExponentialAttenuation()); }else { throw std::invalid_argument("Unknown light type to load uniform: " + light->getLightType()); } glUniform3fv(lightsInfo[i].lightAmbientLoc, 1, (const float *)light->getAmbientColor()); }else { glUniform1i(lightsInfo[i].isExistLoc, false); break; } } glUniform4fv(globalAmbientColorLoc, 1, (const float *)getGlobalAmbientColor()); }