diff --git a/source/graphics/Canvas2D.cpp b/source/graphics/Canvas2D.cpp index d7f1149a81..fd95e3bb78 100644 --- a/source/graphics/Canvas2D.cpp +++ b/source/graphics/Canvas2D.cpp @@ -85,7 +85,7 @@ void CCanvas2D::DrawRect(const CRect& rect, const CColor& color) tech->BeginPass(); CShaderProgramPtr shader = tech->GetShader(); - shader->BindTexture(str_tex, g_Renderer.GetTextureManager().GetWhiteTexture()); + shader->BindTexture(str_tex, g_Renderer.GetTextureManager().GetTransparentTexture()); shader->Uniform(str_transform, GetDefaultGuiMatrix()); shader->Uniform(str_colorAdd, color); shader->Uniform(str_colorMul, CColor(0.0f, 0.0f, 0.0f, 0.0f)); diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index a9efc2b91c..161ac008f4 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -350,7 +350,7 @@ void CGUI::Draw() visibleObject.object->Draw(canvas); } -void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const CRect& UNUSED(Clipping)) +void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, CCanvas2D& canvas, const CRect& Rect, const CRect& UNUSED(Clipping)) { // If the sprite doesn't exist (name == ""), don't bother drawing anything if (!Sprite) @@ -358,7 +358,7 @@ void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const // TODO: Clipping? - Sprite.Draw(*this, Rect, m_Sprites); + Sprite.Draw(*this, canvas, Rect, m_Sprites); } void CGUI::UpdateResolution() diff --git a/source/gui/CGUI.h b/source/gui/CGUI.h index 31bbbe28ae..1bbb3909f4 100644 --- a/source/gui/CGUI.h +++ b/source/gui/CGUI.h @@ -41,6 +41,7 @@ extern const double SELECT_DBLCLICK_RATE; +class CCanvas2D; class CGUISpriteInstance; class CGUISprite; class IGUIObject; @@ -102,10 +103,11 @@ public: * * @param Sprite Object referring to the sprite (which also caches * calculations for faster rendering) + * @param Canvas Canvas to draw on * @param Rect Position and Size * @param Clipping The sprite shouldn't be drawn outside this rectangle */ - void DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const CRect& Clipping = CRect()); + void DrawSprite(const CGUISpriteInstance& Sprite, CCanvas2D& canvas, const CRect& Rect, const CRect& Clipping = CRect()); /** * The replacement of Process(), handles an SDL_Event_ diff --git a/source/gui/CGUIScrollBarVertical.cpp b/source/gui/CGUIScrollBarVertical.cpp index 38494ade9d..2a3ac5e93d 100644 --- a/source/gui/CGUIScrollBarVertical.cpp +++ b/source/gui/CGUIScrollBarVertical.cpp @@ -47,7 +47,7 @@ void CGUIScrollBarVertical::SetPosFromMousePos(const CVector2D& mouse) m_Pos = m_PosWhenPressed + GetMaxPos() * (mouse.Y - m_BarPressedAtPos.Y) / emptyBackground; } -void CGUIScrollBarVertical::Draw() +void CGUIScrollBarVertical::Draw(CCanvas2D& canvas) { if (!GetStyle()) { @@ -61,6 +61,7 @@ void CGUIScrollBarVertical::Draw() m_pGUI.DrawSprite( GetStyle()->m_SpriteBackVertical, + canvas, CRect( outline.left, outline.top + (GetStyle()->m_UseEdgeButtons ? GetStyle()->m_Width : 0), @@ -96,6 +97,7 @@ void CGUIScrollBarVertical::Draw() m_pGUI.DrawSprite( *button_top, + canvas, CRect( outline.left, outline.top, @@ -106,6 +108,7 @@ void CGUIScrollBarVertical::Draw() m_pGUI.DrawSprite( *button_bottom, + canvas, CRect( outline.left, outline.bottom-GetStyle()->m_Width, @@ -117,6 +120,7 @@ void CGUIScrollBarVertical::Draw() m_pGUI.DrawSprite( GetStyle()->m_SpriteBarVertical, + canvas, GetBarRect() ); } diff --git a/source/gui/CGUIScrollBarVertical.h b/source/gui/CGUIScrollBarVertical.h index c1ab1c63e9..6926a6fd7b 100644 --- a/source/gui/CGUIScrollBarVertical.h +++ b/source/gui/CGUIScrollBarVertical.h @@ -41,7 +41,7 @@ public: /** * Draw the scroll-bar */ - virtual void Draw(); + virtual void Draw(CCanvas2D& canvas); /** * If an object that contains a scrollbar has got messages, send diff --git a/source/gui/CGUISprite.cpp b/source/gui/CGUISprite.cpp index bbb5ac32e3..ad7c3398a1 100644 --- a/source/gui/CGUISprite.cpp +++ b/source/gui/CGUISprite.cpp @@ -30,14 +30,14 @@ void CGUISprite::AddImage(SGUIImage* image) m_Images.push_back(image); } -void CGUISpriteInstance::Draw(CGUI& pGUI, const CRect& Size, std::map& Sprites) const +void CGUISpriteInstance::Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map& Sprites) const { if (m_CachedSize != Size) { GUIRenderer::UpdateDrawCallCache(pGUI, m_DrawCallCache, m_SpriteName, Size, Sprites); m_CachedSize = Size; } - GUIRenderer::Draw(m_DrawCallCache); + GUIRenderer::Draw(m_DrawCallCache, canvas); } // Plus a load of constructors / assignment operators, which don't copy the diff --git a/source/gui/CGUISprite.h b/source/gui/CGUISprite.h index e9e75bf445..9f6fc70d4c 100644 --- a/source/gui/CGUISprite.h +++ b/source/gui/CGUISprite.h @@ -34,6 +34,8 @@ #include #include +class CCanvas2D; + struct SGUIImageEffects { SGUIImageEffects() : m_Greyscale(false) {} @@ -137,7 +139,7 @@ public: CGUISpriteInstance(); CGUISpriteInstance(const CStr& SpriteName); - void Draw(CGUI& pGUI, const CRect& Size, std::map& Sprites) const; + void Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map& Sprites) const; /** * Whether this Sprite has no texture name set. diff --git a/source/gui/CGUIText.cpp b/source/gui/CGUIText.cpp index af25670aa9..83069afce2 100644 --- a/source/gui/CGUIText.cpp +++ b/source/gui/CGUIText.cpp @@ -428,7 +428,7 @@ bool CGUIText::AssembleCalls( return done; } -void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const +void CGUIText::Draw(CGUI& pGUI, CCanvas2D& canvas, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const { CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text); @@ -469,7 +469,7 @@ void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& textRenderer.Render(); for (const SSpriteCall& sc : m_SpriteCalls) - pGUI.DrawSprite(sc.m_Sprite, sc.m_Area + pos); + pGUI.DrawSprite(sc.m_Sprite, canvas, sc.m_Area + pos); if (isClipped) glDisable(GL_SCISSOR_TEST); diff --git a/source/gui/CGUIText.h b/source/gui/CGUIText.h index c22aca4dc1..0489fb8b50 100644 --- a/source/gui/CGUIText.h +++ b/source/gui/CGUIText.h @@ -30,6 +30,7 @@ #include #include +class CCanvas2D; class CGUI; class CGUIString; class IGUIObject; @@ -168,7 +169,7 @@ public: /** * Draw this CGUIText object */ - void Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const; + void Draw(CGUI& pGUI, CCanvas2D& canvas, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const; const CSize2D& GetSize() const { return m_Size; } diff --git a/source/gui/GUIRenderer.cpp b/source/gui/GUIRenderer.cpp index dc0ee9889d..f42b301fda 100644 --- a/source/gui/GUIRenderer.cpp +++ b/source/gui/GUIRenderer.cpp @@ -19,6 +19,7 @@ #include "GUIRenderer.h" +#include "graphics/Canvas2D.h" #include "graphics/ShaderManager.h" #include "graphics/TextureManager.h" #include "gui/CGUI.h" @@ -110,7 +111,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const } Sprite->AddImage(Image); - Sprites[SpriteName] = Sprite; } else if (SpriteName.Find("cropped:") != -1) @@ -136,7 +136,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const } Sprite->AddImage(Image); - Sprites[SpriteName] = Sprite; } if (SpriteName.Find("color:") != -1) @@ -166,7 +165,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const } Sprite->AddImage(Image); - Sprites[SpriteName] = Sprite; } it = Sprites.find(SpriteName); @@ -232,12 +230,14 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const if (!Call.m_HasTexture) { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid); + Call.m_Material = str_gui_solid; } else if ((*cit)->m_Effects) { if ((*cit)->m_Effects->m_AddColor != CGUIColor()) { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add); + Call.m_Material = str_gui_add; Call.m_ShaderColorParameter = (*cit)->m_Effects->m_AddColor; // Always enable blending if something's being subtracted from // the alpha channel @@ -247,21 +247,25 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const else if ((*cit)->m_Effects->m_Greyscale) { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_grayscale); + Call.m_Material = str_gui_grayscale; } else if ((*cit)->m_Effects->m_SolidColor != CGUIColor()) { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid_mask); + Call.m_Material = str_gui_solid_mask; Call.m_ShaderColorParameter = (*cit)->m_Effects->m_SolidColor; Call.m_EnableBlending = !(fabs((*cit)->m_Effects->m_SolidColor.a - 1.0f) < 0.0000001f); } else /* Slight confusion - why no effects? */ { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic); + Call.m_Material = str_gui_basic; } } else { Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic); + Call.m_Material = str_gui_basic; } Calls.push_back(Call); @@ -291,9 +295,7 @@ CRect SDrawCall::ComputeTexCoords() const // "real_texture_placement" overrides everything if (m_Image->m_TexturePlacementInFile != CRect()) - { BlockTex = m_Image->m_TexturePlacementInFile; - } // Use the whole texture else BlockTex = CRect(0, 0, TexWidth, TexHeight); @@ -327,7 +329,7 @@ CRect SDrawCall::ComputeTexCoords() const return TexCoords; } -void GUIRenderer::Draw(DrawCalls& Calls) +void GUIRenderer::Draw(DrawCalls& Calls, CCanvas2D& canvas) { if (Calls.empty()) return; @@ -344,12 +346,12 @@ void GUIRenderer::Draw(DrawCalls& Calls) // Iterate through each DrawCall, and execute whatever drawing code is being called for (DrawCalls::const_iterator cit = Calls.begin(); cit != Calls.end(); ++cit) { - cit->m_Shader->BeginPass(); - CShaderProgramPtr shader = cit->m_Shader->GetShader(); - shader->Uniform(str_transform, matrix); - if (cit->m_HasTexture) { + cit->m_Shader->BeginPass(); + CShaderProgramPtr shader = cit->m_Shader->GetShader(); + shader->Uniform(str_transform, matrix); + shader->Uniform(str_color, cit->m_ShaderColorParameter); shader->BindTexture(str_tex, cit->m_Texture); @@ -390,39 +392,24 @@ void GUIRenderer::Draw(DrawCalls& Calls) if (needsBlend) glDisable(GL_BLEND); + + cit->m_Shader->EndPass(); } else { - shader->Uniform(str_color, *cit->m_BackColor); - if (cit->m_EnableBlending) glEnable(GL_BLEND); // Ensure the quad has the correct winding order - CRect Verts = cit->m_Vertices; - if (Verts.right < Verts.left) - std::swap(Verts.right, Verts.left); - if (Verts.bottom < Verts.top) - std::swap(Verts.bottom, Verts.top); - - std::vector data; -#define ADD(x, y, z) STMT(data.push_back(x); data.push_back(y); data.push_back(z)) - ADD(Verts.left, Verts.bottom, 0.0f); - ADD(Verts.right, Verts.bottom, 0.0f); - ADD(Verts.right, Verts.top, 0.0f); - - ADD(Verts.right, Verts.top, 0.0f); - ADD(Verts.left, Verts.top, 0.0f); - ADD(Verts.left, Verts.bottom, 0.0f); - - shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]); - glDrawArrays(GL_TRIANGLES, 0, 6); + CRect rect = cit->m_Vertices; + if (rect.right < rect.left) + std::swap(rect.right, rect.left); + if (rect.bottom < rect.top) + std::swap(rect.bottom, rect.top); + canvas.DrawRect(rect, *(cit->m_BackColor)); if (cit->m_EnableBlending) glDisable(GL_BLEND); -#undef ADD } - - cit->m_Shader->EndPass(); } } diff --git a/source/gui/GUIRenderer.h b/source/gui/GUIRenderer.h index fe19814198..5526be9361 100644 --- a/source/gui/GUIRenderer.h +++ b/source/gui/GUIRenderer.h @@ -23,10 +23,12 @@ #include "graphics/Texture.h" #include "lib/res/handle.h" #include "maths/Rect.h" +#include "ps/CStrIntern.h" #include #include +class CCanvas2D; class CGUI; class CGUISprite; class CStr8; @@ -55,6 +57,9 @@ namespace GUIRenderer CRect m_Vertices; CGUIColor* m_BackColor; + + // Temporary type to make a soft transition to canvas rendering. + CStrIntern m_Material; }; class DrawCalls : public std::vector @@ -68,7 +73,7 @@ namespace GUIRenderer void UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr8& SpriteName, const CRect& Size, std::map& Sprites); - void Draw(DrawCalls& Calls); + void Draw(DrawCalls& Calls, CCanvas2D& canvas); } #endif // INCLUDED_GUIRENDERER diff --git a/source/gui/IGUIScrollBar.h b/source/gui/IGUIScrollBar.h index 023c516b5e..b4eb218ab5 100644 --- a/source/gui/IGUIScrollBar.h +++ b/source/gui/IGUIScrollBar.h @@ -28,6 +28,7 @@ #include "maths/Vector2D.h" #include "ps/CStr.h" +class CCanvas2D; class CGUI; class IGUIScrollBarOwner; struct SGUIMessage; @@ -162,7 +163,7 @@ public: /** * Draw the scroll-bar */ - virtual void Draw() = 0; + virtual void Draw(CCanvas2D& canvas) = 0; /** * If an object that contains a scrollbar has got messages, send diff --git a/source/gui/ObjectBases/IGUIScrollBarOwner.cpp b/source/gui/ObjectBases/IGUIScrollBarOwner.cpp index 3447759337..dd0eee1c17 100644 --- a/source/gui/ObjectBases/IGUIScrollBarOwner.cpp +++ b/source/gui/ObjectBases/IGUIScrollBarOwner.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -57,10 +57,10 @@ void IGUIScrollBarOwner::HandleMessage(SGUIMessage& msg) sb->HandleMessage(msg); } -void IGUIScrollBarOwner::Draw() +void IGUIScrollBarOwner::Draw(CCanvas2D& canvas) { for (IGUIScrollBar* const& sb : m_ScrollBars) - sb->Draw(); + sb->Draw(canvas); } float IGUIScrollBarOwner::GetScrollBarPos(const int index) const diff --git a/source/gui/ObjectBases/IGUIScrollBarOwner.h b/source/gui/ObjectBases/IGUIScrollBarOwner.h index c5f12d8f2b..7761fc19a6 100644 --- a/source/gui/ObjectBases/IGUIScrollBarOwner.h +++ b/source/gui/ObjectBases/IGUIScrollBarOwner.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -20,6 +20,7 @@ #include +class CCanvas2D; class CStr8; struct SGUIMessage; struct SGUIScrollBarStyle; @@ -40,7 +41,7 @@ public: IGUIScrollBarOwner(IGUIObject& m_pObject); virtual ~IGUIScrollBarOwner(); - virtual void Draw(); + virtual void Draw(CCanvas2D& canvas); /** * @see IGUIObject#HandleMessage() diff --git a/source/gui/ObjectBases/IGUITextOwner.cpp b/source/gui/ObjectBases/IGUITextOwner.cpp index 6381dca61e..34f0bff3c9 100644 --- a/source/gui/ObjectBases/IGUITextOwner.cpp +++ b/source/gui/ObjectBases/IGUITextOwner.cpp @@ -91,13 +91,13 @@ void IGUITextOwner::UpdateText() } } -void IGUITextOwner::DrawText(size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping) +void IGUITextOwner::DrawText(CCanvas2D& canvas, size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping) { UpdateText(); ENSURE(index < m_GeneratedTexts.size() && "Trying to draw a Text Index within a IGUITextOwner that doesn't exist"); - m_GeneratedTexts.at(index).Draw(m_pObject.GetGUI(), color, pos, clipping); + m_GeneratedTexts.at(index).Draw(m_pObject.GetGUI(), canvas, color, pos, clipping); } void IGUITextOwner::CalculateTextPosition(CRect& ObjSize, CVector2D& TextPos, CGUIText& Text) diff --git a/source/gui/ObjectBases/IGUITextOwner.h b/source/gui/ObjectBases/IGUITextOwner.h index 88eb00e184..1b75336cea 100644 --- a/source/gui/ObjectBases/IGUITextOwner.h +++ b/source/gui/ObjectBases/IGUITextOwner.h @@ -36,6 +36,7 @@ GUI Object Base - Text Owner #include +class CCanvas2D; struct CGUIColor; struct SGUIMessage; class CGUIText; @@ -79,13 +80,14 @@ public: /** * Draws the Text. * + * @param canvas Canvas to draw on. * @param index Index value of text. Mostly this will be 0 * @param color * @param pos Position * @param clipping Clipping rectangle, don't even add a parameter * to get no clipping. */ - virtual void DrawText(size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping = CRect()); + virtual void DrawText(CCanvas2D& canvas, size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping = CRect()); protected: /** diff --git a/source/gui/ObjectTypes/CButton.cpp b/source/gui/ObjectTypes/CButton.cpp index fdd8d99b59..8826c4d820 100644 --- a/source/gui/ObjectTypes/CButton.cpp +++ b/source/gui/ObjectTypes/CButton.cpp @@ -80,13 +80,14 @@ void CButton::HandleMessage(SGUIMessage& Message) IGUITextOwner::HandleMessage(Message); } -void CButton::Draw(CCanvas2D& UNUSED(canvas)) +void CButton::Draw(CCanvas2D& canvas) { m_pGUI.DrawSprite( GetButtonSprite(m_Sprite, m_SpriteOver, m_SpritePressed, m_SpriteDisabled), + canvas, m_CachedActualSize); - DrawText(0, ChooseColor(), m_TextPos); + DrawText(canvas, 0, ChooseColor(), m_TextPos); } bool CButton::IsMouseOver() const diff --git a/source/gui/ObjectTypes/CChart.cpp b/source/gui/ObjectTypes/CChart.cpp index 34538aa18a..03f48d70d6 100644 --- a/source/gui/ObjectTypes/CChart.cpp +++ b/source/gui/ObjectTypes/CChart.cpp @@ -143,7 +143,7 @@ void CChart::Draw(CCanvas2D& canvas) tech->EndPass(); for (size_t i = 0; i < m_TextPositions.size(); ++i) - DrawText(i, CGUIColor(1.f, 1.f, 1.f, 1.f), m_TextPositions[i]); + DrawText(canvas, i, CGUIColor(1.f, 1.f, 1.f, 1.f), m_TextPositions[i]); } CRect CChart::GetChartRect() const diff --git a/source/gui/ObjectTypes/CCheckBox.cpp b/source/gui/ObjectTypes/CCheckBox.cpp index 0867112b50..55727c1f34 100644 --- a/source/gui/ObjectTypes/CCheckBox.cpp +++ b/source/gui/ObjectTypes/CCheckBox.cpp @@ -64,11 +64,12 @@ void CCheckBox::HandleMessage(SGUIMessage& Message) } } -void CCheckBox::Draw(CCanvas2D& UNUSED(canvas)) +void CCheckBox::Draw(CCanvas2D& canvas) { m_pGUI.DrawSprite( m_Checked ? GetButtonSprite(m_SpriteChecked, m_SpriteCheckedOver, m_SpriteCheckedPressed, m_SpriteCheckedDisabled) : GetButtonSprite(m_SpriteUnchecked, m_SpriteUncheckedOver, m_SpriteUncheckedPressed, m_SpriteUncheckedDisabled), + canvas, m_CachedActualSize); } diff --git a/source/gui/ObjectTypes/CDropDown.cpp b/source/gui/ObjectTypes/CDropDown.cpp index a7861d86bd..1e3317c6e0 100644 --- a/source/gui/ObjectTypes/CDropDown.cpp +++ b/source/gui/ObjectTypes/CDropDown.cpp @@ -420,12 +420,12 @@ bool CDropDown::IsMouseOver() const return m_CachedActualSize.PointInside(m_pGUI.GetMousePos()); } -void CDropDown::Draw(CCanvas2D& UNUSED(canvas)) +void CDropDown::Draw(CCanvas2D& canvas) { const CGUISpriteInstance& sprite = m_Enabled ? m_Sprite : m_SpriteDisabled; const CGUISpriteInstance& spriteOverlay = m_Enabled ? m_SpriteOverlay : m_SpriteOverlayDisabled; - m_pGUI.DrawSprite(sprite, m_CachedActualSize); + m_pGUI.DrawSprite(sprite, canvas, m_CachedActualSize); if (m_ButtonWidth > 0.f) { @@ -434,18 +434,18 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas)) if (!m_Enabled) { - m_pGUI.DrawSprite(*m_Sprite2Disabled ? m_Sprite2Disabled : m_Sprite2, rect); + m_pGUI.DrawSprite(*m_Sprite2Disabled ? m_Sprite2Disabled : m_Sprite2, canvas, rect); } else if (m_Open) { - m_pGUI.DrawSprite(*m_Sprite2Pressed ? m_Sprite2Pressed : m_Sprite2, rect); + m_pGUI.DrawSprite(*m_Sprite2Pressed ? m_Sprite2Pressed : m_Sprite2, canvas, rect); } else if (m_MouseHovering) { - m_pGUI.DrawSprite(*m_Sprite2Over ? m_Sprite2Over : m_Sprite2, rect); + m_pGUI.DrawSprite(*m_Sprite2Over ? m_Sprite2Over : m_Sprite2, canvas, rect); } else - m_pGUI.DrawSprite(m_Sprite2, rect); + m_pGUI.DrawSprite(m_Sprite2, canvas, rect); } if (m_Selected != -1) // TODO: Maybe check validity completely? @@ -454,7 +454,7 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas)) m_CachedActualSize.right - m_ButtonWidth, m_CachedActualSize.bottom); CVector2D pos(m_CachedActualSize.left, m_CachedActualSize.top); - DrawText(m_Selected, m_Enabled ? m_TextColorSelected : m_TextColorDisabled, pos, cliparea); + DrawText(canvas, m_Selected, m_Enabled ? m_TextColorSelected : m_TextColorDisabled, pos, cliparea); } if (m_Open) @@ -466,12 +466,12 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas)) if (m_HideScrollBar) m_ScrollBar.Set(false, false); - DrawList(m_ElementHighlight, m_SpriteList, m_SpriteListOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor); + DrawList(canvas, m_ElementHighlight, m_SpriteList, m_SpriteListOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor); if (m_HideScrollBar) m_ScrollBar.Set(old, false); } - m_pGUI.DrawSprite(spriteOverlay, m_CachedActualSize); + m_pGUI.DrawSprite(spriteOverlay, canvas, m_CachedActualSize); } // When a dropdown list is opened, it needs to be visible above all the other diff --git a/source/gui/ObjectTypes/CImage.cpp b/source/gui/ObjectTypes/CImage.cpp index 5fd54ed1c6..3c2f941116 100644 --- a/source/gui/ObjectTypes/CImage.cpp +++ b/source/gui/ObjectTypes/CImage.cpp @@ -31,7 +31,7 @@ CImage::~CImage() { } -void CImage::Draw(CCanvas2D& UNUSED(canvas)) +void CImage::Draw(CCanvas2D& canvas) { - m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize); + m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize); } diff --git a/source/gui/ObjectTypes/CInput.cpp b/source/gui/ObjectTypes/CInput.cpp index 25684cbebf..15f3374103 100644 --- a/source/gui/ObjectTypes/CInput.cpp +++ b/source/gui/ObjectTypes/CInput.cpp @@ -1187,7 +1187,7 @@ void CInput::UpdateCachedSize() m_GeneratedPlaceholderTextValid = false; } -void CInput::Draw(CCanvas2D& UNUSED(canvas)) +void CInput::Draw(CCanvas2D& canvas) { if (m_CursorBlinkRate > 0.0) { @@ -1209,7 +1209,7 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas)) if (m_Mask && m_MaskChar->length() > 0) mask_char = (*m_MaskChar)[0]; - m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize); + m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize); float scroll = 0.f; if (m_ScrollBar && m_MultiLine) @@ -1398,7 +1398,7 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas)) rect.right = m_CachedActualSize.right; } - m_pGUI.DrawSprite(m_SpriteSelectArea, rect); + m_pGUI.DrawSprite(m_SpriteSelectArea, canvas, rect); } if (i < (int)it->m_ListOfX.size()) @@ -1525,22 +1525,22 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas)) tech->EndPass(); if (m_Caption->empty() && !m_PlaceholderText->GetRawString().empty()) - DrawPlaceholderText(cliparea); + DrawPlaceholderText(canvas, cliparea); // Draw scrollbars on top of the content if (m_ScrollBar && m_MultiLine) - IGUIScrollBarOwner::Draw(); + IGUIScrollBarOwner::Draw(canvas); // Draw the overlays last - m_pGUI.DrawSprite(m_SpriteOverlay, m_CachedActualSize); + m_pGUI.DrawSprite(m_SpriteOverlay, canvas, m_CachedActualSize); } -void CInput::DrawPlaceholderText(const CRect& clipping) +void CInput::DrawPlaceholderText(CCanvas2D& canvas, const CRect& clipping) { if (!m_GeneratedPlaceholderTextValid) SetupGeneratedPlaceholderText(); - m_GeneratedPlaceholderText.Draw(m_pGUI, m_PlaceholderColor, m_CachedActualSize.TopLeft(), clipping); + m_GeneratedPlaceholderText.Draw(m_pGUI, canvas, m_PlaceholderColor, m_CachedActualSize.TopLeft(), clipping); } void CInput::UpdateText(int from, int to_before, int to_after) diff --git a/source/gui/ObjectTypes/CInput.h b/source/gui/ObjectTypes/CInput.h index f3f078cbe7..2a9d2bbf74 100644 --- a/source/gui/ObjectTypes/CInput.h +++ b/source/gui/ObjectTypes/CInput.h @@ -112,11 +112,11 @@ protected: /** * Draws the text generated for placeholder. * - * @param z Z value + * @param canvas Canvas to draw on. * @param clipping Clipping rectangle, don't even add a parameter * to get no clipping. */ - virtual void DrawPlaceholderText(const CRect& clipping = CRect()); + virtual void DrawPlaceholderText(CCanvas2D& canvas, const CRect& clipping = CRect()); /** * Delete the current selection. Also places the pointer at the diff --git a/source/gui/ObjectTypes/CList.cpp b/source/gui/ObjectTypes/CList.cpp index 8aa2613380..d9cce809e7 100644 --- a/source/gui/ObjectTypes/CList.cpp +++ b/source/gui/ObjectTypes/CList.cpp @@ -299,17 +299,17 @@ InReaction CList::ManuallyHandleKeys(const SDL_Event_* ev) return result; } -void CList::Draw(CCanvas2D& UNUSED(canvas)) +void CList::Draw(CCanvas2D& canvas) { - DrawList(m_Selected, m_Sprite, m_SpriteOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor); + DrawList(canvas, m_Selected, m_Sprite, m_SpriteOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor); } -void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, +void CList::DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor) { CRect rect = GetListRect(); - m_pGUI.DrawSprite(sprite, rect); + m_pGUI.DrawSprite(sprite, canvas, rect); float scroll = 0.f; if (m_ScrollBar) @@ -343,7 +343,7 @@ void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, cons rectSel.left = GetScrollBar(0).GetOuterRect().right; } - m_pGUI.DrawSprite(spriteSelectArea, rectSel); + m_pGUI.DrawSprite(spriteSelectArea, canvas, rectSel); drawSelected = true; } } @@ -368,17 +368,17 @@ void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, cons cliparea.left = GetScrollBar(0).GetOuterRect().right; } - DrawText(i, textColor, rect.TopLeft() - CVector2D(0.f, scroll - m_ItemsYPositions[i]), cliparea); + DrawText(canvas, i, textColor, rect.TopLeft() - CVector2D(0.f, scroll - m_ItemsYPositions[i]), cliparea); } // Draw scrollbars on top of the content if (m_ScrollBar) - IGUIScrollBarOwner::Draw(); + IGUIScrollBarOwner::Draw(canvas); // Draw the overlays last - m_pGUI.DrawSprite(spriteOverlay, rect); + m_pGUI.DrawSprite(spriteOverlay, canvas, rect); if (drawSelected) - m_pGUI.DrawSprite(spriteSelectAreaOverlay, rectSel); + m_pGUI.DrawSprite(spriteSelectAreaOverlay, canvas, rectSel); } void CList::AddItem(const CGUIString& str, const CGUIString& data) diff --git a/source/gui/ObjectTypes/CList.h b/source/gui/ObjectTypes/CList.h index 9bb4d7fedd..03076350a1 100644 --- a/source/gui/ObjectTypes/CList.h +++ b/source/gui/ObjectTypes/CList.h @@ -106,7 +106,7 @@ protected: // Extended drawing interface, this is so that classes built on the this one // can use other sprite names. - virtual void DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, + virtual void DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor); // Get the area of the list. This is so that it can easily be changed, like in CDropDown diff --git a/source/gui/ObjectTypes/COList.cpp b/source/gui/ObjectTypes/COList.cpp index 4363f571b7..fa75133bf4 100644 --- a/source/gui/ObjectTypes/COList.cpp +++ b/source/gui/ObjectTypes/COList.cpp @@ -280,12 +280,12 @@ void COList::AdditionalChildrenHandled() SetupText(); } -void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, +void COList::DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor) { CRect rect = GetListRect(); - m_pGUI.DrawSprite(sprite, rect); + m_pGUI.DrawSprite(sprite, canvas, rect); float scroll = 0.f; if (m_ScrollBar) @@ -324,7 +324,7 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con } // Draw item selection - m_pGUI.DrawSprite(spriteSelectArea, rectSel); + m_pGUI.DrawSprite(spriteSelectArea, canvas, rectSel); drawSelected = true; } } @@ -332,7 +332,7 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con // Draw line above column header CRect rect_head(m_CachedActualSize.left, m_CachedActualSize.top, m_CachedActualSize.right, m_CachedActualSize.top + m_HeadingHeight); - m_pGUI.DrawSprite(m_SpriteHeading, rect_head); + m_pGUI.DrawSprite(m_SpriteHeading, canvas, rect_head); // Draw column headers float xpos = 0; @@ -369,11 +369,11 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con else pSprite = &*m_SpriteNotSorted; - m_pGUI.DrawSprite(*pSprite, CRect(leftTopCorner + CVector2D(width - SORT_SPRITE_DIM, 0), leftTopCorner + CVector2D(width, SORT_SPRITE_DIM))); + m_pGUI.DrawSprite(*pSprite, canvas, CRect(leftTopCorner + CVector2D(width - SORT_SPRITE_DIM, 0), leftTopCorner + CVector2D(width, SORT_SPRITE_DIM))); } // Draw column header text - DrawText(col, textColor, leftTopCorner + COLUMN_SHIFT, rect_head); + DrawText(canvas, col, textColor, leftTopCorner + COLUMN_SHIFT, rect_head); xpos += width; ++col; } @@ -424,17 +424,17 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con cliparea2.bottom = std::min(cliparea2.bottom, textPos.Y + rowHeight); // Draw list item - DrawText(objectsCount * (i +/*Heading*/1) + colIdx, column.m_TextColor, textPos, cliparea2); + DrawText(canvas, objectsCount * (i +/*Heading*/1) + colIdx, column.m_TextColor, textPos, cliparea2); xpos += width; } } // Draw scrollbars on top of the content if (m_ScrollBar) - IGUIScrollBarOwner::Draw(); + IGUIScrollBarOwner::Draw(canvas); // Draw the overlays last - m_pGUI.DrawSprite(spriteOverlay, rect); + m_pGUI.DrawSprite(spriteOverlay, canvas, rect); if (drawSelected) - m_pGUI.DrawSprite(spriteSelectAreaOverlay, rectSel); + m_pGUI.DrawSprite(spriteSelectAreaOverlay, canvas, rectSel); } diff --git a/source/gui/ObjectTypes/COList.h b/source/gui/ObjectTypes/COList.h index 081ffd7dda..29e51e126e 100644 --- a/source/gui/ObjectTypes/COList.h +++ b/source/gui/ObjectTypes/COList.h @@ -67,8 +67,9 @@ protected: virtual bool HandleAdditionalChildren(const XMBData& xmb, const XMBElement& child); virtual void AdditionalChildrenHandled(); - void DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, - const CGUISpriteInstance& spriteSelectarea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor); + virtual void DrawList( + CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay, + const CGUISpriteInstance& spriteSelectarea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor); virtual CRect GetListRect() const; diff --git a/source/gui/ObjectTypes/CProgressBar.cpp b/source/gui/ObjectTypes/CProgressBar.cpp index f8abee95ba..d2749acaba 100644 --- a/source/gui/ObjectTypes/CProgressBar.cpp +++ b/source/gui/ObjectTypes/CProgressBar.cpp @@ -53,12 +53,12 @@ void CProgressBar::HandleMessage(SGUIMessage& Message) } } -void CProgressBar::Draw(CCanvas2D& UNUSED(canvas)) +void CProgressBar::Draw(CCanvas2D& canvas) { - m_pGUI.DrawSprite(m_SpriteBackground, m_CachedActualSize); + m_pGUI.DrawSprite(m_SpriteBackground, canvas, m_CachedActualSize); // Get size of bar (notice it is drawn slightly closer, to appear above the background) CRect size = m_CachedActualSize; size.right = size.left + m_CachedActualSize.GetWidth() * (m_Progress / 100.f), - m_pGUI.DrawSprite(m_SpriteBar, size); + m_pGUI.DrawSprite(m_SpriteBar, canvas, size); } diff --git a/source/gui/ObjectTypes/CSlider.cpp b/source/gui/ObjectTypes/CSlider.cpp index 1419f56554..aee5b41c4d 100644 --- a/source/gui/ObjectTypes/CSlider.cpp +++ b/source/gui/ObjectTypes/CSlider.cpp @@ -102,13 +102,13 @@ void CSlider::HandleMessage(SGUIMessage& Message) } } -void CSlider::Draw(CCanvas2D& UNUSED(canvas)) +void CSlider::Draw(CCanvas2D& canvas) { CRect slider_line(m_CachedActualSize); slider_line.left += m_ButtonSide / 2.0f; slider_line.right -= m_ButtonSide / 2.0f; - m_pGUI.DrawSprite(m_SpriteBar, slider_line); - m_pGUI.DrawSprite(m_Sprite, GetButtonRect()); + m_pGUI.DrawSprite(m_SpriteBar, canvas, slider_line); + m_pGUI.DrawSprite(m_Sprite, canvas, GetButtonRect()); } void CSlider::UpdateValue() diff --git a/source/gui/ObjectTypes/CText.cpp b/source/gui/ObjectTypes/CText.cpp index cf6347aa91..cf7ad1864e 100644 --- a/source/gui/ObjectTypes/CText.cpp +++ b/source/gui/ObjectTypes/CText.cpp @@ -183,9 +183,9 @@ void CText::HandleMessage(SGUIMessage& Message) IGUITextOwner::HandleMessage(Message); } -void CText::Draw(CCanvas2D& UNUSED(canvas)) +void CText::Draw(CCanvas2D& canvas) { - m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize); + m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize); float scroll = 0.f; if (m_ScrollBar) @@ -213,14 +213,14 @@ void CText::Draw(CCanvas2D& UNUSED(canvas)) const CGUIColor& color = m_Enabled ? m_TextColor : m_TextColorDisabled; if (m_ScrollBar) - DrawText(0, color, m_CachedActualSize.TopLeft() - CVector2D(0.f, scroll), cliparea); + DrawText(canvas, 0, color, m_CachedActualSize.TopLeft() - CVector2D(0.f, scroll), cliparea); else - DrawText(0, color, m_TextPos, cliparea); + DrawText(canvas, 0, color, m_TextPos, cliparea); // Draw scrollbars on top of the content if (m_ScrollBar) - IGUIScrollBarOwner::Draw(); + IGUIScrollBarOwner::Draw(canvas); // Draw the overlays last - m_pGUI.DrawSprite(m_SpriteOverlay, m_CachedActualSize); + m_pGUI.DrawSprite(m_SpriteOverlay, canvas, m_CachedActualSize); } diff --git a/source/gui/ObjectTypes/CTooltip.cpp b/source/gui/ObjectTypes/CTooltip.cpp index 3d8b4f5317..888c370025 100644 --- a/source/gui/ObjectTypes/CTooltip.cpp +++ b/source/gui/ObjectTypes/CTooltip.cpp @@ -131,7 +131,7 @@ void CTooltip::HandleMessage(SGUIMessage& Message) IGUITextOwner::HandleMessage(Message); } -void CTooltip::Draw(CCanvas2D& UNUSED(canvas)) +void CTooltip::Draw(CCanvas2D& canvas) { // 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 @@ -141,8 +141,8 @@ void CTooltip::Draw(CCanvas2D& UNUSED(canvas)) m_GeneratedTextsValid = true; } - m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize); - DrawText(0, m_TextColor, m_CachedActualSize.TopLeft()); + m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize); + DrawText(canvas, 0, m_TextColor, m_CachedActualSize.TopLeft()); } float CTooltip::GetBufferedZ() const