diff --git a/src/p_saveg.c b/src/p_saveg.c index f7b546dd..c6253698 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2086,6 +2086,9 @@ void P_UnArchiveWorld (void) si->textureoffset = saveg_read32(); si->rowoffset = saveg_read32(); + // [crispy] smooth texture scrolling + si->basetextureoffset = si->textureoffset; + si->baserowoffset = si->rowoffset; si->toptexture = saveg_read16(); si->bottomtexture = saveg_read16(); diff --git a/src/p_setup.c b/src/p_setup.c index ff959edc..74b75ddb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -577,6 +577,9 @@ void P_LoadSideDefs2(int lump) sd->textureoffset = SHORT(msd->textureoffset)<rowoffset = SHORT(msd->rowoffset)<basetextureoffset = sd->textureoffset; + sd->baserowoffset = sd->rowoffset; // killough 4/4/98: allow sidedef texture names to be overloaded // killough 4/11/98: refined to allow colormaps to work as wall diff --git a/src/p_spec.c b/src/p_spec.c index a0108aa8..c524ff69 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -56,6 +56,7 @@ #include "r_draw.h" // R_SetFuzzPosTic #include "r_sky.h" // R_GetSkyColor #include "m_swap.h" +#include "i_video.h" // [FG] uncapped // // Animating textures and planes @@ -2591,8 +2592,10 @@ void T_Scroll(scroll_t *s) case sc_side: // killough 3/7/98: Scroll wall texture side = sides + s->affectee; - side->textureoffset += dx; - side->rowoffset += dy; + side->basetextureoffset += dx; + side->baserowoffset += dy; + side->textureoffset = side->basetextureoffset; + side->rowoffset = side->baserowoffset; break; case sc_floor: // killough 3/7/98: Scroll floor texture @@ -2638,6 +2641,47 @@ void T_Scroll(scroll_t *s) } } +// [crispy] smooth texture scrolling + +static int maxsidescrollers, numsidescrollers; +static scroll_t **sidescrollers; + +static void P_AddSideScroller (scroll_t *s) +{ + if (numsidescrollers == maxsidescrollers) + { + maxsidescrollers = maxsidescrollers ? 2 * maxsidescrollers : 32; + sidescrollers = I_Realloc(sidescrollers, maxsidescrollers * sizeof(*sidescrollers)); + } + sidescrollers[numsidescrollers++] = s; +} + +static void P_FreeSideScrollers (void) +{ + maxsidescrollers = 0; + numsidescrollers = 0; + if (sidescrollers) + free(sidescrollers); + sidescrollers = NULL; +} + +void R_InterpolateTextureOffsets (void) +{ + if (uncapped && leveltime > oldleveltime) + { + int i; + + for (i = 0; i < numsidescrollers; i++) + { + scroll_t *s = sidescrollers[i]; + side_t *side = sides + s->affectee; + + side->textureoffset = side->basetextureoffset + FixedMul(s->dx, fractionaltic); + side->rowoffset = side->baserowoffset + FixedMul(s->dy, fractionaltic); + } + } +} + // // Add_Scroller() // @@ -2671,6 +2715,9 @@ static void Add_Scroller(int type, fixed_t dx, fixed_t dy, sectors[control].floorheight + sectors[control].ceilingheight; s->affectee = affectee; P_AddThinker(&s->thinker); + + if (type == sc_side) + P_AddSideScroller(s); } // Adds wall scroller. Scroll amount is rotated with respect to wall's @@ -2710,6 +2757,8 @@ static void P_SpawnScrollers(void) int i; line_t *l = lines; + P_FreeSideScrollers(); + for (i=0;idx >> SCROLL_SHIFT; // direction and speed of scrolling diff --git a/src/r_defs.h b/src/r_defs.h index 98bd4299..57495af9 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -189,6 +189,10 @@ typedef struct int special; + // [crispy] smooth texture scrolling + fixed_t basetextureoffset; + fixed_t baserowoffset; + } side_t; // diff --git a/src/r_main.c b/src/r_main.c index 61c6464e..130f71d4 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -814,6 +814,9 @@ void R_RenderPlayerView (player_t* player) // check for new console commands. NetUpdate (); + // [crispy] smooth texture scrolling + R_InterpolateTextureOffsets(); + // The head node is the last node output. R_RenderBSPNode (numnodes-1); diff --git a/src/r_main.h b/src/r_main.h index 11aaf25c..ace03221 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -123,6 +123,9 @@ void R_InitLightTables(void); // killough 8/9/98 extern boolean setsizeneeded; void R_ExecuteSetViewSize(void); +// [crispy] smooth texture scrolling +void R_InterpolateTextureOffsets (void); + #endif //----------------------------------------------------------------------------