mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Refactor parts of R_RenderMaskedSegRange
Seperates some subroutines: - R_CheckBlendMode - R_OverflowTest - R_RenderMaskedSegLoop
This commit is contained in:
parent
aab248b25c
commit
a04381ac45
1 changed files with 149 additions and 119 deletions
268
src/r_segs.c
268
src/r_segs.c
|
|
@ -150,130 +150,32 @@ transnum_t R_GetLinedefTransTable(fixed_t alpha)
|
|||
}
|
||||
}
|
||||
|
||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||
static boolean R_OverflowTest(void)
|
||||
{
|
||||
INT64 overflow_test;
|
||||
overflow_test = (INT64)centeryfrac - (((INT64)dc_texturemid*spryscale)>>FRACBITS);
|
||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void R_RenderMaskedSegLoop(drawseg_t *ds, INT32 x1, INT32 x2, INT32 texnum, INT32 bmnum, void (*colfunc_2s)(column_t *, column_t *, INT32))
|
||||
{
|
||||
size_t pindex;
|
||||
column_t *col, *bmCol = NULL;
|
||||
INT32 lightnum, texnum, bmnum, i;
|
||||
INT32 lightnum, i;
|
||||
fixed_t height, realbot;
|
||||
lightlist_t *light;
|
||||
r_lightlist_t *rlight;
|
||||
void (*colfunc_2s)(column_t *, column_t *, INT32);
|
||||
line_t *ldef;
|
||||
INT32 range;
|
||||
sector_t *front, *back;
|
||||
INT32 times, repeats;
|
||||
INT64 overflow_test;
|
||||
INT32 range;
|
||||
transnum_t transtable = NUMTRANSMAPS;
|
||||
patchalphastyle_t blendmode = 0;
|
||||
|
||||
// Calculate light table.
|
||||
// Use different light tables
|
||||
// for horizontal / vertical / diagonal. Diagonal?
|
||||
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally
|
||||
curline = ds->curline;
|
||||
|
||||
if (R_IsDebugLine(curline))
|
||||
{
|
||||
const UINT8 thickness = 4;
|
||||
const UINT8 pal = (leveltime % 70 < 35) ? 0x23 : 0x00;
|
||||
|
||||
const INT32 horizon = ((centeryfrac>>4) + 1 + HEIGHTUNIT - 1) >> HEIGHTBITS;
|
||||
const INT32 y = max(0, min(horizon, vid.height - thickness));
|
||||
|
||||
UINT8 *p = &topleft[x1 + (y * vid.width)];
|
||||
|
||||
range = max(x2 - x1, 0) + 1;
|
||||
|
||||
for (i = 0; i < thickness; ++i)
|
||||
{
|
||||
memset(p, pal, range);
|
||||
p += vid.width;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ds->maskedtexturecol == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
frontsector = curline->frontsector;
|
||||
backsector = curline->backsector;
|
||||
texnum = R_GetTextureNum(curline->sidedef->midtexture);
|
||||
bmnum = R_GetTextureBrightmap(texnum);
|
||||
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
||||
|
||||
ldef = curline->linedef;
|
||||
|
||||
transtable = R_GetLinedefTransTable(ldef->alpha);
|
||||
if (transtable == NUMTRANSMAPS)
|
||||
{
|
||||
// Invisible, so don't render
|
||||
return;
|
||||
}
|
||||
|
||||
blendmode = ldef->blendmode;
|
||||
if (blendmode == AST_MODULATE || blendmode == AST_FOG)
|
||||
{
|
||||
// These blend modes don't use translucency
|
||||
transtable = 0;
|
||||
}
|
||||
|
||||
R_CheckDebugHighlight(SW_HI_MIDTEXTURES);
|
||||
|
||||
if (blendmode == AST_FOG)
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_FOG, bmnum != 0);
|
||||
windowtop = frontsector->ceilingheight;
|
||||
windowbottom = frontsector->floorheight;
|
||||
}
|
||||
else if (transtable != NUMTRANSMAPS && (blendmode || transtable))
|
||||
{
|
||||
dc_transmap = R_GetBlendTable(blendmode, transtable);
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, bmnum != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
R_SetColumnFunc(BASEDRAWFUNC, bmnum != 0);
|
||||
}
|
||||
|
||||
if (curline->polyseg && curline->polyseg->translucency > 0)
|
||||
{
|
||||
if (curline->polyseg->translucency >= NUMTRANSMAPS)
|
||||
return;
|
||||
|
||||
dc_transmap = R_GetTranslucencyTable(curline->polyseg->translucency);
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, bmnum != 0);
|
||||
}
|
||||
|
||||
range = max(ds->x2-ds->x1, 1);
|
||||
rw_scalestep = ds->scalestep;
|
||||
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
||||
|
||||
// Texture must be cached before setting colfunc_2s,
|
||||
// otherwise texture[texnum]->holes may be false when it shouldn't be
|
||||
R_CheckTextureCache(texnum);
|
||||
if (bmnum) { R_CheckTextureCache(bmnum); }
|
||||
|
||||
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||
// are not stored per-column with post info in SRB2
|
||||
if (textures[texnum]->holes)
|
||||
{
|
||||
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||
{
|
||||
colfunc_2s = R_DrawFlippedMaskedColumn;
|
||||
lengthcol = textures[texnum]->height;
|
||||
}
|
||||
else
|
||||
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||
}
|
||||
else
|
||||
{
|
||||
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
||||
lengthcol = textures[texnum]->height;
|
||||
}
|
||||
|
||||
// Setup lighting based on the presence/lack-of 3D floors.
|
||||
dc_numlights = 0;
|
||||
|
|
@ -346,11 +248,6 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
walllights = scalelight[lightnum];
|
||||
}
|
||||
|
||||
maskedtexturecol = ds->maskedtexturecol;
|
||||
|
||||
mfloorclip = ds->sprbottomclip;
|
||||
mceilingclip = ds->sprtopclip;
|
||||
|
||||
if (frontsector->heightsec != -1)
|
||||
front = §ors[frontsector->heightsec];
|
||||
else
|
||||
|
|
@ -415,9 +312,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
if (maskedtexturecol[dc_x] != INT16_MAX)
|
||||
{
|
||||
// Check for overflows first
|
||||
overflow_test = (INT64)centeryfrac - (((INT64)dc_texturemid*spryscale)>>FRACBITS);
|
||||
if (overflow_test < 0) overflow_test = -overflow_test;
|
||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL)
|
||||
if (R_OverflowTest())
|
||||
{
|
||||
// Eh, no, go away, don't waste our time
|
||||
if (dc_numlights)
|
||||
|
|
@ -603,6 +498,141 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
spryscale += rw_scalestep;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static boolean R_CheckBlendMode(const line_t *ldef, INT32 bmnum)
|
||||
{
|
||||
transnum_t transtable = NUMTRANSMAPS;
|
||||
patchalphastyle_t blendmode = 0;
|
||||
|
||||
transtable = R_GetLinedefTransTable(ldef->alpha);
|
||||
if (transtable == NUMTRANSMAPS)
|
||||
{
|
||||
// Invisible, so don't render
|
||||
return false;
|
||||
}
|
||||
|
||||
blendmode = ldef->blendmode;
|
||||
if (blendmode == AST_MODULATE || blendmode == AST_FOG)
|
||||
{
|
||||
// These blend modes don't use translucency
|
||||
transtable = 0;
|
||||
}
|
||||
|
||||
if (blendmode == AST_FOG)
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_FOG, bmnum != 0);
|
||||
windowtop = frontsector->ceilingheight;
|
||||
windowbottom = frontsector->floorheight;
|
||||
}
|
||||
else if (transtable != NUMTRANSMAPS && (blendmode || transtable))
|
||||
{
|
||||
dc_transmap = R_GetBlendTable(blendmode, transtable);
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, bmnum != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
R_SetColumnFunc(BASEDRAWFUNC, bmnum != 0);
|
||||
}
|
||||
|
||||
if (curline->polyseg && curline->polyseg->translucency > 0)
|
||||
{
|
||||
if (curline->polyseg->translucency >= NUMTRANSMAPS)
|
||||
return false;
|
||||
|
||||
dc_transmap = R_GetTranslucencyTable(curline->polyseg->translucency);
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, bmnum != 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||
{
|
||||
INT32 texnum, bmnum, i;
|
||||
void (*colfunc_2s)(column_t *, column_t *, INT32);
|
||||
line_t *ldef;
|
||||
INT32 range;
|
||||
|
||||
// Calculate light table.
|
||||
// Use different light tables
|
||||
// for horizontal / vertical / diagonal. Diagonal?
|
||||
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally
|
||||
curline = ds->curline;
|
||||
|
||||
if (R_IsDebugLine(curline))
|
||||
{
|
||||
const UINT8 thickness = 4;
|
||||
const UINT8 pal = (leveltime % 70 < 35) ? 0x23 : 0x00;
|
||||
|
||||
const INT32 horizon = ((centeryfrac>>4) + 1 + HEIGHTUNIT - 1) >> HEIGHTBITS;
|
||||
const INT32 y = max(0, min(horizon, vid.height - thickness));
|
||||
|
||||
UINT8 *p = &topleft[x1 + (y * vid.width)];
|
||||
|
||||
range = max(x2 - x1, 0) + 1;
|
||||
|
||||
for (i = 0; i < thickness; ++i)
|
||||
{
|
||||
memset(p, pal, range);
|
||||
p += vid.width;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ds->maskedtexturecol == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
frontsector = curline->frontsector;
|
||||
backsector = curline->backsector;
|
||||
texnum = R_GetTextureNum(curline->sidedef->midtexture);
|
||||
bmnum = R_GetTextureBrightmap(texnum);
|
||||
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
||||
|
||||
ldef = curline->linedef;
|
||||
|
||||
R_CheckDebugHighlight(SW_HI_MIDTEXTURES);
|
||||
|
||||
if (R_CheckBlendMode(ldef, bmnum) == false)
|
||||
{
|
||||
return; // does not render
|
||||
}
|
||||
|
||||
rw_scalestep = ds->scalestep;
|
||||
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
||||
|
||||
// Texture must be cached before setting colfunc_2s,
|
||||
// otherwise texture[texnum]->holes may be false when it shouldn't be
|
||||
R_CheckTextureCache(texnum);
|
||||
if (bmnum) { R_CheckTextureCache(bmnum); }
|
||||
|
||||
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||
// are not stored per-column with post info in SRB2
|
||||
if (textures[texnum]->holes)
|
||||
{
|
||||
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||
{
|
||||
colfunc_2s = R_DrawFlippedMaskedColumn;
|
||||
lengthcol = textures[texnum]->height;
|
||||
}
|
||||
else
|
||||
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||
}
|
||||
else
|
||||
{
|
||||
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
||||
lengthcol = textures[texnum]->height;
|
||||
}
|
||||
|
||||
maskedtexturecol = ds->maskedtexturecol;
|
||||
|
||||
mfloorclip = ds->sprbottomclip;
|
||||
mceilingclip = ds->sprtopclip;
|
||||
|
||||
R_RenderMaskedSegLoop(ds, x1, x2, texnum, bmnum, colfunc_2s);
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC, false);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue