Files
Webcam/include/engine/gpu/gpu_core_shader.cpp

149 lines
5.5 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "gpu/gpu_renderer.h"
#include "metafile/nml_object.h"
#include "log/log.h"
using namespace GS::GPU;
using GS::NML::Tag;
//------------------------------------------------------------------------------
Tag *Renderer::GetPCFShaderTag() const
{
const char *pcf_tag[] = { "PCF:3x3GaussianDithered;", "PCF:3x3;", "PCF:2x2;", "PCF:1x1;" };
int pcf_q = GS::Types::Clamp(registry.GetInteger("ShadowMapping:PCF:Quality", 1), 0, 3);
return shader_dict.GetTag(pcf_tag[pcf_q]);
}
Tag *Renderer::GetPSMShaderTag() const
{ return shader_dict.GetTag("PSM;"); }
Tag *Renderer::GetPSSMShaderTag() const
{
const char *pssm_tag[] = { "PSSM:2Split;", "PSSM:3Split;", "PSSM:4Split;" };
int split_count = GS::Types::Clamp(registry.GetInteger("ShadowMapping:PSSM:Split", 3), 2, 4);
return shader_dict.GetTag(pssm_tag[split_count - 2]);
}
void Renderer::MarshallCoreShader(GS::String &source)
{
if (Tag *t = shader_dict.GetTag("UnpackGBuffer:Float;"))
source.Replace("#(UnpackNormalDepth)", t->GetString());
if (Tag *t = GetPCFShaderTag())
source.Replace("#(ComputePCF)", t->GetString());
if (Tag *t = GetPSSMShaderTag())
source.Replace("#(DispatchPSSM)", t->GetString());
}
Shader *Renderer::SetupCoreShader(const char *name)
{
Core::Shader shader;
if (!NML::LoadFromFile(shader, name))
return NULL;
shader.name = name;
// Note: Marshalling is only done on core shaders.
MarshallCoreShader(shader.vertex);
MarshallCoreShader(shader.pixel);
AutoPtr <Shader> gpu_shader((Shader *)NewShader());
if (gpu_shader.IsNull() || !gpu_shader->Create(*core_resource_factory, shader))
return NULL;
return gpu_shader.Detach();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
bool Renderer::LoadCoreShaders(bool support_3d)
{
__LOG_FUNC__
// Load the shader dictionaries.
if (!NML::Parser::Load("@core/shaders/gpu/dict.txt", shader_dict))
__ERR__(__LOG_E__ << "Shader dictionnary missing.\n", false)
if (!NML::Parser::Load("@core/shaders/gpu/dict_material.txt", material_dict))
__ERR__(__LOG_E__ << "Material dictionnary missing.\n", false)
// Load core shaders.
single_texture_color_program = SetupCoreShader("@core/shaders/gpu/single_texture_color.nsa");
single_texture_program = SetupCoreShader("@core/shaders/gpu/single_texture.nsa");
single_color_program = SetupCoreShader("@core/shaders/gpu/single_color.nsa");
simple_program = SetupCoreShader("@core/shaders/gpu/simple.nsa");
if (support_3d)
{
single_texture_cutoff_program = SetupCoreShader("@core/shaders/gpu/single_texture_cutoff.nsa");
single_texture_fx_program = SetupCoreShader("@core/shaders/gpu/single_texture_fx.nsa");
tone_mapping_program = SetupCoreShader("@core/shaders/gpu/tone_mapping.nsa");
ambient_program = SetupCoreShader("@core/shaders/gpu/ambient.nsa");
spotlight_program = SetupCoreShader("@core/shaders/gpu/deferred/spotlight.nsa");
spotlight_shadow_program = SetupCoreShader("@core/shaders/gpu/deferred/spotlight_shadow.nsa");
pointlight_program = SetupCoreShader("@core/shaders/gpu/deferred/pointlight.nsa");
pointlight_shadow_program = SetupCoreShader("@core/shaders/gpu/deferred/pointlight_shadow.nsa");
linearlight_program = SetupCoreShader("@core/shaders/gpu/deferred/linearlight.nsa");
linearlight_shadow_program = SetupCoreShader("@core/shaders/gpu/deferred/linearlight_shadow.nsa");
ds_fog_program = SetupCoreShader("@core/shaders/gpu/deferred/ds_fog.nsa");
fx_blur_program = SetupCoreShader("@core/shaders/gpu/fx_blur.nsa");
noise_program = SetupCoreShader("@core/shaders/gpu/noise.nsa");
sharpen_program = SetupCoreShader("@core/shaders/gpu/sharpen.nsa");
hsl_program = SetupCoreShader("@core/shaders/gpu/hsl.nsa");
chromatic_dispersion_program = SetupCoreShader("@core/shaders/gpu/chromatic_dispersion.nsa");
ssaa_program = SetupCoreShader("@core/shaders/gpu/ssaa.nsa");
ssao_program = SetupCoreShader("@core/shaders/gpu/ssao.nsa");
ssao_blur_program = SetupCoreShader("@core/shaders/gpu/ssao_blur.nsa");
motion_blur_program = SetupCoreShader("@core/shaders/gpu/motion_blur.nsa");
radial_blur_program = SetupCoreShader("@core/shaders/gpu/radial_blur.nsa");
resolve_msaa_depth_program = SetupCoreShader("@core/shaders/gpu/resolve_msaa_depth.nsa");
skybox_program = SetupCoreShader("@core/shaders/gpu/skybox.nsa");
}
return true;
}
void Renderer::UnloadCoreShaders()
{
single_texture_color_program = NULL;
single_texture_program = NULL;
single_color_program = NULL;
simple_program = NULL;
single_texture_cutoff_program = NULL;
single_texture_fx_program = NULL;
tone_mapping_program = NULL;
ambient_program = NULL;
spotlight_program = NULL;
spotlight_shadow_program = NULL;
pointlight_program = NULL;
pointlight_shadow_program = NULL;
linearlight_program = NULL;
linearlight_shadow_program = NULL;
ds_fog_program = NULL;
fx_blur_program = NULL;
noise_program = NULL;
sharpen_program = NULL;
hsl_program = NULL;
chromatic_dispersion_program = NULL;
ssaa_program = NULL;
ssao_program = NULL;
ssao_blur_program = NULL;
motion_blur_program = NULL;
radial_blur_program = NULL;
resolve_msaa_depth_program = NULL;
skybox_program = NULL;
}
//------------------------------------------------------------------------------