Smooth sky scrolling by Manoel Kasimier

This commit is contained in:
eukos 2015-09-06 19:16:52 +02:00
parent b43eb0cc59
commit a4653b07a1
7 changed files with 133 additions and 432 deletions

View file

@ -891,10 +891,9 @@ Draw_Init
===============
*/
byte menumap[256][16]; // Used for menu backgrounds and simple colormod
byte gelmap[256]; // Unused id effect TO be used somehow. made redundant by menumap
byte remapmap[256]; // For translating an old palette to new on load
byte menumap[256][16]; // Used for menu backgrounds and simple colormod
byte gelmap[256]; // Unused id effect TO be used somehow. made redundant by menumap
byte remapmap[256]; // For translating an old palette to new on load
int translate_bsp;
int translate_mdl;
@ -906,9 +905,8 @@ byte coltranslate[256]; // TranslateToCustomPal - used for taking one palette t
pixel_t addTable[256][256]; // Additive blending effect
pixel_t mulTable[256][256]; // Multiply blending effect (for colormod)
pixel_t transTable[256][256]; // Alpha blending by 33% and 66%
//pixel_t alphaTable[256][256]; // Alpha blending by row
pixel_t waterTable[256][256]; // Not cached to disk - for wateralpha only (THIS IS A STUPID but only sensible way to go for this)
int smoothtable[32768][3]; // a table for smoothing out things.... :(
int smoothtable[32768][3]; // a table for smoothing out things.... :(
int noisetable[512][5]; // a table for table
int wootel[32][32][32]; // alternate kernel blend
@ -922,72 +920,54 @@ void InitGel (byte *palette)
for (i=0 ; i<256 ; i++)
{
// r = (palette[i*3]>>4);
r = (palette[i*3] + palette[i*3+1] + palette[i*3+2])/(16*3);
gelmap[i] = /* 64 */ 0 + r;
gelmap[i] = 0 + r;
}
}
// Gamepad notes:
// AUX29 - dpad up
// AUX32 - dpad left
// AUX30 - dpad right
// AUX31 - dpad down
extern cvar_t *temp2;
void InitWootel (void)
{
int i;
int r;
int ordered = 0;
int i;
int r;
float ay, ae;
int result;
int range = 32;
float spread = 1024;
//float spread = temp2->value;
for (i=1 ; i<range; i++)
{
ae = i / range;
for (r=0; r<32; r++){
ay = (RandomRange(0,spread));
result = (float)ay;
//if (result > 512) result = 512;
//if (result < 0) result = 0;
wootel[i][r][0] = result;
for (r=0; r<32; r++)
{
ay = (RandomRange(0,spread));
result = (float)ay;
wootel[i][r][0] = result;
}
}
}
void InitNoise (void)
{
int i;
int r;
int i;
int r;
float ay, ae;
int result;
int range = 64;
float spread = 1024;
//float spread = temp2->value;
for (i=1 ; i<range; i++)
{
ae = i / range;
for (r=0; r<6; r++){
ay = (RandomRange(0,spread));
result = (float)ay;
//if (result > 512) result = 512;
//if (result < 0) result = 0;
noisetable[i][r] = result;
//noisetable[i][r] = (float)(range * ay);
for (r=0; r<6; r++)
{
ay = (RandomRange(0,spread));
result = (float)ay;
noisetable[i][r] = result;
}
}
for (r=0; r<6; r++){
noisetable[0][r] = 0; //yeah.... 0
//noisetable[64][r] = 64; //yeah...SIXTY FOUR
}
for (r=0; r<6; r++)
noisetable[0][r] = 0;
}
extern cvar_t *temp3;
@ -1000,34 +980,33 @@ void InitOrder (void)
int result;
int range = 64;
float spread = 1024;
//float spread = temp2->value;
for (i=1 ; i<range; i++)
{
ae = i / range;
t = (i & 1) << 1;
for (r=0; r<6; r++){
for (r=0; r<6; r++)
{
int eep, erp;
int eep, erp;
erp = (int)(range / (r + 1));
for (eep=0; eep<1024; eep+=erp)
{
erp = (int)(range / (r + 1));
for (eep=0; eep<1024; eep+=erp)
{
ay = 2048;
if ((i & 1) != t)
ay -= 768;
}
result = (float)ay;
noisetable[i][r] = result;
ay = 2048;
if ((i & 1) != t)
ay -= 768;
}
result = (float)ay;
noisetable[i][r] = result;
}
}
for (r=0; r<6; r++){
noisetable[0][r] = 0; //yeah.... 0
}
for (r=0; r<6; r++)
noisetable[0][r] = 0;
}
@ -1039,32 +1018,28 @@ void InitSimple (void)
int result;
int range = 64;
float spread = 1024;
//float spread = temp2->value;
for (i=1 ; i<range; i++)
{
ae = i / range;
for (r=0; r<6; r++){
int ef;
if (r == 0 || r == 2 || r == 4 || r == 6)
ef = 1024;
else
ef = 512;
ay = ef;
for (r=0; r<6; r++)
{
int ef;
result = (float)ay;
//if (result > 512) result = 512;
//if (result < 0) result = 0;
noisetable[i][r] = result;
if (r == 0 || r == 2 || r == 4 || r == 6)
ef = 1024;
else
ef = 512;
//noisetable[i][r] = (float)(range * ay);
ay = ef;
result = (float)ay;
noisetable[i][r] = result;
}
}
for (r=0; r<6; r++){
noisetable[0][r] = 0; //yeah.... 0
//noisetable[64][r] = 64; //yeah...SIXTY FOUR
}
for (r=0; r<6; r++)
noisetable[0][r] = 0;
}
// leilei - smooth table for some 'smooth' things... like model shading
@ -1078,14 +1053,12 @@ void InitSmooth (void)
float noiiz;
int range = 64;
InitNoise();
// InitOrder();
// InitSimple();
for (i=0 ; i<32768; i+=range)
{
for (r=0; r<range; r++){
for (k=0; k<6; k++){
for (k=0; k<6; k++)
smoothtable[i+r][k] = MID(1024, i + 512 - (noisetable[r][k]),16000);
}
}
}
@ -1108,36 +1081,32 @@ void InitRemap (byte *palette)
float s;
for (i=0 ; i<255 ; i++)
{
r = palette[i*3];
g = palette[i*3+1];
b = palette[i*3+2];
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
r = palette[i*3];
g = palette[i*3+1];
b = palette[i*3+2];
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
#ifdef EGAHACK
s = (r * 0.33333) + (g * 0.33333) + (b * 0.33333);
r = s + (r - s) * sat;
g = s + (g - s) * sat;
b = s + (b - s) * sat;
s = (r * 0.33333) + (g * 0.33333) + (b * 0.33333);
r = s + (r - s) * sat;
g = s + (g - s) * sat;
b = s + (b - s) * sat;
#endif
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
coltranslate[i] = BestColor(r,g,b, 0, 254);
remapmap [i] = BestColor(r,g,b, 0, 256-host_fullbrights); // no fullbrights...
remapmap[i] = BestColor(r,g,b, 0, 256-host_fullbrights); // no fullbrights...
}
coltranslate[256] = 256;
coltranslate[255] = 255; // null is null
rmap_ready = 1;
}
// makes a little remap table for our new palette to use
void InitRemapEGA (byte *palette)
{

View file

@ -173,7 +173,6 @@ void D_PolysetUpdateTables (void);
// these are currently for internal use only, and should not be used by drivers
extern int r_skydirect;
extern byte *r_skysource;
// transparency types for D_DrawRect ()
#define DR_SOLID 0
@ -210,8 +209,6 @@ extern drawsurf_t r_drawsurf;
void R_DrawSurface (void);
void R_DrawSurface32 (void);
void R_GenTile (msurface_t *psurf, void *pdest);
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
#define TURB_TEX_SIZE 64 // base turbulent texture size

View file

@ -141,9 +141,6 @@ extern void TransformVector (vec3_t in, vec3_t out);
extern void SetUpForLineScan(fixed8_t startvertu, fixed8_t startvertv,
fixed8_t endvertu, fixed8_t endvertv);
extern int r_skymade;
extern void R_MakeSky (void);
extern int ubasestep, errorterm, erroradjustup, erroradjustdown;
// flags in finalvert_t.flags

View file

@ -240,11 +240,6 @@ void D_DrawSurfaces (void)
if (s->flags & SURF_DRAWSKY)
{
if (!r_skymade)
{
R_MakeSky ();
}
D_DrawSkyScans8 (s->spans);
D_DrawZSpans (s->spans);
}

View file

@ -1,4 +1,5 @@
/*
Copyright (C) Manoel Kasimier
Copyright (C) 1996-1997 Id Software, Inc.
This program is free software; you can redistribute it and/or
@ -27,60 +28,38 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define SKY_SPAN_MAX (1 << SKY_SPAN_SHIFT)
extern qboolean r_dowarp;
static float timespeed1, timespeed2;
extern byte *skyunderlay, *skyoverlay;
/*
=================
D_Sky_uv_To_st
=================
*/
void D_Sky_uv_To_st (int u, int v, fixed16_t *s, fixed16_t *t)
void D_Sky_uv_To_st (int u, int v, fixed16_t *s, fixed16_t *t, fixed16_t *s2, fixed16_t *t2)
{
float wu, wv, temp;
vec3_t end;
float wu, wv;
vec3_t end;
if (r_refdef.vrect.width >= r_refdef.vrect.height)
temp = (float)r_refdef.vrect.width;
else
temp = (float)r_refdef.vrect.height;
wu = (u - xcenter) / xscale;
wv = (ycenter - v) / yscale;
// leilei - sky fix for low detail
if(r_docrap == 1)
{
wu = 8192.0 * (float)(u-((int)vid.maxlowwidth>>1)) / temp;
wv = 8192.0 * (float)(((int)vid.maxlowheight>>1)-v) / temp;
end[0] = vpn[0] + wu*vright[0] + wv*vup[0];
end[1] = vpn[1] + wu*vright[1] + wv*vup[1];
end[2] = vpn[2] + wu*vright[2] + wv*vup[2];
}
else if(r_docrap > 1)
{
wu = 8192.0 * (float)(u-((int)vid.maxwarpwidth>>1)) / temp;
wv = 8192.0 * (float)(((int)vid.maxwarpheight>>1)-v) / temp;
}
else if(r_dowarp)
{
wu = 8192.0 * (float)(u-((int)320>>1)) / temp;
wv = 8192.0 * (float)(((int)200>>1)-v) / temp;
}
else
{
wu = 8192.0 * (float)(u-((int)vid.width>>1)) / temp;
wv = 8192.0 * (float)(((int)vid.height>>1)-v) / temp;
}
end[0] = 4096*vpn[0] + wu*vright[0] + wv*vup[0];
end[1] = 4096*vpn[1] + wu*vright[1] + wv*vup[1];
end[2] = 4096*vpn[2] + wu*vright[2] + wv*vup[2];
end[2] *= 3;
VectorNormalize (end);
temp = skytime*skyspeed; // TODO: add D_SetupFrame & set this there
*s = (int)((temp + 6*(SKYSIZE/2-1)*end[0]) * 0x10000);
*t = (int)((temp + 6*(SKYSIZE/2-1)*end[1]) * 0x10000);
*s = (int)((timespeed1 + 6*(SKYSIZE/2-1)*end[0]) * 0x10000);
*t = (int)((timespeed1 + 6*(SKYSIZE/2-1)*end[1]) * 0x10000);
*s2 = (int)((timespeed2 + 6*(SKYSIZE/2-1)*end[0]) * 0x10000);
*t2 = (int)((timespeed2 + 6*(SKYSIZE/2-1)*end[1]) * 0x10000);
}
unsigned char D_DrawSkyPixelOpaque (unsigned char pixel1, unsigned char pixel2)
{
return pixel2 ? pixel2 : pixel1;
}
/*
=================
@ -89,25 +68,28 @@ D_DrawSkyScans8
*/
void D_DrawSkyScans8 (espan_t *pspan)
{
int count, spancount, u, v;
unsigned char *pdest;
fixed16_t s, t, snext, tnext, sstep, tstep;
int spancountminus1;
int count, spancount, u, v;
unsigned char *pdest;
fixed16_t s, t, snext, tnext, sstep, tstep;
int spancountminus1;
sstep = 0; // keep compiler happy
tstep = 0; // ditto
fixed16_t s2, t2, snext2, tnext2, sstep2, tstep2;
timespeed1=skytime*skyspeed;//*4; // Fightoon modification
timespeed2=timespeed1*2.0;//*-1; // Fightoon modification
sstep2 = 0;
tstep2 = 0;
sstep = 0; // keep compiler happy
tstep = 0; // ditto
do
{
pdest = (unsigned char *)((byte *)d_viewbuffer +
(screenwidth * pspan->v) + pspan->u);
pdest = (unsigned char *)((byte *)d_viewbuffer + (screenwidth * pspan->v) + pspan->u);
count = pspan->count;
// calculate the initial s & t
u = pspan->u;
v = pspan->v;
D_Sky_uv_To_st (u, v, &s, &t);
D_Sky_uv_To_st (u, v, &s, &t, &s2, &t2);
do
{
@ -119,45 +101,51 @@ void D_DrawSkyScans8 (espan_t *pspan)
count -= spancount;
if (count)
{
{
u += spancount;
// calculate s and t at far end of span,
// calculate s and t steps across span by shifting
D_Sky_uv_To_st (u, v, &snext, &tnext);
// calculate s and t at far end of span,
// calculate s and t steps across span by shifting
D_Sky_uv_To_st (u, v, &snext, &tnext, &snext2, &tnext2);
sstep = (snext - s) >> SKY_SPAN_SHIFT;
tstep = (tnext - t) >> SKY_SPAN_SHIFT;
sstep2 = (snext2 - s2) >> SKY_SPAN_SHIFT;
tstep2 = (tnext2 - t2) >> SKY_SPAN_SHIFT;
}
else
{
// calculate s and t at last pixel in span,
// calculate s and t steps across span by division
// calculate s and t at last pixel in span,
// calculate s and t steps across span by division
spancountminus1 = (float)(spancount - 1);
if (spancountminus1 > 0)
{
u += spancountminus1;
D_Sky_uv_To_st (u, v, &snext, &tnext);
D_Sky_uv_To_st (u, v, &snext, &tnext, &snext2, &tnext2);
sstep = (snext - s) / spancountminus1;
tstep = (tnext - t) / spancountminus1;
sstep2 = (snext2 - s2) / spancountminus1;
tstep2 = (tnext2 - t2) / spancountminus1;
}
}
do
{
*pdest++ = r_skysource[((t & R_SKY_TMASK) >> 8) +
((s & R_SKY_SMASK) >> 16)];
s += sstep;
t += tstep;
} while (--spancount > 0);
s = snext;
t = tnext;
*pdest++ = D_DrawSkyPixelOpaque(skyunderlay[((t & R_SKY_TMASK) >> 8) + ((s & R_SKY_SMASK) >> 16)],
skyoverlay [((t2 & R_SKY_TMASK) >> 8) + ((s2 & R_SKY_SMASK) >> 16)]);
s += sstep;
t += tstep;
s2 += sstep2;
t2 += tstep2;
} while (--spancount > 0);
s = snext;
t = tnext;
s2 = snext2;
t2 = tnext2;
} while (count > 0);
} while ((pspan = pspan->pnext) != NULL);
}

View file

@ -31,20 +31,10 @@ float skyspeed, skyspeed2;
float skytime;
byte *r_skysource;
int r_skymade;
;
int r_skydirect; // not used?
// TODO: clean up these routines
byte bottomsky[128*131];
byte bottommask[128*131];
byte newsky[128*256]; // newsky and topsky both pack in here, 128 bytes
// of newsky on the left of each scan, 128 bytes
// of topsky on the right, because the low-level
// drawers need 256-byte scan widths
byte *skyunderlay, *skyoverlay;
/*
=============
@ -55,204 +45,10 @@ A sky texture is 256*128, with the right side being a masked overlay
*/
void R_InitSky (texture_t *mt)
{
int i, j;
byte *src;
src = (byte *)mt + mt->offsets[0];
for (i=0 ; i<128 ; i++)
{
for (j=0 ; j<128 ; j++)
{
newsky[(i*256) + j + 128] = src[i*256 + j + 128];
}
}
for (i=0 ; i<128 ; i++)
{
for (j=0 ; j<131 ; j++)
{
if (src[i*256 + (j & 0x7F)])
{
bottomsky[(i*131) + j] = src[i*256 + (j & 0x7F)];
bottommask[(i*131) + j] = 0;
}
else
{
bottomsky[(i*131) + j] = 0;
bottommask[(i*131) + j] = 0xff;
}
}
}
r_skysource = newsky;
skyoverlay = (byte *)mt + mt->offsets[0];
skyunderlay = skyoverlay+128;
}
/*
=================
R_MakeSky
=================
*/
void R_MakeSky (void)
{
int x, y;
int ofs, baseofs;
int xshift, yshift;
unsigned *pnewsky;
static int xlast = -1, ylast = -1;
xshift = skytime*skyspeed;
yshift = skytime*skyspeed;
if ((xshift == xlast) && (yshift == ylast))
return;
xlast = xshift;
ylast = yshift;
pnewsky = (unsigned *)&newsky[0];
for (y=0 ; y<SKYSIZE ; y++)
{
baseofs = ((y+yshift) & SKYMASK) * 131;
// FIXME: clean this up
#if UNALIGNED_OK
for (x=0 ; x<SKYSIZE ; x += 4)
{
ofs = baseofs + ((x+xshift) & SKYMASK);
// PORT: unaligned dword access to bottommask and bottomsky
*pnewsky = (*(pnewsky + (128 / sizeof (unsigned))) &
*(unsigned *)&bottommask[ofs]) |
*(unsigned *)&bottomsky[ofs];
pnewsky++;
}
#else
for (x=0 ; x<SKYSIZE ; x++)
{
ofs = baseofs + ((x+xshift) & SKYMASK);
*(byte *)pnewsky = (*((byte *)pnewsky + 128) &
*(byte *)&bottommask[ofs]) |
*(byte *)&bottomsky[ofs];
pnewsky = (unsigned *)((byte *)pnewsky + 1);
}
#endif
pnewsky += 128 / sizeof (unsigned);
}
r_skymade = 1;
}
/*
=================
R_GenSkyTile
=================
*/
void R_GenSkyTile (void *pdest)
{
int x, y;
int ofs, baseofs;
int xshift, yshift;
unsigned *pnewsky;
unsigned *pd;
xshift = skytime*skyspeed;
yshift = skytime*skyspeed;
pnewsky = (unsigned *)&newsky[0];
pd = (unsigned *)pdest;
for (y=0 ; y<SKYSIZE ; y++)
{
baseofs = ((y+yshift) & SKYMASK) * 131;
// FIXME: clean this up
#if UNALIGNED_OK
for (x=0 ; x<SKYSIZE ; x += 4)
{
ofs = baseofs + ((x+xshift) & SKYMASK);
// PORT: unaligned dword access to bottommask and bottomsky
*pd = (*(pnewsky + (128 / sizeof (unsigned))) &
*(unsigned *)&bottommask[ofs]) |
*(unsigned *)&bottomsky[ofs];
pnewsky++;
pd++;
}
#else
for (x=0 ; x<SKYSIZE ; x++)
{
ofs = baseofs + ((x+xshift) & SKYMASK);
*(byte *)pd = (*((byte *)pnewsky + 128) &
*(byte *)&bottommask[ofs]) |
*(byte *)&bottomsky[ofs];
pnewsky = (unsigned *)((byte *)pnewsky + 1);
pd = (unsigned *)((byte *)pd + 1);
}
#endif
pnewsky += 128 / sizeof (unsigned);
}
}
/*
=================
R_GenSkyTile16
=================
*/
void R_GenSkyTile16 (void *pdest)
{
int x, y;
int ofs, baseofs;
int xshift, yshift;
byte *pnewsky;
unsigned short *pd;
xshift = skytime * skyspeed;
yshift = skytime * skyspeed;
pnewsky = (byte *)&newsky[0];
pd = (unsigned short *)pdest;
for (y=0 ; y<SKYSIZE ; y++)
{
baseofs = ((y+yshift) & SKYMASK) * 131;
// FIXME: clean this up
// FIXME: do faster unaligned version?
for (x=0 ; x<SKYSIZE ; x++)
{
ofs = baseofs + ((x+xshift) & SKYMASK);
*pd = d_8to16table[(*(pnewsky + 128) &
*(byte *)&bottommask[ofs]) |
*(byte *)&bottomsky[ofs]];
pnewsky++;
pd++;
}
pnewsky += TILE_SIZE;
}
}
/*
=============
R_SetSkyFrame
@ -273,8 +69,6 @@ void R_SetSkyFrame (void)
skytime = cl.time - ((int)(cl.time / temp) * temp);
r_skymade = 0;
}

View file

@ -3484,45 +3484,6 @@ void R_GenTurbTile16 (pixel_t *pbasetex, void *pdest)
}
}
/*
================
R_GenTile
================
*/
void R_GenTile (msurface_t *psurf, void *pdest)
{
if (psurf->flags & SURF_DRAWTURB)
{
if (r_pixbytes == 1)
{
R_GenTurbTile ((pixel_t *)
((byte *)psurf->texinfo->texture + psurf->texinfo->texture->offsets[0]), pdest);
}
else
{
R_GenTurbTile16 ((pixel_t *)
((byte *)psurf->texinfo->texture + psurf->texinfo->texture->offsets[0]), pdest);
}
}
else if (psurf->flags & SURF_DRAWSKY)
{
if (r_pixbytes == 1)
{
R_GenSkyTile (pdest);
}
else
{
R_GenSkyTile16 (pdest);
}
}
else
{
Sys_Error ("Unknown tile type");
}
}
/*
================
R_BuildSurfaceDisplayList