- fixed coordinate calculations for trimmed sprites which were quite a bit broken.

This commit is contained in:
Christoph Oelckers 2015-04-04 13:37:55 +02:00
parent 67334bfa2b
commit 91eafed5d3
2 changed files with 60 additions and 31 deletions

View file

@ -88,7 +88,8 @@ FGLTexture::FGLTexture(FTexture * tx, bool expandpatches)
hirestexture = NULL; hirestexture = NULL;
bHasColorkey = false; bHasColorkey = false;
bIsTransparent = -1; bIsTransparent = -1;
bExpand = expandpatches; bExpandFlag = expandpatches;
mExpandX = mExpandY = 0;
tex->gl_info.SystemTexture[expandpatches] = this; tex->gl_info.SystemTexture[expandpatches] = this;
} }
@ -111,6 +112,8 @@ FGLTexture::~FGLTexture()
//========================================================================== //==========================================================================
unsigned char *FGLTexture::LoadHiresTexture(FTexture *tex, int *width, int *height) unsigned char *FGLTexture::LoadHiresTexture(FTexture *tex, int *width, int *height)
{ {
if (bExpandFlag) return NULL; // doesn't work for expanded textures
if (HiresLump==-1) if (HiresLump==-1)
{ {
bHasColorkey = false; bHasColorkey = false;
@ -179,7 +182,7 @@ void FGLTexture::Clean(bool all)
// //
//=========================================================================== //===========================================================================
unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, FTexture *hirescheck) unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, FTexture *hirescheck, bool createexpanded)
{ {
unsigned char * buffer; unsigned char * buffer;
int W, H; int W, H;
@ -196,8 +199,20 @@ unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, F
} }
} }
W = w = tex->GetWidth() + bExpand*2; int exx, exy;
H = h = tex->GetHeight() + bExpand*2; if (createexpanded)
{
exx = mExpandX;
exy = mExpandY;
}
else
{
exx = exy = 0;
}
W = w = tex->GetWidth() + 2 * exx;
H = h = tex->GetHeight() + 2 * exy;
buffer=new unsigned char[W*(H+1)*4]; buffer=new unsigned char[W*(H+1)*4];
@ -215,7 +230,7 @@ unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, F
if (imgCreate.Create(W, H)) if (imgCreate.Create(W, H))
{ {
memset(imgCreate.GetPixels(), 0, W * H * 4); memset(imgCreate.GetPixels(), 0, W * H * 4);
int trans = tex->CopyTrueColorPixels(&imgCreate, bExpand, bExpand); int trans = tex->CopyTrueColorPixels(&imgCreate, exx, exy);
bmp.CopyPixelDataRGB(0, 0, imgCreate.GetPixels(), W, H, 4, W * 4, 0, CF_BGRA); bmp.CopyPixelDataRGB(0, 0, imgCreate.GetPixels(), W, H, 4, W * 4, 0, CF_BGRA);
tex->CheckTrans(buffer, W*H, trans); tex->CheckTrans(buffer, W*H, trans);
bIsTransparent = tex->gl_info.mIsTransparent; bIsTransparent = tex->gl_info.mIsTransparent;
@ -223,7 +238,7 @@ unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, F
} }
else if (translation<=0) else if (translation<=0)
{ {
int trans = tex->CopyTrueColorPixels(&bmp, bExpand, bExpand); int trans = tex->CopyTrueColorPixels(&bmp, exx, exy);
tex->CheckTrans(buffer, W*H, trans); tex->CheckTrans(buffer, W*H, trans);
bIsTransparent = tex->gl_info.mIsTransparent; bIsTransparent = tex->gl_info.mIsTransparent;
} }
@ -232,10 +247,13 @@ unsigned char * FGLTexture::CreateTexBuffer(int translation, int & w, int & h, F
// When using translations everything must be mapped to the base palette. // When using translations everything must be mapped to the base palette.
// Since FTexture's method is doing exactly that by calling GetPixels let's use that here // Since FTexture's method is doing exactly that by calling GetPixels let's use that here
// to do all the dirty work for us. ;) // to do all the dirty work for us. ;)
tex->FTexture::CopyTrueColorPixels(&bmp, bExpand, bExpand); tex->FTexture::CopyTrueColorPixels(&bmp, exx, exy);
bIsTransparent = 0; bIsTransparent = 0;
} }
// if we just want the texture for some checks there's no need for upsampling.
if (!createexpanded) return buffer;
// [BB] The hqnx upsampling (not the scaleN one) destroys partial transparency, don't upsamle textures using it. // [BB] The hqnx upsampling (not the scaleN one) destroys partial transparency, don't upsamle textures using it.
// [BB] Potentially upsample the buffer. // [BB] Potentially upsample the buffer.
return gl_CreateUpsampledTextureBuffer ( tex, buffer, W, H, w, h, !!bIsTransparent); return gl_CreateUpsampledTextureBuffer ( tex, buffer, W, H, w, h, !!bIsTransparent);
@ -253,7 +271,7 @@ FHardwareTexture *FGLTexture::CreateHwTexture()
if (tex->UseType==FTexture::TEX_Null) return NULL; // Cannot register a NULL texture if (tex->UseType==FTexture::TEX_Null) return NULL; // Cannot register a NULL texture
if (mHwTexture == NULL) if (mHwTexture == NULL)
{ {
mHwTexture = new FHardwareTexture(tex->GetWidth() + bExpand*2, tex->GetHeight() + bExpand*2, tex->gl_info.bNoCompress); mHwTexture = new FHardwareTexture(tex->GetWidth() + mExpandX*2, tex->GetHeight() + mExpandY*2, tex->gl_info.bNoCompress);
} }
return mHwTexture; return mHwTexture;
} }
@ -451,11 +469,14 @@ FMaterial::FMaterial(FTexture * tx, bool expanded)
FTexture *basetex = tx->GetRedirect(false); FTexture *basetex = tx->GetRedirect(false);
mBaseLayer = ValidateSysTexture(basetex, expanded); mBaseLayer = ValidateSysTexture(basetex, expanded);
float fxScale = FIXED2FLOAT(tx->xScale);
float fyScale = FIXED2FLOAT(tx->yScale);
// mSpriteRect is for positioning the sprite in the scene. // mSpriteRect is for positioning the sprite in the scene.
mSpriteRect.left = -mLeftOffset / FIXED2FLOAT(tx->xScale); mSpriteRect.left = -mLeftOffset / fxScale;
mSpriteRect.top = -mTopOffset / FIXED2FLOAT(tx->yScale); mSpriteRect.top = -mTopOffset / fyScale;
mSpriteRect.width = mWidth / FIXED2FLOAT(tx->xScale); mSpriteRect.width = mWidth / fxScale;
mSpriteRect.height = mHeight / FIXED2FLOAT(tx->yScale); mSpriteRect.height = mHeight / fyScale;
if (expanded) if (expanded)
{ {
@ -477,25 +498,24 @@ FMaterial::FMaterial(FTexture * tx, bool expanded)
mRenderWidth = mRenderWidth * mWidth / oldwidth; mRenderWidth = mRenderWidth * mWidth / oldwidth;
mRenderHeight = mRenderHeight * mHeight / oldheight; mRenderHeight = mRenderHeight * mHeight / oldheight;
/* NOTE: This formula is a bit broken and needs fixing.*/ // Reposition the sprite with the frame considered
mSpriteRect.left = -mLeftOffset / fxScale;
mSpriteRect.top = -mTopOffset / fyScale;
mSpriteRect.width = mWidth / fxScale;
mSpriteRect.height = mHeight / fyScale;
if (trimmed) if (trimmed)
{ {
mSpriteRect.left = -(mLeftOffset - trim[0]) / FIXED2FLOAT(tx->xScale); mSpriteRect.left += trim[0] / fxScale;
mSpriteRect.top = -(mTopOffset - trim[1]) / FIXED2FLOAT(tx->yScale); mSpriteRect.top += trim[1] / fyScale;
mSpriteRect.width = (trim[2] + 2) / FIXED2FLOAT(tx->xScale);
mSpriteRect.height = (trim[3] + 2) / FIXED2FLOAT(tx->yScale); mSpriteRect.width -= (oldwidth - trim[2]) / fxScale;
mSpriteRect.height -= (oldheight - trim[3]) / fyScale;
mSpriteU[0] = trim[0] / (float)mWidth; mSpriteU[0] = trim[0] / (float)mWidth;
mSpriteV[0] = trim[1] / (float)mHeight; mSpriteV[0] = trim[1] / (float)mHeight;
mSpriteU[1] *= (trim[0]+trim[2]+2) / (float)mWidth; mSpriteU[1] -= (oldwidth - trim[0] - trim[2]) / (float)mWidth;
mSpriteV[1] *= (trim[1]+trim[3]+2) / (float)mHeight; mSpriteV[1] -= (oldheight - trim[1] - trim[3]) / (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);
} }
} }
@ -540,7 +560,7 @@ bool FMaterial::TrimBorders(int *rect)
int w; int w;
int h; int h;
unsigned char *buffer = CreateTexBuffer(0, w, h); unsigned char *buffer = CreateTexBuffer(0, w, h, false, false);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -554,6 +574,7 @@ bool FMaterial::TrimBorders(int *rect)
} }
int size = w*h; int size = w*h;
if (size == 1) return false;
int first, last; int first, last;
@ -563,6 +584,7 @@ bool FMaterial::TrimBorders(int *rect)
} }
if (first >= size) if (first >= size)
{ {
// completely empty
rect[0] = 0; rect[0] = 0;
rect[1] = 0; rect[1] = 0;
rect[2] = 1; rect[2] = 1;

View file

@ -65,7 +65,9 @@ private:
FHardwareTexture *mHwTexture; FHardwareTexture *mHwTexture;
bool bHasColorkey; // only for hires bool bHasColorkey; // only for hires
bool bExpand; bool bExpandFlag;
int mExpandX;
int mExpandY;
unsigned char * LoadHiresTexture(FTexture *hirescheck, int *width, int *height); unsigned char * LoadHiresTexture(FTexture *hirescheck, int *width, int *height);
@ -77,7 +79,12 @@ public:
FGLTexture(FTexture * tx, bool expandpatches); FGLTexture(FTexture * tx, bool expandpatches);
~FGLTexture(); ~FGLTexture();
unsigned char * CreateTexBuffer(int translation, int & w, int & h, FTexture *hirescheck); unsigned char * CreateTexBuffer(int translation, int & w, int & h, FTexture *hirescheck, bool createexpanded = true);
void SetExpand(int x, int y)
{
mExpandX = x;
mExpandY = y;
}
void Clean(bool all); void Clean(bool all);
int Dump(int i); int Dump(int i);
@ -139,9 +146,9 @@ public:
void Bind(int clamp, int translation); void Bind(int clamp, int translation);
unsigned char * CreateTexBuffer(int translation, int & w, int & h, bool allowhires=true) const unsigned char * CreateTexBuffer(int translation, int & w, int & h, bool allowhires=true, bool createexpanded = true) const
{ {
return mBaseLayer->CreateTexBuffer(translation, w, h, allowhires? tex : NULL); return mBaseLayer->CreateTexBuffer(translation, w, h, allowhires? tex : NULL, createexpanded);
} }
void Clean(bool f) void Clean(bool f)