mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-23 04:11:17 +00:00
Software renderer support for per-walltexture scaling and offsetting.
This commit is contained in:
parent
eef43b4bda
commit
163e8c7155
1 changed files with 39 additions and 6 deletions
45
src/r_segs.c
45
src/r_segs.c
|
@ -42,12 +42,19 @@ angle_t rw_normalangle;
|
|||
angle_t rw_angle1;
|
||||
fixed_t rw_distance;
|
||||
|
||||
// Horizontal scaling hack shenanigans.
|
||||
fixed_t rw_distance;
|
||||
fixed_t rw_distance_scalex_top;
|
||||
fixed_t rw_distance_scalex_mid;
|
||||
fixed_t rw_distance_scalex_bot;
|
||||
|
||||
//
|
||||
// regular wall
|
||||
//
|
||||
static INT32 rw_x, rw_stopx;
|
||||
static angle_t rw_centerangle;
|
||||
static fixed_t rw_offset;
|
||||
static fixed_t rw_offset_top, rw_offset_mid, rw_offset_bot; // Independent offsets.
|
||||
static fixed_t rw_offset2; // for splats
|
||||
static fixed_t rw_scale, rw_scalestep;
|
||||
static fixed_t rw_midtexturemid, rw_toptexturemid, rw_bottomtexturemid;
|
||||
|
@ -61,6 +68,8 @@ static fixed_t pixhigh, pixlow, pixhighstep, pixlowstep;
|
|||
static fixed_t topfrac, topstep;
|
||||
static fixed_t bottomfrac, bottomstep;
|
||||
|
||||
static fixed_t topxscale, topyscale, midxscale, midyscale, botxscale, botyscale;
|
||||
|
||||
static lighttable_t **walllights;
|
||||
static INT16 *maskedtexturecol;
|
||||
#ifdef ESLOPE
|
||||
|
@ -1351,6 +1360,9 @@ static void R_RenderSegLoop (void)
|
|||
|
||||
INT32 mid;
|
||||
fixed_t texturecolumn = 0;
|
||||
fixed_t texturecolumn_top = 0;
|
||||
fixed_t texturecolumn_mid = 0;
|
||||
fixed_t texturecolumn_bot = 0;
|
||||
#ifdef ESLOPE
|
||||
fixed_t oldtexturecolumn = -1;
|
||||
#endif
|
||||
|
@ -1472,6 +1484,9 @@ static void R_RenderSegLoop (void)
|
|||
// calculate texture offset
|
||||
angle = (rw_centerangle + xtoviewangle[rw_x])>>ANGLETOFINESHIFT;
|
||||
texturecolumn = rw_offset-FixedMul(FINETANGENT(angle),rw_distance);
|
||||
texturecolumn_top = (rw_offset_top - FixedMul(FINETANGENT(angle),rw_distance_scalex_top))>>FRACBITS;
|
||||
texturecolumn_mid = (rw_offset_mid - FixedMul(FINETANGENT(angle),rw_distance_scalex_mid))>>FRACBITS;
|
||||
texturecolumn_bot = (rw_offset_bot - FixedMul(FINETANGENT(angle),rw_distance_scalex_bot))>>FRACBITS;
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (oldtexturecolumn != -1) {
|
||||
|
@ -1548,8 +1563,9 @@ static void R_RenderSegLoop (void)
|
|||
{
|
||||
dc_yl = yl;
|
||||
dc_yh = yh;
|
||||
dc_texturemid = rw_midtexturemid;
|
||||
dc_source = R_GetColumn(midtexture,texturecolumn);
|
||||
dc_texturemid = FixedMul(rw_midtexturemid, midyscale);
|
||||
dc_iscale = FixedMul(0xffffffffu / (unsigned)rw_scale, midyscale);
|
||||
dc_source = R_GetColumn(midtexture, texturecolumn_mid);
|
||||
dc_texheight = textureheight[midtexture]>>FRACBITS;
|
||||
|
||||
//profile stuff ---------------------------------------------------------
|
||||
|
@ -1601,8 +1617,9 @@ static void R_RenderSegLoop (void)
|
|||
{
|
||||
dc_yl = yl;
|
||||
dc_yh = mid;
|
||||
dc_texturemid = rw_toptexturemid;
|
||||
dc_source = R_GetColumn(toptexture,texturecolumn);
|
||||
dc_texturemid = FixedMul(rw_toptexturemid, topyscale);
|
||||
dc_iscale = FixedMul(0xffffffffu / (unsigned)rw_scale, topyscale);
|
||||
dc_source = R_GetColumn(toptexture, texturecolumn_top);
|
||||
dc_texheight = textureheight[toptexture]>>FRACBITS;
|
||||
colfunc();
|
||||
ceilingclip[rw_x] = (INT16)mid;
|
||||
|
@ -1634,9 +1651,10 @@ static void R_RenderSegLoop (void)
|
|||
{
|
||||
dc_yl = mid;
|
||||
dc_yh = yh;
|
||||
dc_texturemid = rw_bottomtexturemid;
|
||||
dc_texturemid = FixedMul(rw_bottomtexturemid, botyscale);
|
||||
dc_iscale = FixedMul(0xffffffffu / (unsigned)rw_scale, botyscale);
|
||||
dc_source = R_GetColumn(bottomtexture,
|
||||
texturecolumn);
|
||||
texturecolumn_bot);
|
||||
dc_texheight = textureheight[bottomtexture]>>FRACBITS;
|
||||
colfunc();
|
||||
floorclip[rw_x] = (INT16)mid;
|
||||
|
@ -2640,6 +2658,21 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
|
||||
/// don't use texture offset for splats
|
||||
rw_offset2 = rw_offset + curline->offset;
|
||||
|
||||
// Per-texture scaling, offsetting.
|
||||
topxscale = sidedef->scalex_top;
|
||||
midxscale = sidedef->scalex_mid;
|
||||
botxscale = sidedef->scalex_bot;
|
||||
topyscale = sidedef->scaley_top;
|
||||
midyscale = sidedef->scaley_mid;
|
||||
botyscale = sidedef->scaley_bot;
|
||||
rw_offset_top = FixedMul(rw_offset + curline->offset, topxscale) + sidedef->textureoffset + sidedef->offsetx_top;
|
||||
rw_offset_mid = FixedMul(rw_offset + curline->offset, midxscale) + sidedef->textureoffset + sidedef->offsetx_mid;
|
||||
rw_offset_bot = FixedMul(rw_offset + curline->offset, botxscale) + sidedef->textureoffset + sidedef->offsetx_bot;
|
||||
rw_distance_scalex_top = FixedMul(rw_distance, topxscale);
|
||||
rw_distance_scalex_mid = FixedMul(rw_distance, midxscale);
|
||||
rw_distance_scalex_bot = FixedMul(rw_distance, botxscale);
|
||||
|
||||
rw_offset += sidedef->textureoffset + curline->offset;
|
||||
rw_centerangle = ANGLE_90 + viewangle - rw_normalangle;
|
||||
|
||||
|
|
Loading…
Reference in a new issue