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" > - + + + + + + + + + + + + + + + + + + + + + @@ -81,7 +101,7 @@ - + Rank @@ -93,28 +113,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - 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; +}