Merge pull request #1121 from 0lvin/backport

Improve pcx support and cleanup soft render
This commit is contained in:
Yamagi 2024-07-06 18:49:29 +02:00 committed by GitHub
commit 8c0904f0c8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 50 additions and 43 deletions

View file

@ -85,7 +85,7 @@ SCR_LoadPCX(char *filename, byte **pic, byte **palette, int *width, int *height)
{
byte *raw;
pcx_t *pcx;
int x, y;
int x, y, bpl;
int len, full_size;
int dataByte, runLength;
byte *out, *pix;
@ -115,6 +115,12 @@ SCR_LoadPCX(char *filename, byte **pic, byte **palette, int *width, int *height)
return;
}
bpl = LittleShort(pcx->bytes_per_line);
if (bpl <= pcx->xmax)
{
bpl = pcx->xmax + 1;
}
full_size = (pcx->ymax + 1) * (pcx->xmax + 1);
out = Z_Malloc(full_size);
@ -140,7 +146,7 @@ SCR_LoadPCX(char *filename, byte **pic, byte **palette, int *width, int *height)
for (y = 0; y <= pcx->ymax; y++, pix += pcx->xmax + 1)
{
for (x = 0; x <= pcx->xmax; )
for (x = 0; x < bpl; )
{
dataByte = *raw++;

View file

@ -173,6 +173,12 @@ LoadPCX(const char *origname, byte **pic, byte **palette, int *width, int *heigh
return;
}
if (pcx->bytes_per_line <= pcx_width)
{
pcx->bytes_per_line = pcx_width + 1;
image_issues = true;
}
full_size = (pcx_height + 1) * (pcx_width + 1);
out = malloc(full_size);
if (!out)
@ -218,7 +224,7 @@ LoadPCX(const char *origname, byte **pic, byte **palette, int *width, int *heigh
for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1)
{
for (x = 0; x <= pcx_width; )
for (x = 0; x < pcx->bytes_per_line; )
{
if (raw - (byte *)pcx > len)
{

View file

@ -221,6 +221,8 @@ typedef struct
pixel_t *pskin;
int skinwidth;
int skinheight;
float scalewidth;
float scaleheight;
} affinetridesc_t;
typedef struct
@ -343,7 +345,6 @@ extern qboolean r_dowarp;
extern affinetridesc_t r_affinetridesc;
void D_WarpScreen(void);
void R_PolysetUpdateTables(void);
//=======================================================================//

View file

@ -526,10 +526,10 @@ R_AliasSetupSkin(const entity_t *currententity, const model_t *currentmodel)
return false;
r_affinetridesc.pskin = pskindesc->pixels[0];
r_affinetridesc.skinwidth = pskindesc->width;
r_affinetridesc.skinheight = pskindesc->height;
R_PolysetUpdateTables (); // FIXME: precalc edge lookups
r_affinetridesc.skinwidth = pskindesc->asset_width;
r_affinetridesc.skinheight = pskindesc->asset_height;
r_affinetridesc.scalewidth = (float)pskindesc->asset_width / s_pmdl->skinwidth;
r_affinetridesc.scaleheight = (float)pskindesc->asset_height / s_pmdl->skinheight;
return true;
}

View file

@ -77,10 +77,6 @@ static light3_t d_lightbasestep, d_lightextrastep;
static int d_sfracbasestep, d_tfracbasestep;
static zvalue_t d_ziextrastep, d_zibasestep;
static byte *skintable[MAX_LBM_HEIGHT];
int skinwidth;
static pixel_t *skinstart;
void (*d_pdrawspans)(const entity_t *currententity, spanpackage_t *pspanpackage);
static void R_PolysetSetEdgeTable(void);
@ -131,29 +127,6 @@ static const byte irtable[256] = {
// ======================
/*
================
R_PolysetUpdateTables
================
*/
void
R_PolysetUpdateTables (void)
{
byte *s;
if (r_affinetridesc.skinwidth != skinwidth ||
r_affinetridesc.pskin != skinstart)
{
int i;
skinwidth = r_affinetridesc.skinwidth;
skinstart = r_affinetridesc.pskin;
s = skinstart;
for (i=0 ; i<MAX_LBM_HEIGHT ; i++, s+=skinwidth)
skintable[i] = s;
}
}
/*
================
R_DrawTriangle
@ -300,27 +273,41 @@ FloorDivMod(int numer, int denom, int *quo, int *rem)
#if defined(__i386__) || defined(__amd64__)
q = numer / denom;
r = numer - q * denom;
if (-1/2 || 1/-2 || -1/-2) {
// long live C89
if (r < 0 && r < denom) {
q += 1;
r -= denom;
}
} else {
}
else
{
// C99 always truncates to 0
if ((numer ^ denom) < 0 && r != 0) {
if ((numer ^ denom) < 0 && r != 0)
{
q -= 1;
r += denom;
}
}
if ((numer < 0) ^ (denom < 0))
{
assert(q <= 0);
}
else
{
assert(q >= 0);
}
if (denom < 0)
{
assert(r > denom && r <= 0);
}
else
{
assert(r >= 0 && r < denom);
}
#else
float num = numer, den = denom;
float x;
@ -781,8 +768,8 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp
}
static void
R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
compactvert_t *pleftbottom)
R_ProcessLeftEdge(const compactvert_t *plefttop, const compactvert_t *prighttop,
const compactvert_t *pleftbottom)
{
light3_t working_lstepx;
pixel_t *d_ptex;
@ -795,8 +782,8 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
v = plefttop->v;
d_aspancount = plefttop->u - prighttop->u;
s = plefttop->s;
t = plefttop->t;
s = plefttop->s * r_affinetridesc.scalewidth;
t = plefttop->t * r_affinetridesc.scaleheight;
i = (s >> SHIFT16XYZ) + (t >> SHIFT16XYZ) * r_affinetridesc.skinwidth;
d_ptex = &r_affinetridesc.pskin[i];
d_sfrac = s & 0xFFFF;
@ -821,7 +808,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
// ceil (), but plus a little bit)
t = ubasestep < 0;
for (i = 0; i < 3; i++)
{
working_lstepx[i] = r_lstepx[i] - t;
}
// base steps for drawers
s = r_sstepy + r_sstepx * ubasestep;
@ -832,7 +821,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
d_tfracbasestep = t & 0xFFFF;
for (i = 0; i < 3; i++)
{
d_lightbasestep[i] = r_lstepy[i] + working_lstepx[i] * ubasestep;
}
d_zibasestep = r_zistepy + r_zistepx * ubasestep;
@ -845,7 +836,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
d_tfracextrastep = t & 0xFFFF;
for (i = 0; i < 3; i++)
{
d_lightextrastep[i] = d_lightbasestep[i] + working_lstepx[i];
}
d_ziextrastep = d_zibasestep + r_zistepx;
@ -860,7 +853,8 @@ R_RasterizeAliasPolySmooth
static void
R_RasterizeAliasPolySmooth(const entity_t *currententity)
{
compactvert_t *plefttop, *prighttop, *pleftbottom, *prightbottom;
const compactvert_t *pleftbottom, *prightbottom;
const compactvert_t *plefttop, *prighttop;
spanpackage_t *pstart;
int originalcount;
int leftheight, rightheight;