📄 r_poly.c
字号:
/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <assert.h>
#include "r_local.h"
#define AFFINE_SPANLET_SIZE 16
#define AFFINE_SPANLET_SIZE_BITS 4
typedef struct
{
byte *pbase, *pdest;
short *pz;
fixed16_t s, t;
fixed16_t sstep, tstep;
int izi, izistep, izistep_times_2;
int spancount;
unsigned u, v;
} spanletvars_t;
spanletvars_t s_spanletvars;
static int r_polyblendcolor;
static espan_t *s_polygon_spans;
polydesc_t r_polydesc;
msurface_t *r_alpha_surfaces;
extern int *r_turb_turb;
static int clip_current;
vec5_t r_clip_verts[2][MAXWORKINGVERTS+2];
static int s_minindex, s_maxindex;
static void R_DrawPoly( int iswater );
/*
** R_DrawSpanletOpaque
*/
void R_DrawSpanletOpaque( void )
{
unsigned btemp;
do
{
unsigned ts, tt;
ts = s_spanletvars.s >> 16;
tt = s_spanletvars.t >> 16;
btemp = *(s_spanletvars.pbase + (ts) + (tt) * cachewidth);
if (btemp != 255)
{
if (*s_spanletvars.pz <= (s_spanletvars.izi >> 16))
{
*s_spanletvars.pz = s_spanletvars.izi >> 16;
*s_spanletvars.pdest = btemp;
}
}
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
} while (--s_spanletvars.spancount > 0);
}
/*
** R_DrawSpanletTurbulentStipple33
*/
void R_DrawSpanletTurbulentStipple33( void )
{
unsigned btemp;
int sturb, tturb;
byte *pdest = s_spanletvars.pdest;
short *pz = s_spanletvars.pz;
int izi = s_spanletvars.izi;
if ( s_spanletvars.v & 1 )
{
s_spanletvars.pdest += s_spanletvars.spancount;
s_spanletvars.pz += s_spanletvars.spancount;
if ( s_spanletvars.spancount == AFFINE_SPANLET_SIZE )
s_spanletvars.izi += s_spanletvars.izistep << AFFINE_SPANLET_SIZE_BITS;
else
s_spanletvars.izi += s_spanletvars.izistep * s_spanletvars.izistep;
if ( s_spanletvars.u & 1 )
{
izi += s_spanletvars.izistep;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest++;
pz++;
s_spanletvars.spancount--;
}
s_spanletvars.sstep *= 2;
s_spanletvars.tstep *= 2;
while ( s_spanletvars.spancount > 0 )
{
sturb = ((s_spanletvars.s + r_turb_turb[(s_spanletvars.t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((s_spanletvars.t + r_turb_turb[(s_spanletvars.s>>16)&(CYCLE-1)])>>16)&63;
btemp = *( s_spanletvars.pbase + ( sturb ) + ( tturb << 6 ) );
if ( *pz <= ( izi >> 16 ) )
*pdest = btemp;
izi += s_spanletvars.izistep_times_2;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest += 2;
pz += 2;
s_spanletvars.spancount -= 2;
}
}
}
/*
** R_DrawSpanletTurbulentStipple66
*/
void R_DrawSpanletTurbulentStipple66( void )
{
unsigned btemp;
int sturb, tturb;
byte *pdest = s_spanletvars.pdest;
short *pz = s_spanletvars.pz;
int izi = s_spanletvars.izi;
if ( !( s_spanletvars.v & 1 ) )
{
s_spanletvars.pdest += s_spanletvars.spancount;
s_spanletvars.pz += s_spanletvars.spancount;
if ( s_spanletvars.spancount == AFFINE_SPANLET_SIZE )
s_spanletvars.izi += s_spanletvars.izistep << AFFINE_SPANLET_SIZE_BITS;
else
s_spanletvars.izi += s_spanletvars.izistep * s_spanletvars.izistep;
if ( s_spanletvars.u & 1 )
{
izi += s_spanletvars.izistep;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest++;
pz++;
s_spanletvars.spancount--;
}
s_spanletvars.sstep *= 2;
s_spanletvars.tstep *= 2;
while ( s_spanletvars.spancount > 0 )
{
sturb = ((s_spanletvars.s + r_turb_turb[(s_spanletvars.t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((s_spanletvars.t + r_turb_turb[(s_spanletvars.s>>16)&(CYCLE-1)])>>16)&63;
btemp = *( s_spanletvars.pbase + ( sturb ) + ( tturb << 6 ) );
if ( *pz <= ( izi >> 16 ) )
*pdest = btemp;
izi += s_spanletvars.izistep_times_2;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest += 2;
pz += 2;
s_spanletvars.spancount -= 2;
}
}
else
{
s_spanletvars.pdest += s_spanletvars.spancount;
s_spanletvars.pz += s_spanletvars.spancount;
if ( s_spanletvars.spancount == AFFINE_SPANLET_SIZE )
s_spanletvars.izi += s_spanletvars.izistep << AFFINE_SPANLET_SIZE_BITS;
else
s_spanletvars.izi += s_spanletvars.izistep * s_spanletvars.izistep;
while ( s_spanletvars.spancount > 0 )
{
sturb = ((s_spanletvars.s + r_turb_turb[(s_spanletvars.t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((s_spanletvars.t + r_turb_turb[(s_spanletvars.s>>16)&(CYCLE-1)])>>16)&63;
btemp = *( s_spanletvars.pbase + ( sturb ) + ( tturb << 6 ) );
if ( *pz <= ( izi >> 16 ) )
*pdest = btemp;
izi += s_spanletvars.izistep;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest++;
pz++;
s_spanletvars.spancount--;
}
}
}
/*
** R_DrawSpanletTurbulentBlended
*/
void R_DrawSpanletTurbulentBlended66( void )
{
unsigned btemp;
int sturb, tturb;
do
{
sturb = ((s_spanletvars.s + r_turb_turb[(s_spanletvars.t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((s_spanletvars.t + r_turb_turb[(s_spanletvars.s>>16)&(CYCLE-1)])>>16)&63;
btemp = *( s_spanletvars.pbase + ( sturb ) + ( tturb << 6 ) );
if ( *s_spanletvars.pz <= ( s_spanletvars.izi >> 16 ) )
*s_spanletvars.pdest = vid.alphamap[btemp*256+*s_spanletvars.pdest];
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
} while ( --s_spanletvars.spancount > 0 );
}
void R_DrawSpanletTurbulentBlended33( void )
{
unsigned btemp;
int sturb, tturb;
do
{
sturb = ((s_spanletvars.s + r_turb_turb[(s_spanletvars.t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((s_spanletvars.t + r_turb_turb[(s_spanletvars.s>>16)&(CYCLE-1)])>>16)&63;
btemp = *( s_spanletvars.pbase + ( sturb ) + ( tturb << 6 ) );
if ( *s_spanletvars.pz <= ( s_spanletvars.izi >> 16 ) )
*s_spanletvars.pdest = vid.alphamap[btemp+*s_spanletvars.pdest*256];
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
} while ( --s_spanletvars.spancount > 0 );
}
/*
** R_DrawSpanlet33
*/
void R_DrawSpanlet33( void )
{
unsigned btemp;
do
{
unsigned ts, tt;
ts = s_spanletvars.s >> 16;
tt = s_spanletvars.t >> 16;
btemp = *(s_spanletvars.pbase + (ts) + (tt) * cachewidth);
if ( btemp != 255 )
{
if (*s_spanletvars.pz <= (s_spanletvars.izi >> 16))
{
*s_spanletvars.pdest = vid.alphamap[btemp+*s_spanletvars.pdest*256];
}
}
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
} while (--s_spanletvars.spancount > 0);
}
void R_DrawSpanletConstant33( void )
{
do
{
if (*s_spanletvars.pz <= (s_spanletvars.izi >> 16))
{
*s_spanletvars.pdest = vid.alphamap[r_polyblendcolor+*s_spanletvars.pdest*256];
}
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
} while (--s_spanletvars.spancount > 0);
}
/*
** R_DrawSpanlet66
*/
void R_DrawSpanlet66( void )
{
unsigned btemp;
do
{
unsigned ts, tt;
ts = s_spanletvars.s >> 16;
tt = s_spanletvars.t >> 16;
btemp = *(s_spanletvars.pbase + (ts) + (tt) * cachewidth);
if ( btemp != 255 )
{
if (*s_spanletvars.pz <= (s_spanletvars.izi >> 16))
{
*s_spanletvars.pdest = vid.alphamap[btemp*256+*s_spanletvars.pdest];
}
}
s_spanletvars.izi += s_spanletvars.izistep;
s_spanletvars.pdest++;
s_spanletvars.pz++;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
} while (--s_spanletvars.spancount > 0);
}
/*
** R_DrawSpanlet33Stipple
*/
void R_DrawSpanlet33Stipple( void )
{
unsigned btemp;
byte *pdest = s_spanletvars.pdest;
short *pz = s_spanletvars.pz;
int izi = s_spanletvars.izi;
if ( r_polydesc.stipple_parity ^ ( s_spanletvars.v & 1 ) )
{
s_spanletvars.pdest += s_spanletvars.spancount;
s_spanletvars.pz += s_spanletvars.spancount;
if ( s_spanletvars.spancount == AFFINE_SPANLET_SIZE )
s_spanletvars.izi += s_spanletvars.izistep << AFFINE_SPANLET_SIZE_BITS;
else
s_spanletvars.izi += s_spanletvars.izistep * s_spanletvars.izistep;
if ( r_polydesc.stipple_parity ^ ( s_spanletvars.u & 1 ) )
{
izi += s_spanletvars.izistep;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest++;
pz++;
s_spanletvars.spancount--;
}
s_spanletvars.sstep *= 2;
s_spanletvars.tstep *= 2;
while ( s_spanletvars.spancount > 0 )
{
unsigned s = s_spanletvars.s >> 16;
unsigned t = s_spanletvars.t >> 16;
btemp = *( s_spanletvars.pbase + ( s ) + ( t * cachewidth ) );
if ( btemp != 255 )
{
if ( *pz <= ( izi >> 16 ) )
*pdest = btemp;
}
izi += s_spanletvars.izistep_times_2;
s_spanletvars.s += s_spanletvars.sstep;
s_spanletvars.t += s_spanletvars.tstep;
pdest += 2;
pz += 2;
s_spanletvars.spancount -= 2;
}
}
}
/*
** R_DrawSpanlet66Stipple
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -