Пример #1
0
        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());
        }
Пример #2
0
	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());
	}