示例#1
0
bool Storm3D_Spotlight::setAsRenderTarget(const float *cameraView)
{
	data->updateMatrices(cameraView);

	if(data->shadowMap && data->shadowMap->hasInitialized())
	{
		if(data->shadowMap->set())
		{
			D3DMATRIX dm = { 0 };
			dm._11 = 1.f;
			dm._22 = 1.f;
			dm._33 = 1.f;
			dm._44 = 1.f;

			data->device.SetTransform(D3DTS_WORLD, &dm);
			data->device.SetTransform(D3DTS_VIEW, &data->properties.lightView[1]);

			data->device.SetTransform(D3DTS_PROJECTION, &data->properties.lightProjection);
			Storm3D_ShaderManager::GetSingleton()->SetViewProjectionMatrix(data->properties.lightViewProjection[1], data->properties.lightViewProjection[1]);
			Storm3D_ShaderManager::GetSingleton()->setSpot(data->properties.color, data->properties.position, data->properties.direction, data->properties.range, .1f);

			if(type == Storm3D_Spotlight::AtiFloatBuffer)
				data->atiFloatDepthPixelShader->apply();
			else if(type == Storm3D_Spotlight::AtiBuffer)
			{
				data->device.SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
				data->device.SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

				data->atiDepthPixelShader->apply();
			}
			else
			{
				data->device.SetPixelShader(0);
				data->device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
				data->device.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
				data->device.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
				data->device.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
				data->device.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
			}

			return true;
		}

		IStorm3D_Logger *logger = data->storm.logger;
		if(logger)
		{
			logger->error("Failed to set render target");
		}
	}

	return false;
}
	/*!
		\param name effect name
		\param effect effect to add
	*/
	void addEffect(const string &name, const Effect &effect)
	{
		ProceduralEffect result;
		result.effect = effect;
		result.init(storm);

		if(result.texture1 && result.texture2)
			effects[name] = result;
		else if(logger)
		{
			string message = "Cannot find both textures for procedural effect: ";
			message += name;
			logger->error(message.c_str());

			logger->info(result.effect.source1.texture.texture.c_str());
			logger->info(result.effect.source2.texture.texture.c_str());
		}
	}