soft: scale model texture s,t values

ref_gl renders use 0.0..1.0 float texture coordinates in gl commands
and skin ratio/resolution could be any.
ref_soft render uses absolute coordinates as result textures with
different to expected size are applied incorrectly.

Fix will not add support of scalled retextured skins, just fix case
when ratio is incorrect after scale down such or place a incorrect
pcx skin to the model directory.
This commit is contained in:
Denis Pauk 2024-07-06 16:48:14 +03:00
parent 79c71c7a68
commit ac2a50cb4a
3 changed files with 35 additions and 10 deletions

View file

@ -221,6 +221,8 @@ typedef struct
pixel_t *pskin; pixel_t *pskin;
int skinwidth; int skinwidth;
int skinheight; int skinheight;
float scalewidth;
float scaleheight;
} affinetridesc_t; } affinetridesc_t;
typedef struct typedef struct

View file

@ -526,8 +526,10 @@ R_AliasSetupSkin(const entity_t *currententity, const model_t *currentmodel)
return false; return false;
r_affinetridesc.pskin = pskindesc->pixels[0]; r_affinetridesc.pskin = pskindesc->pixels[0];
r_affinetridesc.skinwidth = pskindesc->width; r_affinetridesc.skinwidth = pskindesc->asset_width;
r_affinetridesc.skinheight = pskindesc->height; 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; return true;
} }

View file

@ -273,27 +273,41 @@ FloorDivMod(int numer, int denom, int *quo, int *rem)
#if defined(__i386__) || defined(__amd64__) #if defined(__i386__) || defined(__amd64__)
q = numer / denom; q = numer / denom;
r = numer - q * denom; r = numer - q * denom;
if (-1/2 || 1/-2 || -1/-2) { if (-1/2 || 1/-2 || -1/-2) {
// long live C89 // long live C89
if (r < 0 && r < denom) { if (r < 0 && r < denom) {
q += 1; q += 1;
r -= denom; r -= denom;
} }
} else { }
else
{
// C99 always truncates to 0 // C99 always truncates to 0
if ((numer ^ denom) < 0 && r != 0) { if ((numer ^ denom) < 0 && r != 0)
{
q -= 1; q -= 1;
r += denom; r += denom;
} }
} }
if ((numer < 0) ^ (denom < 0)) if ((numer < 0) ^ (denom < 0))
{
assert(q <= 0); assert(q <= 0);
}
else else
{
assert(q >= 0); assert(q >= 0);
}
if (denom < 0) if (denom < 0)
{
assert(r > denom && r <= 0); assert(r > denom && r <= 0);
}
else else
{
assert(r >= 0 && r < denom); assert(r >= 0 && r < denom);
}
#else #else
float num = numer, den = denom; float num = numer, den = denom;
float x; float x;
@ -754,8 +768,8 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp
} }
static void static void
R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop, R_ProcessLeftEdge(const compactvert_t *plefttop, const compactvert_t *prighttop,
compactvert_t *pleftbottom) const compactvert_t *pleftbottom)
{ {
light3_t working_lstepx; light3_t working_lstepx;
pixel_t *d_ptex; pixel_t *d_ptex;
@ -768,8 +782,8 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
v = plefttop->v; v = plefttop->v;
d_aspancount = plefttop->u - prighttop->u; d_aspancount = plefttop->u - prighttop->u;
s = plefttop->s; s = plefttop->s * r_affinetridesc.scalewidth;
t = plefttop->t; t = plefttop->t * r_affinetridesc.scaleheight;
i = (s >> SHIFT16XYZ) + (t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; i = (s >> SHIFT16XYZ) + (t >> SHIFT16XYZ) * r_affinetridesc.skinwidth;
d_ptex = &r_affinetridesc.pskin[i]; d_ptex = &r_affinetridesc.pskin[i];
d_sfrac = s & 0xFFFF; d_sfrac = s & 0xFFFF;
@ -794,7 +808,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
// ceil (), but plus a little bit) // ceil (), but plus a little bit)
t = ubasestep < 0; t = ubasestep < 0;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{
working_lstepx[i] = r_lstepx[i] - t; working_lstepx[i] = r_lstepx[i] - t;
}
// base steps for drawers // base steps for drawers
s = r_sstepy + r_sstepx * ubasestep; s = r_sstepy + r_sstepx * ubasestep;
@ -805,7 +821,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
d_tfracbasestep = t & 0xFFFF; d_tfracbasestep = t & 0xFFFF;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{
d_lightbasestep[i] = r_lstepy[i] + working_lstepx[i] * ubasestep; d_lightbasestep[i] = r_lstepy[i] + working_lstepx[i] * ubasestep;
}
d_zibasestep = r_zistepy + r_zistepx * ubasestep; d_zibasestep = r_zistepy + r_zistepx * ubasestep;
@ -818,7 +836,9 @@ R_ProcessLeftEdge(compactvert_t *plefttop, compactvert_t *prighttop,
d_tfracextrastep = t & 0xFFFF; d_tfracextrastep = t & 0xFFFF;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{
d_lightextrastep[i] = d_lightbasestep[i] + working_lstepx[i]; d_lightextrastep[i] = d_lightbasestep[i] + working_lstepx[i];
}
d_ziextrastep = d_zibasestep + r_zistepx; d_ziextrastep = d_zibasestep + r_zistepx;
@ -833,7 +853,8 @@ R_RasterizeAliasPolySmooth
static void static void
R_RasterizeAliasPolySmooth(const entity_t *currententity) 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; spanpackage_t *pstart;
int originalcount; int originalcount;
int leftheight, rightheight; int leftheight, rightheight;