Add ability to flip fonticons either vertically and horizontally or both with the suffixes +h +v +hv
This commit is contained in:
parent
677ac700ca
commit
69352103b8
@ -134,17 +134,45 @@ namespace Components
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextRenderer::IsFontIcon(const char*& text, Game::Material*& fontIconMaterial)
|
bool TextRenderer::IsFontIcon(const char*& text, FontIconInfo& fontIcon)
|
||||||
{
|
{
|
||||||
const auto* curPos = text;
|
const auto* curPos = text;
|
||||||
|
|
||||||
while (*curPos != ' ' && *curPos != ':' && *curPos != 0)
|
while (*curPos != ' ' && *curPos != ':' && *curPos != 0 && *curPos != '+')
|
||||||
curPos++;
|
curPos++;
|
||||||
|
|
||||||
|
const auto* nameEnd = curPos;
|
||||||
|
|
||||||
|
if(*curPos == '+')
|
||||||
|
{
|
||||||
|
auto breakArgs = false;
|
||||||
|
while(!breakArgs)
|
||||||
|
{
|
||||||
|
curPos++;
|
||||||
|
switch(*curPos)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
fontIcon.flipHorizontal = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'v':
|
||||||
|
fontIcon.flipVertical = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ':':
|
||||||
|
breakArgs = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (*curPos != ':')
|
if (*curPos != ':')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const std::string fontIconName(text, curPos - text);
|
const std::string fontIconName(text, nameEnd - text);
|
||||||
|
|
||||||
auto* materialEntry = Game::DB_FindXAssetEntry(Game::XAssetType::ASSET_TYPE_MATERIAL, fontIconName.data());
|
auto* materialEntry = Game::DB_FindXAssetEntry(Game::XAssetType::ASSET_TYPE_MATERIAL, fontIconName.data());
|
||||||
if (materialEntry == nullptr)
|
if (materialEntry == nullptr)
|
||||||
@ -154,21 +182,43 @@ namespace Components
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
text = curPos + 1;
|
text = curPos + 1;
|
||||||
fontIconMaterial = material;
|
fontIcon.material = material;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
float TextRenderer::DrawFontIcon(Game::Material* fontIconMaterial, const float x, const float y, const float sinAngle, const float cosAngle, const Game::Font_s* font, const float xScale, const float yScale, const unsigned color)
|
float TextRenderer::DrawFontIcon(const FontIconInfo& fontIcon, const float x, const float y, const float sinAngle, const float cosAngle, const Game::Font_s* font, const float xScale, const float yScale, const unsigned color)
|
||||||
{
|
{
|
||||||
const auto* colorMap = GetFontIconColorMap(fontIconMaterial);
|
const auto* colorMap = GetFontIconColorMap(fontIcon.material);
|
||||||
if (colorMap == nullptr)
|
if (colorMap == nullptr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
float s0, t0, s1, t1;
|
||||||
|
if(fontIcon.flipHorizontal)
|
||||||
|
{
|
||||||
|
s0 = 1.0f;
|
||||||
|
s1 = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s0 = 0.0f;
|
||||||
|
s1 = 1.0f;
|
||||||
|
}
|
||||||
|
if(fontIcon.flipVertical)
|
||||||
|
{
|
||||||
|
t0 = 1.0f;
|
||||||
|
t1 = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t0 = 0.0f;
|
||||||
|
t1 = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
const auto h = static_cast<float>(font->pixelHeight) * yScale;
|
const auto h = static_cast<float>(font->pixelHeight) * yScale;
|
||||||
const auto w = static_cast<float>(font->pixelHeight) * (static_cast<float>(colorMap->width) / static_cast<float>(colorMap->height)) * xScale;
|
const auto w = static_cast<float>(font->pixelHeight) * (static_cast<float>(colorMap->width) / static_cast<float>(colorMap->height)) * xScale;
|
||||||
|
|
||||||
const auto yy = y - (h + yScale * static_cast<float>(font->pixelHeight)) * 0.5f;
|
const auto yy = y - (h + yScale * static_cast<float>(font->pixelHeight)) * 0.5f;
|
||||||
Game::RB_DrawStretchPicRotate(fontIconMaterial, x, yy, w, h, 0.0, 0.0, 1.0, 1.0, sinAngle, cosAngle, color);
|
Game::RB_DrawStretchPicRotate(fontIcon.material, x, yy, w, h, s0, t0, s1, t1, sinAngle, cosAngle, color);
|
||||||
|
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
@ -356,11 +406,11 @@ namespace Components
|
|||||||
|
|
||||||
if(letter == ':')
|
if(letter == ':')
|
||||||
{
|
{
|
||||||
Game::Material* fontIconMaterial;
|
FontIconInfo fontIconInfo{};
|
||||||
if(IsFontIcon(curText, fontIconMaterial))
|
if(IsFontIcon(curText, fontIconInfo))
|
||||||
{
|
{
|
||||||
RotateXY(cosAngle, sinAngle, startX, startY, xa, xy, &xRot, &yRot);
|
RotateXY(cosAngle, sinAngle, startX, startY, xa, xy, &xRot, &yRot);
|
||||||
xa += DrawFontIcon(fontIconMaterial, xRot, yRot, sinAngle, cosAngle, font, xScale, yScale, ColorRgba(255, 255, 255, finalColor.array[3]));
|
xa += DrawFontIcon(fontIconInfo, xRot, yRot, sinAngle, cosAngle, font, xScale, yScale, ColorRgba(255, 255, 255, finalColor.array[3]));
|
||||||
|
|
||||||
if (renderFlags & Game::TEXT_RENDERFLAG_PADDING)
|
if (renderFlags & Game::TEXT_RENDERFLAG_PADDING)
|
||||||
xa += xScale * padding;
|
xa += xScale * padding;
|
||||||
|
@ -42,6 +42,13 @@ namespace Components
|
|||||||
|
|
||||||
class TextRenderer : public Component
|
class TextRenderer : public Component
|
||||||
{
|
{
|
||||||
|
struct FontIconInfo
|
||||||
|
{
|
||||||
|
Game::Material* material;
|
||||||
|
bool flipHorizontal;
|
||||||
|
bool flipVertical;
|
||||||
|
};
|
||||||
|
|
||||||
struct HsvColor
|
struct HsvColor
|
||||||
{
|
{
|
||||||
unsigned char h;
|
unsigned char h;
|
||||||
@ -74,12 +81,11 @@ namespace Components
|
|||||||
TextRenderer();
|
TextRenderer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
static unsigned HsvToRgb(HsvColor hsv);
|
static unsigned HsvToRgb(HsvColor hsv);
|
||||||
|
|
||||||
static Game::GfxImage* GetFontIconColorMap(Game::Material* fontIconMaterial);
|
static Game::GfxImage* GetFontIconColorMap(Game::Material* fontIconMaterial);
|
||||||
static bool IsFontIcon(const char*& text, Game::Material*& fontIconMaterial);
|
static bool IsFontIcon(const char*& text, FontIconInfo& fontIcon);
|
||||||
static float DrawFontIcon(Game::Material* fontIconMaterial, float x, float y, float sinAngle, float cosAngle, const Game::Font_s* font, float xScale, float yScale, unsigned color);
|
static float DrawFontIcon(const FontIconInfo& fontIcon, float x, float y, float sinAngle, float cosAngle, const Game::Font_s* font, float xScale, float yScale, unsigned color);
|
||||||
|
|
||||||
static float GetMonospaceWidth(Game::Font_s* font, int rendererFlags);
|
static float GetMonospaceWidth(Game::Font_s* font, int rendererFlags);
|
||||||
static void GlowColor(Game::GfxColor* result, Game::GfxColor baseColor, Game::GfxColor forcedGlowColor, int renderFlags);
|
static void GlowColor(Game::GfxColor* result, Game::GfxColor baseColor, Game::GfxColor forcedGlowColor, int renderFlags);
|
||||||
|
Loading…
Reference in New Issue
Block a user