From 4265a8f5135dd6b54f9d31b9472094ca4ef41773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Brammer?= Date: Sun, 31 May 2009 02:10:57 +0200 Subject: [PATCH] OpenGL: Remove code duplication --- standard/inc/StdGL.h | 1 + standard/src/StdGL.cpp | 171 +++++++++++++++-------------------------- 2 files changed, 63 insertions(+), 109 deletions(-) diff --git a/standard/inc/StdGL.h b/standard/inc/StdGL.h index b71d9e5fa..de6e3418a 100644 --- a/standard/inc/StdGL.h +++ b/standard/inc/StdGL.h @@ -116,6 +116,7 @@ class CStdGL : public CStdDDraw virtual CStdGLCtx *CreateContext(HWND hWindow, CStdApp *pApp); #endif // Blit + void SetupTextureEnv(bool fMod2, bool landscape); void PerformBlt(CBltData &rBltData, CTexRef *pTex, DWORD dwModClr, bool fMod2, bool fExact); virtual void BlitLandscape(SURFACE sfcSource, float fx, float fy, SURFACE sfcTarget, float tx, float ty, float wdt, float hgt, const SURFACE textures[]); diff --git a/standard/src/StdGL.cpp b/standard/src/StdGL.cpp index da111f689..86eadef63 100644 --- a/standard/src/StdGL.cpp +++ b/standard/src/StdGL.cpp @@ -153,6 +153,46 @@ bool CStdGL::PrepareRendering(SURFACE sfcToSurface) return true; } +void CStdGL::SetupTextureEnv(bool fMod2, bool landscape) + { + if (shaders[0]) + { + GLuint s = landscape ? 2 : (fMod2 ? 1 : 0); + if (Saturation < 255) + { + s += 3; + } + if (fUseClrModMap) + { + s += 6; + } + glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders[s]); + if (Saturation < 255) + { + GLfloat bla[4] = { Saturation / 255.0f, Saturation / 255.0f, Saturation / 255.0f, 1.0f }; + glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, bla); + } + } + // texture environment + else + { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, fMod2 ? GL_ADD_SIGNED : GL_MODULATE); + glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, fMod2 ? 2.0f : 1.0f); + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); + } + // set modes + glShadeModel((fUseClrModMap && !shaders[0] && !DDrawCfg.NoBoxFades) ? GL_SMOOTH : GL_FLAT); + } + void CStdGL::PerformBlt(CBltData &rBltData, CTexRef *pTex, DWORD dwModClr, bool fMod2, bool fExact) { // clipping @@ -183,49 +223,8 @@ void CStdGL::PerformBlt(CBltData &rBltData, CTexRef *pTex, DWORD dwModClr, bool DwTo4UB(dwModClr, rBltData.vtVtx[i].color); } // reset MOD2 for completely black modulations - if (fMod2 && !fAnyModNotBlack) fMod2 = 0; - if (shaders[0]) - { - glEnable(GL_FRAGMENT_PROGRAM_ARB); - GLuint s = fMod2 ? 1 : 0; - if (Saturation < 255) - { - s += 3; - } - if (fUseClrModMap) - { - s += 6; - glActiveTexture(GL_TEXTURE3); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, (*pClrModMap->GetSurface()->ppTex)->texName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glActiveTexture(GL_TEXTURE0); - } - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders[s]); - if (Saturation < 255) - { - GLfloat bla[4] = { Saturation / 255.0f, Saturation / 255.0f, Saturation / 255.0f, 1.0f }; - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, bla); - } - } - else - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, fMod2 ? GL_ADD_SIGNED : GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, fMod2 ? 2.0f : 1.0f); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - } - // set texture+modes - glShadeModel((fUseClrModMap && !DDrawCfg.NoBoxFades) ? GL_SMOOTH : GL_FLAT); + fMod2 = fMod2 && fAnyModNotBlack; + SetupTextureEnv(fMod2, false); glBindTexture(GL_TEXTURE_2D, pTex->texName); if (!fExact && !DDrawCfg.PointFiltering) { @@ -238,7 +237,7 @@ void CStdGL::PerformBlt(CBltData &rBltData, CTexRef *pTex, DWORD dwModClr, bool matrix[0]=rBltData.TexPos.mat[0]; matrix[1]=rBltData.TexPos.mat[3]; matrix[2]=0; matrix[3]=rBltData.TexPos.mat[6]; matrix[4]=rBltData.TexPos.mat[1]; matrix[5]=rBltData.TexPos.mat[4]; matrix[6]=0; matrix[7]=rBltData.TexPos.mat[7]; matrix[8]=0; matrix[9]=0; matrix[10]=1; matrix[11]=0; - matrix[12]=rBltData.TexPos.mat[2]; matrix[13]=rBltData.TexPos.mat[5]; matrix[14]=0; matrix[15]=rBltData.TexPos.mat[8]; + matrix[12]=rBltData.TexPos.mat[2]; matrix[13]=rBltData.TexPos.mat[5]; matrix[14]=0; matrix[15]=rBltData.TexPos.mat[8]; glLoadMatrixf(matrix); if (shaders[0] && fUseClrModMap) @@ -297,13 +296,6 @@ void CStdGL::PerformBlt(CBltData &rBltData, CTexRef *pTex, DWORD dwModClr, bool } glDrawArrays(GL_POLYGON, 0, rBltData.byNumVertices); glLoadIdentity(); - if (shaders[0]) - { - glDisable(GL_FRAGMENT_PROGRAM_ARB); - glActiveTexture(GL_TEXTURE3); - glDisable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - } if (!fExact && !DDrawCfg.PointFiltering) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -389,60 +381,7 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy, glActiveTexture(GL_TEXTURE0); } DWORD dwModMask = 0; - if (shaders[0]) - { - glEnable(GL_FRAGMENT_PROGRAM_ARB); - GLuint s = mattextures ? 2 : 0; - if (Saturation < 255) - { - s += 3; - } - if (fUseClrModMap) - { - s += 6; - glActiveTexture(GL_TEXTURE3); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, (*pClrModMap->GetSurface()->ppTex)->texName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glActiveTexture(GL_TEXTURE0); - } - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders[s]); - if (Saturation < 255) - { - GLfloat bla[4] = { Saturation / 255.0f, Saturation / 255.0f, Saturation / 255.0f, 1.0f }; - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, bla); - } - dwModMask = 0; - } - // texture environment - else - { - if (DDrawCfg.NoAlphaAdd) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f); - dwModMask = 0xff000000; - } - else - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - dwModMask = 0; - } - } - // set texture+modes - glShadeModel((fUseClrModMap && !DDrawCfg.NoBoxFades) ? GL_SMOOTH : GL_FLAT); + SetupTextureEnv(false, mattextures); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_TEXTURE); @@ -569,10 +508,6 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy, } } - if (shaders[0]) - { - glDisable(GL_FRAGMENT_PROGRAM_ARB); - } if (mattextures) { glActiveTexture(GL_TEXTURE1); @@ -706,6 +641,7 @@ void CStdGL::DrawQuadDw(SURFACE sfcTarget, float *ipVtx, DWORD dwClr1, DWORD dwC glColorPointer(4,GL_UNSIGNED_BYTE,0,colors); glEnableClientState(GL_COLOR_ARRAY); glDrawArrays(GL_POLYGON, 0, 4); + glDisableClientState(GL_COLOR_ARRAY); glShadeModel(GL_FLAT); } @@ -908,12 +844,29 @@ bool CStdGL::StoreStateBlock() void CStdGL::SetTexture() { glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, (dwBlitMode & C4GFXBLIT_ADDITIVE) ? GL_ONE : GL_SRC_ALPHA); + if (shaders[0] && fUseClrModMap) + { + glEnable(GL_FRAGMENT_PROGRAM_ARB); + glActiveTexture(GL_TEXTURE3); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, (*pClrModMap->GetSurface()->ppTex)->texName); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); } void CStdGL::ResetTexture() { // disable texturing + if (shaders[0]) + { + glDisable(GL_FRAGMENT_PROGRAM_ARB); + glActiveTexture(GL_TEXTURE3); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + } glDisable(GL_TEXTURE_2D); }