From 98c7c61cbd681d0aa895a0781095b0400cf57513 Mon Sep 17 00:00:00 2001 From: Hrusteckiy Date: Wed, 5 Jun 2024 16:07:06 +0300 Subject: [PATCH] Restored mirroring of texture feature for `CUIStatic` Using: in node of element based on `CUIStatic` class type `mirror="b"`, `b` is one of mirroring modes. `b` - both, mirror by vertical and horizontal; `v` - vertical, mirror by vertical; `h` - horizontal, mirror by horizontal. --- src/xrUICore/Static/UIStaticItem.cpp | 13 +++++++++++++ src/xrUICore/Static/UIStaticItem.h | 12 ++++++++++++ src/xrUICore/XML/UIXmlInitBase.cpp | 8 ++++++++ 3 files changed, 33 insertions(+) diff --git a/src/xrUICore/Static/UIStaticItem.cpp b/src/xrUICore/Static/UIStaticItem.cpp index 1cbe4a64c32..e6a5d600c3c 100644 --- a/src/xrUICore/Static/UIStaticItem.cpp +++ b/src/xrUICore/Static/UIStaticItem.cpp @@ -6,6 +6,7 @@ CUIStaticItem::CUIStaticItem() uFlags.zero(); vSize.set(0, 0); TextureRect.set(0, 0, 0, 0); + eMirrorMode = tmNone; vHeadingPivot.set(0, 0); vHeadingOffset.set(0, 0); dwColor = 0xffffffff; @@ -56,6 +57,12 @@ void CUIStaticItem::RenderInternal(const Fvector2& in_pos) LTt.set(TextureRect.x1 / ts.x, TextureRect.y1 / ts.y); RBt.set(TextureRect.x2 / ts.x, TextureRect.y2 / ts.y); + // Check mirror mode + if (tmMirrorHorisontal == eMirrorMode || tmMirrorBoth == eMirrorMode) + std::swap(LTt.x, RBt.x); + if (tmMirrorVertical == eMirrorMode || tmMirrorBoth == eMirrorMode) + std::swap(LTt.y, RBt.y); + float offset = -0.5f; if (UI().m_currentPointType == IUIRender::pttLIT) offset = 0.0f; @@ -131,6 +138,12 @@ void CUIStaticItem::RenderInternal(float angle) LTt.set(TextureRect.x1 / ts.x + hp.x, TextureRect.y1 / ts.y + hp.y); RBt.set(TextureRect.x2 / ts.x + hp.x, TextureRect.y2 / ts.y + hp.y); + // Check mirror mode + if (tmMirrorHorisontal == eMirrorMode || tmMirrorBoth == eMirrorMode) + std::swap(LTt.x, RBt.x); + if (tmMirrorVertical == eMirrorMode || tmMirrorBoth == eMirrorMode) + std::swap(LTt.y, RBt.y); + float kx = UI().get_current_kx(); // clip poly diff --git a/src/xrUICore/Static/UIStaticItem.h b/src/xrUICore/Static/UIStaticItem.h index f50801a52ed..3144db10d32 100644 --- a/src/xrUICore/Static/UIStaticItem.h +++ b/src/xrUICore/Static/UIStaticItem.h @@ -6,6 +6,14 @@ #include "xrCore/xrstring.h" #endif +enum EUIMirroring +{ + tmNone, + tmMirrorHorisontal, + tmMirrorVertical, + tmMirrorBoth +}; + class XRUICORE_API CUIStaticItem { protected: @@ -22,6 +30,7 @@ class XRUICORE_API CUIStaticItem Fvector2 vHeadingPivot; Fvector2 vHeadingOffset; Flags8 uFlags; + EUIMirroring eMirrorMode; ui_shader hShader; Fvector2 vPos; @@ -65,6 +74,9 @@ class XRUICORE_API CUIStaticItem void ResetHeadingPivot(); IC bool GetFixedLTWhileHeading() const { return !!uFlags.test(flFixedLTWhileHeading); } Fvector2 GetHeadingPivot() { return vHeadingPivot; } + IC void SetMirrorMode(EUIMirroring m) { eMirrorMode = m; } + IC EUIMirroring GetMirrorMode() { return eMirrorMode; } + private: void RenderInternal(const Fvector2& pos); void RenderInternal(float angle); diff --git a/src/xrUICore/XML/UIXmlInitBase.cpp b/src/xrUICore/XML/UIXmlInitBase.cpp index 371d56845fe..997c29dfaea 100644 --- a/src/xrUICore/XML/UIXmlInitBase.cpp +++ b/src/xrUICore/XML/UIXmlInitBase.cpp @@ -143,6 +143,14 @@ bool CUIXmlInitBase::InitStatic(CUIXml& xml_doc, pcstr path, int index, CUIStati InitTexture(xml_doc, path, index, pWnd); InitTextureOffset(xml_doc, path, index, pWnd); + shared_str mirroring = xml_doc.ReadAttrib(path, index, "mirror", ""); + if (0 == xr_strcmp(mirroring, "h")) + pWnd->GetStaticItem()->SetMirrorMode(tmMirrorHorisontal); + else if (0 == xr_strcmp(mirroring, "v")) + pWnd->GetStaticItem()->SetMirrorMode(tmMirrorVertical); + else if (0 == xr_strcmp(mirroring, "b")) + pWnd->GetStaticItem()->SetMirrorMode(tmMirrorBoth); + const int flag = xml_doc.ReadAttribInt(path, index, "heading", 0); pWnd->EnableHeading((flag) ? true : false);