From 7339a346e39df5207230de7463a89bc1e2f2b69f Mon Sep 17 00:00:00 2001 From: Ykkrosh Date: Wed, 6 Apr 2011 22:07:13 +0000 Subject: [PATCH] Renderer simplification: Remove fixed-function shadowing. Remove now-unused diffuse-only model lighting mode. This was SVN commit r9187. --- .../renderer/FixedFunctionModelRenderer.cpp | 8 +- source/renderer/FixedFunctionModelRenderer.h | 8 +- source/renderer/ModelRenderer.cpp | 29 +-- source/renderer/ModelRenderer.h | 5 +- source/renderer/PlayerRenderer.cpp | 155 ------------ source/renderer/PlayerRenderer.h | 22 -- source/renderer/RenderModifiers.cpp | 84 ------- source/renderer/RenderModifiers.h | 19 -- source/renderer/Renderer.cpp | 130 ++++------ source/renderer/TerrainRenderer.cpp | 229 +++--------------- source/renderer/TerrainRenderer.h | 6 +- source/renderer/TransparencyRenderer.cpp | 139 +---------- source/renderer/TransparencyRenderer.h | 23 -- 13 files changed, 96 insertions(+), 761 deletions(-) diff --git a/source/renderer/FixedFunctionModelRenderer.cpp b/source/renderer/FixedFunctionModelRenderer.cpp index f884f50c20..7b345b8054 100644 --- a/source/renderer/FixedFunctionModelRenderer.cpp +++ b/source/renderer/FixedFunctionModelRenderer.cpp @@ -102,18 +102,14 @@ struct FixedFunctionModelRendererInternals /// Previously prepared modeldef FFModelDef* ffmodeldef; - - /// If true, primary color will only contain the diffuse term - bool colorIsDiffuseOnly; }; // Construction and Destruction -FixedFunctionModelRenderer::FixedFunctionModelRenderer(bool colorIsDiffuseOnly) +FixedFunctionModelRenderer::FixedFunctionModelRenderer() { m = new FixedFunctionModelRendererInternals; m->ffmodeldef = 0; - m->colorIsDiffuseOnly = colorIsDiffuseOnly; } FixedFunctionModelRenderer::~FixedFunctionModelRenderer() @@ -173,7 +169,7 @@ void FixedFunctionModelRenderer::UpdateModelData(CModel* model, void* data, int VertexArrayIterator Color = ffmodel->m_Color.GetIterator(); - ModelRenderer::BuildColor4ub(model, Normal, Color, m->colorIsDiffuseOnly); + ModelRenderer::BuildColor4ub(model, Normal, Color); // upload everything to vertex buffer ffmodel->m_Array.Upload(); diff --git a/source/renderer/FixedFunctionModelRenderer.h b/source/renderer/FixedFunctionModelRenderer.h index 9cb975cbcb..0df5428616 100644 --- a/source/renderer/FixedFunctionModelRenderer.h +++ b/source/renderer/FixedFunctionModelRenderer.h @@ -34,13 +34,7 @@ struct FixedFunctionModelRendererInternals; class FixedFunctionModelRenderer : public ModelVertexRenderer { public: - /** - * FixedFunctionModelRenderer: Constructor. - * - * @param colorIsDiffuseOnly if true, the primary color sent to the fragment stage - * contains only the diffuse term, and not the ambient - */ - FixedFunctionModelRenderer(bool colorIsDiffuseOnly); + FixedFunctionModelRenderer(); ~FixedFunctionModelRenderer(); // Implementations diff --git a/source/renderer/ModelRenderer.cpp b/source/renderer/ModelRenderer.cpp index 57b264d3a4..45fa0927b8 100644 --- a/source/renderer/ModelRenderer.cpp +++ b/source/renderer/ModelRenderer.cpp @@ -106,8 +106,7 @@ void ModelRenderer::BuildPositionAndNormals( void ModelRenderer::BuildColor4ub( CModel* model, const VertexArrayIterator& Normal, - const VertexArrayIterator& Color, - bool onlyDiffuse) + const VertexArrayIterator& Color) { PROFILE( "lighting vertices" ); @@ -117,27 +116,13 @@ void ModelRenderer::BuildColor4ub( CColor shadingColor = model->GetShadingColor(); RGBColor tempcolor; - if (onlyDiffuse) + for (size_t j=0; jGetModelDef()->GetNumVertices() vertices. - * @param onlyDiffuse if true, color will only contain the diffuse term (instead - * of both ambient and diffuse) */ static void BuildColor4ub( CModel* model, const VertexArrayIterator& Normal, - const VertexArrayIterator& Color, - bool onlyDiffuse); + const VertexArrayIterator& Color); /** * BuildUV: Copy UV coordinates into the given vertex array. diff --git a/source/renderer/PlayerRenderer.cpp b/source/renderer/PlayerRenderer.cpp index 1b3643bcbe..6a172e49a0 100644 --- a/source/renderer/PlayerRenderer.cpp +++ b/source/renderer/PlayerRenderer.cpp @@ -254,161 +254,6 @@ void SlowPlayerColorRender::PrepareModel(int pass, CModel* model) } -/////////////////////////////////////////////////////////////////////////////////////////////////// -// LitPlayerColorRender - -LitPlayerColorRender::LitPlayerColorRender() -{ -} - -LitPlayerColorRender::~LitPlayerColorRender() -{ -} - -int LitPlayerColorRender::BeginPass(int pass) -{ - debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture()); - - if (pass == 0) - { - // First pass: Lay down the material color - // We calculate: - // Material = Texture*(PlayerColor*(1.0-Texture.a) + 1.0*Texture.a)) - // = (1 - ((1 - PlayerColor) * (1 - Texture.a)))*Texture - - // Incoming Color holds the player color - // Texture 0 holds the model's texture - - // TexEnv #0 - pglActiveTextureARB(GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_ONE_MINUS_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR); - - // Don't care about alpha; set it to something harmless - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - // TexEnv #1 - pglActiveTextureARB(GL_TEXTURE0+1); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_ONE_MINUS_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - - // Don't care about alpha; set it to something harmless - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE0); - - return STREAM_POS|STREAM_UV0; - } - else - { - // Second pass: Multiply with lighting - // - // We calculate: - // Lighting = Ambient + Diffuse * Shadow - // and modulate with frame buffer contents - // - // Incoming color is diffuse - // Texture 1 is the shadow map - - // TexEnv #0 - pglActiveTextureARB(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - // TexEnv #1 - pglActiveTextureARB(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X); - - pglActiveTextureARB(GL_TEXTURE0); - - // Blending, Z settings - glEnable(GL_BLEND); - glBlendFunc(GL_DST_COLOR, GL_ZERO); - - glDepthMask(0); - - return STREAM_POS|STREAM_COLOR|STREAM_TEXGENTOUV1; - } -} - - -bool LitPlayerColorRender::EndPass(int pass) -{ - if (pass == 0) - { - return false; - } - else - { - // Restore state - pglActiveTextureARB(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - pglActiveTextureARB(GL_TEXTURE0); - - glDisable(GL_BLEND); - glDepthMask(1); - - return true; - } -} - -const CMatrix3D* LitPlayerColorRender::GetTexGenMatrix(int UNUSED(pass)) -{ - return &GetShadowMap()->GetTextureMatrix(); -} - -void LitPlayerColorRender::PrepareTexture(int pass, CTexturePtr& texture) -{ - if (pass == 0) - texture->Bind(0); -} - -void LitPlayerColorRender::PrepareModel(int pass, CModel* model) -{ - if (pass == 0) - { - // Get the player color - SMaterialColor colour = model->GetMaterial().GetObjectColor(); - - // Send the player color - glColor3f(colour.r, colour.g, colour.b); - } -} - /////////////////////////////////////////////////////////////////////////////////////////////// // SolidPlayerColorRender diff --git a/source/renderer/PlayerRenderer.h b/source/renderer/PlayerRenderer.h index 5b072dcf8d..34cb0cbf2c 100644 --- a/source/renderer/PlayerRenderer.h +++ b/source/renderer/PlayerRenderer.h @@ -78,28 +78,6 @@ public: }; -/** - * Class LitPlayerColorRender: Render models fully textured and lit including shadows - * and player color. - * - * @note Only use a LitPlayerColorRenderer instance when depth texture based shadows - * are supported by the OpenGL implementation (as verified by CRenderer::m_Caps::m_DepthTextureShadows). - */ -class LitPlayerColorRender : public LitRenderModifier -{ -public: - LitPlayerColorRender(); - ~LitPlayerColorRender(); - - // Implementation - int BeginPass(int pass); - bool EndPass(int pass); - const CMatrix3D* GetTexGenMatrix(int pass); - void PrepareTexture(int pass, CTexturePtr& texture); - void PrepareModel(int pass, CModel* model); -}; - - /** * Render all models using their player color without lighting. */ diff --git a/source/renderer/RenderModifiers.cpp b/source/renderer/RenderModifiers.cpp index 767f453490..dd5b8f7fa8 100644 --- a/source/renderer/RenderModifiers.cpp +++ b/source/renderer/RenderModifiers.cpp @@ -132,90 +132,6 @@ void PlainRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture) } -/////////////////////////////////////////////////////////////////////////////////////////////// -// PlainLitRenderModifier implementation - -PlainLitRenderModifier::PlainLitRenderModifier() -{ -} - -PlainLitRenderModifier::~PlainLitRenderModifier() -{ -} - -int PlainLitRenderModifier::BeginPass(int pass) -{ - debug_assert(pass == 0); - debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture()); - - // Ambient + Diffuse * Shadow - pglActiveTextureARB(GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X); - - // Incoming color is ambient + diffuse light - pglActiveTextureARB(GL_TEXTURE2); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE0); - - return STREAM_POS|STREAM_COLOR|STREAM_UV0|STREAM_TEXGENTOUV1; -} - -const CMatrix3D* PlainLitRenderModifier::GetTexGenMatrix(int UNUSED(pass)) -{ - return &GetShadowMap()->GetTextureMatrix(); -} - -bool PlainLitRenderModifier::EndPass(int UNUSED(pass)) -{ - g_Renderer.BindTexture(1, 0); - g_Renderer.BindTexture(2, 0); - pglActiveTextureARB(GL_TEXTURE0); - pglClientActiveTextureARB(GL_TEXTURE0); - - return true; -} - -void PlainLitRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture) -{ - texture->Bind(0); -} - - - /////////////////////////////////////////////////////////////////////////////////////////////// // WireframeRenderModifier implementation diff --git a/source/renderer/RenderModifiers.h b/source/renderer/RenderModifiers.h index fe5fa5014e..267527ed4a 100644 --- a/source/renderer/RenderModifiers.h +++ b/source/renderer/RenderModifiers.h @@ -176,25 +176,6 @@ public: }; -/** - * Class PlainLitRenderModifier: Use an opaque color texture for a lit object that is shadowed - * using a depth texture. - * Expects the diffuse brightness in the primary color. - */ -class PlainLitRenderModifier : public LitRenderModifier -{ -public: - PlainLitRenderModifier(); - ~PlainLitRenderModifier(); - - // Implementation - int BeginPass(int pass); - const CMatrix3D* GetTexGenMatrix(int pass); - bool EndPass(int pass); - void PrepareTexture(int pass, CTexturePtr& texture); -}; - - /** * Class WireframeRenderModifier: RenderModifier that renders wireframe models. */ diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 52cabc51c7..d19657f2a6 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -205,13 +205,6 @@ AbstractProfileTable* CRendererStatsTable::GetChild(size_t UNUSED(row)) /////////////////////////////////////////////////////////////////////////////////// // CRenderer implementation -enum { - AmbientDiffuse = 0, - OnlyDiffuse, - - NumVertexTypes -}; - /** * Struct CRendererInternals: Truly hide data that is supposed to be hidden * in this structure so it won't even appear in header files. @@ -269,9 +262,9 @@ public: // "Palette" of available ModelRenderers. Do not use these directly for // rendering and submission; use the aliases above instead. - ModelRenderer* pal_NormalFF[NumVertexTypes]; - ModelRenderer* pal_PlayerFF[NumVertexTypes]; - ModelRenderer* pal_TranspFF[NumVertexTypes]; + ModelRenderer* pal_NormalFF; + ModelRenderer* pal_PlayerFF; + ModelRenderer* pal_TranspFF; ModelRenderer* pal_TranspSortAll; ModelRenderer* pal_NormalShader; @@ -280,7 +273,7 @@ public: ModelRenderer* pal_PlayerInstancingShader; ModelRenderer* pal_TranspShader; - ModelVertexRendererPtr VertexFF[NumVertexTypes]; + ModelVertexRendererPtr VertexFF; ModelVertexRendererPtr VertexPolygonSort; ModelVertexRendererPtr VertexRendererShader; ModelVertexRendererPtr VertexInstancingShader; @@ -304,12 +297,9 @@ public: RenderModifierPtr ModTransparent; // Palette of available RenderModifiers - RenderModifierPtr ModPlain; - LitRenderModifierPtr ModPlainLit; + RenderModifierPtr ModPlainUnlit; RenderModifierPtr ModPlayerUnlit; - LitRenderModifierPtr ModPlayerLit; RenderModifierPtr ModTransparentUnlit; - LitRenderModifierPtr ModTransparentLit; RenderModifierPtr ModShaderSolidColor; RenderModifierPtr ModShaderSolidColorInstancing; @@ -331,12 +321,9 @@ public: terrainRenderer = new TerrainRenderer(); shadow = new ShadowMap(); - for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType) - { - Model.pal_NormalFF[vertexType] = 0; - Model.pal_PlayerFF[vertexType] = 0; - Model.pal_TranspFF[vertexType] = 0; - } + Model.pal_NormalFF = 0; + Model.pal_PlayerFF = 0; + Model.pal_TranspFF = 0; Model.pal_TranspSortAll = 0; Model.pal_NormalShader = 0; @@ -359,9 +346,9 @@ public: } /** - * Load the OpenGL projection and modelview matrices and the viewport according - * to the given camera. - */ + * Load the OpenGL projection and modelview matrices and the viewport according + * to the given camera. + */ void SetOpenGLCamera(const CCamera& camera) { CMatrix3D view; @@ -455,12 +442,9 @@ CRenderer::~CRenderer() UnregisterFileReloadFunc(ReloadChangedFileCB, this); // model rendering - for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType) - { - delete m->Model.pal_NormalFF[vertexType]; - delete m->Model.pal_PlayerFF[vertexType]; - delete m->Model.pal_TranspFF[vertexType]; - } + delete m->Model.pal_NormalFF; + delete m->Model.pal_PlayerFF; + delete m->Model.pal_TranspFF; delete m->Model.pal_TranspSortAll; delete m->Model.pal_NormalShader; @@ -617,18 +601,14 @@ bool CRenderer::Open(int width, int height) // model rendering - m->Model.VertexFF[AmbientDiffuse] = ModelVertexRendererPtr(new FixedFunctionModelRenderer(false)); - m->Model.VertexFF[OnlyDiffuse] = ModelVertexRendererPtr(new FixedFunctionModelRenderer(true)); + m->Model.VertexFF = ModelVertexRendererPtr(new FixedFunctionModelRenderer); m->Model.VertexPolygonSort = ModelVertexRendererPtr(new PolygonSortModelRenderer); m->Model.VertexRendererShader = ModelVertexRendererPtr(new ShaderModelRenderer); m->Model.VertexInstancingShader = ModelVertexRendererPtr(new InstancingModelRenderer); - for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType) - { - m->Model.pal_NormalFF[vertexType] = new BatchModelRenderer(m->Model.VertexFF[vertexType]); - m->Model.pal_PlayerFF[vertexType] = new BatchModelRenderer(m->Model.VertexFF[vertexType]); - m->Model.pal_TranspFF[vertexType] = new SortModelRenderer(m->Model.VertexFF[vertexType]); - } + m->Model.pal_NormalFF = new BatchModelRenderer(m->Model.VertexFF); + m->Model.pal_PlayerFF = new BatchModelRenderer(m->Model.VertexFF); + m->Model.pal_TranspFF = new SortModelRenderer(m->Model.VertexFF); m->Model.pal_TranspSortAll = new SortModelRenderer(m->Model.VertexPolygonSort); @@ -639,14 +619,11 @@ bool CRenderer::Open(int width, int height) m->Model.pal_TranspShader = new SortModelRenderer(m->Model.VertexRendererShader); m->Model.ModWireframe = RenderModifierPtr(new WireframeRenderModifier); - m->Model.ModPlain = RenderModifierPtr(new PlainRenderModifier); - m->Model.ModPlainLit = LitRenderModifierPtr(new PlainLitRenderModifier); + m->Model.ModPlainUnlit = RenderModifierPtr(new PlainRenderModifier); SetFastPlayerColor(true); - m->Model.ModPlayerLit = LitRenderModifierPtr(new LitPlayerColorRender); m->Model.ModSolidColor = RenderModifierPtr(new SolidColorRenderModifier); m->Model.ModSolidPlayerColor = RenderModifierPtr(new SolidPlayerColorRender); m->Model.ModTransparentUnlit = RenderModifierPtr(new TransparentRenderModifier); - m->Model.ModTransparentLit = LitRenderModifierPtr(new LitTransparentRenderModifier); m->Model.ModTransparentShadow = RenderModifierPtr(new TransparentShadowRenderModifier); m->Model.ModTransparentDepthShadow = RenderModifierPtr(new TransparentDepthShadowModifier); @@ -840,7 +817,8 @@ void CRenderer::BeginFrame() // zero out all the per-frame stats m_Stats.Reset(); - // handle the new shader-based approach + // choose model renderers for this frame + if (m_Options.m_RenderPath == RP_SHADER) { if (m->ShadersDirty) @@ -878,55 +856,31 @@ void CRenderer::BeginFrame() m->Model.PlayerInstancing = m->Model.pal_PlayerInstancingShader; m->Model.Transp = m->Model.pal_TranspShader; - - return; - } - - // choose model renderers for this frame - int vertexType; - - if (m_Caps.m_Shadows && m_Options.m_Shadows && m->shadow->GetUseDepthTexture()) - { - vertexType = OnlyDiffuse; - m->Model.ModNormal = m->Model.ModPlainLit; - m->Model.ModNormalInstancing = m->Model.ModPlainLit; - m->Model.ModPlainLit->SetShadowMap(m->shadow); - m->Model.ModPlainLit->SetLightEnv(m_LightEnv); - - m->Model.ModPlayer = m->Model.ModPlayerLit; - m->Model.ModPlayerInstancing = m->Model.ModPlayerLit; - m->Model.ModPlayerLit->SetShadowMap(m->shadow); - m->Model.ModPlayerLit->SetLightEnv(m_LightEnv); - - m->Model.ModTransparent = m->Model.ModTransparentLit; - m->Model.ModTransparentLit->SetShadowMap(m->shadow); - m->Model.ModTransparentLit->SetLightEnv(m_LightEnv); } else { - vertexType = AmbientDiffuse; - m->Model.ModNormal = m->Model.ModPlain; - m->Model.ModNormalInstancing = m->Model.ModPlain; + m->Model.ModNormal = m->Model.ModPlainUnlit; + m->Model.ModNormalInstancing = m->Model.ModPlainUnlit; m->Model.ModPlayer = m->Model.ModPlayerUnlit; m->Model.ModPlayerInstancing = m->Model.ModPlayerUnlit; m->Model.ModTransparent = m->Model.ModTransparentUnlit; + + m->Model.NormalInstancing = m->Model.pal_NormalFF; + m->Model.Normal = m->Model.pal_NormalFF; + + m->Model.PlayerInstancing = m->Model.pal_PlayerFF; + m->Model.Player = m->Model.pal_PlayerFF; + + m->Model.ModSolid = m->Model.ModSolidColor; + m->Model.ModSolidInstancing = m->Model.ModSolidColor; + m->Model.ModSolidPlayer = m->Model.ModSolidPlayerColor; + m->Model.ModSolidPlayerInstancing = m->Model.ModSolidPlayerColor; + + if (m_SortAllTransparent) + m->Model.Transp = m->Model.pal_TranspSortAll; + else + m->Model.Transp = m->Model.pal_TranspFF; } - - m->Model.NormalInstancing = m->Model.pal_NormalFF[vertexType]; - m->Model.Normal = m->Model.pal_NormalFF[vertexType]; - - m->Model.PlayerInstancing = m->Model.pal_PlayerFF[vertexType]; - m->Model.Player = m->Model.pal_PlayerFF[vertexType]; - - m->Model.ModSolid = m->Model.ModSolidColor; - m->Model.ModSolidInstancing = m->Model.ModSolidColor; - m->Model.ModSolidPlayer = m->Model.ModSolidPlayerColor; - m->Model.ModSolidPlayerInstancing = m->Model.ModSolidPlayerColor; - - if (m_SortAllTransparent) - m->Model.Transp = m->Model.pal_TranspSortAll; - else - m->Model.Transp = m->Model.pal_TranspFF[vertexType]; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1010,7 +964,7 @@ void CRenderer::RenderPatches() if (GetRenderPath() == RP_SHADER) m->terrainRenderer->RenderTerrainShader((m_Caps.m_Shadows && m_Options.m_Shadows) ? m->shadow : 0); else - m->terrainRenderer->RenderTerrain((m_Caps.m_Shadows && m_Options.m_Shadows) ? m->shadow : 0); + m->terrainRenderer->RenderTerrain(); if (m_TerrainRenderMode == WIREFRAME) @@ -1494,7 +1448,7 @@ void CRenderer::RenderSubmissions() m->particleRenderer.PrepareForRendering(); PROFILE_END("prepare particles"); - if (m_Caps.m_Shadows && m_Options.m_Shadows) + if (m_Caps.m_Shadows && m_Options.m_Shadows && GetRenderPath() == RP_SHADER) { RenderShadowMap(); } @@ -1661,7 +1615,7 @@ void CRenderer::SetSceneCamera(const CCamera& viewCamera, const CCamera& cullCam m_ViewCamera = viewCamera; m_CullCamera = cullCamera; - if (m_Caps.m_Shadows && m_Options.m_Shadows) + if (m_Caps.m_Shadows && m_Options.m_Shadows && GetRenderPath() == RP_SHADER) m->shadow->SetupFrame(m_CullCamera, m_LightEnv->GetSunDir()); } diff --git a/source/renderer/TerrainRenderer.cpp b/source/renderer/TerrainRenderer.cpp index d54d85f4d1..8a687b4078 100644 --- a/source/renderer/TerrainRenderer.cpp +++ b/source/renderer/TerrainRenderer.cpp @@ -165,7 +165,7 @@ void TerrainRenderer::EndFrame() /////////////////////////////////////////////////////////////////// // Full-featured terrain rendering with blending and everything -void TerrainRenderer::RenderTerrain(ShadowMap* shadow) +void TerrainRenderer::RenderTerrain() { debug_assert(m->phase == Phase_Render); @@ -280,169 +280,44 @@ void TerrainRenderer::RenderTerrain(ShadowMap* shadow) int streamflags = STREAM_POS|STREAM_COLOR|STREAM_POSTOUV0; - if (!shadow) - { - pglActiveTextureARB(GL_TEXTURE0); - // We're not going to use a texture here, but we have to have a valid texture - // bound else the texture unit will be disabled. - // We should still have a bound splat texture from some earlier rendering, - // so assume that's still valid to use. - // (TODO: That's a bit of an ugly hack.) + pglActiveTextureARB(GL_TEXTURE0); + // We're not going to use a texture here, but we have to have a valid texture + // bound else the texture unit will be disabled. + // We should still have a bound splat texture from some earlier rendering, + // so assume that's still valid to use. + // (TODO: That's a bit of an ugly hack.) - // Shadow rendering disabled: (Ambient + Diffuse) * LOS - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); + // Shadow rendering disabled: (Ambient + Diffuse) * LOS + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); + glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); - losTexture.BindTexture(1); - pglClientActiveTextureARB(GL_TEXTURE1); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - streamflags |= STREAM_POSTOUV1; + losTexture.BindTexture(1); + pglClientActiveTextureARB(GL_TEXTURE1); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + streamflags |= STREAM_POSTOUV1; - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(losTexture.GetTextureMatrix()); - glMatrixMode(GL_MODELVIEW); + glMatrixMode(GL_TEXTURE); + glLoadMatrixf(losTexture.GetTextureMatrix()); + glMatrixMode(GL_MODELVIEW); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - } - else - { - losTexture.BindTexture(1); - - g_Renderer.BindTexture(0, shadow->GetTexture()); - - const CMatrix3D& texturematrix = shadow->GetTextureMatrix(); - pglActiveTextureARB(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(&texturematrix._11); - glMatrixMode(GL_MODELVIEW); - - if (shadow->GetUseDepthTexture()) - { - // (Ambient + ShTranslucency * Diffuse * (1 - Shadow) + Diffuse * Shadow) * LOS - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - float shadowTransp = g_Renderer.GetLightEnv().GetTerrainShadowTransparency(); - float color[4] = { shadowTransp, shadowTransp, shadowTransp, 1.0 }; - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color); - - pglActiveTextureARB(GL_TEXTURE1); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE2); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, shadow->GetTexture()); // Need a valid texture or the unit will be disabled - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); - - losTexture.BindTexture(3); - pglClientActiveTextureARB(GL_TEXTURE3); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - streamflags |= STREAM_POSTOUV3; - - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(losTexture.GetTextureMatrix()); - glMatrixMode(GL_MODELVIEW); - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - } - else - { - // (Ambient + Diffuse * Shadow) * LOS - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE1); // + Ambient - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); - - losTexture.BindTexture(2); - pglClientActiveTextureARB(GL_TEXTURE2); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - streamflags |= STREAM_POSTOUV2; - - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(losTexture.GetTextureMatrix()); - glMatrixMode(GL_MODELVIEW); - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - } - } + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); pglActiveTextureARB(GL_TEXTURE0); pglClientActiveTextureARB(GL_TEXTURE0); @@ -457,38 +332,12 @@ void TerrainRenderer::RenderTerrain(ShadowMap* shadow) // restore OpenGL state g_Renderer.BindTexture(1, 0); - if (!shadow) - { - pglClientActiveTextureARB(GL_TEXTURE1); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - } - else - { - if (shadow->GetUseDepthTexture()) - { - g_Renderer.BindTexture(2, 0); - g_Renderer.BindTexture(3, 0); - pglClientActiveTextureARB(GL_TEXTURE3); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - } - else - { - g_Renderer.BindTexture(2, 0); - - pglClientActiveTextureARB(GL_TEXTURE2); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - } - } + pglClientActiveTextureARB(GL_TEXTURE1); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); pglClientActiveTextureARB(GL_TEXTURE0); pglActiveTextureARB(GL_TEXTURE0); diff --git a/source/renderer/TerrainRenderer.h b/source/renderer/TerrainRenderer.h index 6d6592dc3c..92fe3754b9 100644 --- a/source/renderer/TerrainRenderer.h +++ b/source/renderer/TerrainRenderer.h @@ -77,14 +77,14 @@ public: * * preconditions : PrepareForRendering must have been called this * frame before calling RenderTerrain. - * - * @param shadow A prepared shadow map, in case rendering with shadows is enabled. */ - void RenderTerrain(ShadowMap* shadow); + void RenderTerrain(); /** * Render textured terrain, as with RenderTerrain, but using shaders * instead of multitexturing. + * + * @param shadow A prepared shadow map, in case rendering with shadows is enabled. */ void RenderTerrainShader(ShadowMap* shadow); diff --git a/source/renderer/TransparencyRenderer.cpp b/source/renderer/TransparencyRenderer.cpp index 42399d67d2..c533762729 100644 --- a/source/renderer/TransparencyRenderer.cpp +++ b/source/renderer/TransparencyRenderer.cpp @@ -247,7 +247,7 @@ void PolygonSortModelRenderer::UpdateModelData(CModel* model, void* data, int up VertexArrayIterator Color = psmdl->m_Color.GetIterator(); - ModelRenderer::BuildColor4ub(model, Normal, Color, false); + ModelRenderer::BuildColor4ub(model, Normal, Color); // upload everything to vertex buffer psmdl->m_Array.Upload(); @@ -672,143 +672,6 @@ void TransparentRenderModifier::PrepareModel(int UNUSED(pass), CModel* UNUSED(mo } -/////////////////////////////////////////////////////////////////////////////////////////////////// -// LitTransparentRenderModifier implementation - -LitTransparentRenderModifier::LitTransparentRenderModifier() -{ -} - -LitTransparentRenderModifier::~LitTransparentRenderModifier() -{ -} - -int LitTransparentRenderModifier::BeginPass(int pass) -{ - debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture()); - - if (pass == 0) - { - // First pass: Put down Z for opaque parts of the model, - // don't touch the color buffer. - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - - // just pass through texture's alpha - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - // Set the proper LOD bias - glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias); - - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER,0.975f); - - // render everything with color writes off to setup depth buffer correctly - glColorMask(0,0,0,0); - - return STREAM_POS|STREAM_UV0; - } - else - { - // Second pass: Put down color, disable Z write - glColorMask(1,1,1,1); - - glDepthMask(0); - - // Ambient + Diffuse * Shadow - pglActiveTextureARB(GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X); - - // Incoming color is ambient + diffuse light - pglActiveTextureARB(GL_TEXTURE2); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture()); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); - - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE0); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - - pglActiveTextureARB(GL_TEXTURE0); - - glAlphaFunc(GL_GREATER,0); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - // Set the proper LOD bias - glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias); - - return STREAM_POS|STREAM_COLOR|STREAM_UV0|STREAM_TEXGENTOUV1; - } -} - -bool LitTransparentRenderModifier::EndPass(int pass) -{ - if (pass == 0) - return false; // multi-pass - - pglActiveTextureARB(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - pglActiveTextureARB(GL_TEXTURE2); - glDisable(GL_TEXTURE_2D); - pglActiveTextureARB(GL_TEXTURE0); - - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - glDepthMask(1); - - return true; -} - -const CMatrix3D* LitTransparentRenderModifier::GetTexGenMatrix(int UNUSED(pass)) -{ - return &GetShadowMap()->GetTextureMatrix(); -} - -void LitTransparentRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture) -{ - texture->Bind(0); -} - -void LitTransparentRenderModifier::PrepareModel(int UNUSED(pass), CModel* UNUSED(model)) -{ - // No per-model setup necessary -} - - /////////////////////////////////////////////////////////////////////////////////////////////////// // TransparentShadowRenderModifier implementation diff --git a/source/renderer/TransparencyRenderer.h b/source/renderer/TransparencyRenderer.h index eb2283c89c..352ab1e5e6 100644 --- a/source/renderer/TransparencyRenderer.h +++ b/source/renderer/TransparencyRenderer.h @@ -110,29 +110,6 @@ public: }; -/** - * Class LitTransparentRenderModifier: Modifier for transparent models, - * including alpha blending and shadowed lighting. - * - * @note Use only when depth textures are used for shadows and thus supported by the OpenGL - * implementation. - */ -class LitTransparentRenderModifier : public LitRenderModifier -{ -public: - LitTransparentRenderModifier(); - ~LitTransparentRenderModifier(); - - // Implementation - int BeginPass(int pass); - bool EndPass(int pass); - const CMatrix3D* GetTexGenMatrix(int pass); - void PrepareTexture(int pass, CTexturePtr& texture); - void PrepareModel(int pass, CModel* model); - -}; - - /** * Class TransparentShadowRenderModifier: Use to render shadow data for * transparent models into a luminance map.