Smooth sky scrolling by Manoel Kasimier
This commit is contained in:
parent
b43eb0cc59
commit
a4653b07a1
7 changed files with 133 additions and 432 deletions
165
engine/draw.c
165
engine/draw.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
126
renderer/d_sky.c
126
renderer/d_sky.c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
214
renderer/r_sky.c
214
renderer/r_sky.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue