From 1a2b93f4029559a796aa1939817a2a20a09ed985 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 6 Dec 2020 20:49:32 +0100 Subject: [PATCH] - fixed sky panning in Duke. This needs to take the composite texture into account because panning in Build is based on tile size, not map dimension. It was also redone to use floating point to get rid of the horrible precision of the scrolling effect. --- source/build/src/polymost.cpp | 3 ++- source/games/duke/src/global.cpp | 4 ++-- source/games/duke/src/global.h | 4 ++-- source/games/duke/src/sectors.cpp | 8 ++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index b53860fdd..ac0c82394 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -1273,6 +1273,7 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i int32_t dapyscale, dapskybits, dapyoffs, daptileyscale; int16_t const * dapskyoff = getpsky(globalpicnum, &dapyscale, &dapskybits, &dapyoffs, &daptileyscale); globalskytex = skytile? nullptr : GetSkyTexture(globalpicnum, dapskybits, dapskyoff); + int realskybits = dapskybits; if (globalskytex) dapskybits = 0; ghoriz = (qglobalhoriz*(1.f/65536.f)-float(ydimen>>1))*dapyscale*(1.f/65536.f)+float(ydimen>>1)+ghorizcorrect; @@ -1302,7 +1303,7 @@ static void polymost_flatskyrender(vec2f_t const* const dpxy, int32_t const n, i } int const npot = (1<<(widthBits(globalpicnum))) != tileWidth(globalpicnum); - int const xPanning = (hw_parallaxskypanning?global_cf_xpanning:0); + float const xPanning = (hw_parallaxskypanning ? global_cf_xpanning / (1 << (realskybits-dapskybits)) : 0); int picnumbak = globalpicnum; ti = globalpicnum; diff --git a/source/games/duke/src/global.cpp b/source/games/duke/src/global.cpp index 718357188..e3bbad1c8 100644 --- a/source/games/duke/src/global.cpp +++ b/source/games/duke/src/global.cpp @@ -107,8 +107,8 @@ int animategoal[MAXANIMATES]; int animatevel[MAXANIMATES]; int numclouds; // cloudy skies int16_t clouds[256]; -int16_t cloudx; -int16_t cloudy; +float cloudx; +float cloudy; int cloudclock; int numcyclers; // sector lighting effects int16_t cyclers[MAXCYCLERS][6]; diff --git a/source/games/duke/src/global.h b/source/games/duke/src/global.h index 9e134844e..18579aeb9 100644 --- a/source/games/duke/src/global.h +++ b/source/games/duke/src/global.h @@ -94,8 +94,8 @@ extern int animategoal[MAXANIMATES]; extern int animatevel[MAXANIMATES]; extern int16_t clouds[256]; -extern int16_t cloudx; -extern int16_t cloudy; +extern float cloudx; +extern float cloudy; extern int cloudclock; extern DDukeActor *spriteq[1024]; diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp index d38bc9d70..d29047ede 100644 --- a/source/games/duke/src/sectors.cpp +++ b/source/games/duke/src/sectors.cpp @@ -1257,12 +1257,12 @@ void moveclouds(double smoothratio) cloudclock = myclock + 6; // cloudx/y were an array, but all entries were always having the same value so a single pair is enough. - cloudx += ps[screenpeek].angle.ang.bcos(-9); - cloudy += ps[screenpeek].angle.ang.bsin(-9); + cloudx += ps[screenpeek].angle.ang.fcos() * 0.5f; + cloudy += ps[screenpeek].angle.ang.fsin() * 0.5f; for (int i = 0; i < numclouds; i++) { - sector[clouds[i]].setceilingxpan(cloudx / 64.f); - sector[clouds[i]].setceilingypan(cloudy / 64.f); + sector[clouds[i]].setceilingxpan(cloudx); + sector[clouds[i]].setceilingypan(cloudy); } } }