diff --git a/source/graphics/Decal.cpp b/source/graphics/Decal.cpp index 23edee593c..b86aff004b 100644 --- a/source/graphics/Decal.cpp +++ b/source/graphics/Decal.cpp @@ -110,5 +110,5 @@ void CModelDecal::SetTransform(const CMatrix3D& transform) void CModelDecal::RemoveShadows() { - m_Decal.m_Material.AddShaderDefine("DISABLE_RECEIVE_SHADOWS", "1"); + m_Decal.m_Material.AddShaderDefine(str_DISABLE_RECEIVE_SHADOWS, str_1); } diff --git a/source/graphics/LOSTexture.cpp b/source/graphics/LOSTexture.cpp index 348d7af708..2fe3831318 100644 --- a/source/graphics/LOSTexture.cpp +++ b/source/graphics/LOSTexture.cpp @@ -55,7 +55,7 @@ CLOSTexture::CLOSTexture(CSimulation2& simulation) : { if (CRenderer::IsInitialised() && g_Renderer.m_Options.m_SmoothLOS) { - m_smoothShader = g_Renderer.GetShaderManager().LoadEffect("los_interp"); + m_smoothShader = g_Renderer.GetShaderManager().LoadEffect(str_los_interp); CShaderProgramPtr shader = m_smoothShader->GetShader(); if (m_smoothShader && shader) @@ -142,10 +142,10 @@ void CLOSTexture::InterpolateLOS() shader->Bind(); - shader->BindTexture("losTex1", m_Texture); - shader->BindTexture("losTex2", whichTex ? m_TextureSmooth1 : m_TextureSmooth2); + shader->BindTexture(str_losTex1, m_Texture); + shader->BindTexture(str_losTex2, whichTex ? m_TextureSmooth1 : m_TextureSmooth2); - shader->Uniform("delta", (float)g_Renderer.GetTimeManager().GetFrameDelta() * 4.0f, 0.0f, 0.0f, 0.0f); + shader->Uniform(str_delta, (float)g_Renderer.GetTimeManager().GetFrameDelta() * 4.0f, 0.0f, 0.0f, 0.0f); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0, 0, m_TextureSize, m_TextureSize); diff --git a/source/graphics/Material.cpp b/source/graphics/Material.cpp index 0469f58a39..c61d9e0274 100644 --- a/source/graphics/Material.cpp +++ b/source/graphics/Material.cpp @@ -32,7 +32,7 @@ void CMaterial::SetShaderEffect(const CStr& effect) m_ShaderEffect = CStrIntern(effect); } -void CMaterial::AddShaderDefine(const char* key, const char* value) +void CMaterial::AddShaderDefine(CStrIntern key, CStrIntern value) { m_ShaderDefines.Add(key, value); m_CombinedShaderDefines.clear(); @@ -52,7 +52,7 @@ void CMaterial::AddStaticUniform(const char* key, const CVector4D& value) void CMaterial::AddSampler(const TextureSampler& texture) { m_Samplers.push_back(texture); - if (texture.Name == CStrIntern("baseTex")) + if (texture.Name == str_baseTex) m_DiffuseTexture = texture.Sampler; } @@ -81,7 +81,7 @@ void CMaterial::RecomputeCombinedShaderDefines() if (i & (1 << j)) { const CShaderConditionalDefines::CondDefine& def = m_ConditionalDefines.GetItem(j); - defs.Add(def.m_DefName.c_str(), def.m_DefValue.c_str()); + defs.Add(def.m_DefName, def.m_DefValue); } } m_CombinedShaderDefines.push_back(defs); diff --git a/source/graphics/Material.h b/source/graphics/Material.h index a144a24c5d..f4f53bdc38 100644 --- a/source/graphics/Material.h +++ b/source/graphics/Material.h @@ -52,7 +52,7 @@ public: void SetShaderEffect(const CStr& effect); CStrIntern GetShaderEffect() const { return m_ShaderEffect; } - void AddShaderDefine(const char* key, const char* value); + void AddShaderDefine(CStrIntern key, CStrIntern value); // conditionFlags is a bitmask representing which indexes of the // GetConditionalDefines() list are currently matching. diff --git a/source/graphics/MaterialManager.cpp b/source/graphics/MaterialManager.cpp index 68b6923388..068d9f5f92 100644 --- a/source/graphics/MaterialManager.cpp +++ b/source/graphics/MaterialManager.cpp @@ -114,7 +114,7 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname) } else if (token == el_define) { - material.AddShaderDefine(attrs.GetNamedItem(at_name).c_str(), attrs.GetNamedItem(at_value).c_str()); + material.AddShaderDefine(CStrIntern(attrs.GetNamedItem(at_name)), CStrIntern(attrs.GetNamedItem(at_value))); } else if (token == el_conditional_define) { @@ -154,14 +154,14 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname) { std::stringstream sstr; sstr << valmin; - material.AddShaderDefine((conf + "_MIN").c_str(), sstr.str().c_str()); + material.AddShaderDefine(CStrIntern(conf + "_MIN"), CStrIntern(sstr.str())); } if (valmax >= 0.0f) { std::stringstream sstr; sstr << valmax; - material.AddShaderDefine((conf + "_MAX").c_str(), sstr.str().c_str()); + material.AddShaderDefine(CStrIntern(conf + "_MAX"), CStrIntern(sstr.str())); } } diff --git a/source/graphics/Model.cpp b/source/graphics/Model.cpp index 0aae339b85..bec181aaa3 100644 --- a/source/graphics/Model.cpp +++ b/source/graphics/Model.cpp @@ -626,7 +626,7 @@ void CModel::AddFlagsRec(int flags) m_Flags |= flags; if (flags & MODELFLAG_IGNORE_LOS) - m_Material.AddShaderDefine("IGNORE_LOS", "1"); + m_Material.AddShaderDefine(str_IGNORE_LOS, str_1); for (size_t i = 0; i < m_Props.size(); ++i) if (m_Props[i].m_Model->ToCModel()) @@ -637,7 +637,7 @@ void CModel::RemoveShadowsRec() { m_Flags &= ~MODELFLAG_CASTSHADOWS; - m_Material.AddShaderDefine("DISABLE_RECEIVE_SHADOWS", "1"); + m_Material.AddShaderDefine(str_DISABLE_RECEIVE_SHADOWS, str_1); for (size_t i = 0; i < m_Props.size(); ++i) { diff --git a/source/graphics/ParticleEmitter.cpp b/source/graphics/ParticleEmitter.cpp index 39bc3a7557..dc02d7aff2 100644 --- a/source/graphics/ParticleEmitter.cpp +++ b/source/graphics/ParticleEmitter.cpp @@ -167,15 +167,15 @@ void CParticleEmitter::UpdateArrayData() void CParticleEmitter::Bind(const CShaderProgramPtr& shader) { CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); - shader->BindTexture("losTex", los.GetTextureSmooth()); - shader->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shader->BindTexture(str_losTex, los.GetTextureSmooth()); + shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); const CLightEnv& lightEnv = g_Renderer.GetLightEnv(); - shader->Uniform("sunColor", lightEnv.m_SunColor); - shader->Uniform("fogColor", lightEnv.m_FogColor); - shader->Uniform("fogParams", lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); + shader->Uniform(str_sunColor, lightEnv.m_SunColor); + shader->Uniform(str_fogColor, lightEnv.m_FogColor); + shader->Uniform(str_fogParams, lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); - shader->BindTexture("baseTex", m_Type->m_Texture); + shader->BindTexture(str_baseTex, m_Type->m_Texture); pglBlendEquationEXT(m_Type->m_BlendEquation); glBlendFunc(m_Type->m_BlendFuncSrc, m_Type->m_BlendFuncDst); } diff --git a/source/graphics/ShaderDefines.cpp b/source/graphics/ShaderDefines.cpp index e6ccb7ee7a..c414fbff32 100644 --- a/source/graphics/ShaderDefines.cpp +++ b/source/graphics/ShaderDefines.cpp @@ -180,9 +180,9 @@ void CShaderParams::SItems::RecalcHash() } -void CShaderDefines::Add(const char* name, const char* value) +void CShaderDefines::Add(CStrIntern name, CStrIntern value) { - Set(CStrIntern(name), CStrIntern(value)); + Set(name, value); } int CShaderDefines::GetInt(const char* name) const diff --git a/source/graphics/ShaderDefines.h b/source/graphics/ShaderDefines.h index aaae25a6a5..b6fa4bb03f 100644 --- a/source/graphics/ShaderDefines.h +++ b/source/graphics/ShaderDefines.h @@ -133,7 +133,7 @@ public: * Add a name and associated value to the map of defines. * If the name is already defined, its value will be replaced. */ - void Add(const char* name, const char* value); + void Add(CStrIntern name, CStrIntern value); /** * Return the value for the given name as an integer, or 0 if not defined. diff --git a/source/graphics/ShaderManager.cpp b/source/graphics/ShaderManager.cpp index a2f22ab6ae..b18a84578e 100644 --- a/source/graphics/ShaderManager.cpp +++ b/source/graphics/ShaderManager.cpp @@ -183,7 +183,7 @@ bool CShaderManager::NewProgram(const char* name, const CShaderDefines& baseDefi { if (Child.GetNodeName() == el_define) { - defines.Add(Child.GetAttributes().GetNamedItem(at_name).c_str(), Child.GetAttributes().GetNamedItem(at_value).c_str()); + defines.Add(CStrIntern(Child.GetAttributes().GetNamedItem(at_name)), CStrIntern(Child.GetAttributes().GetNamedItem(at_value))); } else if (Child.GetNodeName() == el_vertex) { @@ -347,9 +347,9 @@ bool CShaderManager::EffectCacheKey::operator==(const EffectCacheKey& b) const return (name == b.name && defines1 == b.defines1 && defines2 == b.defines2); } -CShaderTechniquePtr CShaderManager::LoadEffect(const char* name) +CShaderTechniquePtr CShaderManager::LoadEffect(CStrIntern name) { - return LoadEffect(CStrIntern(name), g_Renderer.GetSystemShaderDefines(), CShaderDefines()); + return LoadEffect(name, g_Renderer.GetSystemShaderDefines(), CShaderDefines()); } CShaderTechniquePtr CShaderManager::LoadEffect(CStrIntern name, const CShaderDefines& defines1, const CShaderDefines& defines2) @@ -499,7 +499,7 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin { if (Child.GetNodeName() == el_define) { - techDefines.Add(Child.GetAttributes().GetNamedItem(at_name).c_str(), Child.GetAttributes().GetNamedItem(at_value).c_str()); + techDefines.Add(CStrIntern(Child.GetAttributes().GetNamedItem(at_name)), CStrIntern(Child.GetAttributes().GetNamedItem(at_value))); } else if (Child.GetNodeName() == el_sort_by_distance) { @@ -515,7 +515,7 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin { if (Element.GetNodeName() == el_define) { - passDefines.Add(Element.GetAttributes().GetNamedItem(at_name).c_str(), Element.GetAttributes().GetNamedItem(at_value).c_str()); + passDefines.Add(CStrIntern(Element.GetAttributes().GetNamedItem(at_name)), CStrIntern(Element.GetAttributes().GetNamedItem(at_value))); } else if (Element.GetNodeName() == el_alpha) { diff --git a/source/graphics/ShaderManager.h b/source/graphics/ShaderManager.h index 0cc89e37c2..294f894ed2 100644 --- a/source/graphics/ShaderManager.h +++ b/source/graphics/ShaderManager.h @@ -65,7 +65,7 @@ public: /** * Load a shader effect, with default system defines (from CRenderer::GetSystemShaderDefines). */ - CShaderTechniquePtr LoadEffect(const char* name); + CShaderTechniquePtr LoadEffect(CStrIntern name); /** * Returns the number of shader effects that are currently loaded. diff --git a/source/graphics/ShaderProgram.cpp b/source/graphics/ShaderProgram.cpp index 081e5bd59a..356e6a9015 100644 --- a/source/graphics/ShaderProgram.cpp +++ b/source/graphics/ShaderProgram.cpp @@ -157,7 +157,7 @@ public: virtual Binding GetTextureBinding(texture_id_t id) { - frag_index_pair_t fPair = GetUniformFragmentIndex(CStrIntern(id)); + frag_index_pair_t fPair = GetUniformFragmentIndex(id); int index = fPair.first; if (index == -1) return Binding(); @@ -167,7 +167,7 @@ public: virtual void BindTexture(texture_id_t id, Handle tex) { - frag_index_pair_t fPair = GetUniformFragmentIndex(CStrIntern(id)); + frag_index_pair_t fPair = GetUniformFragmentIndex(id); int index = fPair.first; if (index != -1) { @@ -180,7 +180,7 @@ public: virtual void BindTexture(texture_id_t id, GLuint tex) { - frag_index_pair_t fPair = GetUniformFragmentIndex(CStrIntern(id)); + frag_index_pair_t fPair = GetUniformFragmentIndex(id); int index = fPair.first; if (index != -1) { @@ -197,12 +197,6 @@ public: } virtual Binding GetUniformBinding(uniform_id_t id) - { - CStrIntern idIntern(id); - return Binding(GetUniformVertexIndex(idIntern), GetUniformFragmentIndex(idIntern).first); - } - - virtual Binding GetUniformBinding(CStrIntern id) { return Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id).first); } @@ -546,15 +540,6 @@ public: } virtual Binding GetUniformBinding(uniform_id_t id) - { - std::map >::iterator it = m_Uniforms.find(CStrIntern(id)); - if (it == m_Uniforms.end()) - return Binding(); - else - return Binding(it->second.first, (int)it->second.second); - } - - virtual Binding GetUniformBinding(CStrIntern id) { std::map >::iterator it = m_Uniforms.find(id); if (it == m_Uniforms.end()) @@ -629,18 +614,18 @@ public: m_ValidStreams |= STREAM_UV0 << (texture - GL_TEXTURE0); } - virtual void VertexAttribPointer(const char* id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer) + virtual void VertexAttribPointer(attrib_id_t id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer) { - std::map::iterator it = m_VertexAttribs.find(CStrIntern(id)); + std::map::iterator it = m_VertexAttribs.find(id); if (it != m_VertexAttribs.end()) { pglVertexAttribPointerARB(it->second, size, type, normalized, stride, pointer); } } - virtual void VertexAttribIPointer(const char* id, GLint size, GLenum type, GLsizei stride, void* pointer) + virtual void VertexAttribIPointer(attrib_id_t id, GLint size, GLenum type, GLsizei stride, void* pointer) { - std::map::iterator it = m_VertexAttribs.find(CStrIntern(id)); + std::map::iterator it = m_VertexAttribs.find(id); if (it != m_VertexAttribs.end()) { #if CONFIG2_GLES @@ -784,13 +769,13 @@ void CShaderProgram::Uniform(uniform_id_t id, size_t count, const CMatrix3D* v) // These should all be overridden by CShaderProgramGLSL, and not used // if a non-GLSL shader was loaded instead: -void CShaderProgram::VertexAttribPointer(const char* UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type), +void CShaderProgram::VertexAttribPointer(attrib_id_t UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type), GLboolean UNUSED(normalized), GLsizei UNUSED(stride), void* UNUSED(pointer)) { debug_warn("Shader type doesn't support VertexAttribPointer"); } -void CShaderProgram::VertexAttribIPointer(const char* UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type), +void CShaderProgram::VertexAttribIPointer(attrib_id_t UNUSED(id), GLint UNUSED(size), GLenum UNUSED(type), GLsizei UNUSED(stride), void* UNUSED(pointer)) { debug_warn("Shader type doesn't support VertexAttribIPointer"); diff --git a/source/graphics/ShaderProgram.h b/source/graphics/ShaderProgram.h index 02736f1ee4..a926958c6b 100644 --- a/source/graphics/ShaderProgram.h +++ b/source/graphics/ShaderProgram.h @@ -67,9 +67,9 @@ class CShaderProgram NONCOPYABLE(CShaderProgram); public: - typedef const char* attrib_id_t; - typedef const char* texture_id_t; - typedef const char* uniform_id_t; + typedef CStrIntern attrib_id_t; + typedef CStrIntern texture_id_t; + typedef CStrIntern uniform_id_t; typedef std::pair frag_index_pair_t; /** @@ -144,9 +144,6 @@ public: */ int GetStreamFlags() const; - // TODO: implement vertex attributes - GLuint GetAttribIndex(attrib_id_t id); - virtual Binding GetTextureBinding(texture_id_t id) = 0; @@ -158,7 +155,6 @@ public: virtual Binding GetUniformBinding(uniform_id_t id) = 0; - virtual Binding GetUniformBinding(CStrIntern id) = 0; // Uniform-setting methods that subclasses must define: virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0; @@ -188,8 +184,8 @@ public: virtual void NormalPointer(GLenum type, GLsizei stride, void* pointer); virtual void ColorPointer(GLint size, GLenum type, GLsizei stride, void* pointer); virtual void TexCoordPointer(GLenum texture, GLint size, GLenum type, GLsizei stride, void* pointer); - virtual void VertexAttribPointer(const char* id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer); - virtual void VertexAttribIPointer(const char* id, GLint size, GLenum type, GLsizei stride, void* pointer); + virtual void VertexAttribPointer(attrib_id_t id, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* pointer); + virtual void VertexAttribIPointer(attrib_id_t id, GLint size, GLenum type, GLsizei stride, void* pointer); /** * Checks that all the required vertex attributes have been set. diff --git a/source/graphics/ShaderProgramFFP.cpp b/source/graphics/ShaderProgramFFP.cpp index 567b67a68a..49a2d48d17 100644 --- a/source/graphics/ShaderProgramFFP.cpp +++ b/source/graphics/ShaderProgramFFP.cpp @@ -98,11 +98,6 @@ public: } virtual Binding GetUniformBinding(uniform_id_t id) - { - return Binding(-1, GetUniformIndex(CStrIntern(id))); - } - - virtual Binding GetUniformBinding(CStrIntern id) { return Binding(-1, GetUniformIndex(id)); } diff --git a/source/graphics/TextRenderer.cpp b/source/graphics/TextRenderer.cpp index e58520ad9a..dfdb8a3a0f 100644 --- a/source/graphics/TextRenderer.cpp +++ b/source/graphics/TextRenderer.cpp @@ -21,6 +21,7 @@ #include "lib/ogl.h" #include "lib/res/graphics/unifont.h" +#include "ps/CStrIntern.h" #include "ps/Font.h" extern int g_xres, g_yres; @@ -156,18 +157,18 @@ void CTextRenderer::Render() const std::map& glyphs = batch.font->GetGlyphs(); - m_Shader->BindTexture("tex", batch.font->GetTexture()); + m_Shader->BindTexture(str_tex, batch.font->GetTexture()); - m_Shader->Uniform("transform", batch.transform); + m_Shader->Uniform(str_transform, batch.transform); // ALPHA-only textures will have .rgb sampled as 0, so we need to // replace it with white (but not affect RGBA textures) if (batch.font->HasRGB()) - m_Shader->Uniform("colorAdd", CColor(0.0f, 0.0f, 0.0f, 0.0f)); + m_Shader->Uniform(str_colorAdd, CColor(0.0f, 0.0f, 0.0f, 0.0f)); else - m_Shader->Uniform("colorAdd", CColor(1.0f, 1.0f, 1.0f, 0.0f)); + m_Shader->Uniform(str_colorAdd, CColor(1.0f, 1.0f, 1.0f, 0.0f)); - m_Shader->Uniform("colorMul", batch.color); + m_Shader->Uniform(str_colorMul, batch.color); vertexes.clear(); vertexes.resize(batch.text.size()*4); diff --git a/source/graphics/tests/test_ShaderManager.h b/source/graphics/tests/test_ShaderManager.h index 1feef552e9..97f8d330b8 100644 --- a/source/graphics/tests/test_ShaderManager.h +++ b/source/graphics/tests/test_ShaderManager.h @@ -33,7 +33,7 @@ public: TS_ASSERT(defines1.GetHash() == defines2.GetHash()); TS_ASSERT(!(defines1 < defines2 || defines2 < defines1)); - defines1.Add("FOO", "1"); + defines1.Add(CStrIntern("FOO"), CStrIntern("1")); TS_ASSERT_EQUALS(defines1.GetInt("FOO"), 1); TS_ASSERT_EQUALS(defines2.GetInt("FOO"), 0); @@ -42,7 +42,7 @@ public: TS_ASSERT(!(defines1.GetHash() == defines2.GetHash())); TS_ASSERT(defines1 < defines2 || defines2 < defines1); - defines2.Add("FOO", "2"); + defines2.Add(CStrIntern("FOO"), CStrIntern("2")); TS_ASSERT_EQUALS(defines1.GetInt("FOO"), 1); TS_ASSERT_EQUALS(defines2.GetInt("FOO"), 2); @@ -51,7 +51,7 @@ public: TS_ASSERT(!(defines1.GetHash() == defines2.GetHash())); defines3 = defines2; - defines2.Add("FOO", "1"); // override old value + defines2.Add(CStrIntern("FOO"), CStrIntern("1")); // override old value TS_ASSERT_EQUALS(defines1.GetInt("FOO"), 1); TS_ASSERT_EQUALS(defines2.GetInt("FOO"), 1); @@ -64,20 +64,20 @@ public: void test_defines_order() { CShaderDefines defines1; - defines1.Add("A", "1"); - defines1.Add("B", "1"); - defines1.Add("C", "1"); - defines1.Add("D", "1"); + defines1.Add(CStrIntern("A"), CStrIntern("1")); + defines1.Add(CStrIntern("B"), CStrIntern("1")); + defines1.Add(CStrIntern("C"), CStrIntern("1")); + defines1.Add(CStrIntern("D"), CStrIntern("1")); CShaderDefines defines2; - defines2.Add("C", "2"); - defines2.Add("C", "1"); - defines2.Add("B", "2"); - defines2.Add("B", "1"); - defines2.Add("D", "2"); - defines2.Add("D", "1"); - defines2.Add("A", "2"); - defines2.Add("A", "1"); + defines2.Add(CStrIntern("C"), CStrIntern("2")); + defines2.Add(CStrIntern("C"), CStrIntern("1")); + defines2.Add(CStrIntern("B"), CStrIntern("2")); + defines2.Add(CStrIntern("B"), CStrIntern("1")); + defines2.Add(CStrIntern("D"), CStrIntern("2")); + defines2.Add(CStrIntern("D"), CStrIntern("1")); + defines2.Add(CStrIntern("A"), CStrIntern("2")); + defines2.Add(CStrIntern("A"), CStrIntern("1")); TS_ASSERT(defines1 == defines2); diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index b93c749271..e6bfdecd12 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -941,7 +941,7 @@ SGUIText CGUI::GenerateText(const CGUIString &string, void CGUI::DrawText(SGUIText &Text, const CColor &DefaultColor, const CPos &pos, const float &z, const CRect &clipping) { - CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); tech->BeginPass(); diff --git a/source/gui/CInput.cpp b/source/gui/CInput.cpp index c216df3dcf..07ccf21213 100644 --- a/source/gui/CInput.cpp +++ b/source/gui/CInput.cpp @@ -1102,7 +1102,7 @@ void CInput::Draw() float h = (float)font.GetHeight(); float ls = (float)font.GetLineSpacing(); - CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); CTextRenderer textRenderer(tech->GetShader()); textRenderer.Font(font_name); diff --git a/source/gui/GUIRenderer.cpp b/source/gui/GUIRenderer.cpp index 84ac5f4d57..95311584e8 100644 --- a/source/gui/GUIRenderer.cpp +++ b/source/gui/GUIRenderer.cpp @@ -225,13 +225,13 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, if (!Call.m_HasTexture) { - Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); } else if (cit->m_Effects) { if (cit->m_Effects->m_AddColor != CColor()) { - Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_add"); + Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add); Call.m_ShaderColorParameter = cit->m_Effects->m_AddColor; // Always enable blending if something's being subtracted from // the alpha channel @@ -240,16 +240,16 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, } else if (cit->m_Effects->m_Greyscale) { - Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_grayscale"); + Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_grayscale); } else /* Slight confusion - why no effects? */ { - Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_basic"); + Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic); } } else { - Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect("gui_basic"); + Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic); } Calls.push_back(Call); @@ -350,12 +350,12 @@ void GUIRenderer::Draw(DrawCalls &Calls, float Z) { cit->m_Shader->BeginPass(); CShaderProgramPtr shader = cit->m_Shader->GetShader(); - shader->Uniform("transform", matrix); + shader->Uniform(str_transform, matrix); if (cit->m_HasTexture) { - shader->Uniform("color", cit->m_ShaderColorParameter); - shader->BindTexture("tex", cit->m_Texture); + shader->Uniform(str_color, cit->m_ShaderColorParameter); + shader->BindTexture(str_tex, cit->m_Texture); if (cit->m_EnableBlending || cit->m_Texture->HasAlpha()) // (shouldn't call HasAlpha before BindTexture) { @@ -395,7 +395,7 @@ void GUIRenderer::Draw(DrawCalls &Calls, float Z) } else { - shader->Uniform("color", cit->m_BackColor); + shader->Uniform(str_color, cit->m_BackColor); if (cit->m_EnableBlending) { @@ -425,7 +425,7 @@ void GUIRenderer::Draw(DrawCalls &Calls, float Z) if (cit->m_BorderColor != CColor()) { - shader->Uniform("color", cit->m_BorderColor); + shader->Uniform(str_color, cit->m_BorderColor); data.clear(); ADD(Verts.left + 0.5f, Verts.top + 0.5f, Z + cit->m_DeltaZ); diff --git a/source/gui/MiniMap.cpp b/source/gui/MiniMap.cpp index ef6e8b481e..fa294a02a1 100644 --- a/source/gui/MiniMap.cpp +++ b/source/gui/MiniMap.cpp @@ -384,8 +384,8 @@ void CMiniMap::Draw() if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) { CShaderDefines defines; - defines.Add("MINIMAP_BASE", "1"); - tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("minimap"), g_Renderer.GetSystemShaderDefines(), defines); + defines.Add(str_MINIMAP_BASE, str_1); + tech = g_Renderer.GetShaderManager().LoadEffect(str_minimap, g_Renderer.GetSystemShaderDefines(), defines); tech->BeginPass(); shader = tech->GetShader(); } @@ -398,7 +398,7 @@ void CMiniMap::Draw() // Draw the main textured quad if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) - shader->BindTexture("baseTex", m_TerrainTexture); + shader->BindTexture(str_baseTex, m_TerrainTexture); else g_Renderer.BindTexture(0, m_TerrainTexture); @@ -412,7 +412,7 @@ void CMiniMap::Draw() CTerritoryTexture& territoryTexture = g_Game->GetView()->GetTerritoryTexture(); if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) - shader->BindTexture("baseTex", territoryTexture.GetTexture()); + shader->BindTexture(str_baseTex, territoryTexture.GetTexture()); else territoryTexture.BindTexture(0); @@ -437,11 +437,11 @@ void CMiniMap::Draw() tech->EndPass(); CShaderDefines defines; - defines.Add("MINIMAP_LOS", "1"); - tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("minimap"), g_Renderer.GetSystemShaderDefines(), defines); + defines.Add(str_MINIMAP_LOS, str_1); + tech = g_Renderer.GetShaderManager().LoadEffect(str_minimap, g_Renderer.GetSystemShaderDefines(), defines); tech->BeginPass(); shader = tech->GetShader(); - shader->BindTexture("baseTex", losTexture.GetTexture()); + shader->BindTexture(str_baseTex, losTexture.GetTexture()); } else { @@ -476,8 +476,8 @@ void CMiniMap::Draw() tech->EndPass(); CShaderDefines defines; - defines.Add("MINIMAP_POINT", "1"); - tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("minimap"), g_Renderer.GetSystemShaderDefines(), defines); + defines.Add(str_MINIMAP_POINT, str_1); + tech = g_Renderer.GetShaderManager().LoadEffect(str_minimap, g_Renderer.GetSystemShaderDefines(), defines); tech->BeginPass(); shader = tech->GetShader(); } @@ -585,8 +585,8 @@ void CMiniMap::Draw() tech->EndPass(); CShaderDefines defines; - defines.Add("MINIMAP_LINE", "1"); - tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("minimap"), g_Renderer.GetSystemShaderDefines(), defines); + defines.Add(str_MINIMAP_LINE, str_1); + tech = g_Renderer.GetShaderManager().LoadEffect(str_minimap, g_Renderer.GetSystemShaderDefines(), defines); tech->BeginPass(); shader = tech->GetShader(); } diff --git a/source/ps/CConsole.cpp b/source/ps/CConsole.cpp index 5d7b4d4e44..a41d9fae87 100644 --- a/source/ps/CConsole.cpp +++ b/source/ps/CConsole.cpp @@ -196,7 +196,7 @@ void CConsole::Render() glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - CShaderTechniquePtr solidTech = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + CShaderTechniquePtr solidTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); solidTech->BeginPass(); CShaderProgramPtr solidShader = solidTech->GetShader(); @@ -205,13 +205,13 @@ void CConsole::Render() // animation: slide in from top of screen const float DeltaY = (1.0f - m_fVisibleFrac) * m_fHeight; transform.PostTranslate(m_fX, m_fY - DeltaY, 0.0f); // move to window position - solidShader->Uniform("transform", transform); + solidShader->Uniform(str_transform, transform); DrawWindow(solidShader); solidTech->EndPass(); - CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); textTech->BeginPass(); CTextRenderer textRenderer(textTech->GetShader()); textRenderer.Font(CONSOLE_FONT); @@ -241,13 +241,13 @@ void CConsole::DrawWindow(CShaderProgramPtr& shader) // Draw Background // Set the color to a translucent blue - shader->Uniform("color", 0.0f, 0.0f, 0.5f, 0.6f); + shader->Uniform(str_color, 0.0f, 0.0f, 0.5f, 0.6f); shader->AssertPointersBound(); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); // Draw Border // Set the color to a translucent yellow - shader->Uniform("color", 0.5f, 0.5f, 0.0f, 0.6f); + shader->Uniform(str_color, 0.5f, 0.5f, 0.0f, 0.6f); shader->AssertPointersBound(); glDrawArrays(GL_LINE_LOOP, 0, 4); diff --git a/source/ps/CLogger.cpp b/source/ps/CLogger.cpp index 77a360639d..f7919242b9 100644 --- a/source/ps/CLogger.cpp +++ b/source/ps/CLogger.cpp @@ -284,7 +284,7 @@ void CLogger::Render() CFont font(font_name); int lineSpacing = font.GetLineSpacing(); - CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); textTech->BeginPass(); CTextRenderer textRenderer(textTech->GetShader()); diff --git a/source/ps/CStrIntern.cpp b/source/ps/CStrIntern.cpp index 12994be2a1..ea396de7de 100644 --- a/source/ps/CStrIntern.cpp +++ b/source/ps/CStrIntern.cpp @@ -86,6 +86,11 @@ struct StringsKeyProxyEq static boost::unordered_map, StringsKeyHash> g_Strings; +#define X(id) CStrIntern str_##id(#id); +#define X2(id, str) CStrIntern str_##id(str); +#include "CStrInternStatic.h" +#undef X +#undef X2 static CStrInternInternals* GetString(const char* str, size_t len) { @@ -114,7 +119,7 @@ static CStrInternInternals* GetString(const char* str, size_t len) CStrIntern::CStrIntern() { - m = GetString("", 0); + *this = str__emptystring; } CStrIntern::CStrIntern(const char* str) diff --git a/source/ps/CStrIntern.h b/source/ps/CStrIntern.h index 405ffe7fae..6ee5342241 100644 --- a/source/ps/CStrIntern.h +++ b/source/ps/CStrIntern.h @@ -83,4 +83,10 @@ private: CStrInternInternals* m; }; +#define X(id) extern CStrIntern str_##id; +#define X2(id, str) extern CStrIntern str_##id; +#include "CStrInternStatic.h" +#undef X +#undef X2 + #endif // INCLUDED_CSTRINTERN diff --git a/source/ps/CStrInternStatic.h b/source/ps/CStrInternStatic.h new file mode 100644 index 0000000000..500b7c03ab --- /dev/null +++ b/source/ps/CStrInternStatic.h @@ -0,0 +1,148 @@ +/* Copyright (C) 2013 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +// This file defines global CStrIntern variables, to avoid the cost of +// constructing CStrInterns frequently at runtime. +// +// A line like +// X(foo) +// defines a variable str_foo with value "foo". +// +// A line like +// X2(foo_0, "foo[0]") +// defines a variable str_foo_0 with value "foo[0]". + +X(0) +X(1) +X(2) +X(ALPHABLEND_PASS_BLEND) +X(ALPHABLEND_PASS_OPAQUE) +X(BLEND) +X(BLOOM_NOP) +X(BLOOM_PASS_H) +X(BLOOM_PASS_V) +X(DECAL) +X(DISABLE_RECEIVE_SHADOWS) +X(Foam) +X(IGNORE_LOS) +X(MINIMAP_BASE) +X(MINIMAP_LINE) +X(MINIMAP_LOS) +X(MINIMAP_POINT) +X(MODE_SHADOWCAST) +X(MODE_SILHOUETTEDISPLAY) +X(MODE_SILHOUETTEOCCLUDER) +X(MODE_WIREFRAME) +X(SYS_HAS_ARB) +X(SYS_HAS_GLSL) +X(SYS_PREFER_GLSL) +X(USE_FOAM) +X(USE_FP_SHADOW) +X(USE_GPU_SKINNING) +X(USE_INSTANCING) +X(USE_NORMALS) +X(USE_OBJECTCOLOR) +X(USE_REAL_DEPTH) +X(USE_REFLECTION) +X(USE_REFRACTION) +X(USE_SHADOW) +X(USE_SHADOWS) +X(USE_SHADOW_PCF) +X(USE_SHADOW_SAMPLER) +X(USE_WAVES) +X2(_emptystring, "") +X(a_skinJoints) +X(a_skinWeights) +X(a_tangent) +X(ambient) +X(baseTex) +X(blendTex) +X(bloom) +X(blurTex2) +X(blurTex4) +X(blurTex8) +X(brightness) +X(cameraPos) +X(color) +X(colorAdd) +X(colorMul) +X(delta) +X(depthTex) +X(fogColor) +X(fogParams) +X(foreground_overlay) +X(gui_add) +X(gui_basic) +X(gui_grayscale) +X(gui_solid) +X(gui_text) +X(hdr) +X(height) +X(instancingTransform) +X(losMap) +X(losMatrix) +X(losTex) +X(losTex1) +X(losTex2) +X(losTransform) +X(los_interp) +X(mapSize) +X(maskTex) +X(minimap) +X(murkiness) +X(normalMap) +X(normalMap2) +X(objectColor) +X(particle) +X(particle_solid) +X(playerColor) +X(qualityLevel) +X(reflectionMap) +X(reflectionMatrix) +X(reflectionTint) +X(reflectionTintStrength) +X(refractionMap) +X(refractionMatrix) +X(renderedTex) +X(repeatScale) +X(saturation) +X(screenSize) +X(shadingColor) +X(shadowScale) +X(shadowTex) +X(shadowTransform) +X(shininess) +X(skinBlendMatrices) +X2(skinBlendMatrices_0, "skinBlendMatrices[0]") +X(skyCube) +X(sky_simple) +X(specularStrength) +X(sunColor) +X(sunDir) +X(tex) +X(texSize) +X(textureTransform) +X(time) +X(tint) +X(transform) +X(translation) +X(waterTex) +X(waveTex) +X(waviness) +X(width) +X(zFar) +X(zNear) diff --git a/source/ps/ProfileViewer.cpp b/source/ps/ProfileViewer.cpp index 1e0990acb3..240dc3c87a 100644 --- a/source/ps/ProfileViewer.cpp +++ b/source/ps/ProfileViewer.cpp @@ -187,14 +187,14 @@ void CProfileViewer::RenderProfile() estimate_height += 2; estimate_height = lineSpacing*estimate_height; - CShaderTechniquePtr solidTech = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + CShaderTechniquePtr solidTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); solidTech->BeginPass(); CShaderProgramPtr solidShader = solidTech->GetShader(); - solidShader->Uniform("color", 0.0f, 0.0f, 0.0f, 0.5f); + solidShader->Uniform(str_color, 0.0f, 0.0f, 0.0f, 0.5f); CMatrix3D transform = GetDefaultGuiMatrix(); - solidShader->Uniform("transform", transform); + solidShader->Uniform(str_transform, transform); float backgroundVerts[] = { (float)estimate_width, 0.0f, @@ -209,15 +209,15 @@ void CProfileViewer::RenderProfile() glDrawArrays(GL_TRIANGLES, 0, 6); transform.PostTranslate(22.0f, lineSpacing*3.0f, 0.0f); - solidShader->Uniform("transform", transform); + solidShader->Uniform(str_transform, transform); // Draw row backgrounds for (size_t row = 0; row < numrows; ++row) { if (row % 2) - solidShader->Uniform("color", 1.0f, 1.0f, 1.0f, 0.1f); + solidShader->Uniform(str_color, 1.0f, 1.0f, 1.0f, 0.1f); else - solidShader->Uniform("color", 0.0f, 0.0f, 0.0f, 0.1f); + solidShader->Uniform(str_color, 0.0f, 0.0f, 0.0f, 0.1f); float rowVerts[] = { -22.f, 2.f, @@ -233,14 +233,14 @@ void CProfileViewer::RenderProfile() glDrawArrays(GL_TRIANGLES, 0, 6); transform.PostTranslate(0.0f, lineSpacing, 0.0f); - solidShader->Uniform("transform", transform); + solidShader->Uniform(str_transform, transform); } solidTech->EndPass(); // Print table and column titles - CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr textTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); textTech->BeginPass(); CTextRenderer textRenderer(textTech->GetShader()); diff --git a/source/ps/ThreadUtil.cpp b/source/ps/ThreadUtil.cpp index a4b927f846..458ade8cfe 100644 --- a/source/ps/ThreadUtil.cpp +++ b/source/ps/ThreadUtil.cpp @@ -19,14 +19,21 @@ #include "ThreadUtil.h" +static bool g_MainThreadSet; static pthread_t g_MainThread; bool ThreadUtil::IsMainThread() { + // If SetMainThread hasn't been called yet, this is probably being + // called at static initialisation time, so it must be the main thread + if (!g_MainThreadSet) + return true; + return pthread_equal(pthread_self(), g_MainThread) ? true : false; } void ThreadUtil::SetMainThread() { g_MainThread = pthread_self(); + g_MainThreadSet = true; } diff --git a/source/renderer/DecalRData.cpp b/source/renderer/DecalRData.cpp index ead1f5e61f..e57dfff8c2 100644 --- a/source/renderer/DecalRData.cpp +++ b/source/renderer/DecalRData.cpp @@ -74,7 +74,7 @@ void CDecalRData::RenderDecals(std::vector& decals, const CShaderD ShadowMap* shadow, bool isDummyShader, const CShaderProgramPtr& dummy) { CShaderDefines contextDecal = context; - contextDecal.Add("DECAL", "1"); + contextDecal.Add(str_DECAL, str_1); for (size_t i = 0; i < decals.size(); ++i) { @@ -127,7 +127,7 @@ void CDecalRData::RenderDecals(std::vector& decals, const CShaderD for (size_t s = 0; s < samplersNum; ++s) { CMaterial::TextureSampler &samp = samplers[s]; - shader->BindTexture(samp.Name.c_str(), samp.Sampler); + shader->BindTexture(samp.Name, samp.Sampler); } material.GetStaticUniforms().BindUniforms(shader); @@ -157,7 +157,7 @@ void CDecalRData::RenderDecals(std::vector& decals, const CShaderD #endif { - shader->Uniform("shadingColor", decal->m_Decal->GetShadingColor()); + shader->Uniform(str_shadingColor, decal->m_Decal->GetShadingColor()); } shader->VertexPointer(3, GL_FLOAT, stride, base + decal->m_Position.offset); diff --git a/source/renderer/InstancingModelRenderer.cpp b/source/renderer/InstancingModelRenderer.cpp index aa4c130c04..0355774be5 100644 --- a/source/renderer/InstancingModelRenderer.cpp +++ b/source/renderer/InstancingModelRenderer.cpp @@ -335,7 +335,7 @@ void InstancingModelRenderer::PrepareModelDef(const CShaderProgramPtr& shader, i shader->NormalPointer(GL_FLOAT, stride, base + m->imodeldef->m_Normal.offset); if (m->calculateTangents) - shader->VertexAttribPointer("a_tangent", 4, GL_FLOAT, GL_TRUE, stride, base + m->imodeldef->m_Tangent.offset); + shader->VertexAttribPointer(str_a_tangent, 4, GL_FLOAT, GL_TRUE, stride, base + m->imodeldef->m_Tangent.offset); if (streamflags & STREAM_UV0) shader->TexCoordPointer(GL_TEXTURE0, 2, GL_FLOAT, stride, base + m->imodeldef->m_UVs[0].offset); @@ -346,8 +346,8 @@ void InstancingModelRenderer::PrepareModelDef(const CShaderProgramPtr& shader, i // GPU skinning requires extra attributes to compute positions/normals if (m->gpuSkinning) { - shader->VertexAttribPointer("a_skinJoints", 4, GL_UNSIGNED_BYTE, GL_FALSE, stride, base + m->imodeldef->m_BlendJoints.offset); - shader->VertexAttribPointer("a_skinWeights", 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, base + m->imodeldef->m_BlendWeights.offset); + shader->VertexAttribPointer(str_a_skinJoints, 4, GL_UNSIGNED_BYTE, GL_FALSE, stride, base + m->imodeldef->m_BlendJoints.offset); + shader->VertexAttribPointer(str_a_skinWeights, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, base + m->imodeldef->m_BlendWeights.offset); } shader->AssertPointersBound(); @@ -366,8 +366,8 @@ void InstancingModelRenderer::RenderModel(const CShaderProgramPtr& shader, int U // HACK: NVIDIA drivers return uniform name with "[0]", Intel Windows drivers without; // try uploading both names since one of them should work, and this is easier than // canonicalising the uniform names in CShaderProgramGLSL - shader->Uniform("skinBlendMatrices[0]", mdldef->GetNumBones() + 1, model->GetAnimatedBoneMatrices()); - shader->Uniform("skinBlendMatrices", mdldef->GetNumBones() + 1, model->GetAnimatedBoneMatrices()); + shader->Uniform(str_skinBlendMatrices_0, mdldef->GetNumBones() + 1, model->GetAnimatedBoneMatrices()); + shader->Uniform(str_skinBlendMatrices, mdldef->GetNumBones() + 1, model->GetAnimatedBoneMatrices()); } // render the lot diff --git a/source/renderer/ModelRenderer.cpp b/source/renderer/ModelRenderer.cpp index 873578b193..965eefc533 100644 --- a/source/renderer/ModelRenderer.cpp +++ b/source/renderer/ModelRenderer.cpp @@ -664,7 +664,7 @@ void ShaderModelRenderer::Render(const RenderModifierPtr& modifier, const CShade } else { - bind = shader->GetTextureBinding(samp.Name.c_str()); + bind = shader->GetTextureBinding(samp.Name); texBindings[s] = bind; texBindingNames[s] = samp.Name; } @@ -716,13 +716,13 @@ void ShaderModelRenderer::Render(const RenderModifierPtr& modifier, const CShade int curTex = (int)(time*60/period) % 60; if (WaterMgr->m_RenderWater && WaterMgr->WillRenderFancyWater()) - shader->BindTexture("waterTex", WaterMgr->m_NormalMap[curTex]); + shader->BindTexture(str_waterTex, WaterMgr->m_NormalMap[curTex]); else - shader->BindTexture("waterTex", g_Renderer.GetTextureManager().GetErrorTexture()); + shader->BindTexture(str_waterTex, g_Renderer.GetTextureManager().GetErrorTexture()); } else if (rq.first == RQUERY_SKY_CUBE) { - shader->BindTexture("skyCube", g_Renderer.GetSkyManager()->GetSkyCube()); + shader->BindTexture(str_skyCube, g_Renderer.GetSkyManager()->GetSkyCube()); } } diff --git a/source/renderer/OverlayRenderer.cpp b/source/renderer/OverlayRenderer.cpp index 4d55e458bd..7d08a34257 100644 --- a/source/renderer/OverlayRenderer.cpp +++ b/source/renderer/OverlayRenderer.cpp @@ -138,9 +138,9 @@ OverlayRendererInternals::OverlayRendererInternals() // is because their code is almost identical; the only difference is that for the quad overlays // we want to use a vertex color stream as opposed to an objectColor uniform. To this end, the // shader has been set up to switch between the two behaviours based on the USE_OBJECTCOLOR define. - defsOverlayLineNormal.Add("USE_OBJECTCOLOR", "1"); - defsOverlayLineAlwaysVisible.Add("USE_OBJECTCOLOR", "1"); - defsOverlayLineAlwaysVisible.Add("IGNORE_LOS", "1"); + defsOverlayLineNormal.Add(str_USE_OBJECTCOLOR, str_1); + defsOverlayLineAlwaysVisible.Add(str_USE_OBJECTCOLOR, str_1); + defsOverlayLineAlwaysVisible.Add(str_IGNORE_LOS, str_1); } void OverlayRendererInternals::Initialize() @@ -418,8 +418,8 @@ void OverlayRenderer::RenderTexturedOverlayLines() if (shaderTexLineNormal) { shaderTexLineNormal->Bind(); - shaderTexLineNormal->BindTexture("losTex", los.GetTexture()); - shaderTexLineNormal->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shaderTexLineNormal->BindTexture(str_losTex, los.GetTexture()); + shaderTexLineNormal->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); // batch render only the non-always-visible overlay lines using the normal shader RenderTexturedOverlayLines(shaderTexLineNormal, false); @@ -433,8 +433,8 @@ void OverlayRenderer::RenderTexturedOverlayLines() { shaderTexLineAlwaysVisible->Bind(); // TODO: losTex and losTransform are unused in the always visible shader; see if these can be safely omitted - shaderTexLineAlwaysVisible->BindTexture("losTex", los.GetTexture()); - shaderTexLineAlwaysVisible->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shaderTexLineAlwaysVisible->BindTexture(str_losTex, los.GetTexture()); + shaderTexLineAlwaysVisible->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); // batch render only the always-visible overlay lines using the LoS-ignored shader RenderTexturedOverlayLines(shaderTexLineAlwaysVisible, true); @@ -496,8 +496,8 @@ void OverlayRenderer::RenderQuadOverlays() if (shader) { shader->Bind(); - shader->BindTexture("losTex", los.GetTexture()); - shader->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shader->BindTexture(str_losTex, los.GetTexture()); + shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); // Base offsets (in bytes) of the two backing stores relative to their owner VBO u8* indexBase = m->quadIndices.Bind(); @@ -516,8 +516,8 @@ void OverlayRenderer::RenderQuadOverlays() const QuadBatchKey& maskPair = it->first; - shader->BindTexture("baseTex", maskPair.m_Texture->GetHandle()); - shader->BindTexture("maskTex", maskPair.m_TextureMask->GetHandle()); + shader->BindTexture(str_baseTex, maskPair.m_Texture->GetHandle()); + shader->BindTexture(str_maskTex, maskPair.m_TextureMask->GetHandle()); int streamflags = shader->GetStreamFlags(); @@ -579,7 +579,7 @@ void OverlayRenderer::RenderForegroundOverlays(const CCamera& viewCamera) if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) { - tech = g_Renderer.GetShaderManager().LoadEffect("foreground_overlay"); + tech = g_Renderer.GetShaderManager().LoadEffect(str_foreground_overlay); tech->BeginPass(); shader = tech->GetShader(); } @@ -596,7 +596,7 @@ void OverlayRenderer::RenderForegroundOverlays(const CCamera& viewCamera) SOverlaySprite* sprite = m->sprites[i]; if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) - shader->BindTexture("baseTex", sprite->m_Texture); + shader->BindTexture(str_baseTex, sprite->m_Texture); else sprite->m_Texture->Bind(); diff --git a/source/renderer/ParticleRenderer.cpp b/source/renderer/ParticleRenderer.cpp index 810f1327d4..b0408eb3c4 100644 --- a/source/renderer/ParticleRenderer.cpp +++ b/source/renderer/ParticleRenderer.cpp @@ -86,8 +86,8 @@ void ParticleRenderer::PrepareForRendering(const CShaderDefines& context) // RenderParticles will never be called so it's safe to leave the shaders as null if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) { - m->shader = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("particle"), context, CShaderDefines()); - m->shaderSolid = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("particle_solid"), context, CShaderDefines()); + m->shader = g_Renderer.GetShaderManager().LoadEffect(str_particle, context, CShaderDefines()); + m->shaderSolid = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, context, CShaderDefines()); } } @@ -117,7 +117,7 @@ void ParticleRenderer::RenderParticles(bool solidColor) shader->BeginPass(); - shader->GetShader()->Uniform("transform", g_Renderer.GetViewCamera().GetViewProjection()); + shader->GetShader()->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); if (!solidColor) glEnable(GL_BLEND); diff --git a/source/renderer/PatchRData.cpp b/source/renderer/PatchRData.cpp index af376dab15..56d34ad952 100644 --- a/source/renderer/PatchRData.cpp +++ b/source/renderer/PatchRData.cpp @@ -793,7 +793,7 @@ void CPatchRData::RenderBases(const std::vector& patches, const CS for (size_t s = 0; s < samplersNum; ++s) { CMaterial::TextureSampler &samp = samplers[s]; - shader->BindTexture(samp.Name.c_str(), samp.Sampler); + shader->BindTexture(samp.Name, samp.Sampler); } itt->first->GetMaterial().GetStaticUniforms().BindUniforms(shader); @@ -810,12 +810,12 @@ void CPatchRData::RenderBases(const std::vector& patches, const CS { float c = itt->first->GetTextureMatrix()[0]; float ms = itt->first->GetTextureMatrix()[8]; - shader->Uniform("textureTransform", c, ms, -ms, 0.f); + shader->Uniform(str_textureTransform, c, ms, -ms, 0.f); } } else { - shader->BindTexture("baseTex", g_Renderer.GetTextureManager().GetErrorTexture()); + shader->BindTexture(str_baseTex, g_Renderer.GetTextureManager().GetErrorTexture()); } for (VertexBufferBatches::iterator itv = itt->second.begin(); itv != itt->second.end(); ++itv) @@ -906,7 +906,7 @@ void CPatchRData::RenderBlends(const std::vector& patches, const C BatchesStack batches((BatchesStack::allocator_type(arena))); CShaderDefines contextBlend = context; - contextBlend.Add("BLEND", "1"); + contextBlend.Add(str_BLEND, str_1); PROFILE_START("compute batches"); @@ -1023,10 +1023,10 @@ void CPatchRData::RenderBlends(const std::vector& patches, const C for (size_t s = 0; s < samplersNum; ++s) { CMaterial::TextureSampler &samp = samplers[s]; - shader->BindTexture(samp.Name.c_str(), samp.Sampler); + shader->BindTexture(samp.Name, samp.Sampler); } - shader->BindTexture("blendTex", itt->m_Texture->m_TerrainAlpha->second.m_hCompositeAlphaMap); + shader->BindTexture(str_blendTex, itt->m_Texture->m_TerrainAlpha->second.m_hCompositeAlphaMap); itt->m_Texture->GetMaterial().GetStaticUniforms().BindUniforms(shader); @@ -1043,12 +1043,12 @@ void CPatchRData::RenderBlends(const std::vector& patches, const C { float c = itt->m_Texture->GetTextureMatrix()[0]; float ms = itt->m_Texture->GetTextureMatrix()[8]; - shader->Uniform("textureTransform", c, ms, -ms, 0.f); + shader->Uniform(str_textureTransform, c, ms, -ms, 0.f); } } else { - shader->BindTexture("baseTex", g_Renderer.GetTextureManager().GetErrorTexture()); + shader->BindTexture(str_baseTex, g_Renderer.GetTextureManager().GetErrorTexture()); } for (VertexBufferBatches::iterator itv = itt->m_Batches.begin(); itv != itt->m_Batches.end(); ++itv) diff --git a/source/renderer/PostprocManager.cpp b/source/renderer/PostprocManager.cpp index dd11444deb..e98a092e30 100644 --- a/source/renderer/PostprocManager.cpp +++ b/source/renderer/PostprocManager.cpp @@ -175,8 +175,8 @@ void CPostprocManager::ApplyBlurDownscale2x(GLuint inTex, GLuint outTex, int inW // Get bloom shader with instructions to simply copy texels. CShaderDefines defines; - defines.Add("BLOOM_NOP", "1"); - CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("bloom"), + defines.Add(str_BLOOM_NOP, str_1); + CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_bloom, g_Renderer.GetSystemShaderDefines(), defines); tech->BeginPass(); @@ -192,7 +192,7 @@ void CPostprocManager::ApplyBlurDownscale2x(GLuint inTex, GLuint outTex, int inW glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); - shader->BindTexture("renderedTex", renderedTex); + shader->BindTexture(str_renderedTex, renderedTex); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0, 0, inWidth / 2, inHeight / 2); @@ -217,14 +217,14 @@ void CPostprocManager::ApplyBlurGauss(GLuint inOutTex, GLuint tempTex, int inWid // Get bloom shader, for a horizontal Gaussian blur pass. CShaderDefines defines2; - defines2.Add("BLOOM_PASS_H", "1"); - CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("bloom"), + defines2.Add(str_BLOOM_PASS_H, str_1); + CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_bloom, g_Renderer.GetSystemShaderDefines(), defines2); tech->BeginPass(); CShaderProgramPtr shader = tech->GetShader(); - shader->BindTexture("renderedTex", inOutTex); - shader->Uniform("texSize", inWidth, inHeight, 0.0f, 0.0f); + shader->BindTexture(str_renderedTex, inOutTex); + shader->Uniform(str_texSize, inWidth, inHeight, 0.0f, 0.0f); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0, 0, inWidth, inHeight); @@ -246,16 +246,16 @@ void CPostprocManager::ApplyBlurGauss(GLuint inOutTex, GLuint tempTex, int inWid // Get bloom shader, for a vertical Gaussian blur pass. CShaderDefines defines3; - defines3.Add("BLOOM_PASS_V", "1"); - tech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern("bloom"), + defines3.Add(str_BLOOM_PASS_V, str_1); + tech = g_Renderer.GetShaderManager().LoadEffect(str_bloom, g_Renderer.GetSystemShaderDefines(), defines3); tech->BeginPass(); shader = tech->GetShader(); // Our input texture to the shader is the output of the horizontal pass. - shader->BindTexture("renderedTex", tempTex); - shader->Uniform("texSize", inWidth, inHeight, 0.0f, 0.0f); + shader->BindTexture(str_renderedTex, tempTex); + shader->Uniform(str_texSize, inWidth, inHeight, 0.0f, 0.0f); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0, 0, inWidth, inHeight); @@ -344,7 +344,7 @@ void CPostprocManager::LoadEffect(CStrW &name) if (name != L"default") { CStrW n = L"postproc/" + name; - m_PostProcTech = g_Renderer.GetShaderManager().LoadEffect(n.ToUTF8().c_str()); + m_PostProcTech = g_Renderer.GetShaderManager().LoadEffect(CStrIntern(n.ToUTF8())); } m_PostProcEffect = name; @@ -371,25 +371,25 @@ void CPostprocManager::ApplyEffect(CShaderTechniquePtr &shaderTech1, int pass) // We also bind a bunch of other textures and parameters, but since // this only happens once per frame the overhead is negligible. if (m_WhichBuffer) - shader->BindTexture("renderedTex", m_ColourTex1); + shader->BindTexture(str_renderedTex, m_ColourTex1); else - shader->BindTexture("renderedTex", m_ColourTex2); + shader->BindTexture(str_renderedTex, m_ColourTex2); - shader->BindTexture("depthTex", m_DepthTex); + shader->BindTexture(str_depthTex, m_DepthTex); - shader->BindTexture("blurTex2", m_BlurTex2a); - shader->BindTexture("blurTex4", m_BlurTex4a); - shader->BindTexture("blurTex8", m_BlurTex8a); + shader->BindTexture(str_blurTex2, m_BlurTex2a); + shader->BindTexture(str_blurTex4, m_BlurTex4a); + shader->BindTexture(str_blurTex8, m_BlurTex8a); - shader->Uniform("width", m_Width); - shader->Uniform("height", m_Height); - shader->Uniform("zNear", g_Game->GetView()->GetNear()); - shader->Uniform("zFar", g_Game->GetView()->GetFar()); + shader->Uniform(str_width, m_Width); + shader->Uniform(str_height, m_Height); + shader->Uniform(str_zNear, g_Game->GetView()->GetNear()); + shader->Uniform(str_zFar, g_Game->GetView()->GetFar()); - shader->Uniform("brightness", g_LightEnv.m_Brightness); - shader->Uniform("hdr", g_LightEnv.m_Contrast); - shader->Uniform("saturation", g_LightEnv.m_Saturation); - shader->Uniform("bloom", g_LightEnv.m_Bloom); + shader->Uniform(str_brightness, g_LightEnv.m_Brightness); + shader->Uniform(str_hdr, g_LightEnv.m_Contrast); + shader->Uniform(str_saturation, g_LightEnv.m_Saturation); + shader->Uniform(str_bloom, g_LightEnv.m_Bloom); glBegin(GL_QUADS); glColor4f(1.f, 1.f, 1.f, 1.f); diff --git a/source/renderer/RenderModifiers.cpp b/source/renderer/RenderModifiers.cpp index 1b299b0d9e..37c9815983 100644 --- a/source/renderer/RenderModifiers.cpp +++ b/source/renderer/RenderModifiers.cpp @@ -73,39 +73,39 @@ ShaderRenderModifier::ShaderRenderModifier() void ShaderRenderModifier::BeginPass(const CShaderProgramPtr& shader) { - shader->Uniform("transform", g_Renderer.GetViewCamera().GetViewProjection()); - shader->Uniform("cameraPos", g_Renderer.GetViewCamera().GetOrientation().GetTranslation()); + shader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); + shader->Uniform(str_cameraPos, g_Renderer.GetViewCamera().GetOrientation().GetTranslation()); - if (GetShadowMap() && shader->GetTextureBinding("shadowTex").Active()) + if (GetShadowMap() && shader->GetTextureBinding(str_shadowTex).Active()) { - shader->BindTexture("shadowTex", GetShadowMap()->GetTexture()); - shader->Uniform("shadowTransform", GetShadowMap()->GetTextureMatrix()); + shader->BindTexture(str_shadowTex, GetShadowMap()->GetTexture()); + shader->Uniform(str_shadowTransform, GetShadowMap()->GetTextureMatrix()); int width = GetShadowMap()->GetWidth(); int height = GetShadowMap()->GetHeight(); - shader->Uniform("shadowScale", width, height, 1.0f / width, 1.0f / height); + shader->Uniform(str_shadowScale, width, height, 1.0f / width, 1.0f / height); } if (GetLightEnv()) { - shader->Uniform("ambient", GetLightEnv()->m_UnitsAmbientColor); - shader->Uniform("sunDir", GetLightEnv()->GetSunDir()); - shader->Uniform("sunColor", GetLightEnv()->m_SunColor); + shader->Uniform(str_ambient, GetLightEnv()->m_UnitsAmbientColor); + shader->Uniform(str_sunDir, GetLightEnv()->GetSunDir()); + shader->Uniform(str_sunColor, GetLightEnv()->m_SunColor); - shader->Uniform("fogColor", GetLightEnv()->m_FogColor); - shader->Uniform("fogParams", GetLightEnv()->m_FogFactor, GetLightEnv()->m_FogMax, 0.f, 0.f); + shader->Uniform(str_fogColor, GetLightEnv()->m_FogColor); + shader->Uniform(str_fogParams, GetLightEnv()->m_FogFactor, GetLightEnv()->m_FogMax, 0.f, 0.f); } - if (shader->GetTextureBinding("losTex").Active()) + if (shader->GetTextureBinding(str_losTex).Active()) { CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); - shader->BindTexture("losTex", los.GetTextureSmooth()); + shader->BindTexture(str_losTex, los.GetTextureSmooth()); // Don't bother sending the whole matrix, we just need two floats (scale and translation) - shader->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); } - m_BindingInstancingTransform = shader->GetUniformBinding("instancingTransform"); - m_BindingShadingColor = shader->GetUniformBinding("shadingColor"); - m_BindingPlayerColor = shader->GetUniformBinding("playerColor"); + m_BindingInstancingTransform = shader->GetUniformBinding(str_instancingTransform); + m_BindingShadingColor = shader->GetUniformBinding(str_shadingColor); + m_BindingPlayerColor = shader->GetUniformBinding(str_playerColor); } void ShaderRenderModifier::PrepareModel(const CShaderProgramPtr& shader, CModel* model) diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index be4d7cf094..2216cc4e34 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -352,15 +352,15 @@ public: CShaderDefines contextSkinned = context; if (g_Renderer.m_Options.m_GPUSkinning) { - contextSkinned.Add("USE_INSTANCING", "1"); - contextSkinned.Add("USE_GPU_SKINNING", "1"); + contextSkinned.Add(str_USE_INSTANCING, str_1); + contextSkinned.Add(str_USE_GPU_SKINNING, str_1); } Model.NormalSkinned->Render(Model.ModShader, contextSkinned, flags); if (Model.NormalUnskinned != Model.NormalSkinned) { CShaderDefines contextUnskinned = context; - contextUnskinned.Add("USE_INSTANCING", "1"); + contextUnskinned.Add(str_USE_INSTANCING, str_1); Model.NormalUnskinned->Render(Model.ModShader, contextUnskinned, flags); } } @@ -373,15 +373,15 @@ public: CShaderDefines contextSkinned = context; if (g_Renderer.m_Options.m_GPUSkinning) { - contextSkinned.Add("USE_INSTANCING", "1"); - contextSkinned.Add("USE_GPU_SKINNING", "1"); + contextSkinned.Add(str_USE_INSTANCING, str_1); + contextSkinned.Add(str_USE_GPU_SKINNING, str_1); } Model.TranspSkinned->Render(Model.ModShader, contextSkinned, flags); if (Model.TranspUnskinned != Model.TranspSkinned) { CShaderDefines contextUnskinned = context; - contextUnskinned.Add("USE_INSTANCING", "1"); + contextUnskinned.Add(str_USE_INSTANCING, str_1); Model.TranspUnskinned->Render(Model.ModShader, contextUnskinned, flags); } } @@ -539,13 +539,13 @@ CShaderDefines CRenderer::ComputeSystemShaderDefines() CShaderDefines defines; if (GetRenderPath() == RP_SHADER && m_Caps.m_ARBProgram) - defines.Add("SYS_HAS_ARB", "1"); + defines.Add(str_SYS_HAS_ARB, str_1); if (GetRenderPath() == RP_SHADER && m_Caps.m_VertexShader && m_Caps.m_FragmentShader) - defines.Add("SYS_HAS_GLSL", "1"); + defines.Add(str_SYS_HAS_GLSL, str_1); if (m_Options.m_PreferGLSL) - defines.Add("SYS_PREFER_GLSL", "1"); + defines.Add(str_SYS_PREFER_GLSL, str_1); return defines; } @@ -560,18 +560,18 @@ void CRenderer::ReloadShaders() if (m_Caps.m_Shadows && m_Options.m_Shadows) { - m->globalContext.Add("USE_SHADOW", "1"); + m->globalContext.Add(str_USE_SHADOW, str_1); if (m_Caps.m_ARBProgramShadow && m_Options.m_ARBProgramShadow) - m->globalContext.Add("USE_FP_SHADOW", "1"); + m->globalContext.Add(str_USE_FP_SHADOW, str_1); if (m_Options.m_ShadowPCF) - m->globalContext.Add("USE_SHADOW_PCF", "1"); + m->globalContext.Add(str_USE_SHADOW_PCF, str_1); #if !CONFIG2_GLES - m->globalContext.Add("USE_SHADOW_SAMPLER", "1"); + m->globalContext.Add(str_USE_SHADOW_SAMPLER, str_1); #endif } if (m_LightEnv) - m->globalContext.Add(("LIGHTING_MODEL_" + m_LightEnv->GetLightingModel()).c_str(), "1"); + m->globalContext.Add(CStrIntern("LIGHTING_MODEL_" + m_LightEnv->GetLightingModel()), str_1); m->Model.ModShader = LitRenderModifierPtr(new ShaderRenderModifier()); @@ -875,7 +875,7 @@ void CRenderer::RenderShadowMap(const CShaderDefines& context) } CShaderDefines contextCast = context; - contextCast.Add("MODE_SHADOWCAST", "1"); + contextCast.Add(str_MODE_SHADOWCAST, str_1); { PROFILE("render models"); @@ -1003,7 +1003,7 @@ void CRenderer::RenderModels(const CShaderDefines& context, const CFrustum* frus else if (m_ModelRenderMode == EDGED_FACES) { CShaderDefines contextWireframe = context; - contextWireframe.Add("MODE_WIREFRAME", "1"); + contextWireframe.Add(str_MODE_WIREFRAME, str_1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDisable(GL_TEXTURE_2D); @@ -1040,10 +1040,10 @@ void CRenderer::RenderTransparentModels(const CShaderDefines& context, ETranspar glDisable(GL_CULL_FACE); CShaderDefines contextOpaque = context; - contextOpaque.Add("ALPHABLEND_PASS_OPAQUE", "1"); + contextOpaque.Add(str_ALPHABLEND_PASS_OPAQUE, str_1); CShaderDefines contextBlend = context; - contextBlend.Add("ALPHABLEND_PASS_BLEND", "1"); + contextBlend.Add(str_ALPHABLEND_PASS_BLEND, str_1); if (transparentMode == TRANSPARENT || transparentMode == TRANSPARENT_OPAQUE) m->CallTranspModelRenderers(contextOpaque, flags); @@ -1063,7 +1063,7 @@ void CRenderer::RenderTransparentModels(const CShaderDefines& context, ETranspar else if (m_ModelRenderMode == EDGED_FACES) { CShaderDefines contextWireframe = contextOpaque; - contextWireframe.Add("MODE_WIREFRAME", "1"); + contextWireframe.Add(str_MODE_WIREFRAME, str_1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDisable(GL_TEXTURE_2D); @@ -1284,10 +1284,10 @@ void CRenderer::RenderSilhouettes(const CShaderDefines& context) PROFILE3_GPU("silhouettes"); CShaderDefines contextOccluder = context; - contextOccluder.Add("MODE_SILHOUETTEOCCLUDER", "1"); + contextOccluder.Add(str_MODE_SILHOUETTEOCCLUDER, str_1); CShaderDefines contextDisplay = context; - contextDisplay.Add("MODE_SILHOUETTEDISPLAY", "1"); + contextDisplay.Add(str_MODE_SILHOUETTEDISPLAY, str_1); // Render silhouettes of units hidden behind terrain or occluders. // To avoid breaking the standard rendering of alpha-blended objects, this @@ -1401,11 +1401,11 @@ void CRenderer::RenderParticles() m->particleRenderer.RenderParticles(true); - CShaderTechniquePtr shaderTech = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + CShaderTechniquePtr shaderTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); shaderTech->BeginPass(); CShaderProgramPtr shader = shaderTech->GetShader(); - shader->Uniform("color", 0.0f, 1.0f, 0.0f, 1.0f); - shader->Uniform("transform", m_ViewCamera.GetViewProjection()); + shader->Uniform(str_color, 0.0f, 1.0f, 0.0f, 1.0f); + shader->Uniform(str_transform, m_ViewCamera.GetViewProjection()); m->particleRenderer.RenderBounds(shader); diff --git a/source/renderer/ShadowMap.cpp b/source/renderer/ShadowMap.cpp index df33642543..cbe7aa11f5 100644 --- a/source/renderer/ShadowMap.cpp +++ b/source/renderer/ShadowMap.cpp @@ -570,7 +570,7 @@ int ShadowMap::GetHeight() const void ShadowMap::RenderDebugBounds() { - CShaderTechniquePtr shaderTech = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + CShaderTechniquePtr shaderTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); shaderTech->BeginPass(); CShaderProgramPtr shader = shaderTech->GetShader(); @@ -578,15 +578,15 @@ void ShadowMap::RenderDebugBounds() glDisable(GL_CULL_FACE); // Render shadow bound - shader->Uniform("transform", g_Renderer.GetViewCamera().GetViewProjection() * m->InvLightTransform); + shader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection() * m->InvLightTransform); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - shader->Uniform("color", 0.0f, 0.0f, 1.0f, 0.25f); + shader->Uniform(str_color, 0.0f, 0.0f, 1.0f, 0.25f); m->ShadowBound.Render(shader); glDisable(GL_BLEND); - shader->Uniform("color", 0.0f, 0.0f, 1.0f, 1.0f); + shader->Uniform(str_color, 0.0f, 0.0f, 1.0f, 1.0f); m->ShadowBound.RenderOutline(shader); // Draw a funny line/triangle direction indicator thing for unknown reasons @@ -656,12 +656,12 @@ void ShadowMap::RenderDebugTexture() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); #endif - CShaderTechniquePtr texTech = g_Renderer.GetShaderManager().LoadEffect("gui_basic"); + CShaderTechniquePtr texTech = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic); texTech->BeginPass(); CShaderProgramPtr texShader = texTech->GetShader(); - texShader->Uniform("transform", GetDefaultGuiMatrix()); - texShader->BindTexture("tex", m->Texture); + texShader->Uniform(str_transform, GetDefaultGuiMatrix()); + texShader->BindTexture(str_tex, m->Texture); float s = 256.f; float boxVerts[] = { diff --git a/source/renderer/SkyManager.cpp b/source/renderer/SkyManager.cpp index 3da9416a04..a05706c036 100644 --- a/source/renderer/SkyManager.cpp +++ b/source/renderer/SkyManager.cpp @@ -260,10 +260,10 @@ void SkyManager::RenderSky() if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) { - skytech = g_Renderer.GetShaderManager().LoadEffect("sky_simple"); + skytech = g_Renderer.GetShaderManager().LoadEffect(str_sky_simple); skytech->BeginPass(); shader = skytech->GetShader(); - shader->BindTexture("baseTex", m_SkyCubeMap); + shader->BindTexture(str_baseTex, m_SkyCubeMap); } else { diff --git a/source/renderer/TerrainRenderer.cpp b/source/renderer/TerrainRenderer.cpp index 1d26a9237e..4fd89a1a39 100644 --- a/source/renderer/TerrainRenderer.cpp +++ b/source/renderer/TerrainRenderer.cpp @@ -468,30 +468,30 @@ void TerrainRenderer::RenderTerrainOverlayTexture(CMatrix3D& textureMatrix) */ void TerrainRenderer::PrepareShader(const CShaderProgramPtr& shader, ShadowMap* shadow) { - shader->Uniform("transform", g_Renderer.GetViewCamera().GetViewProjection()); - shader->Uniform("cameraPos", g_Renderer.GetViewCamera().GetOrientation().GetTranslation()); + shader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); + shader->Uniform(str_cameraPos, g_Renderer.GetViewCamera().GetOrientation().GetTranslation()); const CLightEnv& lightEnv = g_Renderer.GetLightEnv(); if (shadow) { - shader->BindTexture("shadowTex", shadow->GetTexture()); - shader->Uniform("shadowTransform", shadow->GetTextureMatrix()); + shader->BindTexture(str_shadowTex, shadow->GetTexture()); + shader->Uniform(str_shadowTransform, shadow->GetTextureMatrix()); int width = shadow->GetWidth(); int height = shadow->GetHeight(); - shader->Uniform("shadowScale", width, height, 1.0f / width, 1.0f / height); + shader->Uniform(str_shadowScale, width, height, 1.0f / width, 1.0f / height); } CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); - shader->BindTexture("losTex", los.GetTextureSmooth()); - shader->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); + shader->BindTexture(str_losTex, los.GetTextureSmooth()); + shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); - shader->Uniform("ambient", lightEnv.m_TerrainAmbientColor); - shader->Uniform("sunColor", lightEnv.m_SunColor); - shader->Uniform("sunDir", lightEnv.GetSunDir()); + shader->Uniform(str_ambient, lightEnv.m_TerrainAmbientColor); + shader->Uniform(str_sunColor, lightEnv.m_SunColor); + shader->Uniform(str_sunDir, lightEnv.GetSunDir()); - shader->Uniform("fogColor", lightEnv.m_FogColor); - shader->Uniform("fogParams", lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); + shader->Uniform(str_fogColor, lightEnv.m_FogColor); + shader->Uniform(str_fogParams, lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); } void TerrainRenderer::RenderTerrainShader(const CShaderDefines& context, ShadowMap* shadow, bool filtered) @@ -504,11 +504,11 @@ void TerrainRenderer::RenderTerrainShader(const CShaderDefines& context, ShadowM return; // render the solid black sides of the map first - CShaderTechniquePtr techSolid = g_Renderer.GetShaderManager().LoadEffect("gui_solid"); + CShaderTechniquePtr techSolid = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); techSolid->BeginPass(); CShaderProgramPtr shaderSolid = techSolid->GetShader(); - shaderSolid->Uniform("transform", g_Renderer.GetViewCamera().GetViewProjection()); - shaderSolid->Uniform("color", 0.0f, 0.0f, 0.0f, 1.0f); + shaderSolid->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); + shaderSolid->Uniform(str_color, 0.0f, 0.0f, 0.0f, 1.0f); PROFILE_START("render terrain sides"); for (size_t i = 0; i < visiblePatches.size(); ++i) @@ -655,27 +655,27 @@ bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, ShadowMap* // If we're using fancy water, make sure its shader is loaded if (!m->fancyWaterShader || WaterMgr->m_NeedsReloading) { - if(WaterMgr->m_WaterNormal) - defines.Add("USE_NORMALS","1"); - if(WaterMgr->m_WaterRealDepth) - defines.Add("USE_REAL_DEPTH","1"); - if(WaterMgr->m_WaterFoam && !g_AtlasGameLoop->running) - defines.Add("USE_FOAM","1"); - if(WaterMgr->m_WaterCoastalWaves && !g_AtlasGameLoop->running) - defines.Add("USE_WAVES","1"); - if(WaterMgr->m_WaterRefraction) - defines.Add("USE_REFRACTION","1"); - if(WaterMgr->m_WaterReflection) - defines.Add("USE_REFLECTION","1"); - if(shadow && WaterMgr->m_WaterShadows) - defines.Add("USE_SHADOWS","1"); + if (WaterMgr->m_WaterNormal) + defines.Add(str_USE_NORMALS, str_1); + if (WaterMgr->m_WaterRealDepth) + defines.Add(str_USE_REAL_DEPTH, str_1); + if (WaterMgr->m_WaterFoam && !g_AtlasGameLoop->running) + defines.Add(str_USE_FOAM, str_1); + if (WaterMgr->m_WaterCoastalWaves && !g_AtlasGameLoop->running) + defines.Add(str_USE_WAVES, str_1); + if (WaterMgr->m_WaterRefraction) + defines.Add(str_USE_REFRACTION, str_1); + if (WaterMgr->m_WaterReflection) + defines.Add(str_USE_REFLECTION, str_1); + if (shadow && WaterMgr->m_WaterShadows) + defines.Add(str_USE_SHADOWS, str_1); m->wavesShader = g_Renderer.GetShaderManager().LoadProgram("glsl/waves", defines); if (!m->wavesShader) { LOGERROR(L"Failed to load waves shader. Deactivating waves.\n"); g_Renderer.SetOptionBool(CRenderer::OPT_WATERCOASTALWAVES, false); - defines.Add("USE_WAVES","0"); + defines.Add(str_USE_WAVES, str_0); } // haven't updated the ARB shader yet so I'll always load the GLSL @@ -771,10 +771,10 @@ bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, ShadowMap* // rendering m->wavesShader->Bind(); - m->wavesShader->BindTexture("waveTex", WaterMgr->m_Wave); - m->wavesShader->Uniform("time", (float)time); - m->wavesShader->Uniform("waviness", WaterMgr->m_Waviness); - m->wavesShader->Uniform("mapSize", (float)(WaterMgr->m_TexSize)); + m->wavesShader->BindTexture(str_waveTex, WaterMgr->m_Wave); + m->wavesShader->Uniform(str_time, (float)time); + m->wavesShader->Uniform(str_waviness, WaterMgr->m_Waviness); + m->wavesShader->Uniform(str_mapSize, (float)(WaterMgr->m_TexSize)); SWavesVertex *base=(SWavesVertex *)WaterMgr->m_VBWaves->m_Owner->Bind(); GLsizei stride = sizeof(SWavesVertex); @@ -805,57 +805,57 @@ bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, ShadowMap* const CCamera& camera = g_Renderer.GetViewCamera(); CVector3D camPos = camera.m_Orientation.GetTranslation(); - m->fancyWaterShader->BindTexture("normalMap", WaterMgr->m_NormalMap[curTex]); - m->fancyWaterShader->BindTexture("normalMap2", WaterMgr->m_NormalMap[nexTex]); + m->fancyWaterShader->BindTexture(str_normalMap, WaterMgr->m_NormalMap[curTex]); + m->fancyWaterShader->BindTexture(str_normalMap2, WaterMgr->m_NormalMap[nexTex]); if (WaterMgr->m_WaterFoam || WaterMgr->m_WaterCoastalWaves) { - m->fancyWaterShader->BindTexture("Foam", WaterMgr->m_Foam); - m->fancyWaterShader->Uniform("mapSize", (float)(WaterMgr->m_TexSize)); + m->fancyWaterShader->BindTexture(str_Foam, WaterMgr->m_Foam); + m->fancyWaterShader->Uniform(str_mapSize, (float)(WaterMgr->m_TexSize)); } if (WaterMgr->m_WaterRealDepth) - m->fancyWaterShader->BindTexture("depthTex", WaterMgr->m_depthTT); + m->fancyWaterShader->BindTexture(str_depthTex, WaterMgr->m_depthTT); if (WaterMgr->m_WaterCoastalWaves) - m->fancyWaterShader->BindTexture("waveTex", WaterMgr->m_waveTT); + m->fancyWaterShader->BindTexture(str_waveTex, WaterMgr->m_waveTT); if (WaterMgr->m_WaterReflection) - m->fancyWaterShader->BindTexture("reflectionMap", WaterMgr->m_ReflectionTexture); + m->fancyWaterShader->BindTexture(str_reflectionMap, WaterMgr->m_ReflectionTexture); if (WaterMgr->m_WaterRefraction) - m->fancyWaterShader->BindTexture("refractionMap", WaterMgr->m_RefractionTexture); + m->fancyWaterShader->BindTexture(str_refractionMap, WaterMgr->m_RefractionTexture); - m->fancyWaterShader->BindTexture("losMap", losTexture.GetTextureSmooth()); + m->fancyWaterShader->BindTexture(str_losMap, losTexture.GetTextureSmooth()); const CLightEnv& lightEnv = g_Renderer.GetLightEnv(); // TODO: only bind what's really needed for that. - m->fancyWaterShader->Uniform("sunDir", lightEnv.GetSunDir()); - m->fancyWaterShader->Uniform("sunColor", lightEnv.m_SunColor.X); - m->fancyWaterShader->Uniform("color", WaterMgr->m_WaterColor); - m->fancyWaterShader->Uniform("shininess", WaterMgr->m_Shininess); - m->fancyWaterShader->Uniform("specularStrength", WaterMgr->m_SpecularStrength); - m->fancyWaterShader->Uniform("waviness", WaterMgr->m_Waviness); - m->fancyWaterShader->Uniform("murkiness", WaterMgr->m_Murkiness); - m->fancyWaterShader->Uniform("tint", WaterMgr->m_WaterTint); - m->fancyWaterShader->Uniform("reflectionTintStrength", WaterMgr->m_ReflectionTintStrength); - m->fancyWaterShader->Uniform("reflectionTint", WaterMgr->m_ReflectionTint); - m->fancyWaterShader->Uniform("translation", tx, ty); - m->fancyWaterShader->Uniform("repeatScale", 1.0f / repeatPeriod); - m->fancyWaterShader->Uniform("reflectionMatrix", WaterMgr->m_ReflectionMatrix); - m->fancyWaterShader->Uniform("refractionMatrix", WaterMgr->m_RefractionMatrix); - m->fancyWaterShader->Uniform("losMatrix", losTexture.GetTextureMatrix()); - m->fancyWaterShader->Uniform("cameraPos", camPos); - m->fancyWaterShader->Uniform("fogColor", lightEnv.m_FogColor); - m->fancyWaterShader->Uniform("fogParams", lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); - m->fancyWaterShader->Uniform("time", (float)time); - m->fancyWaterShader->Uniform("screenSize", (float)g_Renderer.GetWidth(), (float)g_Renderer.GetHeight(), 0.0f, 0.0f); - m->fancyWaterShader->BindTexture("skyCube", g_Renderer.GetSkyManager()->GetSkyCube()); + m->fancyWaterShader->Uniform(str_sunDir, lightEnv.GetSunDir()); + m->fancyWaterShader->Uniform(str_sunColor, lightEnv.m_SunColor.X); + m->fancyWaterShader->Uniform(str_color, WaterMgr->m_WaterColor); + m->fancyWaterShader->Uniform(str_shininess, WaterMgr->m_Shininess); + m->fancyWaterShader->Uniform(str_specularStrength, WaterMgr->m_SpecularStrength); + m->fancyWaterShader->Uniform(str_waviness, WaterMgr->m_Waviness); + m->fancyWaterShader->Uniform(str_murkiness, WaterMgr->m_Murkiness); + m->fancyWaterShader->Uniform(str_tint, WaterMgr->m_WaterTint); + m->fancyWaterShader->Uniform(str_reflectionTintStrength, WaterMgr->m_ReflectionTintStrength); + m->fancyWaterShader->Uniform(str_reflectionTint, WaterMgr->m_ReflectionTint); + m->fancyWaterShader->Uniform(str_translation, tx, ty); + m->fancyWaterShader->Uniform(str_repeatScale, 1.0f / repeatPeriod); + m->fancyWaterShader->Uniform(str_reflectionMatrix, WaterMgr->m_ReflectionMatrix); + m->fancyWaterShader->Uniform(str_refractionMatrix, WaterMgr->m_RefractionMatrix); + m->fancyWaterShader->Uniform(str_losMatrix, losTexture.GetTextureMatrix()); + m->fancyWaterShader->Uniform(str_cameraPos, camPos); + m->fancyWaterShader->Uniform(str_fogColor, lightEnv.m_FogColor); + m->fancyWaterShader->Uniform(str_fogParams, lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f); + m->fancyWaterShader->Uniform(str_time, (float)time); + m->fancyWaterShader->Uniform(str_screenSize, (float)g_Renderer.GetWidth(), (float)g_Renderer.GetHeight(), 0.0f, 0.0f); + m->fancyWaterShader->BindTexture(str_skyCube, g_Renderer.GetSkyManager()->GetSkyCube()); if (shadow && WaterMgr->m_WaterShadows) { - m->fancyWaterShader->BindTexture("shadowTex", shadow->GetTexture()); - m->fancyWaterShader->Uniform("shadowTransform", shadow->GetTextureMatrix()); + m->fancyWaterShader->BindTexture(str_shadowTex, shadow->GetTexture()); + m->fancyWaterShader->Uniform(str_shadowTransform, shadow->GetTextureMatrix()); int width = shadow->GetWidth(); int height = shadow->GetHeight(); - m->fancyWaterShader->Uniform("shadowScale", width, height, 1.0f / width, 1.0f / height); + m->fancyWaterShader->Uniform(str_shadowScale, width, height, 1.0f / width, 1.0f / height); } for (size_t i = 0; i < m->visiblePatches.size(); ++i) @@ -996,7 +996,7 @@ void TerrainRenderer::RenderPriorities() ENSURE(m->phase == Phase_Render); - CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect("gui_text"); + CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); tech->BeginPass(); CTextRenderer textRenderer(tech->GetShader()); diff --git a/source/renderer/TexturedLineRData.cpp b/source/renderer/TexturedLineRData.cpp index 2c2cdcffd4..4cca462a6e 100644 --- a/source/renderer/TexturedLineRData.cpp +++ b/source/renderer/TexturedLineRData.cpp @@ -41,9 +41,9 @@ void CTexturedLineRData::Render(const SOverlayTexturedLine& line, const CShaderP const int streamFlags = shader->GetStreamFlags(); - shader->BindTexture("baseTex", line.m_TextureBase->GetHandle()); - shader->BindTexture("maskTex", line.m_TextureMask->GetHandle()); - shader->Uniform("objectColor", line.m_Color); + shader->BindTexture(str_baseTex, line.m_TextureBase->GetHandle()); + shader->BindTexture(str_maskTex, line.m_TextureMask->GetHandle()); + shader->Uniform(str_objectColor, line.m_Color); GLsizei stride = sizeof(CTexturedLineRData::SVertex); CTexturedLineRData::SVertex* vertexBase = reinterpret_cast(m_VB->m_Owner->Bind());