- calculate weapon positions fully in floating point to avoid roundoff errors.

- In order to get reliable results the empty border around scaled sprites must be the same scale as the sprite (i.e. 2 pixels for 2x scale and 4 pixels for 4x scale.)
This commit is contained in:
Christoph Oelckers 2015-04-04 12:35:10 +02:00
parent b0c0012d60
commit 67334bfa2b
2 changed files with 33 additions and 16 deletions

View file

@ -79,7 +79,8 @@ void FGLRenderer::DrawPSprite (player_t * player,pspdef_t *psp,fixed_t sx, fixed
int x1,y1,x2,y2; int x1,y1,x2,y2;
float scale; float scale;
fixed_t scalex; fixed_t scalex;
fixed_t texturemid;// 4:3 16:9 16:10 17:10 5:4 float ftexturemid;
// 4:3 16:9 16:10 17:10 5:4
static fixed_t xratio[] = {FRACUNIT, FRACUNIT*3/4, FRACUNIT*5/6, FRACUNIT*40/51, FRACUNIT}; static fixed_t xratio[] = {FRACUNIT, FRACUNIT*3/4, FRACUNIT*5/6, FRACUNIT*40/51, FRACUNIT};
// [BB] In the HUD model step we just render the model and break out. // [BB] In the HUD model step we just render the model and break out.
@ -116,23 +117,24 @@ void FGLRenderer::DrawPSprite (player_t * player,pspdef_t *psp,fixed_t sx, fixed
x2+=viewwindowx; x2+=viewwindowx;
// killough 12/98: fix psprite positioning problem // killough 12/98: fix psprite positioning problem
texturemid = (100<<FRACBITS) - (sy-(tex->GetScaledTopOffset()<<FRACBITS)); ftexturemid = 100.f - FIXED2FLOAT(sy) + tex->GetScaledTopOffsetFloat();
AWeapon * wi=player->ReadyWeapon; AWeapon * wi=player->ReadyWeapon;
if (wi && wi->YAdjust) if (wi && wi->YAdjust)
{ {
float fYAd = FIXED2FLOAT(wi->YAdjust);
if (screenblocks>=11) if (screenblocks>=11)
{ {
texturemid -= wi->YAdjust; ftexturemid -= fYAd;
} }
else if (!st_scale) else if (!st_scale)
{ {
texturemid -= FixedMul (StatusBar->GetDisplacement (), wi->YAdjust); ftexturemid -= FIXED2FLOAT(StatusBar->GetDisplacement ()) * fYAd;
} }
} }
scale = ((SCREENHEIGHT*vw)/SCREENWIDTH) / 200.0f; scale = (SCREENHEIGHT*vw)/ (SCREENWIDTH * 200.0f);
y1 = viewwindowy + (vh >> 1) - (int)(((float)texturemid / (float)FRACUNIT) * scale); y1 = viewwindowy + (vh >> 1) - (int)(ftexturemid * scale);
y2 = y1 + (int)((float)tex->TextureHeight() * scale) + 1; y2 = y1 + (int)((float)tex->TextureHeight() * scale) + 1;
if (!mirror) if (!mirror)

View file

@ -460,17 +460,25 @@ FMaterial::FMaterial(FTexture * tx, bool expanded)
if (expanded) if (expanded)
{ {
// a little adjustment to make sprites look better with texture filtering: // a little adjustment to make sprites look better with texture filtering:
// create a 1 pixel wide empty frame around them. // create a 1 pixel wide empty frame around them. The frame must be the same size as the texture scale so that
mWidth+=2; // position calculations remain scale independent.
mHeight+=2;
mLeftOffset+=1;
mTopOffset+=1;
mRenderWidth = mRenderWidth * mWidth / (mWidth-2);
mRenderHeight = mRenderHeight * mHeight / (mHeight-2);
int trim[4]; int trim[4];
bool trimmed = TrimBorders(trim); // get the trim size before adding the empty frame
if (TrimBorders(trim)) int intscaleX = MAX(1, tex->xScale >> FRACBITS);
int intscaleY = MAX(1, tex->yScale >> FRACBITS);
int oldwidth = mWidth;
int oldheight = mHeight;
mWidth+=2*intscaleX;
mHeight+=2*intscaleY;
mLeftOffset+=intscaleX;
mTopOffset+=intscaleY;
mRenderWidth = mRenderWidth * mWidth / oldwidth;
mRenderHeight = mRenderHeight * mHeight / oldheight;
/* NOTE: This formula is a bit broken and needs fixing.*/
if (trimmed)
{ {
mSpriteRect.left = -(mLeftOffset - trim[0]) / FIXED2FLOAT(tx->xScale); mSpriteRect.left = -(mLeftOffset - trim[0]) / FIXED2FLOAT(tx->xScale);
mSpriteRect.top = -(mTopOffset - trim[1]) / FIXED2FLOAT(tx->yScale); mSpriteRect.top = -(mTopOffset - trim[1]) / FIXED2FLOAT(tx->yScale);
@ -482,6 +490,13 @@ FMaterial::FMaterial(FTexture * tx, bool expanded)
mSpriteU[1] *= (trim[0]+trim[2]+2) / (float)mWidth; mSpriteU[1] *= (trim[0]+trim[2]+2) / (float)mWidth;
mSpriteV[1] *= (trim[1]+trim[3]+2) / (float)mHeight; mSpriteV[1] *= (trim[1]+trim[3]+2) / (float)mHeight;
} }
else
{
mSpriteRect.left = -mLeftOffset / FIXED2FLOAT(tx->xScale);
mSpriteRect.top = -mTopOffset / FIXED2FLOAT(tx->yScale);
mSpriteRect.width = mWidth / FIXED2FLOAT(tx->xScale);
mSpriteRect.height = mHeight / FIXED2FLOAT(tx->yScale);
}
} }
mTextureLayers.ShrinkToFit(); mTextureLayers.ShrinkToFit();
@ -761,7 +776,7 @@ FMaterial * FMaterial::ValidateTexture(FTexture * tex, bool expand)
FMaterial *gltex = tex->gl_info.Material[expand]; FMaterial *gltex = tex->gl_info.Material[expand];
if (gltex == NULL) if (gltex == NULL)
{ {
if (tex->bWarped || tex->bHasCanvas || tex->gl_info.shaderindex >= FIRST_USER_SHADER) if (tex->bWarped || tex->bHasCanvas || tex->gl_info.shaderindex >= FIRST_USER_SHADER)// || tex->xScale != FRACUNIT && tex->yScale != FRACUNIT)
{ {
expand = false; expand = false;
} }