forked from 0ad/0ad
Use pointers instead of copying sprites in the GUI. Fixes #1984. Patch by jP_wanN.
This was SVN commit r14493.
This commit is contained in:
parent
28f022993a
commit
fb8032043b
@ -485,8 +485,7 @@ void CGUI::Destroy()
|
|||||||
{
|
{
|
||||||
// We can use the map to delete all
|
// We can use the map to delete all
|
||||||
// now we don't want to cancel all if one Destroy fails
|
// now we don't want to cancel all if one Destroy fails
|
||||||
map_pObjects::iterator it;
|
for (map_pObjects::iterator it = m_pAllObjects.begin(); it != m_pAllObjects.end(); ++it)
|
||||||
for (it = m_pAllObjects.begin(); it != m_pAllObjects.end(); ++it)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -502,12 +501,10 @@ void CGUI::Destroy()
|
|||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::map<CStr, CGUISprite>::iterator it2 = m_Sprites.begin(); it2 != m_Sprites.end(); ++it2)
|
|
||||||
for (std::vector<SGUIImage>::iterator it3 = it2->second.m_Images.begin(); it3 != it2->second.m_Images.end(); ++it3)
|
|
||||||
delete it3->m_Effects;
|
|
||||||
|
|
||||||
// Clear all
|
// Clear all
|
||||||
m_pAllObjects.clear();
|
m_pAllObjects.clear();
|
||||||
|
for(std::map<CStr, CGUISprite*>::iterator it = m_Sprites.begin(); it != m_Sprites.end(); ++it)
|
||||||
|
delete it->second;
|
||||||
m_Sprites.clear();
|
m_Sprites.clear();
|
||||||
m_Icons.clear();
|
m_Icons.clear();
|
||||||
}
|
}
|
||||||
@ -1454,7 +1451,7 @@ void CGUI::Xeromyces_ReadScript(XMBElement Element, CXeromyces* pFile, boost::un
|
|||||||
void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile)
|
void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile)
|
||||||
{
|
{
|
||||||
// Sprite object we're adding
|
// Sprite object we're adding
|
||||||
CGUISprite sprite;
|
CGUISprite* Sprite = new CGUISprite;
|
||||||
|
|
||||||
// and what will be its reference name
|
// and what will be its reference name
|
||||||
CStr name;
|
CStr name;
|
||||||
@ -1487,7 +1484,7 @@ void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile)
|
|||||||
|
|
||||||
if (ElementName == "image")
|
if (ElementName == "image")
|
||||||
{
|
{
|
||||||
Xeromyces_ReadImage(child, pFile, sprite);
|
Xeromyces_ReadImage(child, pFile, *Sprite);
|
||||||
}
|
}
|
||||||
else if (ElementName == "effect")
|
else if (ElementName == "effect")
|
||||||
{
|
{
|
||||||
@ -1510,9 +1507,9 @@ void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile)
|
|||||||
// Apply the effects to every image (unless the image overrides it with
|
// Apply the effects to every image (unless the image overrides it with
|
||||||
// different effects)
|
// different effects)
|
||||||
if (effects)
|
if (effects)
|
||||||
for (std::vector<SGUIImage>::iterator it = sprite.m_Images.begin(); it != sprite.m_Images.end(); ++it)
|
for (std::vector<SGUIImage*>::iterator it = Sprite->m_Images.begin(); it != Sprite->m_Images.end(); ++it)
|
||||||
if (! it->m_Effects)
|
if (! (*it)->m_Effects)
|
||||||
it->m_Effects = new SGUIImageEffects(*effects); // do a copy just so it can be deleted correctly later
|
(*it)->m_Effects = new SGUIImageEffects(*effects); // do a copy just so it can be deleted correctly later
|
||||||
|
|
||||||
delete effects;
|
delete effects;
|
||||||
|
|
||||||
@ -1520,18 +1517,18 @@ void CGUI::Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile)
|
|||||||
// Add Sprite
|
// Add Sprite
|
||||||
//
|
//
|
||||||
|
|
||||||
m_Sprites[name] = sprite;
|
m_Sprites[name] = Sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite &parent)
|
void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite &parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Image object we're adding
|
// Image object we're adding
|
||||||
SGUIImage image;
|
SGUIImage* Image = new SGUIImage;
|
||||||
|
|
||||||
// Set defaults to "0 0 100% 100%"
|
// Set defaults to "0 0 100% 100%"
|
||||||
image.m_TextureSize = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
Image->m_TextureSize = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
||||||
image.m_Size = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
Image->m_Size = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
||||||
|
|
||||||
// TODO Gee: Setup defaults here (or maybe they are in the SGUIImage ctor)
|
// TODO Gee: Setup defaults here (or maybe they are in the SGUIImage ctor)
|
||||||
|
|
||||||
@ -1549,7 +1546,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
|
|
||||||
if (attr_name == "texture")
|
if (attr_name == "texture")
|
||||||
{
|
{
|
||||||
image.m_TextureName = VfsPath("art/textures/ui") / attr_value;
|
Image->m_TextureName = VfsPath("art/textures/ui") / attr_value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "size")
|
if (attr_name == "size")
|
||||||
@ -1557,7 +1554,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CClientArea ca;
|
CClientArea ca;
|
||||||
if (!GUI<CClientArea>::ParseString(attr_value, ca))
|
if (!GUI<CClientArea>::ParseString(attr_value, ca))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_Size = ca;
|
else Image->m_Size = ca;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "texture_size")
|
if (attr_name == "texture_size")
|
||||||
@ -1565,7 +1562,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CClientArea ca;
|
CClientArea ca;
|
||||||
if (!GUI<CClientArea>::ParseString(attr_value, ca))
|
if (!GUI<CClientArea>::ParseString(attr_value, ca))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_TextureSize = ca;
|
else Image->m_TextureSize = ca;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "real_texture_placement")
|
if (attr_name == "real_texture_placement")
|
||||||
@ -1573,7 +1570,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CRect rect;
|
CRect rect;
|
||||||
if (!GUI<CRect>::ParseString(attr_value, rect))
|
if (!GUI<CRect>::ParseString(attr_value, rect))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_TexturePlacementInFile = rect;
|
else Image->m_TexturePlacementInFile = rect;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "cell_size")
|
if (attr_name == "cell_size")
|
||||||
@ -1581,7 +1578,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CSize size;
|
CSize size;
|
||||||
if (!GUI<CSize>::ParseString(attr_value, size))
|
if (!GUI<CSize>::ParseString(attr_value, size))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_CellSize = size;
|
else Image->m_CellSize = size;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "fixed_h_aspect_ratio")
|
if (attr_name == "fixed_h_aspect_ratio")
|
||||||
@ -1589,7 +1586,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
float val;
|
float val;
|
||||||
if (!GUI<float>::ParseString(attr_value, val))
|
if (!GUI<float>::ParseString(attr_value, val))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_FixedHAspectRatio = val;
|
else Image->m_FixedHAspectRatio = val;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "round_coordinates")
|
if (attr_name == "round_coordinates")
|
||||||
@ -1597,17 +1594,17 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
bool b;
|
bool b;
|
||||||
if (!GUI<bool>::ParseString(attr_value, b))
|
if (!GUI<bool>::ParseString(attr_value, b))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_RoundCoordinates = b;
|
else Image->m_RoundCoordinates = b;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "wrap_mode")
|
if (attr_name == "wrap_mode")
|
||||||
{
|
{
|
||||||
if (attr_value == L"repeat")
|
if (attr_value == L"repeat")
|
||||||
image.m_WrapMode = GL_REPEAT;
|
Image->m_WrapMode = GL_REPEAT;
|
||||||
else if (attr_value == L"mirrored_repeat")
|
else if (attr_value == L"mirrored_repeat")
|
||||||
image.m_WrapMode = GL_MIRRORED_REPEAT;
|
Image->m_WrapMode = GL_MIRRORED_REPEAT;
|
||||||
else if (attr_value == L"clamp_to_edge")
|
else if (attr_value == L"clamp_to_edge")
|
||||||
image.m_WrapMode = GL_CLAMP_TO_EDGE;
|
Image->m_WrapMode = GL_CLAMP_TO_EDGE;
|
||||||
else
|
else
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
}
|
}
|
||||||
@ -1617,7 +1614,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
float z_level;
|
float z_level;
|
||||||
if (!GUI<float>::ParseString(attr_value, z_level))
|
if (!GUI<float>::ParseString(attr_value, z_level))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_DeltaZ = z_level/100.f;
|
else Image->m_DeltaZ = z_level/100.f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "backcolor")
|
if (attr_name == "backcolor")
|
||||||
@ -1625,7 +1622,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CColor color;
|
CColor color;
|
||||||
if (!GUI<CColor>::ParseString(attr_value, color))
|
if (!GUI<CColor>::ParseString(attr_value, color))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_BackColor = color;
|
else Image->m_BackColor = color;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "bordercolor")
|
if (attr_name == "bordercolor")
|
||||||
@ -1633,7 +1630,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CColor color;
|
CColor color;
|
||||||
if (!GUI<CColor>::ParseString(attr_value, color))
|
if (!GUI<CColor>::ParseString(attr_value, color))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_BorderColor = color;
|
else Image->m_BorderColor = color;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "border")
|
if (attr_name == "border")
|
||||||
@ -1641,7 +1638,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
bool b;
|
bool b;
|
||||||
if (!GUI<bool>::ParseString(attr_value, b))
|
if (!GUI<bool>::ParseString(attr_value, b))
|
||||||
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str());
|
||||||
else image.m_Border = b;
|
else Image->m_Border = b;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1657,14 +1654,14 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
CStr ElementName (pFile->GetElementString(child.GetNodeName()));
|
CStr ElementName (pFile->GetElementString(child.GetNodeName()));
|
||||||
if (ElementName == "effect")
|
if (ElementName == "effect")
|
||||||
{
|
{
|
||||||
if (image.m_Effects)
|
if (Image->m_Effects)
|
||||||
{
|
{
|
||||||
LOGERROR(L"GUI <image> must not have more than one <effect>");
|
LOGERROR(L"GUI <image> must not have more than one <effect>");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
image.m_Effects = new SGUIImageEffects;
|
Image->m_Effects = new SGUIImageEffects;
|
||||||
Xeromyces_ReadEffects(child, pFile, *image.m_Effects);
|
Xeromyces_ReadEffects(child, pFile, *Image->m_Effects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1677,7 +1674,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
// Input
|
// Input
|
||||||
//
|
//
|
||||||
|
|
||||||
parent.AddImage(image);
|
parent.AddImage(Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects &effects)
|
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects &effects)
|
||||||
|
@ -670,7 +670,7 @@ private:
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
|
|
||||||
// Sprites
|
// Sprites
|
||||||
std::map<CStr, CGUISprite> m_Sprites;
|
std::map<CStr, CGUISprite*> m_Sprites;
|
||||||
|
|
||||||
// Styles
|
// Styles
|
||||||
std::map<CStr, SGUIStyle> m_Styles;
|
std::map<CStr, SGUIStyle> m_Styles;
|
||||||
|
@ -18,7 +18,20 @@
|
|||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
#include "CGUISprite.h"
|
#include "CGUISprite.h"
|
||||||
|
|
||||||
void CGUISpriteInstance::Draw(CRect Size, int CellID, std::map<CStr, CGUISprite> &Sprites, float Z) const
|
CGUISprite::~CGUISprite()
|
||||||
|
{
|
||||||
|
for (std::vector<SGUIImage*>::iterator it = m_Images.begin(); it != m_Images.end(); it++)
|
||||||
|
{
|
||||||
|
delete *it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUISprite::AddImage(SGUIImage* image)
|
||||||
|
{
|
||||||
|
m_Images.push_back(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUISpriteInstance::Draw(CRect Size, int CellID, std::map<CStr, CGUISprite*> &Sprites, float Z) const
|
||||||
{
|
{
|
||||||
if (m_CachedSize != Size || m_CachedCellID != CellID)
|
if (m_CachedSize != Size || m_CachedCellID != CellID)
|
||||||
{
|
{
|
||||||
|
@ -69,7 +69,6 @@ struct SGUIImageEffects
|
|||||||
bool m_Greyscale;
|
bool m_Greyscale;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A CGUISprite is actually a collage of several <b>real</b>
|
* A CGUISprite is actually a collage of several <b>real</b>
|
||||||
* sprites, this struct represents is such real sprite.
|
* sprites, this struct represents is such real sprite.
|
||||||
@ -81,6 +80,11 @@ struct SGUIImage
|
|||||||
m_Effects(NULL), m_Border(false), m_DeltaZ(0.f)
|
m_Effects(NULL), m_Border(false), m_DeltaZ(0.f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~SGUIImage()
|
||||||
|
{
|
||||||
|
delete m_Effects;
|
||||||
|
}
|
||||||
|
|
||||||
// Filename of the texture
|
// Filename of the texture
|
||||||
VfsPath m_TextureName;
|
VfsPath m_TextureName;
|
||||||
@ -135,8 +139,9 @@ struct SGUIImage
|
|||||||
* way of declaring delta-z.
|
* way of declaring delta-z.
|
||||||
*/
|
*/
|
||||||
float m_DeltaZ;
|
float m_DeltaZ;
|
||||||
};
|
|
||||||
|
|
||||||
|
NONCOPYABLE(SGUIImage);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The GUI sprite, is actually several real sprites (images)
|
* The GUI sprite, is actually several real sprites (images)
|
||||||
@ -151,17 +156,19 @@ class CGUISprite
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CGUISprite() {}
|
CGUISprite() {}
|
||||||
virtual ~CGUISprite() {}
|
virtual ~CGUISprite();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an image to the sprite collage.
|
* Adds an image to the sprite collage.
|
||||||
*
|
*
|
||||||
* @param image Adds this image to the sprite collage.
|
* @param image Adds this image to the sprite collage.
|
||||||
*/
|
*/
|
||||||
void AddImage(const SGUIImage &image) { m_Images.push_back(image); }
|
void AddImage(SGUIImage*);
|
||||||
|
|
||||||
/// List of images
|
/// List of images
|
||||||
std::vector<SGUIImage> m_Images;
|
std::vector<SGUIImage*> m_Images;
|
||||||
|
|
||||||
|
NONCOPYABLE(CGUISprite);
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "GUIRenderer.h"
|
#include "GUIRenderer.h"
|
||||||
@ -176,7 +183,7 @@ public:
|
|||||||
CGUISpriteInstance(const CStr& SpriteName);
|
CGUISpriteInstance(const CStr& SpriteName);
|
||||||
CGUISpriteInstance(const CGUISpriteInstance &Sprite);
|
CGUISpriteInstance(const CGUISpriteInstance &Sprite);
|
||||||
CGUISpriteInstance &operator=(const CStr& SpriteName);
|
CGUISpriteInstance &operator=(const CStr& SpriteName);
|
||||||
void Draw(CRect Size, int CellID, std::map<CStr, CGUISprite> &Sprites, float Z) const;
|
void Draw(CRect Size, int CellID, std::map<CStr, CGUISprite*>& Sprites, float Z) const;
|
||||||
void Invalidate();
|
void Invalidate();
|
||||||
bool IsEmpty() const;
|
bool IsEmpty() const;
|
||||||
const CStr& GetName() { return m_SpriteName; }
|
const CStr& GetName() { return m_SpriteName; }
|
||||||
|
@ -56,7 +56,7 @@ DrawCalls& DrawCalls::operator=(const DrawCalls&)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, const CRect &Size, int CellID, std::map<CStr, CGUISprite> &Sprites)
|
void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, const CRect &Size, int CellID, std::map<CStr, CGUISprite*> &Sprites)
|
||||||
{
|
{
|
||||||
// This is called only when something has changed (like the size of the
|
// This is called only when something has changed (like the size of the
|
||||||
// sprite), so it doesn't need to be particularly efficient.
|
// sprite), so it doesn't need to be particularly efficient.
|
||||||
@ -71,7 +71,7 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
std::map<CStr, CGUISprite>::iterator it (Sprites.find(SpriteName));
|
std::map<CStr, CGUISprite*>::iterator it (Sprites.find(SpriteName));
|
||||||
if (it == Sprites.end())
|
if (it == Sprites.end())
|
||||||
{
|
{
|
||||||
// Sprite not found. Check whether this a special sprite:
|
// Sprite not found. Check whether this a special sprite:
|
||||||
@ -84,26 +84,26 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
if (SpriteName.substr(0, 10) == "stretched:")
|
if (SpriteName.substr(0, 10) == "stretched:")
|
||||||
{
|
{
|
||||||
// TODO: Should check (nicely) that this is a valid file?
|
// TODO: Should check (nicely) that this is a valid file?
|
||||||
SGUIImage Image;
|
SGUIImage* Image = new SGUIImage;
|
||||||
|
|
||||||
// Allow grayscale images for disabled portraits
|
// Allow grayscale images for disabled portraits
|
||||||
if (SpriteName.substr(10, 10) == "grayscale:")
|
if (SpriteName.substr(10, 10) == "grayscale:")
|
||||||
{
|
{
|
||||||
Image.m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(20));
|
Image->m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(20));
|
||||||
Image.m_Effects = new SGUIImageEffects;
|
Image->m_Effects = new SGUIImageEffects;
|
||||||
Image.m_Effects->m_Greyscale = true;
|
Image->m_Effects->m_Greyscale = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Image.m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(10));
|
Image->m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
||||||
Image.m_Size = ca;
|
Image->m_Size = ca;
|
||||||
Image.m_TextureSize = ca;
|
Image->m_TextureSize = ca;
|
||||||
|
|
||||||
CGUISprite Sprite;
|
CGUISprite* Sprite = new CGUISprite;
|
||||||
Sprite.AddImage(Image);
|
Sprite->AddImage(Image);
|
||||||
|
|
||||||
Sprites[SpriteName] = Sprite;
|
Sprites[SpriteName] = Sprite;
|
||||||
|
|
||||||
@ -113,22 +113,22 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
else if (SpriteName.substr(0, 8) == "cropped:")
|
else if (SpriteName.substr(0, 8) == "cropped:")
|
||||||
{
|
{
|
||||||
// TODO: Should check (nicely) that this is a valid file?
|
// TODO: Should check (nicely) that this is a valid file?
|
||||||
SGUIImage Image;
|
SGUIImage* Image = new SGUIImage;
|
||||||
|
|
||||||
double xRatio = SpriteName.BeforeFirst(",").AfterLast("(").ToDouble();
|
double xRatio = SpriteName.BeforeFirst(",").AfterLast("(").ToDouble();
|
||||||
double yRatio = SpriteName.BeforeFirst(")").AfterLast(",").ToDouble();
|
double yRatio = SpriteName.BeforeFirst(")").AfterLast(",").ToDouble();
|
||||||
|
|
||||||
int PathStart = SpriteName.Find(")") + 1;
|
int PathStart = SpriteName.Find(")") + 1;
|
||||||
|
|
||||||
Image.m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(PathStart));
|
Image->m_TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.substr(PathStart));
|
||||||
|
|
||||||
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
||||||
CClientArea cb(CRect(0, 0, 0, 0), CRect(0, 0, 100/xRatio, 100/yRatio));
|
CClientArea cb(CRect(0, 0, 0, 0), CRect(0, 0, 100/xRatio, 100/yRatio));
|
||||||
Image.m_Size = ca;
|
Image->m_Size = ca;
|
||||||
Image.m_TextureSize = cb;
|
Image->m_TextureSize = cb;
|
||||||
|
|
||||||
CGUISprite Sprite;
|
CGUISprite* Sprite = new CGUISprite;
|
||||||
Sprite.AddImage(Image);
|
Sprite->AddImage(Image);
|
||||||
|
|
||||||
Sprites[SpriteName] = Sprite;
|
Sprites[SpriteName] = Sprite;
|
||||||
|
|
||||||
@ -147,16 +147,16 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGUIImage image;
|
SGUIImage* Image = new SGUIImage;
|
||||||
|
|
||||||
image.m_BackColor = color;
|
Image->m_BackColor = color;
|
||||||
|
|
||||||
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
CClientArea ca(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100));
|
||||||
image.m_Size = ca;
|
Image->m_Size = ca;
|
||||||
image.m_TextureSize = ca;
|
Image->m_TextureSize = ca;
|
||||||
|
|
||||||
CGUISprite Sprite;
|
CGUISprite* Sprite = new CGUISprite;
|
||||||
Sprite.AddImage(image);
|
Sprite->AddImage(Image);
|
||||||
|
|
||||||
Sprites[SpriteName] = Sprite;
|
Sprites[SpriteName] = Sprite;
|
||||||
|
|
||||||
@ -171,16 +171,16 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Calls.reserve(it->second.m_Images.size());
|
Calls.reserve(it->second->m_Images.size());
|
||||||
|
|
||||||
// Iterate through all the sprite's images, loading the texture and
|
// Iterate through all the sprite's images, loading the texture and
|
||||||
// calculating the texture coordinates
|
// calculating the texture coordinates
|
||||||
std::vector<SGUIImage>::const_iterator cit;
|
std::vector<SGUIImage*>::const_iterator cit;
|
||||||
for (cit = it->second.m_Images.begin(); cit != it->second.m_Images.end(); ++cit)
|
for (cit = it->second->m_Images.begin(); cit != it->second->m_Images.end(); ++cit)
|
||||||
{
|
{
|
||||||
SDrawCall Call(&*cit); // pointers are safe since we never modify sprites/images after startup
|
SDrawCall Call(*cit); // pointers are safe since we never modify sprites/images after startup
|
||||||
|
|
||||||
CRect ObjectSize = cit->m_Size.GetClientArea(Size);
|
CRect ObjectSize = (*cit)->m_Size.GetClientArea(Size);
|
||||||
|
|
||||||
if (ObjectSize.GetWidth() == 0.0 || ObjectSize.GetHeight() == 0.0)
|
if (ObjectSize.GetWidth() == 0.0 || ObjectSize.GetHeight() == 0.0)
|
||||||
{
|
{
|
||||||
@ -189,7 +189,7 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Call.m_Vertices = ObjectSize;
|
Call.m_Vertices = ObjectSize;
|
||||||
if (cit->m_RoundCoordinates)
|
if ((*cit)->m_RoundCoordinates)
|
||||||
{
|
{
|
||||||
// Round the vertex coordinates to integers, to avoid ugly filtering artifacts
|
// Round the vertex coordinates to integers, to avoid ugly filtering artifacts
|
||||||
Call.m_Vertices.left = (int)(Call.m_Vertices.left + 0.5f);
|
Call.m_Vertices.left = (int)(Call.m_Vertices.left + 0.5f);
|
||||||
@ -198,10 +198,10 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
Call.m_Vertices.bottom = (int)(Call.m_Vertices.bottom + 0.5f);
|
Call.m_Vertices.bottom = (int)(Call.m_Vertices.bottom + 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! cit->m_TextureName.empty())
|
if (!(*cit)->m_TextureName.empty())
|
||||||
{
|
{
|
||||||
CTextureProperties textureProps(cit->m_TextureName);
|
CTextureProperties textureProps((*cit)->m_TextureName);
|
||||||
textureProps.SetWrap(cit->m_WrapMode);
|
textureProps.SetWrap((*cit)->m_WrapMode);
|
||||||
CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
|
CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
|
||||||
texture->Prefetch();
|
texture->Prefetch();
|
||||||
Call.m_HasTexture = true;
|
Call.m_HasTexture = true;
|
||||||
@ -216,29 +216,29 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName,
|
|||||||
{
|
{
|
||||||
Call.m_HasTexture = false;
|
Call.m_HasTexture = false;
|
||||||
// Enable blending if it's transparent (allowing a little error in the calculations)
|
// Enable blending if it's transparent (allowing a little error in the calculations)
|
||||||
Call.m_EnableBlending = !(fabs(cit->m_BackColor.a - 1.0f) < 0.0000001f);
|
Call.m_EnableBlending = !(fabs((*cit)->m_BackColor.a - 1.0f) < 0.0000001f);
|
||||||
}
|
}
|
||||||
|
|
||||||
Call.m_BackColor = cit->m_BackColor;
|
Call.m_BackColor = (*cit)->m_BackColor;
|
||||||
Call.m_BorderColor = cit->m_Border ? cit->m_BorderColor : CColor();
|
Call.m_BorderColor = (*cit)->m_Border ? (*cit)->m_BorderColor : CColor();
|
||||||
Call.m_DeltaZ = cit->m_DeltaZ;
|
Call.m_DeltaZ = (*cit)->m_DeltaZ;
|
||||||
|
|
||||||
if (!Call.m_HasTexture)
|
if (!Call.m_HasTexture)
|
||||||
{
|
{
|
||||||
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid);
|
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid);
|
||||||
}
|
}
|
||||||
else if (cit->m_Effects)
|
else if ((*cit)->m_Effects)
|
||||||
{
|
{
|
||||||
if (cit->m_Effects->m_AddColor != CColor())
|
if ((*cit)->m_Effects->m_AddColor != CColor())
|
||||||
{
|
{
|
||||||
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add);
|
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add);
|
||||||
Call.m_ShaderColorParameter = cit->m_Effects->m_AddColor;
|
Call.m_ShaderColorParameter = (*cit)->m_Effects->m_AddColor;
|
||||||
// Always enable blending if something's being subtracted from
|
// Always enable blending if something's being subtracted from
|
||||||
// the alpha channel
|
// the alpha channel
|
||||||
if (cit->m_Effects->m_AddColor.a < 0.f)
|
if ((*cit)->m_Effects->m_AddColor.a < 0.f)
|
||||||
Call.m_EnableBlending = true;
|
Call.m_EnableBlending = true;
|
||||||
}
|
}
|
||||||
else if (cit->m_Effects->m_Greyscale)
|
else if ((*cit)->m_Effects->m_Greyscale)
|
||||||
{
|
{
|
||||||
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_grayscale);
|
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_grayscale);
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ namespace GUIRenderer
|
|||||||
|
|
||||||
namespace GUIRenderer
|
namespace GUIRenderer
|
||||||
{
|
{
|
||||||
void UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map<CStr, CGUISprite> &Sprites);
|
void UpdateDrawCallCache(DrawCalls &Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map<CStr, CGUISprite*> &Sprites);
|
||||||
|
|
||||||
void Draw(DrawCalls &Calls, float Z);
|
void Draw(DrawCalls &Calls, float Z);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user