Index: ps/trunk/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
+++ ps/trunk/binaries/data/mods/public/gui/session/minimap/MiniMap.xml
@@ -5,7 +5,7 @@
type="image"
>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: ps/trunk/binaries/data/mods/public/gui/session/sprites.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/session/sprites.xml
+++ ps/trunk/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 @@
// 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))
Index: ps/trunk/source/gui/GUIRenderer.cpp
===================================================================
--- ps/trunk/source/gui/GUIRenderer.cpp
+++ ps/trunk/source/gui/GUIRenderer.cpp
@@ -102,7 +102,6 @@
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 @@
// 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;
Index: ps/trunk/source/gui/ObjectTypes/CTooltip.h
===================================================================
--- ps/trunk/source/gui/ObjectTypes/CTooltip.h
+++ ps/trunk/source/gui/ObjectTypes/CTooltip.h
@@ -50,6 +50,8 @@
virtual void Draw();
+ virtual float GetBufferedZ() const;
+
// Settings
float m_BufferZone;
CGUIString m_Caption;
Index: ps/trunk/source/gui/ObjectTypes/CTooltip.cpp
===================================================================
--- ps/trunk/source/gui/ObjectTypes/CTooltip.cpp
+++ ps/trunk/source/gui/ObjectTypes/CTooltip.cpp
@@ -147,8 +147,6 @@
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 @@
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;
+}