mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-28 12:30:46 +00:00
- implemented 2D rotation and fixed offset calculation for drawing scaled sprites on the status bar.
This commit is contained in:
parent
e2de6d9dc3
commit
1e8b8443b0
6 changed files with 108 additions and 42 deletions
|
@ -39,6 +39,7 @@
|
||||||
#include "v_draw.h"
|
#include "v_draw.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
#include "fcolormap.h"
|
#include "fcolormap.h"
|
||||||
|
#include "printf.h"
|
||||||
|
|
||||||
static F2DDrawer drawer;
|
static F2DDrawer drawer;
|
||||||
F2DDrawer* twod = &drawer;
|
F2DDrawer* twod = &drawer;
|
||||||
|
@ -401,10 +402,6 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms)
|
||||||
|
|
||||||
double xscale = parms.destwidth / parms.texwidth;
|
double xscale = parms.destwidth / parms.texwidth;
|
||||||
double yscale = parms.destheight / parms.texheight;
|
double yscale = parms.destheight / parms.texheight;
|
||||||
double x = parms.x - parms.left * xscale;
|
|
||||||
double y = parms.y - parms.top * yscale;
|
|
||||||
double w = parms.destwidth;
|
|
||||||
double h = parms.destheight;
|
|
||||||
double u1, v1, u2, v2;
|
double u1, v1, u2, v2;
|
||||||
PalEntry vertexcolor;
|
PalEntry vertexcolor;
|
||||||
|
|
||||||
|
@ -433,38 +430,86 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms)
|
||||||
if (parms.flipY)
|
if (parms.flipY)
|
||||||
std::swap(v1, v2);
|
std::swap(v1, v2);
|
||||||
|
|
||||||
// This is crap. Only kept for backwards compatibility with scripts that may have used it.
|
if (parms.rotateangle == 0)
|
||||||
// Note that this only works for unflipped full textures.
|
|
||||||
if (parms.windowleft > 0 || parms.windowright < parms.texwidth)
|
|
||||||
{
|
{
|
||||||
double wi = std::min(parms.windowright, parms.texwidth);
|
double x = parms.x - parms.left * xscale;
|
||||||
x += parms.windowleft * xscale;
|
double y = parms.y - parms.top * yscale;
|
||||||
w -= (parms.texwidth - wi + parms.windowleft) * xscale;
|
double w = parms.destwidth;
|
||||||
|
double h = parms.destheight;
|
||||||
|
|
||||||
u1 = float(u1 + parms.windowleft / parms.texwidth);
|
|
||||||
u2 = float(u2 - (parms.texwidth - wi) / parms.texwidth);
|
// This is crap. Only kept for backwards compatibility with scripts that may have used it.
|
||||||
|
// Note that this only works for unflipped and unrotated full textures.
|
||||||
|
if (parms.windowleft > 0 || parms.windowright < parms.texwidth)
|
||||||
|
{
|
||||||
|
double wi = std::min(parms.windowright, parms.texwidth);
|
||||||
|
x += parms.windowleft * xscale;
|
||||||
|
w -= (parms.texwidth - wi + parms.windowleft) * xscale;
|
||||||
|
|
||||||
|
u1 = float(u1 + parms.windowleft / parms.texwidth);
|
||||||
|
u2 = float(u2 - (parms.texwidth - wi) / parms.texwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x < (double)parms.lclip || y < (double)parms.uclip || x + w >(double)parms.rclip || y + h >(double)parms.dclip)
|
||||||
|
{
|
||||||
|
dg.mScissor[0] = parms.lclip;
|
||||||
|
dg.mScissor[1] = parms.uclip;
|
||||||
|
dg.mScissor[2] = parms.rclip;
|
||||||
|
dg.mScissor[3] = parms.dclip;
|
||||||
|
dg.mFlags |= DTF_Scissor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(dg.mScissor, 0, sizeof(dg.mScissor));
|
||||||
|
}
|
||||||
|
|
||||||
|
dg.mVertCount = 4;
|
||||||
|
dg.mVertIndex = (int)mVertices.Reserve(4);
|
||||||
|
TwoDVertex* ptr = &mVertices[dg.mVertIndex];
|
||||||
|
ptr->Set(x, y, 0, u1, v1, vertexcolor); ptr++;
|
||||||
|
ptr->Set(x, y + h, 0, u1, v2, vertexcolor); ptr++;
|
||||||
|
ptr->Set(x + w, y, 0, u2, v1, vertexcolor); ptr++;
|
||||||
|
ptr->Set(x + w, y + h, 0, u2, v2, vertexcolor); ptr++;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (x < (double)parms.lclip || y < (double)parms.uclip || x + w >(double)parms.rclip || y + h >(double)parms.dclip)
|
|
||||||
{
|
{
|
||||||
|
double radang = parms.rotateangle * (pi::pi() / 180.);
|
||||||
|
double cosang = cos(radang);
|
||||||
|
double sinang = sin(radang);
|
||||||
|
double xd1 = -parms.left;
|
||||||
|
double yd1 = -parms.top;
|
||||||
|
double xd2 = xd1 + parms.texwidth;
|
||||||
|
double yd2 = yd1 + parms.texheight;
|
||||||
|
|
||||||
|
double x1 = parms.x + xscale * (xd1 * cosang + yd1 * sinang);
|
||||||
|
double y1 = parms.y - yscale * (xd1 * sinang - yd1 * cosang);
|
||||||
|
|
||||||
|
double x2 = parms.x + xscale * (xd1 * cosang + yd2 * sinang);
|
||||||
|
double y2 = parms.y - yscale * (xd1 * sinang - yd2 * cosang);
|
||||||
|
|
||||||
|
double x3 = parms.x + xscale * (xd2 * cosang + yd1 * sinang);
|
||||||
|
double y3 = parms.y - yscale * (xd2 * sinang - yd1 * cosang);
|
||||||
|
|
||||||
|
double x4 = parms.x + xscale * (xd2 * cosang + yd2 * sinang);
|
||||||
|
double y4 = parms.y - yscale * (xd2 * sinang - yd2 * cosang);
|
||||||
|
|
||||||
|
Printf(PRINT_NOTIFY, "%f, %f\n", y2, y4);
|
||||||
|
|
||||||
dg.mScissor[0] = parms.lclip;
|
dg.mScissor[0] = parms.lclip;
|
||||||
dg.mScissor[1] = parms.uclip;
|
dg.mScissor[1] = parms.uclip;
|
||||||
dg.mScissor[2] = parms.rclip;
|
dg.mScissor[2] = parms.rclip;
|
||||||
dg.mScissor[3] = parms.dclip;
|
dg.mScissor[3] = parms.dclip;
|
||||||
dg.mFlags |= DTF_Scissor;
|
dg.mFlags |= DTF_Scissor;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset(dg.mScissor, 0, sizeof(dg.mScissor));
|
|
||||||
}
|
|
||||||
|
|
||||||
dg.mVertCount = 4;
|
dg.mVertCount = 4;
|
||||||
dg.mVertIndex = (int)mVertices.Reserve(4);
|
dg.mVertIndex = (int)mVertices.Reserve(4);
|
||||||
TwoDVertex *ptr = &mVertices[dg.mVertIndex];
|
TwoDVertex* ptr = &mVertices[dg.mVertIndex];
|
||||||
ptr->Set(x, y, 0, u1, v1, vertexcolor); ptr++;
|
ptr->Set(x1, y1, 0, u1, v1, vertexcolor); ptr++;
|
||||||
ptr->Set(x, y + h, 0, u1, v2, vertexcolor); ptr++;
|
ptr->Set(x2, y2, 0, u1, v2, vertexcolor); ptr++;
|
||||||
ptr->Set(x + w, y, 0, u2, v1, vertexcolor); ptr++;
|
ptr->Set(x3, y3, 0, u2, v1, vertexcolor); ptr++;
|
||||||
ptr->Set(x + w, y + h, 0, u2, v2, vertexcolor); ptr++;
|
ptr->Set(x4, y4, 0, u2, v2, vertexcolor); ptr++;
|
||||||
|
|
||||||
|
}
|
||||||
dg.mIndexIndex = mIndices.Size();
|
dg.mIndexIndex = mIndices.Size();
|
||||||
dg.mIndexCount += 6;
|
dg.mIndexCount += 6;
|
||||||
AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2);
|
AddIndices(dg.mVertIndex, 6, 0, 1, 2, 1, 3, 2);
|
||||||
|
|
|
@ -636,6 +636,7 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double
|
||||||
parms->fsscalemode = -1;
|
parms->fsscalemode = -1;
|
||||||
parms->patchscalex = parms->patchscaley = 1;
|
parms->patchscalex = parms->patchscaley = 1;
|
||||||
parms->viewport = { 0,0,drawer->GetWidth(), drawer->GetHeight() };
|
parms->viewport = { 0,0,drawer->GetWidth(), drawer->GetHeight() };
|
||||||
|
parms->rotateangle = 0;
|
||||||
|
|
||||||
// Parse the tag list for attributes. (For floating point attributes,
|
// Parse the tag list for attributes. (For floating point attributes,
|
||||||
// consider that the C ABI dictates that all floats be promoted to
|
// consider that the C ABI dictates that all floats be promoted to
|
||||||
|
@ -1069,6 +1070,12 @@ bool ParseDrawTextureTags(F2DDrawer *drawer, FGameTexture *img, double x, double
|
||||||
case DTA_ViewportHeight:
|
case DTA_ViewportHeight:
|
||||||
parms->viewport.height = ListGetInt(tags);
|
parms->viewport.height = ListGetInt(tags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DTA_Rotate:
|
||||||
|
assert(fortext == false);
|
||||||
|
if (fortext) return false;
|
||||||
|
parms->rotateangle = ListGetDouble(tags);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
tag = ListGetInt(tags);
|
tag = ListGetInt(tags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,7 @@ enum
|
||||||
DTA_CenterOffsetRel, // Apply texture offsets relative to center, instead of top left. This is standard alignment for Build's 2D content.
|
DTA_CenterOffsetRel, // Apply texture offsets relative to center, instead of top left. This is standard alignment for Build's 2D content.
|
||||||
DTA_TopLeft, // always align to top left. Added to have a boolean condition for this alignment.
|
DTA_TopLeft, // always align to top left. Added to have a boolean condition for this alignment.
|
||||||
DTA_Pin, // Pin a non-widescreen image to the left/right edge of the screen.
|
DTA_Pin, // Pin a non-widescreen image to the left/right edge of the screen.
|
||||||
|
DTA_Rotate,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -172,6 +173,7 @@ struct DrawParms
|
||||||
double srcx, srcy;
|
double srcx, srcy;
|
||||||
double srcwidth, srcheight;
|
double srcwidth, srcheight;
|
||||||
double patchscalex, patchscaley;
|
double patchscalex, patchscaley;
|
||||||
|
double rotateangle;
|
||||||
IntRect viewport;
|
IntRect viewport;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -405,16 +405,16 @@ void DBaseStatusBar::StatusbarToRealCoords(double &x, double &y, double &w, doub
|
||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
void DBaseStatusBar::DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation)
|
void DBaseStatusBar::DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, double rotate)
|
||||||
{
|
{
|
||||||
if (!texture.isValid())
|
if (!texture.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE));
|
FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE));
|
||||||
DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, color, translation);
|
DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, color, translation, rotate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBaseStatusBar::DrawGraphic(FGameTexture* tex, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation)
|
void DBaseStatusBar::DrawGraphic(FGameTexture* tex, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color, int translation, double rotate)
|
||||||
{
|
{
|
||||||
double texwidth = tex->GetDisplayWidth() * scaleX;
|
double texwidth = tex->GetDisplayWidth() * scaleX;
|
||||||
double texheight = tex->GetDisplayHeight() * scaleY;
|
double texheight = tex->GetDisplayHeight() * scaleY;
|
||||||
|
@ -466,19 +466,29 @@ void DBaseStatusBar::DrawGraphic(FGameTexture* tex, double x, double y, int flag
|
||||||
y += drawOffset.Y;
|
y += drawOffset.Y;
|
||||||
|
|
||||||
double xo = 0, yo = 0;
|
double xo = 0, yo = 0;
|
||||||
switch (flags & DI_ITEM_HMASK)
|
if (flags & DI_ITEM_RELCENTER)
|
||||||
{
|
{
|
||||||
case DI_ITEM_HCENTER: xo = texwidth / 2; break;
|
xo = tex->GetDisplayWidth() / 2 + tex->GetDisplayLeftOffset();
|
||||||
case DI_ITEM_RIGHT: xo = texwidth; break;
|
yo = tex->GetDisplayHeight() / 2 + tex->GetDisplayTopOffset();
|
||||||
case DI_ITEM_HOFFSET: xo = tex->GetDisplayLeftOffset(); break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (flags & DI_ITEM_HMASK)
|
||||||
|
{
|
||||||
|
case DI_ITEM_HCENTER: xo = tex->GetDisplayWidth() / 2; break;
|
||||||
|
case DI_ITEM_RIGHT: xo = tex->GetDisplayWidth(); break;
|
||||||
|
case DI_ITEM_HOFFSET: xo = tex->GetDisplayLeftOffset(); break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (flags & DI_ITEM_VMASK)
|
switch (flags & DI_ITEM_VMASK)
|
||||||
{
|
{
|
||||||
case DI_ITEM_VCENTER: yo = texheight / 2; break;
|
case DI_ITEM_VCENTER: yo = tex->GetDisplayHeight() / 2; break;
|
||||||
case DI_ITEM_BOTTOM: yo = texheight; break;
|
case DI_ITEM_BOTTOM: yo = tex->GetDisplayHeight(); break;
|
||||||
case DI_ITEM_VOFFSET: yo = tex->GetDisplayTopOffset(); break;
|
case DI_ITEM_VOFFSET: yo = tex->GetDisplayTopOffset(); break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
//xo *= scaleX;
|
||||||
|
//yo *= scaleY;
|
||||||
|
|
||||||
if (!fullscreenOffsets)
|
if (!fullscreenOffsets)
|
||||||
{
|
{
|
||||||
|
@ -527,6 +537,7 @@ void DBaseStatusBar::DrawGraphic(FGameTexture* tex, double x, double y, int flag
|
||||||
DTA_AlphaChannel, !!(flags & DI_ALPHAMAPPED),
|
DTA_AlphaChannel, !!(flags & DI_ALPHAMAPPED),
|
||||||
DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1,
|
DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1,
|
||||||
DTA_FlipX, !!(flags & DI_MIRROR),
|
DTA_FlipX, !!(flags & DI_MIRROR),
|
||||||
|
DTA_Rotate, rotate,
|
||||||
TAG_DONE);
|
TAG_DONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,8 +177,8 @@ public:
|
||||||
DVector2 GetHUDScale() const;
|
DVector2 GetHUDScale() const;
|
||||||
void NewGame ();
|
void NewGame ();
|
||||||
|
|
||||||
void DrawGraphic(FGameTexture *texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0);
|
void DrawGraphic(FGameTexture *texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0);
|
||||||
void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0);
|
void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, PalEntry color = 0xffffffff, int translation = 0, double rotate = 0);
|
||||||
void DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY);
|
void DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY, double scaleX, double scaleY);
|
||||||
void TransformRect(double &x, double &y, double &w, double &h, int flags = 0);
|
void TransformRect(double &x, double &y, double &w, double &h, int flags = 0);
|
||||||
void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0);
|
void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0);
|
||||||
|
@ -279,6 +279,7 @@ enum DI_Flags
|
||||||
DI_DIMDEPLETED = 0x400,
|
DI_DIMDEPLETED = 0x400,
|
||||||
DI_DONTANIMATE = 0x800, // do not animate the texture
|
DI_DONTANIMATE = 0x800, // do not animate the texture
|
||||||
DI_MIRROR = 0x1000, // flip the texture horizontally, like a mirror
|
DI_MIRROR = 0x1000, // flip the texture horizontally, like a mirror
|
||||||
|
DI_ITEM_RELCENTER = 0x2000,
|
||||||
|
|
||||||
DI_SCREEN_AUTO = 0, // decide based on given offsets.
|
DI_SCREEN_AUTO = 0, // decide based on given offsets.
|
||||||
DI_SCREEN_MANUAL_ALIGN = 0x4000, // If this is on, the following flags will have an effect
|
DI_SCREEN_MANUAL_ALIGN = 0x4000, // If this is on, the following flags will have an effect
|
||||||
|
|
|
@ -346,8 +346,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Todo: These need rotation support which currently does not exist.
|
// Todo: These need rotation support which currently does not exist.
|
||||||
DrawGraphic(tileGetTexture(GUTMETER), 257, top + 24, DI_ITEM_BOTTOM, 1, -1, -1, scale, scale, 0xffffffff, 0 /*, p->drunkang * 360. / 2048 */ );
|
DrawGraphic(tileGetTexture(GUTMETER), 256, top + 15, DI_ITEM_RELCENTER, 1, -1, -1, scale, scale, 0xffffffff, 0, p->drunkang * (-360. / 2048));
|
||||||
DrawGraphic(tileGetTexture(GUTMETER), 293, top + 24, DI_ITEM_BOTTOM, 1, -1, -1, scale, scale, 0xffffffff, 0 /*, p->eatang * 360. / 2048 */);
|
DrawGraphic(tileGetTexture(GUTMETER), 292, top + 15, DI_ITEM_RELCENTER, 1, -1, -1, scale, scale, 0xffffffff, 0, p->eatang * (-360. / 2048));
|
||||||
|
|
||||||
if (p->drink_amt >= 0 && p->drink_amt <= 30)
|
if (p->drink_amt >= 0 && p->drink_amt <= 30)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue