Ejemplo n.º 1
0
static bool AddTechnique(JSON &json, CGtechnique technique, UniformsMap &uniformRemapping)
{
    bool success = true;
    const char * const techniqueName = cgGetTechniqueName(technique);

    if (sVerbose)
    {
        puts(techniqueName);
    }

    json.AddArray(techniqueName);

    CGpass pass = cgGetFirstPass(technique);
    if (NULL == pass)
    {
        success = false;
    }

    while (NULL != pass)
    {
        success &= AddPass(technique, json, pass, uniformRemapping);

        pass = cgGetNextPass(pass);
    }

    json.CloseArray(); // techniqueName

    return success;
}
void DoF::Setup() {

    // calc gaussian values (with variance=1) in the interval [-4;4];
    calcBlurWeightArray();

    vector<vector<float> > weights;
    for (int i=0; i<NUM_SAMPLES; i++) {
	vector<float> weight;
	weight.push_back(blurweights[i]);
	weights.push_back(weight);
    }

    // blur
    pass1 = AddPass("Effects/GaussianBlur_Pass1.frag");
    pass1->BindColorBuffer("colorbuf");
    pass1->BindFloat("weights", weights);
    pass1->AttachUserBuffer(0);

    pass2 = AddPass("Effects/GaussianBlur_Pass2.frag");
    pass2->BindUserBuffer("colorbuf", pass1, 0);
    pass2->BindFloat("weights", weights);
    pass2->AttachUserBuffer(0);

/*
    pass1 = AddPass("TwoPassBlur_Pass1.frag");
    pass1->BindColorBuffer("colorbuf");
    pass1->AttachUserBuffer(0);

    pass2 = AddPass("TwoPassBlur_Pass2.frag");
    pass2->BindUserBuffer("colorbuf", pass1, 0);
    pass2->AttachUserBuffer(0);
*/
    // dof
    IPostProcessingPass* pass3 = AddPass("Effects/DoF.frag");
    pass3->BindFloat("znear", znear);
    pass3->BindFloat("zfar", zfar);
    pass3->BindFloat("zsharp", zsharp);
    pass3->BindUserBuffer ("blurred", pass2, 0);
    pass3->BindColorBuffer("unblurred");
    pass3->BindDepthBuffer("depthbuf");
    pass3->EnableColorBufferOutput();
}
Ejemplo n.º 3
0
void CBspMapResourceProvider::LoadTextures(const CBspFile& bspFile, CPakFile& pakFile)
{
	const Bsp::TextureArray& textures(bspFile.GetTextures());
	m_materials.resize(textures.size());
	for(uint32 i = 0; i < textures.size(); i++)
	{
		const Bsp::TEXTURE& texture(textures[i]);

		auto resultMaterial = BspMapMaterialPtr(new CBspMapMaterial());
		m_materials[i] = resultMaterial;

		ShaderMap::const_iterator shaderIterator = m_shaders.find(texture.name);
		if(shaderIterator == m_shaders.end())
		{
			//Create a basic material with this texture
			std::string fullName;
			if(!pakFile.TryCompleteFileName(texture.name, fullName))
			{
				continue;
			}

			LoadTexture(fullName.c_str(), pakFile);

			{
				auto pass = BspMapPassPtr(new CBspMapPass());
				pass->SetTexture(GetTexture(fullName.c_str()));
				pass->SetTextureSource(CBspMapPass::TEXTURE_SOURCE_DIFFUSE);
				pass->SetBlendingFunction(Palleon::TEXTURE_COMBINE_MODULATE);
				resultMaterial->AddPass(pass);
			}

			{
				auto pass = BspMapPassPtr(new CBspMapPass());
				pass->SetTextureSource(CBspMapPass::TEXTURE_SOURCE_LIGHTMAP);
				pass->SetBlendingFunction(Palleon::TEXTURE_COMBINE_MODULATE);
				resultMaterial->AddPass(pass);
			}
		}
		else
		{
			const QUAKE_SHADER& shader = shaderIterator->second;

			resultMaterial->SetIsSky(shader.isSky);

			for(QuakeShaderPassArray::const_iterator passIterator(shader.passes.begin());
				passIterator != shader.passes.end(); passIterator++)
			{
				const QUAKE_SHADER_PASS& passData(*passIterator);
				if(passData.mapName.length() < 4) continue;

				auto pass = BspMapPassPtr(new CBspMapPass());

				{
					Palleon::TEXTURE_COMBINE_MODE blendingFunction = Palleon::TEXTURE_COMBINE_MODULATE;
					switch(passData.blendFunc)
					{
					case QUAKE_SHADER_BLEND_BLEND:
						blendingFunction = Palleon::TEXTURE_COMBINE_LERP;
						break;
					case QUAKE_SHADER_BLEND_ADD:
						blendingFunction = Palleon::TEXTURE_COMBINE_ADD;
						break;
					case QUAKE_SHADER_BLEND_FILTER:
						blendingFunction = Palleon::TEXTURE_COMBINE_MODULATE;
						break;
					}
					pass->SetBlendingFunction(blendingFunction);
				}

				if(passData.mapName == "$lightmap")
				{
					pass->SetTextureSource(CBspMapPass::TEXTURE_SOURCE_LIGHTMAP);
				}
				else
				{
					std::string fileName(passData.mapName.begin(), passData.mapName.begin() + passData.mapName.length() - 4);
					
					std::string fullName;
					if(!pakFile.TryCompleteFileName(fileName.c_str(), fullName))
					{
						continue;
					}

					LoadTexture(fullName.c_str(), pakFile);
					pass->SetTexture(GetTexture(fullName.c_str()));
					pass->SetTextureSource(CBspMapPass::TEXTURE_SOURCE_DIFFUSE);
				}

				for(unsigned int i = 0; i < passData.tcMods.size(); i++)
				{
					const QUAKE_SHADER_TCMOD& tcMod(passData.tcMods[i]);
					BspMapTcModPtr result;
					switch(tcMod.type)
					{
					case QUAKE_SHADER_TCMOD_SCROLL:
						result = BspMapTcModPtr(new CBspMapTcMod_Scroll(
									tcMod.params[0],
									tcMod.params[1]));
						break;
					case QUAKE_SHADER_TCMOD_SCALE:
						result = BspMapTcModPtr(new CBspMapTcMod_Scale(
									tcMod.params[0],
									tcMod.params[1]));
						break;
					case QUAKE_SHADER_TCMOD_ROTATE:
						result = BspMapTcModPtr(new CBspMapTcMod_Rotate(
									tcMod.params[0]));
						break;
					case QUAKE_SHADER_TCMOD_TURB:
						result = BspMapTcModPtr(new CBspMapTcMod_Turb(
									tcMod.params[1],
									tcMod.params[3]));
						break;
					case QUAKE_SHADER_TCMOD_STRETCH:
						{
							BSPMAPWAVEPARAMS wave;
							wave.type		= BSPMAPWAVEPARAMS::WAVE_SIN;
							wave.base		= tcMod.params[0];
							wave.amplitude	= tcMod.params[1];
							wave.phase		= tcMod.params[2];
							wave.freq		= tcMod.params[3];
							result = BspMapTcModPtr(new CBspMapTcMod_Stretch(wave));
						}
						break;
					default:
						continue;
						break;
					}
					pass->AddTcMod(result);
				}

				resultMaterial->AddPass(pass);

				if(resultMaterial->GetPassCount() == CBspMapMaterial::MAX_PASS)
				{
					break;
				}
			}
		}
	}
}
void PassDriver::PopulatePasses() {
  UnreachablePass* unreachable = new UnreachablePass();

  AddPass(unreachable);
}
void SimpleBlur::Setup() {
    pass1 = AddPass("Effects/SimpleBlur.frag");
    pass1->BindFloat("offset", offset);
    pass1->BindColorBuffer("colorbuf");
    pass1->EnableColorBufferOutput();
}