Reduce disappearance of vissprites close to the camera
This commit is contained in:
parent
c0380a3052
commit
1790891fd8
|
@ -743,10 +743,7 @@ void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight)
|
||||||
static void R_DrawVisSprite(vissprite_t *vis)
|
static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
{
|
{
|
||||||
column_t *column;
|
column_t *column;
|
||||||
//#ifdef RANGECHECK
|
|
||||||
#if 1
|
|
||||||
INT32 texturecolumn;
|
INT32 texturecolumn;
|
||||||
#endif
|
|
||||||
fixed_t frac;
|
fixed_t frac;
|
||||||
patch_t *patch = vis->patch;
|
patch_t *patch = vis->patch;
|
||||||
fixed_t this_scale = vis->mobj->scale;
|
fixed_t this_scale = vis->mobj->scale;
|
||||||
|
@ -899,7 +896,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
if (vis->scalestep)
|
if (vis->scalestep)
|
||||||
{
|
{
|
||||||
angle_t angle = ((vis->centerangle + xtoviewangle[dc_x]) >> ANGLETOFINESHIFT) & 0xFFF;
|
angle_t angle = ((vis->centerangle + xtoviewangle[dc_x]) >> ANGLETOFINESHIFT) & 0xFFF;
|
||||||
texturecolumn = (vis->paperoffset - FixedMul(FINETANGENT(angle), vis->paperdistance)) >> FRACBITS;
|
texturecolumn = (vis->paperoffset - FixedMul(FINETANGENT(angle), vis->paperdistance)) / this_scale;
|
||||||
|
|
||||||
if (texturecolumn < 0 || texturecolumn >= SHORT(patch->width))
|
if (texturecolumn < 0 || texturecolumn >= SHORT(patch->width))
|
||||||
{
|
{
|
||||||
|
@ -1154,7 +1151,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
tz = gxt-gyt;
|
tz = gxt-gyt;
|
||||||
|
|
||||||
// thing is behind view plane?
|
// thing is behind view plane?
|
||||||
if (!(papersprite) && (tz < FixedMul(MINZ, this_scale))) // papersprite clipping is handled later
|
if (!papersprite && (tz < FixedMul(MINZ, this_scale))) // papersprite clipping is handled later
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gxt = -FixedMul(tr_x, viewsin);
|
gxt = -FixedMul(tr_x, viewsin);
|
||||||
|
@ -1162,7 +1159,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
tx = -(gyt + gxt);
|
tx = -(gyt + gxt);
|
||||||
|
|
||||||
// too far off the side?
|
// too far off the side?
|
||||||
if (abs(tx) > tz<<2)
|
if (!papersprite && abs(tx) > tz<<2) // papersprite clipping is handled later
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// aspect ratio stuff
|
// aspect ratio stuff
|
||||||
|
@ -1291,7 +1288,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
|
|
||||||
if (papersprite)
|
if (papersprite)
|
||||||
{
|
{
|
||||||
fixed_t xscale2, yscale2, cosmul, sinmul, tz2;
|
fixed_t xscale2, yscale2, cosmul, sinmul, tx2, tz2;
|
||||||
INT32 range;
|
INT32 range;
|
||||||
|
|
||||||
if (ang >= ANGLE_180)
|
if (ang >= ANGLE_180)
|
||||||
|
@ -1309,7 +1306,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
gyt = -FixedMul(tr_y, viewsin);
|
gyt = -FixedMul(tr_y, viewsin);
|
||||||
tz = gxt-gyt;
|
tz = gxt-gyt;
|
||||||
yscale = FixedDiv(projectiony, tz);
|
yscale = FixedDiv(projectiony, tz);
|
||||||
if (yscale < 64) return; // Fix some funky visuals
|
//if (yscale < 64) return; // Fix some funky visuals
|
||||||
|
|
||||||
gxt = -FixedMul(tr_x, viewsin);
|
gxt = -FixedMul(tr_x, viewsin);
|
||||||
gyt = FixedMul(tr_y, viewcos);
|
gyt = FixedMul(tr_y, viewcos);
|
||||||
|
@ -1317,10 +1314,6 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
xscale = FixedDiv(projection, tz);
|
xscale = FixedDiv(projection, tz);
|
||||||
x1 = (centerxfrac + FixedMul(tx,xscale))>>FRACBITS;
|
x1 = (centerxfrac + FixedMul(tx,xscale))>>FRACBITS;
|
||||||
|
|
||||||
// off the right side?
|
|
||||||
if (x1 > viewwidth)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Get paperoffset (offset) and paperoffset (distance)
|
// Get paperoffset (offset) and paperoffset (distance)
|
||||||
paperoffset = -FixedMul(tr_x, cosmul) - FixedMul(tr_y, sinmul);
|
paperoffset = -FixedMul(tr_x, cosmul) - FixedMul(tr_y, sinmul);
|
||||||
paperdistance = -FixedMul(tr_x, sinmul) + FixedMul(tr_y, cosmul);
|
paperdistance = -FixedMul(tr_x, sinmul) + FixedMul(tr_y, cosmul);
|
||||||
|
@ -1337,19 +1330,44 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||||
gyt = -FixedMul(tr_y, viewsin);
|
gyt = -FixedMul(tr_y, viewsin);
|
||||||
tz2 = gxt-gyt;
|
tz2 = gxt-gyt;
|
||||||
yscale2 = FixedDiv(projectiony, tz2);
|
yscale2 = FixedDiv(projectiony, tz2);
|
||||||
if (yscale2 < 64) return; // ditto
|
//if (yscale2 < 64) return; // ditto
|
||||||
|
|
||||||
gxt = -FixedMul(tr_x, viewsin);
|
gxt = -FixedMul(tr_x, viewsin);
|
||||||
gyt = FixedMul(tr_y, viewcos);
|
gyt = FixedMul(tr_y, viewcos);
|
||||||
tx = -(gyt + gxt);
|
tx2 = -(gyt + gxt);
|
||||||
xscale2 = FixedDiv(projection, tz2);
|
xscale2 = FixedDiv(projection, tz2);
|
||||||
x2 = ((centerxfrac + FixedMul(tx,xscale2))>>FRACBITS);
|
x2 = ((centerxfrac + FixedMul(tx2,xscale2))>>FRACBITS);
|
||||||
|
|
||||||
|
if (max(tz, tz2) < FixedMul(MINZ, this_scale)) // non-papersprite clipping is handled earlier
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Needs partially clipped
|
||||||
|
if (tz < FixedMul(MINZ, this_scale))
|
||||||
|
{
|
||||||
|
fixed_t div = FixedDiv(tz2-tz, FixedMul(MINZ, this_scale)-tz);
|
||||||
|
tx += FixedDiv(tx2-tx, div);
|
||||||
|
tz = FixedMul(MINZ, this_scale);
|
||||||
|
yscale = FixedDiv(projectiony, tz);
|
||||||
|
xscale = FixedDiv(projection, tz);
|
||||||
|
x1 = (centerxfrac + FixedMul(tx,xscale))>>FRACBITS;
|
||||||
|
}
|
||||||
|
else if (tz2 < FixedMul(MINZ, this_scale))
|
||||||
|
{
|
||||||
|
fixed_t div = FixedDiv(tz-tz2, FixedMul(MINZ, this_scale)-tz2);
|
||||||
|
tx2 += FixedDiv(tx-tx2, div);
|
||||||
|
tz2 = FixedMul(MINZ, this_scale);
|
||||||
|
yscale2 = FixedDiv(projectiony, tz2);
|
||||||
|
xscale2 = FixedDiv(projection, tz2);
|
||||||
|
x2 = (centerxfrac + FixedMul(tx2,xscale2))>>FRACBITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// off the right side?
|
||||||
|
if (x1 > viewwidth)
|
||||||
|
return;
|
||||||
|
|
||||||
// off the left side
|
// off the left side
|
||||||
if (x2 < 0)
|
if (x2 < 0)
|
||||||
return;
|
return;
|
||||||
if (max(tz, tz2) < FixedMul(MINZ, this_scale)) // non-papersprite clipping is handled earlier
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((range = x2 - x1) <= 0)
|
if ((range = x2 - x1) <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue