From bac357a6bed56fb7410921da5734a04234e9770b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Sep 2020 21:31:35 +0200 Subject: [PATCH 01/10] - disable the weapon in SW's savepics. The way the weapon drawer is implemented does not work well with save pictures. --- source/glbackend/glbackend.cpp | 1 + source/sw/src/draw.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index d48cbd8c6..0e6c0f020 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -339,6 +339,7 @@ void WriteSavePic(FileWriter* file, int width, int height) RenderState.EnableDrawBuffers(1, true); screen->SetViewportRects(&bounds); + twodpsp.Clear(); bool didit = gi->GenerateSavePic(); float Brightness = 8.f / (r_scenebrightness + 8.f); diff --git a/source/sw/src/draw.cpp b/source/sw/src/draw.cpp index 0b49ab388..41188c81f 100644 --- a/source/sw/src/draw.cpp +++ b/source/sw/src/draw.cpp @@ -1766,7 +1766,7 @@ drawscreen(PLAYERp pp, double smoothratio) renderSetAspect(viewingRange, divscale16(ydim * 8, xdim * 5)); - UpdatePanel(smoothratio); + if (!ScreenSavePic) UpdatePanel(smoothratio); #define SLIME 2305 // Only animate lava if its picnum is on screen @@ -1782,6 +1782,13 @@ drawscreen(PLAYERp pp, double smoothratio) } #endif + // if doing a screen save don't need to process the rest + if (ScreenSavePic) + { + DrawScreen = false; + return; + } + MarkSectorSeen(pp->cursectnum); @@ -1810,13 +1817,6 @@ drawscreen(PLAYERp pp, double smoothratio) } - // if doing a screen save don't need to process the rest - if (ScreenSavePic) - { - DrawScreen = false; - return; - } - //PrintLocationInfo(pp); //PrintSpriteInfo(pp); From 555ebf86a0a48df1ea9e89d8befafc4003f2b0e7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Sep 2020 22:16:48 +0200 Subject: [PATCH 02/10] - Duke: fixed path for widescreen intermission pics. --- wadsrc/static/filter/duke/engine/widescreen.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/filter/duke/engine/widescreen.def b/wadsrc/static/filter/duke/engine/widescreen.def index bc9fbf262..cbe32fd04 100644 --- a/wadsrc/static/filter/duke/engine/widescreen.def +++ b/wadsrc/static/filter/duke/engine/widescreen.def @@ -29,8 +29,8 @@ tilefromtexture 2556 { file "tiles/duke3d/2556.png" xoffset -1 yoffset -2 ifcrc tilefromtexture 2557 { file "tiles/duke3d/2557.png" xoffset -1 yoffset -2 ifcrc 3133384900 } // Level Ending Screens (by fgsfds) -tilefromtexture 3240 { file "duke3d/3240.png" ifcrc -2916948 } -tilefromtexture 3245 { file "duke3d/3245.png" ifcrc -721918170 } +tilefromtexture 3240 { file "tiles/duke3d/3240.png" ifcrc -2916948 } +tilefromtexture 3245 { file "tiles/duke3d/3245.png" ifcrc -721918170 } // VACATION From f0b32b6078cca9dd9cbad82b586e79f8ea52495c Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Sun, 20 Sep 2020 18:25:16 +1000 Subject: [PATCH 03/10] - SW: Implement `cl_viewbob`. --- source/sw/src/draw.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/sw/src/draw.cpp b/source/sw/src/draw.cpp index 41188c81f..06bb98c05 100644 --- a/source/sw/src/draw.cpp +++ b/source/sw/src/draw.cpp @@ -1726,8 +1726,11 @@ drawscreen(PLAYERp pp, double smoothratio) if (!TEST(pp->Flags, PF_VIEW_FROM_CAMERA|PF_VIEW_FROM_OUTSIDE)) { - tz += bob_amt; - tz += pp->obob_z + xs_CRoundToInt(fmulscale16(pp->bob_z - pp->obob_z, smoothratio)); + if (cl_viewbob) + { + tz += bob_amt; + tz += pp->obob_z + xs_CRoundToInt(fmulscale16(pp->bob_z - pp->obob_z, smoothratio)); + } // recoil only when not in camera tq16horiz = tq16horiz + pp->recoil_horizoff; From dc7be6d526c05858d5a5aad0ea9c130477d434c3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Sep 2020 19:27:30 +0200 Subject: [PATCH 04/10] - Duke: edited the first intermission pic a bit to reduce the visibility of a seam where it was extended --- .../static/filter/duke/tiles/duke3d/3240.png | Bin 44847 -> 29229 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/wadsrc/static/filter/duke/tiles/duke3d/3240.png b/wadsrc/static/filter/duke/tiles/duke3d/3240.png index 54cdc2db37b074c4d61851f74a993940cef52c1a..2b937ab3fede1bc6a57bc19fae9e04085eac76a3 100644 GIT binary patch literal 29229 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 UB4>Mgp8x;=07*qoM6N<$f|OJ6ZU6uP literal 44847 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 From 78be8f866b1b8b81a656467b96333381baef1498 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Sep 2020 20:39:11 +0200 Subject: [PATCH 05/10] - always use the containing sector's fog when rendering sprites. This is for consistency, otherwise sprites with a palette translation would stand out. Also use shade dependent fog density instead of a single global value. Currently this only has an effect in true color rendering mode. --- source/build/src/engine.cpp | 4 ++-- source/build/src/mdsprite.cpp | 1 + source/build/src/polymost.cpp | 16 +++++++++------- source/build/src/voxmodel.cpp | 5 +++-- source/core/palette.h | 10 +++++----- source/glbackend/glbackend.cpp | 26 ++++++++++++++++++++------ source/glbackend/glbackend.h | 1 + 7 files changed, 41 insertions(+), 22 deletions(-) diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 7be582938..560bcd6b4 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -179,7 +179,7 @@ fixed_t qglobalhoriz; float fglobalposx, fglobalposy, fglobalposz; int16_t globalang, globalcursectnum; fixed_t qglobalang; -int32_t globalpal, cosglobalang, singlobalang; +int32_t globalpal, globalfloorpal, cosglobalang, singlobalang; int32_t cosviewingrangeglobalang, sinviewingrangeglobalang; int32_t xyaspect; @@ -1768,7 +1768,7 @@ void renderDrawMapView(int32_t dax, int32_t day, int32_t zoome, int16_t ang) globalorientation = (int32_t)sec->floorstat; if ((globalorientation&1) != 0) continue; - globalpal = sec->floorpal; + globalfloorpal = globalpal = sec->floorpal; globalpicnum = sec->floorpicnum; if ((unsigned)globalpicnum >= (unsigned)MAXTILES) globalpicnum = 0; diff --git a/source/build/src/mdsprite.cpp b/source/build/src/mdsprite.cpp index 17bcde053..e1bfd55cc 100644 --- a/source/build/src/mdsprite.cpp +++ b/source/build/src/mdsprite.cpp @@ -1494,6 +1494,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr) } #endif int palid = TRANSLATION(Translation_Remap + curbasepal, globalpal); + GLInterface.SetFade(sector[tspr->sectnum].floorpal); GLInterface.SetTexture(-1, tex, palid, CLAMP_XY); if (tspr->clipdist & TSPR_FLAGS_MDHACK) diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index 42df205bd..bdc40a126 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -299,7 +299,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 } if (!lookups.checkTable(globalpal)) - globalpal = 0; + globalfloorpal = globalpal = 0; //Load texture (globalpicnum) setgotpic(globalpicnum); @@ -377,6 +377,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 int palid = TRANSLATION(Translation_Remap + curbasepal, globalpal); + GLInterface.SetFade(globalfloorpal); bool success = GLInterface.SetTexture(globalpicnum, tileGetTexture(globalpicnum), palid, sampleroverride); if (!success) { @@ -1567,7 +1568,7 @@ static void polymost_drawalls(int32_t const bunch) globalpicnum = sec->floorpicnum; globalshade = sec->floorshade; - globalpal = sec->floorpal; + globalfloorpal = globalpal = sec->floorpal; globalorientation = sec->floorstat; GLInterface.SetVisibility(sectorVisibility(sectnum)); @@ -1808,7 +1809,7 @@ static void polymost_drawalls(int32_t const bunch) globalpicnum = sec->ceilingpicnum; globalshade = sec->ceilingshade; - globalpal = sec->ceilingpal; + globalfloorpal = globalpal = sec->ceilingpal; globalorientation = sec->ceilingstat; GLInterface.SetVisibility(sectorVisibility(sectnum)); @@ -2074,7 +2075,7 @@ static void polymost_drawalls(int32_t const bunch) if (((cy0 < ocy0) || (cy1 < ocy1)) && (!((sec->ceilingstat§or[nextsectnum].ceilingstat)&1))) { - globalpicnum = wal->picnum; globalshade = wal->shade; globalpal = (int32_t)((uint8_t)wal->pal); + globalpicnum = wal->picnum; globalshade = wal->shade; globalfloorpal = globalpal = (int32_t)((uint8_t)wal->pal); GLInterface.SetVisibility(sectorVisibility(sectnum)); globalorientation = wal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -2109,7 +2110,7 @@ static void polymost_drawalls(int32_t const bunch) xtex.u += (float)(nwal->xpanning - wal->xpanning) * xtex.d; ytex.u += (float)(nwal->xpanning - wal->xpanning) * ytex.d; } - globalpicnum = nwal->picnum; globalshade = nwal->shade; globalpal = (int32_t)((uint8_t)nwal->pal); + globalpicnum = nwal->picnum; globalshade = nwal->shade; globalfloorpal = globalpal = (int32_t)((uint8_t)nwal->pal); GLInterface.SetVisibility(sectorVisibility(sectnum)); globalorientation = nwal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -2150,7 +2151,7 @@ static void polymost_drawalls(int32_t const bunch) globalpicnum = (nextsectnum < 0) ? wal->picnum : wal->overpicnum; globalshade = wal->shade; - globalpal = wal->pal; + globalfloorpal = globalpal = wal->pal; GLInterface.SetVisibility(sectorVisibility(sectnum)); globalorientation = wal->cstat; tileUpdatePicnum(&globalpicnum, wallnum+16384); @@ -2670,7 +2671,7 @@ static void polymost_drawmaskwallinternal(int32_t wallIndex) GLInterface.SetVisibility(sectorVisibility(sectnum)); globalshade = (int32_t)wal->shade; - globalpal = (int32_t)((uint8_t)wal->pal); + globalfloorpal = globalpal = (int32_t)((uint8_t)wal->pal); vec2f_t s0 = { (float)(wal->x-globalposx), (float)(wal->y-globalposy) }; vec2f_t p0 = { s0.y*gcosang - s0.x*gsinang, s0.x*gcosang2 + s0.y*gsinang2 }; @@ -3043,6 +3044,7 @@ void polymost_drawsprite(int32_t snum) globalpicnum = tspr->picnum; globalshade = tspr->shade; globalpal = tspr->pal; + globalfloorpal = sector[tspr->sectnum].floorpal; globalorientation = tspr->cstat; GLInterface.SetVisibility(sectorVisibility(tspr->sectnum)); diff --git a/source/build/src/voxmodel.cpp b/source/build/src/voxmodel.cpp index e74ba36bf..59a57cecb 100644 --- a/source/build/src/voxmodel.cpp +++ b/source/build/src/voxmodel.cpp @@ -1008,7 +1008,7 @@ voxmodel_t *loadkvxfrombuf(const char *kvxbuffer, int32_t length) //Draw voxel model as perfect cubes // Note: This is a hopeless mess that totally forfeits any chance of using a vertex buffer with its messy coordinate adjustments. :( -int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr) +int32_t polymost_voxdraw(voxmodel_t* m, tspriteptr_t const tspr) { // float clut[6] = {1.02,1.02,0.94,1.06,0.98,0.98}; float f, g, k0, zoff; @@ -1016,7 +1016,7 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr) if ((intptr_t)m == (intptr_t)(-1)) // hackhackhack return 0; - if ((tspr->cstat&48)==32) + if ((tspr->cstat & 48) == 32) return 0; polymost_outputGLDebugMessage(3, "polymost_voxdraw(m:%p, tspr:%p)", m, tspr); @@ -1150,6 +1150,7 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr) } GLInterface.SetPalswap(globalpal); + GLInterface.SetFade(sector[tspr->sectnum].floorpal); // The texture here is already translated. GLInterface.SetTexture(-1, htex, 0/*TRANSLATION(Translation_Remap + curbasepal, globalpal)*/, CLAMP_NOFILTER_XY, true); diff --git a/source/core/palette.h b/source/core/palette.h index 72c3e88a9..ac6e441b7 100644 --- a/source/core/palette.h +++ b/source/core/palette.h @@ -165,20 +165,20 @@ inline void videoclearFade() void videoTintBlood(int32_t r, int32_t g, int32_t b); -extern int32_t globalpal; +extern int32_t globalpal, globalfloorpal; extern void paletteLoadFromDisk(void); -typedef struct glblenddef_ +struct glblenddef_t { float alpha; uint8_t src, dst, flags; -} glblenddef_t; +}; -typedef struct glblend_ +struct glblend_t { glblenddef_t def[2]; -} glblend_t; +}; extern glblend_t const nullglblend, defaultglblend; extern glblend_t glblend[MAXBLENDTABS]; diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index 0e6c0f020..57c2ff7e6 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -152,7 +152,14 @@ void GLInstance::SetIdentityMatrix(int num) void GLInstance::SetPalswap(int index) { renderState.ShadeDiv = lookups.tables[index].ShadeFactor; - renderState.FogColor = lookups.getFade(index); +} + +void GLInstance::SetFade(int index) +{ + if (!hw_useindexedcolortextures) + renderState.FogColor = lookups.getFade(index); + else + renderState.FogColor = 0; } void PolymostRenderState::Apply(FRenderState& state, GLState& oldState) @@ -227,17 +234,24 @@ void PolymostRenderState::Apply(FRenderState& state, GLState& oldState) state.SetDepthFunc(DepthFunc); oldState.DepthFunc = DepthFunc; } + bool foggy = (GLInterface.useMapFog || FogColor); // Disable brightmaps if non-black fog is used. - if (!(Flags & RF_FogDisabled) && ShadeDiv >= 1 / 1000.f && (GLInterface.useMapFog || FogColor)) + if (!(Flags & RF_FogDisabled) && ShadeDiv >= 1 / 1000.f && foggy) { state.EnableFog(1); + float density = GLInterface.useMapFog ? 350.f : 350.f - Scale(numshades - Shade, 150, numshades); + state.SetFog((GLInterface.useMapFog) ? PalEntry(0x999999) : FogColor, density); + state.SetSoftLightLevel(255); + state.SetLightParms(128.f, 1/1000.f); + } + else + { + state.EnableFog(0); + state.SetSoftLightLevel(ShadeDiv >= 1 / 1000.f ? 255 - Scale(Shade, 255, numshades) : 255); + state.SetLightParms(VisFactor, ShadeDiv / (numshades - 2)); } - else state.EnableFog(0); - state.SetFog((GLInterface.useMapFog) ? PalEntry(0x999999) : FogColor, 350.f); // Fixme: The real density still needs to be implemented. 350 is a reasonable default only. - state.SetSoftLightLevel(ShadeDiv >= 1 / 1000.f ? 255 - Scale(Shade, 255, numshades) : 255); - state.SetLightParms(VisFactor, ShadeDiv / (numshades - 2)); state.SetTextureMode(TextureMode); state.SetNpotEmulation(NPOTEmulation.Y, NPOTEmulation.X); diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h index 952b752f4..a3fe80ccb 100644 --- a/source/glbackend/glbackend.h +++ b/source/glbackend/glbackend.h @@ -140,6 +140,7 @@ public: } void SetPalswap(int index); + void SetFade(int palette); void SetShade(int32_t shade, int numshades) { From c1a8d55d2499fe5c4730433aa685c95da5c9db13 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Sep 2020 21:15:16 +0200 Subject: [PATCH 06/10] - removed Softpoly from the startup screen and its enabling define in the project. Since this not only crashes but also has totally unfitting lighting, which is unlikely to be fixed it really makes no sense offering this to the users. Vulkan may also have to be disabled for release builds because it's not working yet but that needs to be fixed later and should eventually be supported. --- CMakeLists.txt | 4 ++-- source/CMakeLists.txt | 4 +--- source/platform/win32/gameres.rc | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aaf4bb53..7890c81b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,9 +207,9 @@ if( MSVC ) # Function-level linking # Disable run-time type information if ( HAVE_VULKAN ) - set( ALL_C_FLAGS "/GF /Gy /permissive- /DHAVE_VULKAN /DHAVE_SOFTPOLY" ) + set( ALL_C_FLAGS "/GF /Gy /permissive- /DHAVE_VULKAN" ) else() - set( ALL_C_FLAGS "/GF /Gy /permissive- /DHAVE_SOFTPOLY" ) + set( ALL_C_FLAGS "/GF /Gy /permissive-" ) endif() # Use SSE 2 as minimum always as the true color drawers needs it for __vectorcall diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index d608d2ef2..a19a0c1e3 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -680,7 +680,6 @@ set( POLYRENDER_SOURCES # without being compiled. set( NOT_COMPILED_SOURCE_FILES ${OTHER_SYSTEM_SOURCES} - ${POLYRENDER_SOURCES} sc_man_scanner.h common/engine/sc_man_scanner.re common/scripting/frontend/zcc-parse.lemon @@ -704,7 +703,6 @@ set( VM_JIT_SOURCES set( FASTMATH_SOURCES common/rendering/gl_load/gl_load.c - common/rendering/polyrenderer/poly_all.cpp common/textures/hires/hqnx/init.cpp common/textures/hires/hqnx/hq2x.cpp common/textures/hires/hqnx/hq3x.cpp @@ -755,7 +753,7 @@ set (POLYBACKEND_SOURCES common/rendering/polyrenderer/backend/poly_hwtexture.cpp common/rendering/polyrenderer/backend/poly_renderstate.cpp ) -set (FASTMATH_SOURCES ${FASTMATH_SOURCES} ${POLYBACKEND_SOURCES}) +set (FASTMATH_SOURCES ${FASTMATH_SOURCES}) set (PCH_SOURCES diff --git a/source/platform/win32/gameres.rc b/source/platform/win32/gameres.rc index 2eefbe25a..00222f887 100644 --- a/source/platform/win32/gameres.rc +++ b/source/platform/win32/gameres.rc @@ -28,7 +28,6 @@ BEGIN PUSHBUTTON "E&xit",IDCANCEL,166,228,50,14 CONTROL "&OpenGL",IDC_WELCOME_VULKAN1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,13,167,41,10 CONTROL "&Vulkan",IDC_WELCOME_VULKAN2,"Button",BS_AUTORADIOBUTTON,13,177,37,10 - CONTROL "&SoftPoly",IDC_WELCOME_VULKAN3,"Button",BS_AUTORADIOBUTTON,13,188,43,10 END IDD_CRASHDIALOG DIALOGEX 0, 0, 415, 308 From 11397028151845936a37ac3fe9e6085efc0365f4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Sep 2020 21:52:10 +0200 Subject: [PATCH 07/10] - disable softpoly for POSIX as well. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7890c81b2..b278c1da3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -253,9 +253,9 @@ if( MSVC ) else() set( REL_LINKER_FLAGS "" ) if ( HAVE_VULKAN ) - set( ALL_C_FLAGS "-ffp-contract=off -DHAVE_VULKAN -DHAVE_SOFTPOLY" ) + set( ALL_C_FLAGS "-ffp-contract=off -DHAVE_VULKAN" ) else() - set( ALL_C_FLAGS "-ffp-contract=off -DHAVE_SOFTPOLY" ) + set( ALL_C_FLAGS "-ffp-contract=off" ) endif() set( ALL_C_FLAGS "${ALL_C_FLAGS} -DUSE_OPENGL=1 -DNOASM=1" ) From 3810c4cb51d10ac09162656805561d2df805f333 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 20 Sep 2020 22:00:39 +0200 Subject: [PATCH 08/10] - Blood: instead of running the indexer after saving a state, just save the pointer before indexing to directly restore it. --- source/blood/src/loadsave.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blood/src/loadsave.cpp b/source/blood/src/loadsave.cpp index b63803baa..7f627bd58 100644 --- a/source/blood/src/loadsave.cpp +++ b/source/blood/src/loadsave.cpp @@ -709,9 +709,10 @@ void MyLoadSave::Save(void) int nXSprite = sprite[nSprite].extra; if (nXSprite > 0) { + auto saved = xsprite[nXSprite].aiState; IndexAIState(xsprite[nXSprite].aiState); Write(&xsprite[nXSprite], sizeof(XSPRITE)); - UnindexAIState(xsprite[nXSprite].aiState); + xsprite[nXSprite].aiState = saved; } } } From 0461acfc8ba5a9aca1d8b0f4c5fc1460641c1803 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 21 Sep 2020 21:17:23 +0200 Subject: [PATCH 09/10] - removed the brightness fudging in the palette emulation shader and always return an alpha of 1. The fudging was only needed because fog was still applied on top of the palette emulation so after completely disabling the true color distance attenuation in palette mode it made the image too bright. The alpha needs to be 1 because this is only the texel, not the combined color. --- wadsrc/static/shaders/glsl/func_paletted.fp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/shaders/glsl/func_paletted.fp b/wadsrc/static/shaders/glsl/func_paletted.fp index b47dacb7c..1be496917 100644 --- a/wadsrc/static/shaders/glsl/func_paletted.fp +++ b/wadsrc/static/shaders/glsl/func_paletted.fp @@ -60,5 +60,5 @@ vec4 ProcessTexel() color.rgb = uFogColor.rgb * (1.0-fogfactor) + color.rgb * fogfactor;// mix(vec3(0.6), color.rgb, fogfactor); } if (color.a < uAlphaThreshold) discard; // it's only here that we have the alpha value available to be able to perform the alpha test. - return vec4(color.rgb / 0.85, vColor.a); + return vec4(color.rgb, 1.0); } From 9859571ded6f91b6d2bd09fe917e8c1f39ccc92a Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Tue, 22 Sep 2020 07:29:52 +1000 Subject: [PATCH 10/10] - DrawCrosshair(): Factor in Blood's adjustable horizon which defaults to 90. * Fixes https://forum.zdoom.org/viewtopic.php?f=340&t=69920. --- source/blood/src/hudsprites.cpp | 2 +- source/core/gamecontrol.cpp | 4 ++-- source/core/gamecontrol.h | 2 +- source/exhumed/src/status.cpp | 2 +- source/games/duke/src/game_misc.cpp | 2 +- source/sw/src/draw.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blood/src/hudsprites.cpp b/source/blood/src/hudsprites.cpp index 130c2f1a4..384b2b7f0 100644 --- a/source/blood/src/hudsprites.cpp +++ b/source/blood/src/hudsprites.cpp @@ -100,7 +100,7 @@ void hudDraw(PLAYER *gView, int nSectnum, int defaultHoriz, double bobx, double { if (gViewPos == 0) { - DrawCrosshair(kCrosshairTile, gView->pXSprite->health >> 4, 0, 2); + DrawCrosshair(kCrosshairTile, gView->pXSprite->health >> 4, 0, defaultHoriz - 100, 2); double cX = 160; double cY = 220; diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index e2a242c37..b0f9aba90 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -1394,7 +1394,7 @@ void DrawGenericCrosshair(int num, int phealth, double xdelta) } -void DrawCrosshair(int deftile, int health, double xdelta, double scale, PalEntry color) +void DrawCrosshair(int deftile, int health, double xdelta, double ydelta, double scale, PalEntry color) { int type = -1; if (automapMode == am_off && cl_crosshair) @@ -1405,7 +1405,7 @@ void DrawCrosshair(int deftile, int health, double xdelta, double scale, PalEntr if (tile) { double crosshair_scale = cl_crosshairscale * .01 * scale; - DrawTexture(twod, tile, 160 + xdelta, 100, DTA_Color, color, + DrawTexture(twod, tile, 160 + xdelta, 100 + ydelta, DTA_Color, color, DTA_FullscreenScale, FSMode_Fit320x200, DTA_ScaleX, crosshair_scale, DTA_ScaleY, crosshair_scale, DTA_CenterOffsetRel, true, DTA_ViewportX, windowxy1.x, DTA_ViewportY, windowxy1.y, DTA_ViewportWidth, windowxy2.x - windowxy1.x + 1, DTA_ViewportHeight, windowxy2.y - windowxy1.y + 1, TAG_DONE); diff --git a/source/core/gamecontrol.h b/source/core/gamecontrol.h index 244e077ce..9632dd40e 100644 --- a/source/core/gamecontrol.h +++ b/source/core/gamecontrol.h @@ -57,7 +57,7 @@ void CONFIG_ReadCombatMacros(); int GameMain(); int GetAutomapZoom(int gZoom); -void DrawCrosshair(int deftile, int health, double xdelta, double scale, PalEntry color = 0xffffffff); +void DrawCrosshair(int deftile, int health, double xdelta, double ydelta, double scale, PalEntry color = 0xffffffff); void updatePauseStatus(); void DeferedStartGame(MapRecord* map, int skill); void ChangeLevel(MapRecord* map, int skill); diff --git a/source/exhumed/src/status.cpp b/source/exhumed/src/status.cpp index 930b0c86b..7bed57d37 100644 --- a/source/exhumed/src/status.cpp +++ b/source/exhumed/src/status.cpp @@ -1002,7 +1002,7 @@ void DrawStatusBar() } DExhumedStatusBar sbar; sbar.Draw(); - DrawCrosshair(MAXTILES, PlayerList[nLocalPlayer].nHealth >> 3, 0, 1); + DrawCrosshair(MAXTILES, PlayerList[nLocalPlayer].nHealth >> 3, 0, 0, 1); } diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp index 229bc2a43..999a09524 100644 --- a/source/games/duke/src/game_misc.cpp +++ b/source/games/duke/src/game_misc.cpp @@ -300,7 +300,7 @@ void drawoverlays(double smoothratio) if (ps[myconnectindex].newowner == -1 && ud.camerasprite == -1) { - DrawCrosshair(TILE_CROSSHAIR, ps[screenpeek].last_extra, -getHalfLookAng(screenpeek, cl_syncinput, smoothratio), isRR() ? 0.5 : 1); + DrawCrosshair(TILE_CROSSHAIR, ps[screenpeek].last_extra, -getHalfLookAng(screenpeek, cl_syncinput, smoothratio), 0, isRR() ? 0.5 : 1); } if (paused == 2) diff --git a/source/sw/src/draw.cpp b/source/sw/src/draw.cpp index 06bb98c05..43e68c6aa 100644 --- a/source/sw/src/draw.cpp +++ b/source/sw/src/draw.cpp @@ -1262,7 +1262,7 @@ void DrawCrosshair(PLAYERp pp) if (!(CameraTestMode) && !TEST(pp->Flags, PF_VIEW_FROM_OUTSIDE)) { USERp u = User[pp->PlayerSprite]; - ::DrawCrosshair(2326, u->Health, 0, 2, shadeToLight(10)); + ::DrawCrosshair(2326, u->Health, 0, 0, 2, shadeToLight(10)); } }