Fixed issue with vertical offsets being broken.

Add a vertical flip variant for the translucent column drawer.
Translucency is now properly distributed: 0.00 leads to no render at all, 0.1 to TRANS10, ..., 0.9 to TRANS90, 1 to regular column drawer.
This commit is contained in:
Nevur 2017-03-05 18:53:34 +01:00
parent 829be5bd43
commit 13dbe7d3a3

View file

@ -219,7 +219,7 @@ static inline void R_DrawTransColumnInCache(column_t *patch, UINT8 *cache, texpa
{ {
INT32 count, position; INT32 count, position;
UINT8 *source, *dest; UINT8 *source, *dest;
UINT8 *mytransmap = transtables + ((8*(originPatch->alpha)/255) << FF_TRANSSHIFT); UINT8 *mytransmap = transtables + ((8*(originPatch->alpha) + 255/8)/(255 - 255/11) << FF_TRANSSHIFT); // The equation's not exact but it works as intended. I'll call it a day for now.
INT32 topdelta, prevdelta = -1; INT32 topdelta, prevdelta = -1;
INT32 originy = originPatch->originy; INT32 originy = originPatch->originy;
@ -246,17 +246,53 @@ static inline void R_DrawTransColumnInCache(column_t *patch, UINT8 *cache, texpa
dest = cache + position; dest = cache + position;
if (count > 0) if (count > 0)
{ {
for (; dest < cache + position + count; ++source) for (; dest < cache + position + count; source++, dest++)
//*dest++ = transtables[(*source)<<8 + *dest]; *dest = *(mytransmap + ((*dest)<<8) + (*source));
*dest++ = *(mytransmap + ((*source)<<8) + (*dest));
//*dest++ = *source;
} }
patch = (column_t *)((UINT8 *)patch + patch->length + 4); patch = (column_t *)((UINT8 *)patch + patch->length + 4);
} }
} }
static inline void R_DrawTransFlippedColumnInCache(column_t *patch, UINT8 *cache, texpatch_t *originPatch, INT32 cacheheight, INT32 patchheight)
{
INT32 count, position;
UINT8 *source, *dest;
UINT8 *mytransmap = transtables + ((8*(originPatch->alpha) + 255/8)/(255 - 255/11) << FF_TRANSSHIFT); // The equation's not exact but it works as intended. I'll call it a day for now.
INT32 topdelta, prevdelta = -1;
INT32 originy = originPatch->originy;
while (patch->topdelta != 0xff)
{
topdelta = patch->topdelta;
if (topdelta <= prevdelta)
topdelta += prevdelta;
prevdelta = topdelta;
topdelta = patchheight-patch->length-topdelta;
source = (UINT8 *)patch + 2 + patch->length; // patch + 3 + (patch->length-1)
count = patch->length;
position = originy + topdelta;
if (position < 0)
{
count += position;
source += position; // start further UP the column
position = 0;
}
if (position + count > cacheheight)
count = cacheheight - position;
dest = cache + position;
if (count > 0)
{
for (; dest < cache + position + count; --source, dest++)
*dest = *(mytransmap + ((*dest)<<8) + (*source));
}
patch = (column_t *)((UINT8 *)patch + patch->length + 4);
}
}
// //
// R_GenerateTexture // R_GenerateTexture
@ -371,10 +407,12 @@ static UINT8 *R_GenerateTexture(size_t texnum)
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
{ {
static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer. static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer.
if (patch->style == AST_TRANSLUCENT) if ((patch->style == AST_TRANSLUCENT) && (patch->alpha <= (10*255/11))) // Alpha style set to translucent? Is the alpha small enough for translucency?
{ {
if (patch->alpha < 255/11) // Is the patch way too translucent? Don't render then.
continue;
if (patch->flip & 2) if (patch->flip & 2)
ColumnDrawerPointer = &R_DrawTransColumnInCache; ColumnDrawerPointer = &R_DrawTransFlippedColumnInCache;
else else
ColumnDrawerPointer = &R_DrawTransColumnInCache; ColumnDrawerPointer = &R_DrawTransColumnInCache;
} }