mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-27 04:41:23 +00:00
Add R_Draw2sMultiPatchTranslucentColumn_8, for columns of multi-patch textures used as midtextures on two-sided linedefs with both transparency AND translucency
...that was a mouthful
This commit is contained in:
parent
1b531ddcfe
commit
b9b0a8110c
5 changed files with 103 additions and 0 deletions
|
@ -161,6 +161,7 @@ void R_DrawSplat_8(void);
|
||||||
void R_DrawTranslucentSplat_8(void);
|
void R_DrawTranslucentSplat_8(void);
|
||||||
void R_DrawTranslucentSpan_8(void);
|
void R_DrawTranslucentSpan_8(void);
|
||||||
void R_Draw2sMultiPatchColumn_8(void);
|
void R_Draw2sMultiPatchColumn_8(void);
|
||||||
|
void R_Draw2sMultiPatchTranslucentColumn_8(void);
|
||||||
void R_DrawFogSpan_8(void);
|
void R_DrawFogSpan_8(void);
|
||||||
void R_DrawFogColumn_8(void);
|
void R_DrawFogColumn_8(void);
|
||||||
void R_DrawColumnShadowed_8(void);
|
void R_DrawColumnShadowed_8(void);
|
||||||
|
|
|
@ -203,6 +203,103 @@ void R_Draw2sMultiPatchColumn_8(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void R_Draw2sMultiPatchTranslucentColumn_8(void)
|
||||||
|
{
|
||||||
|
INT32 count;
|
||||||
|
register UINT8 *dest;
|
||||||
|
register fixed_t frac;
|
||||||
|
fixed_t fracstep;
|
||||||
|
|
||||||
|
count = dc_yh - dc_yl;
|
||||||
|
|
||||||
|
if (count < 0) // Zero length, column does not exceed a pixel.
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef RANGECHECK
|
||||||
|
if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Framebuffer destination address.
|
||||||
|
// Use ylookup LUT to avoid multiply with ScreenWidth.
|
||||||
|
// Use columnofs LUT for subwindows?
|
||||||
|
|
||||||
|
//dest = ylookup[dc_yl] + columnofs[dc_x];
|
||||||
|
dest = &topleft[dc_yl*vid.width + dc_x];
|
||||||
|
|
||||||
|
count++;
|
||||||
|
|
||||||
|
// Determine scaling, which is the only mapping to be done.
|
||||||
|
fracstep = dc_iscale;
|
||||||
|
//frac = dc_texturemid + (dc_yl - centery)*fracstep;
|
||||||
|
frac = (dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep))*(!dc_hires);
|
||||||
|
|
||||||
|
// Inner loop that does the actual texture mapping, e.g. a DDA-like scaling.
|
||||||
|
// This is as fast as it gets.
|
||||||
|
{
|
||||||
|
register const UINT8 *source = dc_source;
|
||||||
|
register const UINT8 *transmap = dc_transmap;
|
||||||
|
register const lighttable_t *colormap = dc_colormap;
|
||||||
|
register INT32 heightmask = dc_texheight-1;
|
||||||
|
register UINT8 val;
|
||||||
|
if (dc_texheight & heightmask) // not a power of 2 -- killough
|
||||||
|
{
|
||||||
|
heightmask++;
|
||||||
|
heightmask <<= FRACBITS;
|
||||||
|
|
||||||
|
if (frac < 0)
|
||||||
|
while ((frac += heightmask) < 0);
|
||||||
|
else
|
||||||
|
while (frac >= heightmask)
|
||||||
|
frac -= heightmask;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Re-map color indices from wall texture column
|
||||||
|
// using a lighting/special effects LUT.
|
||||||
|
// heightmask is the Tutti-Frutti fix
|
||||||
|
val = source[frac>>FRACBITS];
|
||||||
|
|
||||||
|
if (val != TRANSPARENTPIXEL)
|
||||||
|
*dest = colormap[*(transmap + (val<<8) + (*dest))];
|
||||||
|
|
||||||
|
dest += vid.width;
|
||||||
|
|
||||||
|
// Avoid overflow.
|
||||||
|
if (fracstep > 0x7FFFFFFF - frac)
|
||||||
|
frac += fracstep - heightmask;
|
||||||
|
else
|
||||||
|
frac += fracstep;
|
||||||
|
|
||||||
|
while (frac >= heightmask)
|
||||||
|
frac -= heightmask;
|
||||||
|
} while (--count);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while ((count -= 2) >= 0) // texture height is a power of 2
|
||||||
|
{
|
||||||
|
val = source[(frac>>FRACBITS) & heightmask];
|
||||||
|
if (val != TRANSPARENTPIXEL)
|
||||||
|
*dest = colormap[*(transmap + (val<<8) + (*dest))];
|
||||||
|
dest += vid.width;
|
||||||
|
frac += fracstep;
|
||||||
|
val = source[(frac>>FRACBITS) & heightmask];
|
||||||
|
if (val != TRANSPARENTPIXEL)
|
||||||
|
*dest = colormap[*(transmap + (val<<8) + (*dest))];
|
||||||
|
dest += vid.width;
|
||||||
|
frac += fracstep;
|
||||||
|
}
|
||||||
|
if (count & 1)
|
||||||
|
{
|
||||||
|
val = source[(frac>>FRACBITS) & heightmask];
|
||||||
|
if (val != TRANSPARENTPIXEL)
|
||||||
|
*dest = colormap[*(transmap + (val<<8) + (*dest))];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief The R_DrawShadeColumn_8 function
|
/** \brief The R_DrawShadeColumn_8 function
|
||||||
Experiment to make software go faster. Taken from the Boom source
|
Experiment to make software go faster. Taken from the Boom source
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -271,6 +271,8 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
|
||||||
|
|
||||||
if (colfunc == wallcolfunc)
|
if (colfunc == wallcolfunc)
|
||||||
twosmultipatchfunc();
|
twosmultipatchfunc();
|
||||||
|
else if (colfunc == fuzzcolfunc)
|
||||||
|
twosmultipatchtransfunc();
|
||||||
else
|
else
|
||||||
colfunc();
|
colfunc();
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ void (*splatfunc)(void); // span drawer w/ transparency
|
||||||
void (*basespanfunc)(void); // default span func for color mode
|
void (*basespanfunc)(void); // default span func for color mode
|
||||||
void (*transtransfunc)(void); // translucent translated column drawer
|
void (*transtransfunc)(void); // translucent translated column drawer
|
||||||
void (*twosmultipatchfunc)(void); // for cols with transparent pixels
|
void (*twosmultipatchfunc)(void); // for cols with transparent pixels
|
||||||
|
void (*twosmultipatchtransfunc)(void); // for cols with transparent pixels AND translucency
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
// global video state
|
// global video state
|
||||||
|
@ -127,6 +128,7 @@ void SCR_SetMode(void)
|
||||||
fuzzcolfunc = R_DrawTranslucentColumn_8;
|
fuzzcolfunc = R_DrawTranslucentColumn_8;
|
||||||
walldrawerfunc = R_DrawWallColumn_8;
|
walldrawerfunc = R_DrawWallColumn_8;
|
||||||
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8;
|
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8;
|
||||||
|
twosmultipatchtransfunc = R_Draw2sMultiPatchTranslucentColumn_8;
|
||||||
#ifdef RUSEASM
|
#ifdef RUSEASM
|
||||||
if (R_ASM)
|
if (R_ASM)
|
||||||
{
|
{
|
||||||
|
|
|
@ -136,6 +136,7 @@ extern void (*basespanfunc)(void);
|
||||||
extern void (*splatfunc)(void);
|
extern void (*splatfunc)(void);
|
||||||
extern void (*transtransfunc)(void);
|
extern void (*transtransfunc)(void);
|
||||||
extern void (*twosmultipatchfunc)(void);
|
extern void (*twosmultipatchfunc)(void);
|
||||||
|
extern void (*twosmultipatchtransfunc)(void);
|
||||||
|
|
||||||
// -----
|
// -----
|
||||||
// CPUID
|
// CPUID
|
||||||
|
|
Loading…
Reference in a new issue