diff --git a/binaries/data/mods/public/gui/session/minimap/MiniMap.xml b/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
index 2214f6ce17..1a834aee67 100644
--- a/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
+++ b/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
@@ -5,7 +5,7 @@
type="image"
>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/binaries/data/mods/public/gui/session/sprites.xml b/binaries/data/mods/public/gui/session/sprites.xml
index 2aebe621e5..c155a6f2fd 100644
--- a/binaries/data/mods/public/gui/session/sprites.xml
+++ b/binaries/data/mods/public/gui/session/sprites.xml
@@ -299,10 +299,6 @@
-
-
-
-
+void CollectVisibleObjectsRecursively(const std::vector& objects, Container* visibleObjects)
+{
+ for (IGUIObject* const& object : objects)
+ {
+ if (!object->IsHidden())
+ {
+ visibleObjects->emplace_back(VisibleObject{object, visibleObjects->size(), 0.0f});
+ CollectVisibleObjectsRecursively(object->GetChildren(), visibleObjects);
+ }
+ }
+}
+
+} // anonynous namespace
+
CGUI::CGUI(const shared_ptr& context)
: m_BaseObject(std::make_unique(*this)),
m_FocusedObject(nullptr),
m_InternalNameNumber(0),
m_MouseButtons(0)
{
- m_ScriptInterface.reset(new ScriptInterface("Engine", "GUIPage", context));
+ m_ScriptInterface = std::make_shared("Engine", "GUIPage", context);
m_ScriptInterface->SetCallbackData(this);
GuiScriptingInit(*m_ScriptInterface);
@@ -302,7 +331,22 @@ void CGUI::Draw()
// drawn on top of everything else
glClear(GL_DEPTH_BUFFER_BIT);
- m_BaseObject->RecurseObject(&IGUIObject::IsHidden, &IGUIObject::Draw);
+ using Arena = Allocators::DynamicArena<128 * KiB>;
+ using ObjectListAllocator = ProxyAllocator;
+ Arena arena;
+
+ std::vector visibleObjects((ObjectListAllocator(arena)));
+ CollectVisibleObjectsRecursively(m_BaseObject->GetChildren(), &visibleObjects);
+ for (VisibleObject& visibleObject : visibleObjects)
+ visibleObject.bufferedZ = visibleObject.object->GetBufferedZ();
+
+ std::sort(visibleObjects.begin(), visibleObjects.end(), [](const VisibleObject& visibleObject1, const VisibleObject& visibleObject2) -> bool {
+ if (visibleObject1.bufferedZ != visibleObject2.bufferedZ)
+ return visibleObject1.bufferedZ < visibleObject2.bufferedZ;
+ return visibleObject1.index < visibleObject2.index;
+ });
+ for (const VisibleObject& visibleObject : visibleObjects)
+ visibleObject.object->Draw();
}
void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, const float& Z, const CRect& Rect, const CRect& UNUSED(Clipping))
diff --git a/source/gui/GUIRenderer.cpp b/source/gui/GUIRenderer.cpp
index 22a274b0eb..9af3ff81f7 100644
--- a/source/gui/GUIRenderer.cpp
+++ b/source/gui/GUIRenderer.cpp
@@ -102,7 +102,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
SGUIImage* Image = new SGUIImage();
Image->m_TextureName = TextureName;
- // Allow grayscale images for disabled portraits
if (SpriteName.Find("grayscale:") != -1)
{
Image->m_Effects = std::make_shared();
@@ -118,13 +117,23 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
// TODO: Should check (nicely) that this is a valid file?
SGUIImage* Image = new SGUIImage();
+ const bool centered = SpriteName.Find("center:") != -1;
+
CStr info = SpriteName.AfterLast("cropped:").BeforeFirst(":");
double xRatio = info.BeforeFirst(",").ToDouble();
double yRatio = info.AfterLast(",").ToDouble();
- Image->m_TextureSize = CGUISize(CRect(0, 0, 0, 0), CRect(0, 0, 100/xRatio, 100/yRatio));
-
+ const CRect percentSize = centered
+ ? CRect(50 - 50 / xRatio, 50 - 50 / yRatio, 50 + 50 / xRatio, 50 + 50 / yRatio)
+ : CRect(0, 0, 100 / xRatio, 100 / yRatio);
+ Image->m_TextureSize = CGUISize(CRect(0, 0, 0, 0), percentSize);
Image->m_TextureName = TextureName;
+ if (SpriteName.Find("grayscale:") != -1)
+ {
+ Image->m_Effects = std::make_shared();
+ Image->m_Effects->m_Greyscale = true;
+ }
+
Sprite->AddImage(Image);
Sprites[SpriteName] = Sprite;
diff --git a/source/gui/ObjectTypes/CTooltip.cpp b/source/gui/ObjectTypes/CTooltip.cpp
index 6def14fd36..695e65ff06 100644
--- a/source/gui/ObjectTypes/CTooltip.cpp
+++ b/source/gui/ObjectTypes/CTooltip.cpp
@@ -147,8 +147,6 @@ void CTooltip::HandleMessage(SGUIMessage& Message)
void CTooltip::Draw()
{
- float z = 900.f; // TODO: Find a nicer way of putting the tooltip on top of everything else
-
// Normally IGUITextOwner will handle this updating but since SetupText can modify the position
// we need to call it now *before* we do the rest of the drawing
if (!m_GeneratedTextsValid)
@@ -157,7 +155,13 @@ void CTooltip::Draw()
m_GeneratedTextsValid = true;
}
+ const float z = GetBufferedZ();
m_pGUI.DrawSprite(m_Sprite, z, m_CachedActualSize);
-
DrawText(0, m_TextColor, m_CachedActualSize.TopLeft(), z + 0.1f);
}
+
+float CTooltip::GetBufferedZ() const
+{
+ // TODO: Find a nicer way of putting the tooltip on top of everything else.
+ return 900.f;
+}
diff --git a/source/gui/ObjectTypes/CTooltip.h b/source/gui/ObjectTypes/CTooltip.h
index 508f306f58..a272bbae3b 100644
--- a/source/gui/ObjectTypes/CTooltip.h
+++ b/source/gui/ObjectTypes/CTooltip.h
@@ -50,6 +50,8 @@ protected:
virtual void Draw();
+ virtual float GetBufferedZ() const;
+
// Settings
float m_BufferZone;
CGUIString m_Caption;