From bd4e4834e3f5974e0d243f1fc7ce6db5c50da827 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 5 Oct 2019 12:28:08 +0200 Subject: [PATCH] - moved the main shader and its entire uniform maintenance into the backend. --- source/CMakeLists.txt | 1 + source/build/include/build.h | 19 +- source/build/include/polymost.h | 15 - source/build/src/2d.cpp | 4 +- source/build/src/animvpx.cpp | 4 +- source/build/src/common.cpp | 8 +- source/build/src/engine.cpp | 16 +- source/build/src/mdsprite.cpp | 30 +- source/build/src/palette.cpp | 12 +- source/build/src/polymost.cpp | 568 ++++-------------------------- source/build/src/voxmodel.cpp | 9 +- source/glbackend/gl_renderstate.h | 26 ++ source/glbackend/gl_shader.cpp | 179 ++++++++++ source/glbackend/gl_shader.h | 60 ++++ source/glbackend/gl_uniform.h | 94 +++++ source/glbackend/glbackend.cpp | 111 +++++- source/glbackend/glbackend.h | 86 ++++- 17 files changed, 650 insertions(+), 592 deletions(-) create mode 100644 source/glbackend/gl_renderstate.h create mode 100644 source/glbackend/gl_shader.cpp create mode 100644 source/glbackend/gl_shader.h create mode 100644 source/glbackend/gl_uniform.h diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 20accbcd5..4ff73ac3a 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -772,6 +772,7 @@ set (PCH_SOURCES glbackend/gl_hwtexture.cpp glbackend/gl_samplers.cpp + glbackend/gl_shader.cpp glbackend/glbackend.cpp mact/src/animlib.cpp diff --git a/source/build/include/build.h b/source/build/include/build.h index 84f2a5364..8d2a16ed8 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -1489,23 +1489,8 @@ int32_t engineLoadBoardV5V6(const char *filename, char fromwhere, vec3_t *dapos, #endif -static FORCE_INLINE void renderDisableFog(void) -{ -#ifdef USE_OPENGL - if (videoGetRenderMode() >= REND_POLYMOST) - { - polymost_setFogEnabled(false); - } -#endif -} - -static FORCE_INLINE void renderEnableFog(void) -{ -#ifdef USE_OPENGL - if (videoGetRenderMode() >= REND_POLYMOST && !nofog) - polymost_setFogEnabled(true); -#endif -} +void renderDisableFog(void); +void renderEnableFog(void); static vec2_t const zerovec = { 0, 0 }; diff --git a/source/build/include/polymost.h b/source/build/include/polymost.h index 49f43da7b..642e8216f 100644 --- a/source/build/include/polymost.h +++ b/source/build/include/polymost.h @@ -51,19 +51,6 @@ void polymost_completeMirror(); int32_t polymost_maskWallHasTranslucency(uwalltype const * const wall); int32_t polymost_spriteHasTranslucency(uspritetype const * const tspr); -void polymost_resetVertexPointers(void); -void polymost_disableProgram(void); -void polymost_resetProgram(void); -void polymost_setTexturePosSize(vec4f_t const &texturePosSize); -void polymost_setHalfTexelSize(vec2f_t const &halfTexelSize); -char polymost_getClamp(); -void polymost_setClamp(char clamp); -void polymost_setVisibility(float visibility); -void polymost_setFogEnabled(char fogEnabled); -void polymost_useColorOnly(char useColorOnly); -void polymost_usePaletteIndexing(char usePaletteIndexing); -void polymost_useDetailMapping(char useDetailMapping); -void polymost_useGlowMapping(char useGlowMapping); void useShaderProgram(uint32_t shaderID); float* multiplyMatrix4f(float m0[4*4], const float m1[4*4]); @@ -71,8 +58,6 @@ float* multiplyMatrix4f(float m0[4*4], const float m1[4*4]); void polymost_glinit(void); void polymost_glreset(void); -void polymost_init(void); - enum { INVALIDATE_ALL, INVALIDATE_ART, diff --git a/source/build/src/2d.cpp b/source/build/src/2d.cpp index b083030a9..c43c31d72 100644 --- a/source/build/src/2d.cpp +++ b/source/build/src/2d.cpp @@ -60,7 +60,7 @@ static void drawlinegl(int32_t x1, int32_t y1, int32_t x2, int32_t y2, palette_t GLInterface.EnableDepthTest(false); GLInterface.EnableBlend(true); // When using line antialiasing, this is needed - polymost_useColorOnly(true); + GLInterface.UseColorOnly(true); GLInterface.SetColorub(p.r, p.g, p.b, 255); auto data = GLInterface.AllocVertices(2); @@ -68,7 +68,7 @@ static void drawlinegl(int32_t x1, int32_t y1, int32_t x2, int32_t y2, palette_t data.second[1].Set((float) x2 * (1.f/4096.f), (float) y2 * (1.f/4096.f)); GLInterface.Draw(DT_LINES, data.first, 2); - polymost_useColorOnly(false); + GLInterface.UseColorOnly(false); } #endif diff --git a/source/build/src/animvpx.cpp b/source/build/src/animvpx.cpp index f71a206ae..50e5832dc 100644 --- a/source/build/src/animvpx.cpp +++ b/source/build/src/animvpx.cpp @@ -417,7 +417,6 @@ void animvpx_setup_glstate(int32_t animvpx_flags) VSMatrix identity(0); GLInterface.SetMatrix(Matrix_ModelView, &identity); GLInterface.SetMatrix(Matrix_Projection, &identity); - GLInterface.SetMatrix(Matrix_Texture0, &identity); GLInterface.EnableAlphaTest(false); GLInterface.EnableDepthTest(false); @@ -444,8 +443,7 @@ void animvpx_setup_glstate(int32_t animvpx_flags) void animvpx_restore_glstate(void) { - useShaderProgram(0); - polymost_resetProgram(); + GLInterface.SetPolymostShader(); delete texture; texture = nullptr; diff --git a/source/build/src/common.cpp b/source/build/src/common.cpp index 2608b5b23..d572d444a 100644 --- a/source/build/src/common.cpp +++ b/source/build/src/common.cpp @@ -249,8 +249,8 @@ int32_t FindDistance3D(int32_t x, int32_t y, int32_t z) // Clear OSD background void COMMON_doclearbackground(int numcols, int height) { - polymost_setFogEnabled(false); - polymost_useColorOnly(true); + GLInterface.SetFogEnabled(false); + GLInterface.UseColorOnly(true); polymostSet2dView(); @@ -277,8 +277,8 @@ void COMMON_doclearbackground(int numcols, int height) GLInterface.SetColor(0.f, 0.f, 0.f, 1.f); GLInterface.Draw(DT_TRIANGLE_STRIP, vert.first+4, 4); - polymost_useColorOnly(false); - polymost_setFogEnabled(true); + GLInterface.UseColorOnly(false); + GLInterface.SetFogEnabled(true); } void COMMON_clearbackground(int numcols, int numrows) diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 67783dabd..8912da875 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -8975,7 +8975,7 @@ killsprite: { GLInterface.EnableBlend(false); GLInterface.EnableAlphaTest(true); - polymost_setClamp(1+2); + GLInterface.SetClamp(1+2); if (spritesortcnt < numSprites) { @@ -9026,7 +9026,7 @@ killsprite: } } - polymost_setClamp(0); + GLInterface.SetClamp(0); int32_t numMaskWalls = maskwallcnt; maskwallcnt = 0; for (i = 0; i < numMaskWalls; i++) @@ -9071,7 +9071,7 @@ killsprite: #ifdef USE_OPENGL if (videoGetRenderMode() == REND_POLYMOST) - polymost_setClamp(1+2); + GLInterface.SetClamp(1+2); #endif i = spritesortcnt; @@ -9160,14 +9160,14 @@ killsprite: debugmask_add(maskwall[maskwallcnt], thewall[maskwall[maskwallcnt]]); #ifdef USE_OPENGL if (videoGetRenderMode() == REND_POLYMOST) - polymost_setClamp(0); + GLInterface.SetClamp(0); #endif renderDrawMaskedWall(maskwallcnt); } #ifdef USE_OPENGL if (videoGetRenderMode() == REND_POLYMOST) - polymost_setClamp(1+2); + GLInterface.SetClamp(1+2); #endif while (spritesortcnt) { @@ -9183,7 +9183,7 @@ killsprite: if (videoGetRenderMode() == REND_POLYMOST) { GLInterface.SetDepthMask(true); - polymost_setClamp(0); + GLInterface.SetClamp(0); } #endif @@ -12982,10 +12982,6 @@ int32_t videoSetRenderMode(int32_t renderer) if (videoGetRenderMode() >= REND_POLYMOST) glrendmode = rendmode; - if (renderer == REND_POLYMOST) - { - polymost_init(); - } #endif return 0; diff --git a/source/build/src/mdsprite.cpp b/source/build/src/mdsprite.cpp index c54239fae..2759dcb08 100644 --- a/source/build/src/mdsprite.cpp +++ b/source/build/src/mdsprite.cpp @@ -2058,10 +2058,9 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) float const xpanning = (float)sext->xpanning * (1.f/256.f); float const ypanning = (float)sext->ypanning * (1.f/256.f); - char prevClamp = polymost_getClamp(); - polymost_setClamp(0); - polymost_usePaletteIndexing(false); - polymost_setTexturePosSize({ 0.f, 0.f, 1.f, 1.f }); + int prevClamp = GLInterface.GetClamp(); + GLInterface.SetClamp(0); + GLInterface.UsePaletteIndexing(false); for (surfi=0; surfihead.numsurfs; surfi++) { @@ -2130,7 +2129,6 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) if (!(tspr->extra&TSPR_EXTRA_MDHACK)) { -#ifdef USE_GLEXT //POGOTODO: if we add support for palette indexing on model skins, the texture for the palswap could be setup here texunits += 4; @@ -2140,7 +2138,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) { mdskinmap_t *sk; - polymost_useDetailMapping(true); + GLInterface.UseDetailMapping(true); polymost_setupdetailtexture(3, tex); for (sk = m->skinmap; sk; sk = sk->next) @@ -2157,7 +2155,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) if (i) { - polymost_useGlowMapping(true); + GLInterface.UseGlowMapping(true); polymost_setupglowtexture(4, tex); texmat.loadIdentity(); @@ -2165,8 +2163,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) GLInterface.SetMatrix(Matrix_Texture4, &texmat); } -#endif - indexhandle = m->vindexes; + indexhandle = m->vindexes; //PLAG: delayed polygon-level sorted rendering @@ -2217,10 +2214,8 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) md3draw_handle_triangles(s, indexhandle, texunits, NULL); } -#ifdef USE_GLEXT - polymost_useDetailMapping(false); - polymost_useGlowMapping(false); -#endif + GLInterface.UseDetailMapping(false); + GLInterface.UseGlowMapping(false); } //------------ @@ -2230,12 +2225,11 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) VSMatrix identity(0); GLInterface.SetMatrix(Matrix_ModelView, &identity); - GLInterface.SetMatrix(Matrix_Texture0, &identity); - - polymost_setClamp(prevClamp); - polymost_usePaletteIndexing(true); - polymost_resetVertexPointers(); + GLInterface.SetClamp(prevClamp); + GLInterface.UsePaletteIndexing(true); + GLInterface.SetPolymostShader(); + globalnoeffect=0; return 1; } diff --git a/source/build/src/palette.cpp b/source/build/src/palette.cpp index 3801bd040..9f9904c29 100644 --- a/source/build/src/palette.cpp +++ b/source/build/src/palette.cpp @@ -58,13 +58,13 @@ void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f) GLInterface.EnableDepthTest(false); GLInterface.EnableAlphaTest(false); - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); GLInterface.SetBlendFunc(STYLEALPHA_Src, STYLEALPHA_InvSrc); GLInterface.EnableBlend(true); GLInterface.SetColorub(r, g, b, f); - polymost_useColorOnly(true); + GLInterface.UseColorOnly(true); auto data = GLInterface.AllocVertices(3); auto vt = data.second; @@ -72,7 +72,7 @@ void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f) vt[1].Set(2.5f, 1.f); vt[2].Set(.0f, -2.5f); GLInterface.Draw(DT_TRIANGLES, data.first, 3); - polymost_useColorOnly(false); + GLInterface.UseColorOnly(false); GLInterface.SetMatrix(Matrix_Projection, &oldproj); GLInterface.SetMatrix(Matrix_ModelView, &oldmv); @@ -93,12 +93,12 @@ void fullscreen_tint_gl_blood(void) GLInterface.EnableDepthTest(false); GLInterface.EnableAlphaTest(false); - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); GLInterface.SetBlendFunc(STYLEALPHA_One, STYLEALPHA_One); GLInterface.EnableBlend(true); - polymost_useColorOnly(true); + GLInterface.UseColorOnly(true); GLInterface.SetColorub(max(tint_blood_r, 0), max(tint_blood_g, 0), max(tint_blood_b, 0), 255); auto data = GLInterface.AllocVertices(3); auto vt = data.second; @@ -117,7 +117,7 @@ void fullscreen_tint_gl_blood(void) GLInterface.SetBlendOp(STYLEOP_Add); GLInterface.SetColorub(0,0,0,0); GLInterface.SetBlendFunc(STYLEALPHA_Src, STYLEALPHA_InvSrc); - polymost_useColorOnly(false); + GLInterface.UseColorOnly(false); GLInterface.SetMatrix(Matrix_Projection, &oldproj); GLInterface.SetMatrix(Matrix_ModelView, &oldmv); diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index 0b12b5944..1d7ff661f 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -129,7 +129,6 @@ int32_t r_flatsky = 1; static float fogresult, fogresult2; coltypef fogcol, fogtable[MAXPALOOKUPS]; -static uint32_t currentShaderProgramID = 0; static GLenum currentActiveTexture = 0; static uint32_t currentTextureID = 0; @@ -143,55 +142,6 @@ static FHardwareTexture *paletteTextureIDs[MAXBASEPALS]; static FHardwareTexture *palswapTextureID = nullptr; //extern char const *polymost1Frag; //extern char const *polymost1Vert; -static GLuint polymost1CurrentShaderProgramID = 0; -static GLuint polymost1ExtendedShaderProgramID = 0; -static GLint polymost1TexSamplerLoc = -1; -static GLint polymost1PalSwapSamplerLoc = -1; -static GLint polymost1PaletteSamplerLoc = -1; -static GLint polymost1DetailSamplerLoc = -1; -static GLint polymost1GlowSamplerLoc = -1; -static GLint polymost1TexturePosSizeLoc = -1; -static vec4f_t polymost1TexturePosSize = { 0.f, 0.f, 1.f, 1.f }; -static GLint polymost1HalfTexelSizeLoc = -1; -static vec2f_t polymost1HalfTexelSize = { 0.f, 0.f }; -static GLint polymost1PalswapPosLoc = -1; -static vec2f_t polymost1PalswapPos = { 0.f, 0.f }; -static GLint polymost1PalswapSizeLoc = -1; -static vec2f_t polymost1PalswapSize = { 0.f, 0.f }; -static vec2f_t polymost1PalswapInnerSize = { 0.f, 0.f }; -static GLint polymost1ClampLoc = -1; -static vec2f_t polymost1Clamp = { 0.f, 0.f }; -static GLint polymost1ShadeLoc = -1; -static float polymost1Shade = 0.f; -static GLint polymost1NumShadesLoc = -1; -static float polymost1NumShades = 64.f; -static GLint polymost1VisFactorLoc = -1; -static float polymost1VisFactor = 128.f; -static GLint polymost1FogEnabledLoc = -1; -static float polymost1FogEnabled = 1.f; -static GLint polymost1UseColorOnlyLoc = -1; -static float polymost1UseColorOnly = 0.f; -static GLint polymost1UsePaletteLoc = -1; -static float polymost1UsePalette = 1.f; -static GLint polymost1UseDetailMappingLoc = -1; -static float polymost1UseDetailMapping = 0.f; -static GLint polymost1UseGlowMappingLoc = -1; -static float polymost1UseGlowMapping = 0.f; -static GLint polymost1NPOTEmulationLoc = -1; -static float polymost1NPOTEmulation = 0.f; -static GLint polymost1NPOTEmulationFactorLoc = -1; -static float polymost1NPOTEmulationFactor = 1.f; -static GLint polymost1NPOTEmulationXOffsetLoc = -1; -static float polymost1NPOTEmulationXOffset = 0.f; -static GLint polymost1BrightnessLoc = -1; -static float polymost1Brightness = 1.f; -static GLint polymost1RotMatrixLoc = -1; -static float polymost1RotMatrix[16] = { 1.f, 0.f, 0.f, 0.f, - 0.f, 1.f, 0.f, 0.f, - 0.f, 0.f, 1.f, 0.f, - 0.f, 0.f, 0.f, 1.f }; -static GLint polymost1ShadeInterpolateLoc = -1; -static float polymost1ShadeInterpolate = 1.f; static inline float float_trans(uint32_t maskprops, uint8_t blend) { @@ -356,44 +306,6 @@ static void calcmat(vec3f_t a0, const vec2f_t *offset, float f, float mat[16], i mat[14] = (mat[14] + a0.y*mat[2]) + (a0.z*mat[6] + a0.x*mat[10]); } -static GLuint polymost2_compileShader(GLenum shaderType, const char* const source, int * pLength = nullptr) -{ - GLuint shaderID = glCreateShader(shaderType); - if (shaderID == 0) - { - return 0; - } - - glShaderSource(shaderID, - 1, - &source, - pLength); - glCompileShader(shaderID); - - GLint compileStatus; - glGetShaderiv(shaderID, GL_COMPILE_STATUS, &compileStatus); - if (!compileStatus) - { - GLint logLength; - glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLength); - OSD_Printf("Compile Status: %u\n", compileStatus); - if (logLength > 0) - { - char *infoLog = (char*)Xmalloc(logLength); - glGetShaderInfoLog(shaderID, logLength, &logLength, infoLog); - OSD_Printf("Log:\n%s\n", infoLog); - free(infoLog); - } - } - - return shaderID; -} - -static GLuint polymost2_compileShader(GLenum shaderType, const char* const source, int length) -{ - return polymost2_compileShader(shaderType, source, &length); -} - void polymost_glreset() { for (bssize_t i=0; i<=MAXPALOOKUPS-1; i++) @@ -450,286 +362,17 @@ void polymost_glreset() #endif } -// reset vertex pointers to polymost default -void polymost_resetVertexPointers() +static void polymost_bindPth(pthtyp const* const pPth, int sampler) { - polymost_resetProgram(); -} + Bassert(pPth); -void polymost_disableProgram() -{ - if (videoGetRenderMode() != REND_POLYMOST) - return; - - polymost_outputGLDebugMessage(3, "polymost_disableProgram()"); - - useShaderProgram(0); -} - -void polymost_resetProgram() -{ - if (videoGetRenderMode() != REND_POLYMOST) - return; - - polymost_outputGLDebugMessage(3, "polymost_resetProgram()"); - - useShaderProgram(polymost1CurrentShaderProgramID); - - // ensure that palswapTexture and paletteTexture[curbasepal] is bound - GLInterface.BindTexture(1, palswapTextureID); - GLInterface.BindTexture(2, paletteTextureIDs[curbasepal]); -} - -static void polymost_setCurrentShaderProgram(uint32_t programID) -{ - polymost_outputGLDebugMessage(3, "polymost_setCurrentShaderProgram(programID:%u)", programID); - - polymost1CurrentShaderProgramID = programID; - useShaderProgram(programID); - - //update the uniform locations - polymost1TexSamplerLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "s_texture"); - polymost1PalSwapSamplerLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "s_palswap"); - polymost1PaletteSamplerLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "s_palette"); - polymost1DetailSamplerLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "s_detail"); - polymost1GlowSamplerLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "s_glow"); - polymost1TexturePosSizeLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_texturePosSize"); - polymost1HalfTexelSizeLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_halfTexelSize"); - polymost1PalswapPosLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_palswapPos"); - polymost1PalswapSizeLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_palswapSize"); - polymost1ClampLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_clamp"); - polymost1ShadeLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_shade"); - polymost1NumShadesLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_numShades"); - polymost1VisFactorLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_visFactor"); - polymost1FogEnabledLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_fogEnabled"); - polymost1UsePaletteLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_usePalette"); - polymost1UseColorOnlyLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_useColorOnly"); - polymost1UseDetailMappingLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_useDetailMapping"); - polymost1UseGlowMappingLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_useGlowMapping"); - polymost1NPOTEmulationLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_npotEmulation"); - polymost1NPOTEmulationFactorLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_npotEmulationFactor"); - polymost1NPOTEmulationXOffsetLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_npotEmulationXOffset"); - polymost1BrightnessLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_brightness"); - polymost1RotMatrixLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_rotMatrix"); - polymost1ShadeInterpolateLoc = glGetUniformLocation(polymost1CurrentShaderProgramID, "u_shadeInterpolate"); - - //set the uniforms to the current values - glUniform4f(polymost1TexturePosSizeLoc, polymost1TexturePosSize.x, polymost1TexturePosSize.y, polymost1TexturePosSize.z, polymost1TexturePosSize.w); - glUniform2f(polymost1HalfTexelSizeLoc, polymost1HalfTexelSize.x, polymost1HalfTexelSize.y); - glUniform2f(polymost1PalswapPosLoc, polymost1PalswapPos.x, polymost1PalswapPos.y); - glUniform2f(polymost1PalswapSizeLoc, polymost1PalswapInnerSize.x, polymost1PalswapInnerSize.y); - glUniform2f(polymost1ClampLoc, polymost1Clamp.x, polymost1Clamp.y); - glUniform1f(polymost1ShadeLoc, polymost1Shade); - glUniform1f(polymost1NumShadesLoc, polymost1NumShades); - glUniform1f(polymost1VisFactorLoc, polymost1VisFactor); - glUniform1f(polymost1FogEnabledLoc, polymost1FogEnabled); - glUniform1f(polymost1UseColorOnlyLoc, polymost1UseColorOnly); - glUniform1f(polymost1UsePaletteLoc, polymost1UsePalette); - glUniform1f(polymost1UseDetailMappingLoc, polymost1UseDetailMapping); - glUniform1f(polymost1UseGlowMappingLoc, polymost1UseGlowMapping); - glUniform1f(polymost1NPOTEmulationLoc, polymost1NPOTEmulation); - glUniform1f(polymost1NPOTEmulationFactorLoc, polymost1NPOTEmulationFactor); - glUniform1f(polymost1NPOTEmulationXOffsetLoc, polymost1NPOTEmulationXOffset); - glUniform1f(polymost1BrightnessLoc, polymost1Brightness); - glUniformMatrix4fv(polymost1RotMatrixLoc, 1, false, polymost1RotMatrix); - glUniform1f(polymost1ShadeInterpolateLoc, polymost1ShadeInterpolate); -} - -void polymost_setTexturePosSize(vec4f_t const &texturePosSize) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1TexturePosSize = texturePosSize; - glUniform4f(polymost1TexturePosSizeLoc, polymost1TexturePosSize.x, polymost1TexturePosSize.y, polymost1TexturePosSize.z, polymost1TexturePosSize.w); -} - -static inline void polymost_setHalfTexelSize(vec2f_t const &halfTexelSize) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1HalfTexelSize = halfTexelSize; - glUniform2f(polymost1HalfTexelSizeLoc, polymost1HalfTexelSize.x, polymost1HalfTexelSize.y); -} - -static void polymost_setPalswap(uint32_t index) -{ - static uint32_t lastPalswapIndex; - - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - lastPalswapIndex = index; - polymost1PalswapPos.x = index*polymost1PalswapSize.x; - polymost1PalswapPos.y = floorf(polymost1PalswapPos.x); - polymost1PalswapPos = { polymost1PalswapPos.x - polymost1PalswapPos.y + (0.5f/PALSWAP_TEXTURE_SIZE), - polymost1PalswapPos.y * polymost1PalswapSize.y + (0.5f/PALSWAP_TEXTURE_SIZE) }; - glUniform2f(polymost1PalswapPosLoc, polymost1PalswapPos.x, polymost1PalswapPos.y); -} - -static void polymost_setPalswapSize(uint32_t width, uint32_t height) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1PalswapSize = { width*(1.f/PALSWAP_TEXTURE_SIZE), - height*(1.f/PALSWAP_TEXTURE_SIZE) }; - - polymost1PalswapInnerSize = { (width-1)*(1.f/PALSWAP_TEXTURE_SIZE), - (height-1)*(1.f/PALSWAP_TEXTURE_SIZE) }; - - glUniform2f(polymost1PalswapSizeLoc, polymost1PalswapInnerSize.x, polymost1PalswapInnerSize.y); -} - -char polymost_getClamp() -{ - return polymost1Clamp.x + polymost1Clamp.y*2.0; -} - -void polymost_setClamp(char clamp) -{ - char clampx = clamp&1; - char clampy = clamp>>1; - if (currentShaderProgramID != polymost1CurrentShaderProgramID || - (clampx == polymost1Clamp.x && clampy == polymost1Clamp.y)) - return; - - polymost1Clamp.x = clampx; - polymost1Clamp.y = clampy; - glUniform2f(polymost1ClampLoc, polymost1Clamp.x, polymost1Clamp.y); -} - -static void polymost_setShade(int32_t shade) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - if (globalflags & GLOBAL_NO_GL_TILESHADES) - shade = 0; - - static int32_t lastShade; - static int32_t lastNumShades; - - if (shade != lastShade) - { - lastShade = shade; - polymost1Shade = shade; - glUniform1f(polymost1ShadeLoc, polymost1Shade); - } - - if (numshades != lastNumShades) - { - lastNumShades = numshades; - polymost1NumShades = numshades; - glUniform1f(polymost1NumShadesLoc, polymost1NumShades); - } -} - -static void polymost_setVisibility(float visibility) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - float visFactor = visibility * fviewingrange * (1.f / (64.f * 65536.f)); - if (visFactor == polymost1VisFactor) - return; - - polymost1VisFactor = visFactor; - glUniform1f(polymost1VisFactorLoc, polymost1VisFactor); -} - -void polymost_setFogEnabled(char fogEnabled) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1FogEnabled = fogEnabled; - glUniform1f(polymost1FogEnabledLoc, polymost1FogEnabled); -} - -void polymost_useColorOnly(char useColorOnly) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1UseColorOnly = useColorOnly; - glUniform1f(polymost1UseColorOnlyLoc, polymost1UseColorOnly); -} - -void polymost_usePaletteIndexing(char usePaletteIndexing) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID) - return; - - polymost1UsePalette = usePaletteIndexing; - glUniform1f(polymost1UsePaletteLoc, polymost1UsePalette); -} - -void polymost_useDetailMapping(char useDetailMapping) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID || useDetailMapping == polymost1UseDetailMapping) - return; - - polymost1UseDetailMapping = useDetailMapping; - glUniform1f(polymost1UseDetailMappingLoc, polymost1UseDetailMapping); -} - -void polymost_useGlowMapping(char useGlowMapping) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID || useGlowMapping == polymost1UseGlowMapping) - return; - - polymost1UseGlowMapping = useGlowMapping; - glUniform1f(polymost1UseGlowMappingLoc, polymost1UseGlowMapping); -} - -void polymost_npotEmulation(char npotEmulation, float factor, float xOffset) -{ - if (currentShaderProgramID != polymost1CurrentShaderProgramID || npotEmulation == polymost1NPOTEmulation) - return; - - polymost1NPOTEmulation = npotEmulation; - glUniform1f(polymost1NPOTEmulationLoc, polymost1NPOTEmulation); - polymost1NPOTEmulationFactor = factor; - glUniform1f(polymost1NPOTEmulationFactorLoc, polymost1NPOTEmulationFactor); - polymost1NPOTEmulationXOffset = xOffset; - glUniform1f(polymost1NPOTEmulationXOffsetLoc, polymost1NPOTEmulationXOffset); -} - -void polymost_shadeInterpolate(int32_t shadeInterpolate) -{ - if (currentShaderProgramID == polymost1CurrentShaderProgramID) - { - polymost1ShadeInterpolate = shadeInterpolate; - glUniform1f(polymost1ShadeInterpolateLoc, polymost1ShadeInterpolate); - } -} - -void polymost_setBrightness(int brightness){ - if (currentShaderProgramID == polymost1CurrentShaderProgramID) - { - polymost1Brightness = 8.f / (brightness+8.f); - glUniform1f(polymost1BrightnessLoc, polymost1Brightness); - } -} - - -static void polymost_bindPth(pthtyp const * const pPth, int sampler) -{ - Bassert(pPth); - - vec4f_t texturePosSize = { 0.f, 0.f, 1.f, 1.f }; - vec2f_t halfTexelSize = { 0.f, 0.f }; - polymost_setTexturePosSize(texturePosSize); - polymost_setHalfTexelSize(halfTexelSize); GLInterface.BindTexture(0, pPth->glpic, sampler); } + void useShaderProgram(uint32_t shaderID) { glUseProgram(shaderID); - currentShaderProgramID = shaderID; } FileReader GetBaseResource(const char* fn); @@ -742,56 +385,6 @@ void polymost_glinit() currentTextureID = 0; char allPacked = false; - auto fr1 = GetBaseResource("demolition/shaders/glsl/polymost.vp"); - TArray polymost1Vert = fr1.Read(); - fr1 = GetBaseResource("demolition/shaders/glsl/polymost.fp"); - TArray polymost1Frag = fr1.Read(); - // Zero-terminate both strings. - polymost1Vert.Push(0); - polymost1Frag.Push(0); - - polymost1ExtendedShaderProgramID = glCreateProgram(); - GLuint polymost1BasicVertexShaderID = polymost2_compileShader(GL_VERTEX_SHADER, (char*)polymost1Vert.Data()); - GLuint polymost1ExtendedFragmentShaderID = polymost2_compileShader(GL_FRAGMENT_SHADER, (char*)polymost1Frag.Data()); - glAttachShader(polymost1ExtendedShaderProgramID, polymost1BasicVertexShaderID); - glAttachShader(polymost1ExtendedShaderProgramID, polymost1ExtendedFragmentShaderID); - glLinkProgram(polymost1ExtendedShaderProgramID); - - char buffer[10000]; - glGetShaderInfoLog(polymost1BasicVertexShaderID, 10000, NULL, buffer); - if (*buffer) - { - initprintf("Vertex shader:\n%s\n", buffer); - } - glGetShaderInfoLog(polymost1ExtendedFragmentShaderID, 10000, NULL, buffer); - if (*buffer) - { - initprintf("Fragment shader:\n%s\n", buffer); - } - - glGetProgramInfoLog(polymost1ExtendedShaderProgramID, 10000, NULL, buffer); - if (*buffer) - { - initprintf("Linking:\n%s\n", buffer); - } - GLint status = 0; - glGetProgramiv(polymost1ExtendedShaderProgramID, GL_LINK_STATUS, &status); - auto linked = (status == GL_TRUE); - if (!linked) - { - // only print message if there's an error. - wm_msgbox("Fatal error", "Unable to init shader\n"); - exit(1); - } - // set defaults - polymost_setCurrentShaderProgram(polymost1ExtendedShaderProgramID); - glUniform1i(polymost1TexSamplerLoc, 0); - glUniform1i(polymost1PalSwapSamplerLoc, 1); - glUniform1i(polymost1PaletteSamplerLoc, 2); - glUniform1i(polymost1DetailSamplerLoc, 3); - glUniform1i(polymost1GlowSamplerLoc, 4); - polymost_setPalswapSize(256, numshades+1); - useShaderProgram(0); lastbasepal = -1; for (int basepalnum = 0; basepalnum < MAXBASEPALS; ++basepalnum) @@ -804,15 +397,6 @@ void polymost_glinit() { uploadpalswap(palookupnum); } - - polymost_resetVertexPointers(); - -} - -void polymost_init() -{ - lastbasepal = -1; - polymost_resetVertexPointers(); } ////////// VISIBILITY FOG ROUTINES ////////// @@ -1060,7 +644,7 @@ static void resizeglcheck(void) VSMatrix identity(0); GLInterface.SetMatrix(Matrix_ModelView, &identity); - if (!nofog) polymost_setFogEnabled(true); + if (!nofog) GLInterface.SetFogEnabled(true); } } @@ -1133,11 +717,6 @@ void uploadtexture(FHardwareTexture *tex, int32_t doalloc, vec2_t siz, int32_t t void uploadbasepalette(int32_t basepalnum) { - if (!polymost1ExtendedShaderProgramID) - { - //POGO: if we haven't initialized properly yet, we shouldn't be uploading base palettes - return; - } if (!basepaltable[basepalnum]) { return; @@ -1165,11 +744,6 @@ void uploadbasepalette(int32_t basepalnum) void uploadpalswap(int32_t palookupnum) { - if (!polymost1ExtendedShaderProgramID) - { - //POGO: if we haven't initialized properly yet, we shouldn't be uploading palette swap tables - return; - } if (!palookup[palookupnum]) { return; @@ -1826,8 +1400,8 @@ static void polymost_updatePalette() return; } - polymost_setPalswap(globalpal); - polymost_setShade(globalshade); + GLInterface.SetPalswap(globalpal); + GLInterface.SetShade(globalshade, numshades); //POGO: only bind the base pal once when it's swapped if (curbasepal != lastbasepal) @@ -1840,7 +1414,7 @@ static void polymost_updatePalette() static void polymost_updaterotmat(void) { - if (currentShaderProgramID == polymost1CurrentShaderProgramID) + if (1) { float matrix[16] = { 1.f, 0.f, 0.f, 0.f, @@ -1866,24 +1440,17 @@ static void polymost_updaterotmat(void) multiplyMatrix4f(matrix, udmatrix); multiplyMatrix4f(matrix, tiltmatrix); #endif - Bmemcpy(polymost1RotMatrix, matrix, sizeof(matrix)); - glUniformMatrix4fv(polymost1RotMatrixLoc, 1, false, polymost1RotMatrix); + GLInterface.SetMatrix(Matrix_View, matrix); } } static void polymost_identityrotmat(void) { - if (currentShaderProgramID == polymost1CurrentShaderProgramID) + if (1) { - float matrix[16] = { - 1.f, 0.f, 0.f, 0.f, - 0.f, 1.f, 0.f, 0.f, - 0.f, 0.f, 1.f, 0.f, - 0.f, 0.f, 0.f, 1.f, - }; - Bmemcpy(polymost1RotMatrix, matrix, sizeof(matrix)); - glUniformMatrix4fv(polymost1RotMatrixLoc, 1, false, polymost1RotMatrix); - } + VSMatrix matrix(0); + GLInterface.SetMatrix(Matrix_View, &matrix); + } } static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, int32_t method); @@ -2022,7 +1589,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 //POGOTODO: I could move this into bindPth if (!(pth->flags & PTH_INDEXED)) - polymost_usePaletteIndexing(false); + GLInterface.UsePaletteIndexing(false); // The entire logic here is just one lousy hack. int mSampler = NoSampler; @@ -2065,7 +1632,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 (detailpth = texcache_fetch(globalpicnum, DETAILPAL, 0, method & ~DAMETH_MASKPROPS)) && detailpth->hicr && detailpth->hicr->palnum == DETAILPAL) { - polymost_useDetailMapping(true); + GLInterface.UseDetailMapping(true); polymost_setupdetailtexture(3, detailpth->glpic); texmat.loadIdentity(); @@ -2089,7 +1656,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 (glowpth = texcache_fetch(globalpicnum, GLOWPAL, 0, (method & ~DAMETH_MASKPROPS) | DAMETH_MASK)) && glowpth->hicr && (glowpth->hicr->palnum == GLOWPAL)) { - polymost_useGlowMapping(true); + GLInterface.UseGlowMapping(true); polymost_setupglowtexture(4, glowpth->glpic); } } @@ -2100,16 +1667,16 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 int32_t size2; for (size2 = 1; size2 < size; size2 += size2) {} if (size == size2) - polymost_npotEmulation(false, 1.f, 0.f); + GLInterface.SetNpotEmulation(false, 1.f, 0.f); else { float xOffset = 1.f / tilesiz[globalpicnum].x; - polymost_npotEmulation(true, (1.f*size2) / size, xOffset); + GLInterface.SetNpotEmulation(true, (1.f*size2) / size, xOffset); } } else { - polymost_npotEmulation(false, 1.f, 0.f); + GLInterface.SetNpotEmulation(false, 1.f, 0.f); } #endif @@ -2333,12 +1900,10 @@ do GLInterface.Draw(DT_TRIANGLE_FAN, data.first, npoints); } -#ifdef USE_GLEXT + GLInterface.UseDetailMapping(false); + GLInterface.UseGlowMapping(false); + GLInterface.SetNpotEmulation(false, 1.f, 0.f); - polymost_useDetailMapping(false); - polymost_useGlowMapping(false); - polymost_npotEmulation(false, 1.f, 0.f); -#endif if (pth->hicr) { VSMatrix identity(0); @@ -2356,7 +1921,7 @@ do if (!(pth->flags & PTH_INDEXED)) { // restore palette usage if we were just rendering a non-indexed color texture - polymost_usePaletteIndexing(true); + GLInterface.UsePaletteIndexing(true); } if (fullbright_pass == 1) { @@ -2365,7 +1930,7 @@ do globalshade = -128; fullbright_pass = 2; - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); GLInterface.SetDepthFunc(Depth_Equal); @@ -2374,7 +1939,7 @@ do GLInterface.SetDepthFunc(Depth_LessEqual); if (!nofog) - polymost_setFogEnabled(true); + GLInterface.SetFogEnabled(true); globalshade = shade; fullbright_pass = 0; @@ -3771,7 +3336,7 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i int const npot = (1<<(picsiz[globalpicnum]&15)) != tilesiz[globalpicnum].x; int const xpanning = (r_parallaxskypanning?global_cf_xpanning:0); - polymost_setClamp((npot || xpanning != 0) ? 0 : 2); + GLInterface.SetClamp((npot || xpanning != 0) ? 0 : 2); int picnumbak = globalpicnum; ti = globalpicnum; @@ -3906,7 +3471,7 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i globalpicnum = picnumbak; - polymost_setClamp(0); + GLInterface.SetClamp(0); flatskyrender = 1; } @@ -4016,7 +3581,7 @@ static void polymost_drawalls(int32_t const bunch) globvis2 = (sector[sectnum].visibility != 0) ? mulscale4(globalcisibility2, (uint8_t)(sector[sectnum].visibility + 16)) : globalcisibility2; - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); tileUpdatePicnum(&globalpicnum, sectnum); @@ -4054,7 +3619,7 @@ static void polymost_drawalls(int32_t const bunch) if (sec->visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sec->visibility + 16)); float viscale = xdimscale*fxdimen*(.0000001f/256.f); - polymost_setVisibility(globvis2*viscale); + GLInterface.SetVisibility(globvis2*viscale, fviewingrange); //Use clamping for tiled sky textures //(don't wrap around edges if the sky use multiple panels) @@ -4073,7 +3638,7 @@ static void polymost_drawalls(int32_t const bunch) skyclamphack = 0; flatskyrender = 1; globalshade += globvis2*xdimscale*fviewingrange*(1.f / (64.f * 65536.f * 256.f * 1024.f)); - polymost_setVisibility(0.f); + GLInterface.SetVisibility(0.f, fviewingrange); polymost_domost(x0,fy0,x1,fy1); flatskyrender = 0; } @@ -4353,7 +3918,7 @@ static void polymost_drawalls(int32_t const bunch) skyclamphack = 0; skyzbufferhack = 0; if (!nofog) - polymost_setFogEnabled(true); + GLInterface.SetFogEnabled(true); } // Ceiling @@ -4373,7 +3938,7 @@ static void polymost_drawalls(int32_t const bunch) globvis2 = (sector[sectnum].visibility != 0) ? mulscale4(globalcisibility2, (uint8_t)(sector[sectnum].visibility + 16)) : globalcisibility2; - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); tileUpdatePicnum(&globalpicnum, sectnum); @@ -4411,7 +3976,7 @@ static void polymost_drawalls(int32_t const bunch) if (sec->visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sec->visibility + 16)); float viscale = xdimscale*fxdimen*(.0000001f/256.f); - polymost_setVisibility(globvis2*viscale); + GLInterface.SetVisibility(globvis2*viscale, fviewingrange); //Use clamping for tiled sky textures //(don't wrap around edges if the sky use multiple panels) @@ -4430,7 +3995,7 @@ static void polymost_drawalls(int32_t const bunch) skyclamphack = 0; flatskyrender = 1; globalshade += globvis2*xdimscale*fviewingrange*(1.f / (64.f * 65536.f * 256.f * 1024.f)); - polymost_setVisibility(0.f); + GLInterface.SetVisibility(0.f, fviewingrange); polymost_domost(x1,cy1,x0,cy0); flatskyrender = 0; } @@ -4713,7 +4278,7 @@ static void polymost_drawalls(int32_t const bunch) skyclamphack = 0; skyzbufferhack = 0; if (!nofog) - polymost_setFogEnabled(true); + GLInterface.SetFogEnabled(true); } #ifdef YAX_ENABLE @@ -4721,13 +4286,6 @@ static void polymost_drawalls(int32_t const bunch) { int32_t baselevp, checkcf, i, j; int16_t bn[2]; -# if 0 - int32_t obunchchk = (1 && yax_globalbunch>=0 && - haveymost[yax_globalbunch>>3]&pow2char[yax_globalbunch&7]); - - // if (obunchchk) - const int32_t x2 = yax_globalbunch*xdimen; -# endif baselevp = (yax_globallev == YAX_MAXDRAWS); yax_getbunches(sectnum, &bn[0], &bn[1]); @@ -4806,7 +4364,7 @@ static void polymost_drawalls(int32_t const bunch) if (sector[sectnum].visibility != 0) globvis = mulscale4(globvis, (uint8_t)(sector[sectnum].visibility+16)); globvis2 = globalvisibility2; if (sector[sectnum].visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sector[sectnum].visibility+16)); - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); globalorientation = wal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -4851,7 +4409,7 @@ static void polymost_drawalls(int32_t const bunch) if (sector[sectnum].visibility != 0) globvis = mulscale4(globvis, (uint8_t)(sector[sectnum].visibility+16)); globvis2 = globalvisibility2; if (sector[sectnum].visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sector[sectnum].visibility+16)); - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); globalorientation = nwal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -4904,7 +4462,7 @@ static void polymost_drawalls(int32_t const bunch) globvis2 = (sector[sectnum].visibility != 0) ? mulscale4(globalvisibility2, (uint8_t)(sector[sectnum].visibility + 16)) : globalvisibility2; - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); globalorientation = wal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -5239,7 +4797,7 @@ void polymost_drawrooms() GLInterface.EnableDepthTest(true); GLInterface.SetDepthFunc(Depth_Always); - polymost_setBrightness(r_brightnesshack); + GLInterface.SetBrightness(r_brightnesshack); gvrcorrection = viewingrange*(1.f/65536.f); if (glprojectionhacks == 2) @@ -5270,7 +4828,7 @@ void polymost_drawrooms() gvisibility = ((float)globalvisibility)*FOGSCALE; - polymost_shadeInterpolate(r_shadeinterpolate); + GLInterface.SetShadeInterpolate(r_shadeinterpolate); //global cos/sin height angle if (r_yshearing) @@ -5514,7 +5072,7 @@ static void polymost_drawmaskwallinternal(int32_t wallIndex) globvis2 = globalvisibility2; globvis2 = (sector[sectnum].visibility != 0) ? mulscale4(globvis2, (uint8_t)(sector[sectnum].visibility + 16)) : globalvisibility2; - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); globalshade = (int32_t)wal->shade; globalpal = (int32_t)((uint8_t)wal->pal); @@ -5894,7 +5452,7 @@ void polymost_drawsprite(int32_t snum) globvis2 = globalvisibility2; if (sector[tspr->sectnum].visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sector[tspr->sectnum].visibility + 16)); - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); vec2_t off = { 0, 0 }; @@ -6308,7 +5866,7 @@ void polymost_drawsprite(int32_t snum) globvis2 = globalhisibility2; if (sector[tspr->sectnum].visibility != 0) globvis2 = mulscale4(globvis2, (uint8_t)(sector[tspr->sectnum].visibility + 16)); - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); if ((globalorientation & 64) != 0 && (globalposz > tspr->z) == (!(globalorientation & 8))) goto _drawsprite_return; @@ -6691,12 +6249,12 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a, spriteext[tspr.owner].alpha = daalpha * (1.0f / 255.0f); tspr.blend = dablend; - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); if (videoGetRenderMode() == REND_POLYMOST) polymost_mddraw(&tspr); - if (!nofog) polymost_setFogEnabled(true); + if (!nofog) GLInterface.SetFogEnabled(true); gvrcorrection = ogvrcorrection; viewingrange = oldviewingrange; @@ -6730,8 +6288,8 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 globvis = 0; globvis2 = 0; - polymost_setClamp(1+2); - polymost_setVisibility(globvis2); + GLInterface.SetClamp(1+2); + GLInterface.SetVisibility(globvis2, fviewingrange); int32_t const ogpicnum = globalpicnum; globalpicnum = picnum; @@ -6931,14 +6489,14 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 xtex.v = yv2*(1.0/65536.0); ytex.v = yv*(1.0/65536.0); - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); pow2xsplit = 0; polymost_drawpoly(fpxy,n,method); - if (!nofog) polymost_setFogEnabled(true); + if (!nofog) GLInterface.SetFogEnabled(true); } GLInterface.EnableAlphaTest(false); GLInterface.EnableBlend(false); - polymost_setClamp(0); + GLInterface.SetClamp(0); GLInterface.SetMatrix(Matrix_Projection, &oldproj); GLInterface.SetMatrix(Matrix_ModelView, &oldmv); @@ -7130,7 +6688,7 @@ void polymost_fillpolygon(int32_t npoints) polymost_outputGLDebugMessage(3, "polymost_fillpolygon(npoints:%d)", npoints); globvis2 = 0; - polymost_setVisibility(globvis2); + GLInterface.SetVisibility(globvis2, fviewingrange); globalx1 = mulscale16(globalx1,xyaspect); globaly2 = mulscale16(globaly2,xyaspect); @@ -7157,7 +6715,7 @@ void polymost_fillpolygon(int32_t npoints) polymost_bindPth(pth, -1); if (!(pth->flags & PTH_INDEXED)) - polymost_usePaletteIndexing(false); + GLInterface.UsePaletteIndexing(false); } polymost_updatePalette(); @@ -7182,7 +6740,7 @@ void polymost_fillpolygon(int32_t npoints) if (pth && !(pth->flags & PTH_INDEXED)) { // restore palette usage if we were just rendering a non-indexed color texture - polymost_usePaletteIndexing(true); + GLInterface.UsePaletteIndexing(true); } } @@ -7241,6 +6799,17 @@ static int32_t gen_font_glyph_tex(void) return 0; } +// These are used by the automap drawers +void renderDisableFog(void) +{ + GLInterface.SetFogEnabled(false); +} + +void renderEnableFog(void) +{ + if (!nofog) GLInterface.SetFogEnabled(true); +} + int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t backcol, const char *name, char fontsize) { int const arbackcol = (unsigned)backcol < 256 ? backcol : 0; @@ -7261,9 +6830,8 @@ int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t ba return -1; GLInterface.BindTexture(0, polymosttext); - polymost_setTexturePosSize({0, 0, 1, 1}); - - polymost_usePaletteIndexing(false); + + GLInterface.UsePaletteIndexing(false); polymostSet2dView(); // disables blending, texturing, and depth testing @@ -7271,7 +6839,7 @@ int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t ba GLInterface.SetDepthMask(false); // XXX: Don't fogify the OSD text in Mapster32 with r_usenewshading >= 2. - polymost_setFogEnabled(false); + GLInterface.SetFogEnabled(false); // We want to have readable text in wireframe mode, too: GLInterface.SetWireframe(false); lastglpolygonmode = 0; @@ -7360,9 +6928,9 @@ int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t ba GLInterface.SetDepthMask(true); - if (!nofog) polymost_setFogEnabled(true); + if (!nofog) GLInterface.SetFogEnabled(true); - polymost_usePaletteIndexing(true); + GLInterface.UsePaletteIndexing(true); return 0; } diff --git a/source/build/src/voxmodel.cpp b/source/build/src/voxmodel.cpp index 2549bd27b..5463c266a 100644 --- a/source/build/src/voxmodel.cpp +++ b/source/build/src/voxmodel.cpp @@ -1132,15 +1132,14 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr) #endif const float phack[2] = { 0, 1.f/256.f }; - char prevClamp = polymost_getClamp(); - polymost_setClamp(0); + int prevClamp = GLInterface.GetClamp(); + GLInterface.SetClamp(0); if (!m->texid[globalpal]) m->texid[globalpal] = gloadtex(m->mytex, m->mytexx, m->mytexy, m->is8bit, globalpal); GLInterface.BindTexture(0, m->texid[globalpal]); - polymost_usePaletteIndexing(false); - polymost_setTexturePosSize({ 0.f, 0.f, 1.f, 1.f }); + GLInterface.UsePaletteIndexing(false); auto data = GLInterface.AllocVertices(m->qcnt * 4); auto vt = data.second; @@ -1183,7 +1182,7 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr) } GLInterface.Draw(DT_QUADS, qstart, qdone * 4); - polymost_setClamp(prevClamp); + GLInterface.SetClamp(prevClamp); //------------ GLInterface.SetCull(Cull_None); diff --git a/source/glbackend/gl_renderstate.h b/source/glbackend/gl_renderstate.h new file mode 100644 index 000000000..45c4f3879 --- /dev/null +++ b/source/glbackend/gl_renderstate.h @@ -0,0 +1,26 @@ +#pragma once + +class PolymostShader; + +struct PolymostRenderState +{ + int PalSwapIndex; + //float PalswapPos[2]; + //float PalswapSize[2]; + float Clamp[2]; + float Shade; + float NumShades = 64.f; + float VisFactor = 128.f; + float FogEnabled = 1.f; + float UseColorOnly; + float UsePalette = 1.f; + float UseDetailMapping; + float UseGlowMapping; + float NPOTEmulation; + float NPOTEmulationFactor = 1.f; + float NPOTEmulationXOffset; + float Brightness = 1.f; + float ShadeInterpolate = 1.f; + + void Apply(PolymostShader *shader); +}; diff --git a/source/glbackend/gl_shader.cpp b/source/glbackend/gl_shader.cpp new file mode 100644 index 000000000..56a61372c --- /dev/null +++ b/source/glbackend/gl_shader.cpp @@ -0,0 +1,179 @@ +/* +** gl_shader.cpp +** +** GLSL shader handling +** +**--------------------------------------------------------------------------- +** Copyright 2004-2019 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** 4. When not used as part of GZDoom or a GZDoom derivative, this code will be +** covered by the terms of the GNU Lesser General Public License as published +** by the Free Software Foundation; either version 2.1 of the License, or (at +** your option) any later version. +** 5. Full disclosure of the entire project's source code, except for third +** party libraries is mandatory. (NOTE: This clause is non-negotiable!) +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ +#include +#include "glbackend.h" +#include "glad/glad.h" +#include "gl_shader.h" +#include "zstring.h" + +#include "baselayer.h" + +//========================================================================== +// +// +// +//========================================================================== + +bool FShader::Load(const char * name, const char * vert_prog, const char * frag_prog) +{ + FString error; + static char buffer[10000]; + + hVertProg = glCreateShader(GL_VERTEX_SHADER); + hFragProg = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(hVertProg, 1, &vert_prog, nullptr); + glShaderSource(hFragProg, 1, &frag_prog, nullptr); + + glCompileShader(hVertProg); + glCompileShader(hFragProg); + + hShader = glCreateProgram(); + + glAttachShader(hShader, hVertProg); + glAttachShader(hShader, hFragProg); + + //glBindAttribLocation(hShader, VATTR_VERTEX, "aPosition"); + //glBindAttribLocation(hShader, VATTR_TEXCOORD, "aTexCoord"); + //glBindAttribLocation(hShader, VATTR_COLOR, "aColor"); + //glBindAttribLocation(hShader, VATTR_VERTEX2, "aVertex2"); + + glLinkProgram(hShader); + + glGetShaderInfoLog(hVertProg, 10000, NULL, buffer); + if (*buffer) + { + error << "Vertex shader:\n" << buffer << "\n"; + } + glGetShaderInfoLog(hFragProg, 10000, NULL, buffer); + if (*buffer) + { + error << "Fragment shader:\n" << buffer << "\n"; + } + + glGetProgramInfoLog(hShader, 10000, NULL, buffer); + if (*buffer) + { + error << "Linking:\n" << buffer << "\n"; + } + int linked; + glGetProgramiv(hShader, GL_LINK_STATUS, &linked); + if (linked == 0) + { + // only print message if there's an error. + initprintf("Init Shader '%s':\n%s\n", name, error.GetChars()); + return false; + } + return true; +} + +//========================================================================== +// +// +// +//========================================================================== + +FShader::~FShader() +{ + glDeleteProgram(hShader); + glDeleteShader(hVertProg); + glDeleteShader(hFragProg); +} + + +//========================================================================== +// +// +// +//========================================================================== + +bool FShader::Bind() +{ + glUseProgram(hShader); + return true; +} + + +//========================================================================== +// +// +// +//========================================================================== + +bool PolymostShader::Load(const char * name, const char * vert_prog, const char * frag_prog) +{ + if (!FShader::Load(name, vert_prog, frag_prog)) return false; + + PalswapPos.Init(hShader, "u_palswapPos"); + PalswapSize.Init(hShader, "u_palswapSize"); + Clamp.Init(hShader, "u_clamp"); + Shade.Init(hShader, "u_shade"); + NumShades.Init(hShader, "u_numShades"); + VisFactor.Init(hShader, "u_visFactor"); + FogEnabled.Init(hShader, "u_fogEnabled"); + UseColorOnly.Init(hShader, "u_useColorOnly"); + UsePalette.Init(hShader, "u_usePalette"); + UseDetailMapping.Init(hShader, "u_useDetailMapping"); + UseGlowMapping.Init(hShader, "u_useGlowMapping"); + NPOTEmulation.Init(hShader, "u_npotEmulation"); + NPOTEmulationFactor.Init(hShader, "u_npotEmulationFactor"); + NPOTEmulationXOffset.Init(hShader, "u_npotEmulationXOffset"); + Brightness.Init(hShader, "u_brightness"); + RotMatrix.Init(hShader, "u_rotMatrix"); + ShadeInterpolate.Init(hShader, "u_shadeInterpolate"); + + glUseProgram(hShader); + + int SamplerLoc; + SamplerLoc = glGetUniformLocation(hShader, "s_texture"); + glUniform1i(SamplerLoc, 0); + SamplerLoc = glGetUniformLocation(hShader, "s_palswap"); + glUniform1i(SamplerLoc, 1); + SamplerLoc = glGetUniformLocation(hShader, "s_palette"); + glUniform1i(SamplerLoc, 2); + SamplerLoc = glGetUniformLocation(hShader, "s_detail"); + glUniform1i(SamplerLoc, 3); + SamplerLoc = glGetUniformLocation(hShader, "s_glow"); + glUniform1i(SamplerLoc, 4); + + glUseProgram(0); + return true; +} diff --git a/source/glbackend/gl_shader.h b/source/glbackend/gl_shader.h new file mode 100644 index 000000000..89792e289 --- /dev/null +++ b/source/glbackend/gl_shader.h @@ -0,0 +1,60 @@ +#pragma once; + +#include "gl_uniform.h" + +class FShader +{ + friend class FShaderManager; + friend class FRenderState; + + unsigned int hVertProg = 0; + unsigned int hFragProg = 0; + +protected: + unsigned int hShader = 0; + +#if 0 + FName mName; + int projectionmatrix_index; + int viewmatrix_index; + int modelmatrix_index; + int texturematrix_index; + bool currentTextureMatrixState = false; + bool currentModelMatrixState = false; +#endif + +public: + FShader() = default; + virtual ~FShader(); + + virtual bool Load(const char * name, const char * vert_prog_lump, const char * fragprog); //, const char * fragprog2, const char *defines); + bool Bind(); + unsigned int GetHandle() const { return hShader; } +}; + +class PolymostShader : public FShader +{ +public: + FBufferedUniform2f PalswapPos; + FBufferedUniform2f PalswapSize; + FBufferedUniform2f Clamp; + FBufferedUniform1f Shade; + FBufferedUniform1f NumShades; + FBufferedUniform1f VisFactor; + FBufferedUniform1f FogEnabled; + FBufferedUniform1f UseColorOnly; + FBufferedUniform1f UsePalette; + FBufferedUniform1f UseDetailMapping; + FBufferedUniform1f UseGlowMapping; + FBufferedUniform1f NPOTEmulation; + FBufferedUniform1f NPOTEmulationFactor; + FBufferedUniform1f NPOTEmulationXOffset; + FBufferedUniform1f Brightness; + FUniformMatrix4f RotMatrix; + FBufferedUniform1f ShadeInterpolate; + +public: + + PolymostShader() = default; + virtual bool Load(const char * name, const char * vert_prog_lump, const char * fragprog); //, const char * fragprog2, const char *defines); +}; diff --git a/source/glbackend/gl_uniform.h b/source/glbackend/gl_uniform.h new file mode 100644 index 000000000..1fdc722fe --- /dev/null +++ b/source/glbackend/gl_uniform.h @@ -0,0 +1,94 @@ +#pragma once + +class FBufferedUniform1f +{ + float mBuffer; + int mIndex; + +public: + void Init(GLuint hShader, const GLchar *name) + { + mIndex = glGetUniformLocation(hShader, name); + mBuffer = 0; + } + + void Set(float newvalue) + { + if (newvalue != mBuffer) + { + mBuffer = newvalue; + glUniform1f(mIndex, newvalue); + } + } +}; + +class FBufferedUniform2f +{ + float mBuffer[2]; + int mIndex; + +public: + void Init(GLuint hShader, const GLchar *name) + { + mIndex = glGetUniformLocation(hShader, name); + memset(mBuffer, 0, sizeof(mBuffer)); + } + + void Set(const float *newvalue) + { + if (memcmp(newvalue, mBuffer, sizeof(mBuffer))) + { + memcpy(mBuffer, newvalue, sizeof(mBuffer)); + glUniform2fv(mIndex, 1, newvalue); + } + } + + void Set(float f1, float f2) + { + if (mBuffer[0] != f1 || mBuffer[1] != f2) + { + mBuffer[0] = f1; + mBuffer[1] = f2; + glUniform2fv(mIndex, 1, mBuffer); + } + } + +}; + +class FBufferedUniform4f +{ + float mBuffer[4]; + int mIndex; + +public: + void Init(GLuint hShader, const GLchar *name) + { + mIndex = glGetUniformLocation(hShader, name); + memset(mBuffer, 0, sizeof(mBuffer)); + } + + void Set(const float *newvalue) + { + if (memcmp(newvalue, mBuffer, sizeof(mBuffer))) + { + memcpy(mBuffer, newvalue, sizeof(mBuffer)); + glUniform4fv(mIndex, 1, newvalue); + } + } +}; + +class FUniformMatrix4f +{ + int mIndex; + +public: + void Init(GLuint hShader, const GLchar *name) + { + mIndex = glGetUniformLocation(hShader, name); + } + + void Set(const float *newvalue) + { + glUniformMatrix4fv(mIndex, 1, false, newvalue); + } +}; \ No newline at end of file diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index 826891eb3..6a223cfb4 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -2,6 +2,7 @@ #include "glbackend.h" #include "glad/glad.h" #include "gl_samplers.h" +#include "gl_shader.h" #include "baselayer.h" #include "resourcefile.h" @@ -60,9 +61,29 @@ void GLInstance::Init() osdcmd_glinfo(NULL); glinfo.dumped = 1; } + new(&renderState) PolymostRenderState; // reset to defaults. + LoadPolymostShader(); } +void GLInstance::LoadPolymostShader() +{ + auto fr1 = GetBaseResource("demolition/shaders/glsl/polymost.vp"); + TArray polymost1Vert = fr1.Read(); + fr1 = GetBaseResource("demolition/shaders/glsl/polymost.fp"); + TArray polymost1Frag = fr1.Read(); + // Zero-terminate both strings. + polymost1Vert.Push(0); + polymost1Frag.Push(0); + polymostShader = new PolymostShader(); + if (!polymostShader->Load("PolymostShader", (const char*)polymost1Vert.Data(), (const char*)polymost1Frag.Data())) + { + exit(1); + } + SetPolymostShader(); +} + + void GLInstance::InitGLState(int fogmode, int multisample) { glShadeModel(GL_SMOOTH); // GL_FLAT @@ -89,6 +110,10 @@ void GLInstance::Deinit() { if (mSamplers) delete mSamplers; mSamplers = nullptr; + if (polymostShader) delete polymostShader; + polymostShader = nullptr; + + activeShader = nullptr; } std::pair GLInstance::AllocVertices(size_t num) @@ -108,6 +133,7 @@ static GLint primtypes[] = void GLInstance::Draw(EDrawType type, size_t start, size_t count) { + if (activeShader == polymostShader) renderState.Apply(polymostShader); glBegin(primtypes[type]); auto p = &Buffer[start]; for (size_t i = 0; i < count; i++, p++) @@ -188,22 +214,30 @@ void GLInstance::SetMatrix(int num, const VSMatrix *mat) matrices[num] = *mat; switch(num) { + default: + return; + case Matrix_View: + polymostShader->RotMatrix.Set(mat->get()); + break; + case Matrix_Projection: glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->get()); break; case Matrix_ModelView: glMatrixMode(GL_MODELVIEW); + glLoadMatrixf(mat->get()); break; - default: - glActiveTexture(GL_TEXTURE0 + num - Matrix_Texture0); + case Matrix_Texture3: + case Matrix_Texture4: + glActiveTexture(GL_TEXTURE3 + num - Matrix_Texture3); glMatrixMode(GL_TEXTURE); + glLoadMatrixf(mat->get()); + glActiveTexture(GL_TEXTURE0); break; } - glLoadMatrixf(mat->get()); - glMatrixMode(GL_MODELVIEW); - if (num > Matrix_Texture0) glActiveTexture(GL_TEXTURE0); } void GLInstance::EnableStencilWrite(int value) @@ -325,4 +359,69 @@ void GLInstance::SetWireframe(bool on) void GLInstance::ReadPixels(int xdim, int ydim, uint8_t* buffer) { glReadPixels(0, 0, xdim, ydim, GL_RGB, GL_UNSIGNED_BYTE, buffer); -} \ No newline at end of file +} + +void GLInstance::SetPolymostShader() +{ + if (activeShader != polymostShader) + { + polymostShader->Bind(); + activeShader = polymostShader; + } + //GLInterface.BindTexture(1, palswapTextureID); + //GLInterface.BindTexture(2, paletteTextureIDs[curbasepal]); + +} + + +void PolymostRenderState::Apply(PolymostShader* shader) +{ + shader->Clamp.Set(Clamp); + shader->Shade.Set(Shade); + shader->NumShades.Set(NumShades); + shader->VisFactor.Set(VisFactor); + shader->FogEnabled.Set(FogEnabled); + shader->UseColorOnly.Set(UseColorOnly); + shader->UsePalette.Set(UsePalette); + shader->UseDetailMapping.Set(UseDetailMapping); + shader->UseGlowMapping.Set(UseGlowMapping); + shader->NPOTEmulation.Set(NPOTEmulation); + shader->NPOTEmulationFactor.Set(NPOTEmulationFactor); + shader->NPOTEmulationXOffset.Set(NPOTEmulationXOffset); + shader->ShadeInterpolate.Set(ShadeInterpolate); + shader->Brightness.Set(Brightness); +} + +#if 0 + +static void polymost_setPalswap(uint32_t index) +{ + static uint32_t lastPalswapIndex; + + if (currentShaderProgramID != polymost1CurrentShaderProgramID) + return; + + lastPalswapIndex = index; + polymost1PalswapPos.x = index * polymost1PalswapSize.x; + polymost1PalswapPos.y = floorf(polymost1PalswapPos.x); + polymost1PalswapPos = { polymost1PalswapPos.x - polymost1PalswapPos.y + (0.5f / PALSWAP_TEXTURE_SIZE), + polymost1PalswapPos.y * polymost1PalswapSize.y + (0.5f / PALSWAP_TEXTURE_SIZE) }; + glUniform2f(polymost1PalswapPosLoc, polymost1PalswapPos.x, polymost1PalswapPos.y); +} + +static void polymost_setPalswapSize(uint32_t width, uint32_t height) +{ + if (currentShaderProgramID != polymost1CurrentShaderProgramID) + return; + + polymost1PalswapSize = { width * (1.f / PALSWAP_TEXTURE_SIZE), + height * (1.f / PALSWAP_TEXTURE_SIZE) }; + + polymost1PalswapInnerSize = { (width - 1) * (1.f / PALSWAP_TEXTURE_SIZE), + (height - 1) * (1.f / PALSWAP_TEXTURE_SIZE) }; + + glUniform2f(polymost1PalswapSizeLoc, polymost1PalswapInnerSize.x, polymost1PalswapInnerSize.y); +} + + +#endif \ No newline at end of file diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h index 2442977d8..68adf90fd 100644 --- a/source/glbackend/glbackend.h +++ b/source/glbackend/glbackend.h @@ -5,9 +5,12 @@ #include #include "gl_samplers.h" #include "gl_hwtexture.h" +#include "gl_renderstate.h" #include "matrix.h" class FSamplerManager; +class FShader; +class PolymostShader; struct glinfo_t { const char* vendor; @@ -59,16 +62,12 @@ enum EDrawType enum EMatrixType { + Matrix_View, Matrix_Projection, Matrix_ModelView, - Matrix_Texture0, - Matrix_Texture1, - Matrix_Texture2, Matrix_Texture3, Matrix_Texture4, - Matrix_Texture5, - Matrix_Texture6, - Matrix_Texture7, + // These are the only ones being used. NUMMATRICES }; @@ -128,6 +127,9 @@ class GLInstance int maxTextureSize; VSMatrix matrices[NUMMATRICES]; + PolymostRenderState renderState; + FShader* activeShader; + PolymostShader* polymostShader; public: @@ -136,6 +138,7 @@ public: void Init(); void InitGLState(int fogmode, int multisample); + void LoadPolymostShader(); void Deinit(); @@ -188,8 +191,79 @@ public: void SetViewport(int x, int y, int w, int h); void SetAlphaThreshold(float al); void SetWireframe(bool on); + void SetPolymostShader(); void ReadPixels(int w, int h, uint8_t* buffer); + + + void SetPalswap(uint32_t index) + { + renderState.PalSwapIndex = index; + } + + int GetClamp() + { + return int(renderState.Clamp[0] + 2*renderState.Clamp[1]); + } + + void SetClamp(int clamp) + { + renderState.Clamp[0] = clamp & 1; + renderState.Clamp[1] = !!(clamp & 2); + } + + void SetShade(int32_t shade, int numshades) + { + renderState.Shade = shade; + renderState.NumShades = numshades; + } + + void SetVisibility(float visibility, float fviewingrange) + { + renderState.VisFactor = visibility * fviewingrange * (1.f / (64.f * 65536.f)); + } + + void SetFogEnabled(bool fogEnabled) + { + renderState.FogEnabled = fogEnabled; + } + + void UseColorOnly(bool useColorOnly) + { + renderState.UseColorOnly = useColorOnly; + } + + void UsePaletteIndexing(bool usePaletteIndexing) + { + renderState.UsePalette = usePaletteIndexing; + } + + void UseDetailMapping(bool useDetailMapping) + { + renderState.UseDetailMapping = useDetailMapping; + } + + void UseGlowMapping(bool useGlowMapping) + { + renderState.UseGlowMapping = useGlowMapping; + } + + void SetNpotEmulation(bool npotEmulation, float factor, float xOffset) + { + renderState.NPOTEmulation = npotEmulation; + renderState.NPOTEmulationFactor = factor; + renderState.NPOTEmulationXOffset = xOffset; + } + + void SetShadeInterpolate(int32_t shadeInterpolate) + { + renderState.ShadeInterpolate = shadeInterpolate; + } + + void SetBrightness(int brightness) + { + renderState.Brightness = 8.f / (brightness + 8.f); + } }; extern GLInstance GLInterface;