mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-06-22 08:07:33 +00:00
Initial changes to GUI sprite code. (There shouldn't be any visible effects - if there are, they're bugs)
This was SVN commit r1507.
This commit is contained in:
+14
-14
@@ -20,10 +20,10 @@ CButton::CButton()
|
|||||||
AddSetting(GUIST_float, "buffer-zone");
|
AddSetting(GUIST_float, "buffer-zone");
|
||||||
AddSetting(GUIST_CGUIString, "caption");
|
AddSetting(GUIST_CGUIString, "caption");
|
||||||
AddSetting(GUIST_CStr, "font");
|
AddSetting(GUIST_CStr, "font");
|
||||||
AddSetting(GUIST_CStr, "sprite");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite");
|
||||||
AddSetting(GUIST_CStr, "sprite-over");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite-over");
|
||||||
AddSetting(GUIST_CStr, "sprite-pressed");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite-pressed");
|
||||||
AddSetting(GUIST_CStr, "sprite-disabled");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite-disabled");
|
||||||
AddSetting(GUIST_EAlign, "text-align");
|
AddSetting(GUIST_EAlign, "text-align");
|
||||||
AddSetting(GUIST_EVAlign, "text-valign");
|
AddSetting(GUIST_EVAlign, "text-valign");
|
||||||
AddSetting(GUIST_CColor, "textcolor");
|
AddSetting(GUIST_CColor, "textcolor");
|
||||||
@@ -124,18 +124,18 @@ void CButton::Draw()
|
|||||||
{
|
{
|
||||||
float bz = GetBufferedZ();
|
float bz = GetBufferedZ();
|
||||||
|
|
||||||
CStr sprite, sprite_over, sprite_pressed, sprite_disabled;
|
CGUISpriteInstance sprite, sprite_over, sprite_pressed, sprite_disabled;
|
||||||
|
|
||||||
GUI<CStr>::GetSetting(this, "sprite", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite", sprite);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-over", sprite_over);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-over", sprite_over);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-pressed", sprite_pressed);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-pressed", sprite_pressed);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-disabled", sprite_disabled);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-disabled", sprite_disabled);
|
||||||
|
|
||||||
DrawButton(m_CachedActualSize,
|
DrawButton(m_CachedActualSize,
|
||||||
bz,
|
bz,
|
||||||
sprite,
|
sprite,
|
||||||
sprite_over,
|
sprite_over,
|
||||||
sprite_pressed,
|
sprite_pressed,
|
||||||
sprite_disabled);
|
sprite_disabled);
|
||||||
|
|
||||||
CColor color = ChooseColor();
|
CColor color = ChooseColor();
|
||||||
|
|||||||
+37
-37
@@ -15,36 +15,36 @@ using namespace std;
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
CCheckBox::CCheckBox()
|
CCheckBox::CCheckBox()
|
||||||
{
|
{
|
||||||
/* bool m_Checked;
|
/* bool m_Checked;
|
||||||
CStr m_Font;
|
CStr m_Font;
|
||||||
CStr m_Sprite;
|
CGUISpriteInstance m_Sprite;
|
||||||
CStr m_SpriteDisabled;
|
CGUISpriteInstance m_SpriteDisabled;
|
||||||
CStr m_SpriteOver;
|
CGUISpriteInstance m_SpriteOver;
|
||||||
CStr m_SpritePressed;
|
CGUISpriteInstance m_SpritePressed;
|
||||||
CStr m_Sprite2;
|
CGUISpriteInstance m_Sprite2;
|
||||||
CStr m_Sprite2Disabled;
|
CGUISpriteInstance m_Sprite2Disabled;
|
||||||
CStr m_Sprite2Over;
|
CGUISpriteInstance m_Sprite2Over;
|
||||||
CStr m_Sprite2Pressed;
|
CGUISpriteInstance m_Sprite2Pressed;
|
||||||
int m_SquareSide;
|
int m_SquareSide;
|
||||||
EAlign m_TextAlign;
|
EAlign m_TextAlign;
|
||||||
CColor m_TextColor;
|
CColor m_TextColor;
|
||||||
CColor m_TextColorDisabled;
|
CColor m_TextColorDisabled;
|
||||||
CColor m_TextColorOver;
|
CColor m_TextColorOver;
|
||||||
CColor m_TextColorPressed;
|
CColor m_TextColorPressed;
|
||||||
EVAlign m_TextValign;
|
EVAlign m_TextValign;
|
||||||
CStr m_ToolTip;
|
CStr m_ToolTip;
|
||||||
CStr m_ToolTipStyle;
|
CStr m_ToolTipStyle;
|
||||||
*/
|
*/
|
||||||
AddSetting(GUIST_CGUIString, "caption");
|
AddSetting(GUIST_CGUIString, "caption");
|
||||||
AddSetting(GUIST_bool, "checked");
|
AddSetting(GUIST_bool, "checked");
|
||||||
AddSetting(GUIST_CStr, "sprite");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite");
|
||||||
AddSetting(GUIST_CStr, "sprite-over");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite-over");
|
||||||
AddSetting(GUIST_CStr, "sprite-pressed");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite-pressed");
|
||||||
AddSetting(GUIST_CStr, "sprite-disabled");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite-disabled");
|
||||||
AddSetting(GUIST_CStr, "sprite2");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite2");
|
||||||
AddSetting(GUIST_CStr, "sprite2-over");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite2-over");
|
||||||
AddSetting(GUIST_CStr, "sprite2-pressed");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite2-pressed");
|
||||||
AddSetting(GUIST_CStr, "sprite2-disabled");
|
AddSetting(GUIST_CGUISpriteInstance,"sprite2-disabled");
|
||||||
AddSetting(GUIST_int, "square-side");
|
AddSetting(GUIST_int, "square-side");
|
||||||
|
|
||||||
// Add text
|
// Add text
|
||||||
@@ -123,21 +123,21 @@ void CCheckBox::Draw()
|
|||||||
bool checked;
|
bool checked;
|
||||||
GUI<bool>::GetSetting(this, "checked", checked);
|
GUI<bool>::GetSetting(this, "checked", checked);
|
||||||
|
|
||||||
CStr sprite, sprite_over, sprite_pressed, sprite_disabled;
|
CGUISpriteInstance sprite, sprite_over, sprite_pressed, sprite_disabled;
|
||||||
|
|
||||||
if (checked)
|
if (checked)
|
||||||
{
|
{
|
||||||
GUI<CStr>::GetSetting(this, "sprite2", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite2", sprite);
|
||||||
GUI<CStr>::GetSetting(this, "sprite2-over", sprite_over);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite2-over", sprite_over);
|
||||||
GUI<CStr>::GetSetting(this, "sprite2-pressed", sprite_pressed);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite2-pressed", sprite_pressed);
|
||||||
GUI<CStr>::GetSetting(this, "sprite2-disabled", sprite_disabled);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite2-disabled", sprite_disabled);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GUI<CStr>::GetSetting(this, "sprite", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite", sprite);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-over", sprite_over);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-over", sprite_over);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-pressed", sprite_pressed);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-pressed", sprite_pressed);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-disabled", sprite_disabled);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-disabled", sprite_disabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawButton( rect,
|
DrawButton( rect,
|
||||||
|
|||||||
+16
-137
@@ -407,134 +407,24 @@ void CGUI::Draw()
|
|||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGUI::DrawSprite(const CStr& SpriteName,
|
void CGUI::DrawSprite(CGUISpriteInstance& Sprite,
|
||||||
const float &Z,
|
const float &Z,
|
||||||
const CRect &Rect,
|
const CRect &Rect,
|
||||||
const CRect &Clipping)
|
const CRect &Clipping)
|
||||||
{
|
{
|
||||||
// This is not an error, it's just a choice not to draw any sprite.
|
// If the sprite doesn't exist (name == ""), don't bother drawing anything
|
||||||
if (SpriteName == CStr())
|
if (Sprite.IsEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO: Clipping?
|
// TODO: Clipping?
|
||||||
bool DoClipping = (Clipping != CRect());
|
|
||||||
|
|
||||||
CGUISprite Sprite;
|
|
||||||
|
|
||||||
// Fetch real sprite from name
|
|
||||||
if (m_Sprites.count(SpriteName) == 0)
|
|
||||||
{
|
|
||||||
LOG_ONCE(ERROR, LOG_CATEGORY, "Trying to use a sprite that doesn't exist (\"%s\").", SpriteName.c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else Sprite = m_Sprites[SpriteName];
|
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(0.0f, 0.0f, Z);
|
glTranslatef(0.0f, 0.0f, Z);
|
||||||
|
|
||||||
// Iterate all images and request them being drawn be the
|
Sprite.Draw(Rect, m_Sprites);
|
||||||
// CRenderer
|
|
||||||
std::vector<SGUIImage>::const_iterator cit;
|
|
||||||
for (cit=Sprite.m_Images.begin(); cit!=Sprite.m_Images.end(); ++cit)
|
|
||||||
{
|
|
||||||
if (cit->m_Texture)
|
|
||||||
{
|
|
||||||
// TODO: Handle the GL state in a nicer way
|
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glColor3f(1.0f, 1.0f, 1.0f);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
||||||
|
|
||||||
int fmt;
|
|
||||||
tex_info(cit->m_Texture, NULL, NULL, &fmt, NULL, NULL);
|
|
||||||
if (fmt == GL_RGBA || fmt == GL_BGRA)
|
|
||||||
{
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
}
|
|
||||||
|
|
||||||
tex_bind(cit->m_Texture);
|
|
||||||
|
|
||||||
CRect real = cit->m_Size.GetClientArea(Rect);
|
|
||||||
|
|
||||||
// Get the screen position/size of a single tiling of the texture
|
|
||||||
CRect TexSize = cit->m_TextureSize.GetClientArea(real);
|
|
||||||
|
|
||||||
// Actual texture coordinates we'll send to OGL.
|
|
||||||
CRect TexCoords;
|
|
||||||
|
|
||||||
TexCoords.left = (TexSize.left - real.left) / TexSize.GetWidth();
|
|
||||||
TexCoords.right = TexCoords.left + real.GetWidth() / TexSize.GetWidth();
|
|
||||||
|
|
||||||
// 'Bottom' is actually the top in screen-space (I think),
|
|
||||||
// because the GUI puts (0,0) at the top-left
|
|
||||||
TexCoords.bottom = (TexSize.bottom - real.bottom) / TexSize.GetHeight();
|
|
||||||
TexCoords.top = TexCoords.bottom + real.GetHeight() / TexSize.GetHeight();
|
|
||||||
|
|
||||||
if (cit->m_TexturePlacementInFile != CRect())
|
|
||||||
{
|
|
||||||
// Save the width/height, because we'll change the values one at a time and need
|
|
||||||
// to be able to use the unchanged width/height
|
|
||||||
float width = TexCoords.GetWidth(),
|
|
||||||
height = TexCoords.GetHeight();
|
|
||||||
|
|
||||||
// Get texture width/height
|
|
||||||
int t_w, t_h;
|
|
||||||
tex_info(cit->m_Texture, &t_w, &t_h, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
float fTW=(float)t_w, fTH=(float)t_h;
|
|
||||||
|
|
||||||
// notice left done after right, so that left is still unchanged, that is important.
|
|
||||||
TexCoords.right = TexCoords.left + width * cit->m_TexturePlacementInFile.right/fTW;
|
|
||||||
TexCoords.left += width * cit->m_TexturePlacementInFile.left/fTW;
|
|
||||||
|
|
||||||
TexCoords.bottom = TexCoords.top + height * cit->m_TexturePlacementInFile.bottom/fTH;
|
|
||||||
TexCoords.top += height * cit->m_TexturePlacementInFile.top/fTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
glTexCoord2f(TexCoords.right, TexCoords.bottom); glVertex3f(real.right, real.bottom, cit->m_DeltaZ);
|
|
||||||
glTexCoord2f(TexCoords.left, TexCoords.bottom); glVertex3f(real.left, real.bottom, cit->m_DeltaZ);
|
|
||||||
glTexCoord2f(TexCoords.left, TexCoords.top); glVertex3f(real.left, real.top, cit->m_DeltaZ);
|
|
||||||
glTexCoord2f(TexCoords.right, TexCoords.top); glVertex3f(real.right, real.top, cit->m_DeltaZ);
|
|
||||||
glEnd();
|
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//glDisable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
// TODO Gee: (2004-09-04) Shouldn't untextured sprites be able to be transparent too?
|
|
||||||
glColor4f(cit->m_BackColor.r, cit->m_BackColor.g, cit->m_BackColor.b, cit->m_BackColor.a);
|
|
||||||
|
|
||||||
CRect real = cit->m_Size.GetClientArea(Rect);
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
glVertex3f(real.right, real.bottom, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.left, real.bottom, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.left, real.top, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.right, real.top, cit->m_DeltaZ);
|
|
||||||
glEnd();
|
|
||||||
|
|
||||||
if (cit->m_Border)
|
|
||||||
{
|
|
||||||
glColor3f(cit->m_BorderColor.r, cit->m_BorderColor.g, cit->m_BorderColor.b);
|
|
||||||
glBegin(GL_LINE_LOOP);
|
|
||||||
glVertex3f(real.left, real.top+1.f, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.right-1.f, real.top+1.f, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.right-1.f, real.bottom, cit->m_DeltaZ);
|
|
||||||
glVertex3f(real.left, real.bottom, cit->m_DeltaZ);
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGUI::Destroy()
|
void CGUI::Destroy()
|
||||||
@@ -658,7 +548,7 @@ struct SGenerateTextImage
|
|||||||
SpriteCall.m_Area.right = width-BufferZone;
|
SpriteCall.m_Area.right = width-BufferZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpriteCall.m_TextureName = TextureName;
|
SpriteCall.m_Sprite = TextureName;
|
||||||
|
|
||||||
m_YFrom = SpriteCall.m_Area.top-BufferZone;
|
m_YFrom = SpriteCall.m_Area.top-BufferZone;
|
||||||
m_YTo = SpriteCall.m_Area.bottom+BufferZone;
|
m_YTo = SpriteCall.m_Area.bottom+BufferZone;
|
||||||
@@ -932,7 +822,7 @@ SGUIText CGUI::GenerateText(const CGUIString &string,
|
|||||||
return Text;
|
return Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGUI::DrawText(const SGUIText &Text, const CColor &DefaultColor,
|
void CGUI::DrawText(SGUIText &Text, const CColor &DefaultColor,
|
||||||
const CPos &pos, const float &z)
|
const CPos &pos, const float &z)
|
||||||
{
|
{
|
||||||
// TODO Gee: All these really necessary? Some
|
// TODO Gee: All these really necessary? Some
|
||||||
@@ -984,11 +874,11 @@ void CGUI::DrawText(const SGUIText &Text, const CColor &DefaultColor,
|
|||||||
if (font)
|
if (font)
|
||||||
delete font;
|
delete font;
|
||||||
|
|
||||||
for (list<SGUIText::SSpriteCall>::const_iterator it=Text.m_SpriteCalls.begin();
|
for (list<SGUIText::SSpriteCall>::iterator it=Text.m_SpriteCalls.begin();
|
||||||
it!=Text.m_SpriteCalls.end();
|
it!=Text.m_SpriteCalls.end();
|
||||||
++it)
|
++it)
|
||||||
{
|
{
|
||||||
DrawSprite(it->m_TextureName, z, it->m_Area + pos);
|
DrawSprite(it->m_Sprite, z, it->m_Area + pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO To whom it may concern: Thing were not reset, so
|
// TODO To whom it may concern: Thing were not reset, so
|
||||||
@@ -1213,7 +1103,7 @@ void CGUI::Xeromyces_ReadObject(XMBElement Element, CXeromyces* pFile, IGUIObjec
|
|||||||
if (m_Styles.count(CStr("default")) == 1)
|
if (m_Styles.count(CStr("default")) == 1)
|
||||||
object->LoadStyle(*this, CStr("default"));
|
object->LoadStyle(*this, CStr("default"));
|
||||||
|
|
||||||
if (argStyle != CStr())
|
if (argStyle.Length())
|
||||||
{
|
{
|
||||||
// additional check
|
// additional check
|
||||||
if (m_Styles.count(argStyle) == 0)
|
if (m_Styles.count(argStyle) == 0)
|
||||||
@@ -1262,6 +1152,8 @@ void CGUI::Xeromyces_ReadObject(XMBElement Element, CXeromyces* pFile, IGUIObjec
|
|||||||
ManuallySetZ = true;
|
ManuallySetZ = true;
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: Reimplement this inside GUIRenderer.cpp
|
||||||
|
|
||||||
// Generate "stretched:filename" sprites.
|
// Generate "stretched:filename" sprites.
|
||||||
//
|
//
|
||||||
// Check whether it's actually one of the many sprite... parameters.
|
// Check whether it's actually one of the many sprite... parameters.
|
||||||
@@ -1299,7 +1191,7 @@ void CGUI::Xeromyces_ReadObject(XMBElement Element, CXeromyces* pFile, IGUIObjec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// Try setting the value
|
// Try setting the value
|
||||||
if (object->SetSetting(pFile->getAttributeString(attr.Name), (CStr)attr.Value) != PS_OK)
|
if (object->SetSetting(pFile->getAttributeString(attr.Name), (CStr)attr.Value) != PS_OK)
|
||||||
{
|
{
|
||||||
@@ -1531,23 +1423,10 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite
|
|||||||
// This is the only attribute we want
|
// This is the only attribute we want
|
||||||
if (attr_name == "texture")
|
if (attr_name == "texture")
|
||||||
{
|
{
|
||||||
// Load the texture from disk now, because now's as good a time as any
|
|
||||||
CStr TexFilename ("art/textures/ui/");
|
CStr TexFilename ("art/textures/ui/");
|
||||||
TexFilename += attr_value;
|
TexFilename += attr_value;
|
||||||
|
|
||||||
Handle tex = tex_load(TexFilename.c_str());
|
image.m_TextureName = TexFilename;
|
||||||
if (tex <= 0)
|
|
||||||
{
|
|
||||||
// Don't use ReportParseError, because this is not a *parsing* error
|
|
||||||
// and has ultimately nothing to do with the actual sprite we're reading.
|
|
||||||
LOG(ERROR, LOG_CATEGORY, "Error opening texture '%s': %lld", TexFilename.c_str(), tex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
image.m_TextureName = TexFilename;
|
|
||||||
image.m_Texture = tex;
|
|
||||||
tex_upload(tex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (attr_name == "size")
|
if (attr_name == "size")
|
||||||
|
|||||||
+8
-7
@@ -104,14 +104,15 @@ public:
|
|||||||
void Draw();
|
void Draw();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw GUI Sprite, cooperates with CRenderer.
|
* Draw GUI Sprite
|
||||||
*
|
*
|
||||||
* @param SpriteName By name! The GUI will fetch the real object itself.
|
* @param Sprite Object refering to the sprite (which also caches
|
||||||
|
* calculations for faster rendering)
|
||||||
* @param Z Drawing order, depth value
|
* @param Z Drawing order, depth value
|
||||||
* @param Rect Position and Size
|
* @param Rect Position and Size
|
||||||
* @param Clipping The sprite shouldn't be drawn outside this rectangle
|
* @param Clipping The sprite shouldn't be drawn outside this rectangle
|
||||||
*/
|
*/
|
||||||
void DrawSprite(const CStr& SpriteName, const float &Z,
|
void DrawSprite(CGUISpriteInstance& Sprite, const float &Z,
|
||||||
const CRect &Rect, const CRect &Clipping=CRect());
|
const CRect &Rect, const CRect &Clipping=CRect());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,7 +123,7 @@ public:
|
|||||||
* @param pos position
|
* @param pos position
|
||||||
* @param z z value.
|
* @param z z value.
|
||||||
*/
|
*/
|
||||||
void DrawText(const SGUIText &Text, const CColor &DefaultColor,
|
void DrawText(SGUIText &Text, const CColor &DefaultColor,
|
||||||
const CPos &pos, const float &z);
|
const CPos &pos, const float &z);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -185,7 +186,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Update Resolution, should be called every time the resolution
|
* Update Resolution, should be called every time the resolution
|
||||||
* of the opengl screen has been changed, this is becuase it needs
|
* of the OpenGL screen has been changed, this is because it needs
|
||||||
* to re-cache all its actual sizes
|
* to re-cache all its actual sizes
|
||||||
*
|
*
|
||||||
* Needs no input since screen resolution is global.
|
* Needs no input since screen resolution is global.
|
||||||
@@ -203,7 +204,7 @@ public:
|
|||||||
* Done through the CGUI since it can communicate with
|
* Done through the CGUI since it can communicate with
|
||||||
*
|
*
|
||||||
* @param Text Text to generate SGUIText object from
|
* @param Text Text to generate SGUIText object from
|
||||||
* @param Font Default font, notice both Default color and defult font
|
* @param Font Default font, notice both Default color and default font
|
||||||
* can be changed by tags.
|
* can be changed by tags.
|
||||||
* @param Width Width, 0 if no word-wrapping.
|
* @param Width Width, 0 if no word-wrapping.
|
||||||
* @param BufferZone space between text and edge, and space between text and images.
|
* @param BufferZone space between text and edge, and space between text and images.
|
||||||
@@ -248,7 +249,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* Adds an object to the GUI's object database
|
* Adds an object to the GUI's object database
|
||||||
* Private, since you can only add objects through
|
* Private, since you can only add objects through
|
||||||
* XML files. Why? Becasue it enables the GUI to
|
* XML files. Why? Because it enables the GUI to
|
||||||
* be much more encapsulated and safe.
|
* be much more encapsulated and safe.
|
||||||
*
|
*
|
||||||
* @throws Rethrows PS_RESULT from IGUIObject::SetGUI() and
|
* @throws Rethrows PS_RESULT from IGUIObject::SetGUI() and
|
||||||
|
|||||||
@@ -82,33 +82,33 @@ struct CGUIScrollBarStyle
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
CStr m_SpriteButtonTop;
|
CGUISpriteInstance m_SpriteButtonTop;
|
||||||
CStr m_SpriteButtonTopPressed;
|
CGUISpriteInstance m_SpriteButtonTopPressed;
|
||||||
CStr m_SpriteButtonTopDisabled;
|
CGUISpriteInstance m_SpriteButtonTopDisabled;
|
||||||
|
|
||||||
CStr m_SpriteButtonBottom;
|
CGUISpriteInstance m_SpriteButtonBottom;
|
||||||
CStr m_SpriteButtonBottomPressed;
|
CGUISpriteInstance m_SpriteButtonBottomPressed;
|
||||||
CStr m_SpriteButtonBottomDisabled;
|
CGUISpriteInstance m_SpriteButtonBottomDisabled;
|
||||||
|
|
||||||
CStr m_SpriteScrollBackHorizontal;
|
CGUISpriteInstance m_SpriteScrollBackHorizontal;
|
||||||
CStr m_SpriteScrollBarHorizontal;
|
CGUISpriteInstance m_SpriteScrollBarHorizontal;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
/** @name Verical Sprites */
|
/** @name Vertical Sprites */
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
CStr m_SpriteButtonLeft;
|
CGUISpriteInstance m_SpriteButtonLeft;
|
||||||
CStr m_SpriteButtonLeftPressed;
|
CGUISpriteInstance m_SpriteButtonLeftPressed;
|
||||||
CStr m_SpriteButtonLeftDisabled;
|
CGUISpriteInstance m_SpriteButtonLeftDisabled;
|
||||||
|
|
||||||
CStr m_SpriteButtonRight;
|
CGUISpriteInstance m_SpriteButtonRight;
|
||||||
CStr m_SpriteButtonRightPressed;
|
CGUISpriteInstance m_SpriteButtonRightPressed;
|
||||||
CStr m_SpriteButtonRightDisabled;
|
CGUISpriteInstance m_SpriteButtonRightDisabled;
|
||||||
|
|
||||||
CStr m_SpriteScrollBackVertical;
|
CGUISpriteInstance m_SpriteScrollBackVertical;
|
||||||
CStr m_SpriteScrollBarVertical;
|
CGUISpriteInstance m_SpriteScrollBarVertical;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ void CGUIScrollBarVertical::Draw()
|
|||||||
if (m_UseEdgeButtons)
|
if (m_UseEdgeButtons)
|
||||||
{
|
{
|
||||||
// Get Appropriate sprites
|
// Get Appropriate sprites
|
||||||
CStr button_top, button_bottom;
|
CGUISpriteInstance button_top, button_bottom;
|
||||||
|
|
||||||
// figure out what sprite to use for top button
|
// figure out what sprite to use for top button
|
||||||
if (m_ButtonMinusHovered)
|
if (m_ButtonMinusHovered)
|
||||||
|
|||||||
+34
-11
@@ -1,15 +1,38 @@
|
|||||||
/*
|
|
||||||
CGUISprite
|
|
||||||
by Gustav Larsson
|
|
||||||
gee@pyro.nu
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
#include "GUI.h"
|
#include "CGUISprite.h"
|
||||||
|
|
||||||
using namespace std;
|
CGUISpriteInstance::CGUISpriteInstance()
|
||||||
/*
|
|
||||||
void CGUISprite::Draw(const float &z, const CRect &rect, const CRect &clipping=CRect(0,0,0,0))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
CGUISpriteInstance::CGUISpriteInstance(CStr SpriteName)
|
||||||
|
: m_SpriteName(SpriteName)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CGUISpriteInstance &CGUISpriteInstance::operator=(CStr SpriteName)
|
||||||
|
{
|
||||||
|
m_SpriteName = SpriteName;
|
||||||
|
Invalidate();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUISpriteInstance::Draw(CRect Size, std::map<CStr, CGUISprite> &Sprites)
|
||||||
|
{
|
||||||
|
if (m_CachedSize != Size)
|
||||||
|
{
|
||||||
|
GUIRenderer::UpdateDrawCallCache(m_DrawCallCache, m_SpriteName, Size, Sprites);
|
||||||
|
m_CachedSize = Size;
|
||||||
|
}
|
||||||
|
GUIRenderer::Draw(m_DrawCallCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUISpriteInstance::Invalidate()
|
||||||
|
{
|
||||||
|
m_CachedSize = CRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CGUISpriteInstance::IsEmpty() const
|
||||||
|
{
|
||||||
|
return m_SpriteName=="";
|
||||||
|
}
|
||||||
+39
-31
@@ -25,7 +25,8 @@ gee@pyro.nu
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Includes / Compiler directives
|
// Includes / Compiler directives
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
#include "GUI.h"
|
#include "GUIutil.h"
|
||||||
|
|
||||||
#include "Overlay.h"
|
#include "Overlay.h"
|
||||||
#include "lib/res/ogl_tex.h"
|
#include "lib/res/ogl_tex.h"
|
||||||
|
|
||||||
@@ -53,43 +54,28 @@ gee@pyro.nu
|
|||||||
*/
|
*/
|
||||||
struct SGUIImage
|
struct SGUIImage
|
||||||
{
|
{
|
||||||
SGUIImage() : m_Texture(0), m_Border(false), m_DeltaZ(0.f), m_TexturePlacementInFile() {}
|
SGUIImage() : m_Border(false), m_DeltaZ(0.f) {}
|
||||||
~SGUIImage() {
|
|
||||||
if (m_Texture)
|
|
||||||
tex_free(m_Texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy constructor, which increments the refcount of the texture.
|
|
||||||
// Slightly inefficient, but makes sure things get destructed
|
|
||||||
// at the right times.
|
|
||||||
SGUIImage(const SGUIImage& s)
|
|
||||||
{
|
|
||||||
#define C(x) m_##x = s.m_##x
|
|
||||||
C(TextureName); C(Texture);
|
|
||||||
C(Size); C(TextureSize);
|
|
||||||
C(BackColor); C(BorderColor);
|
|
||||||
C(Border); C(DeltaZ);
|
|
||||||
C(TexturePlacementInFile);
|
|
||||||
#undef C
|
|
||||||
// 'Load' the texture (but don't do any work because it's cached)
|
|
||||||
if (m_Texture)
|
|
||||||
tex_load(m_TextureName);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Filename of the texture
|
||||||
CStr m_TextureName;
|
CStr m_TextureName;
|
||||||
Handle m_Texture;
|
|
||||||
|
|
||||||
// Image placement
|
// Image placement (relative to object)
|
||||||
CClientArea m_Size;
|
CClientArea m_Size;
|
||||||
|
|
||||||
// Texture placement
|
// Texture placement (relative to image placement)
|
||||||
CClientArea m_TextureSize;
|
CClientArea m_TextureSize;
|
||||||
|
|
||||||
// Because OpenGL wants textures in squares with a power of 2 (64x64, 256x256)
|
// Because OpenGL wants textures in squares with a power of 2 (64x64, 256x256)
|
||||||
// it's sometimes tediuos to adjust this. So this value simulates which area
|
// it's sometimes tedious to adjust this. So this value simulates which area
|
||||||
// is the real texture
|
// is the real texture
|
||||||
CRect m_TexturePlacementInFile;
|
CRect m_TexturePlacementInFile;
|
||||||
|
|
||||||
|
// For textures that contain a collection of icons (e.g. unit portraits), this
|
||||||
|
// will be set to the size of one icon. An object's icon-id will determine
|
||||||
|
// which part of the texture is used.
|
||||||
|
// Equal to CPos(0,0) for non-icon textures.
|
||||||
|
CSize m_IconSize;
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
CColor m_BackColor;
|
CColor m_BackColor;
|
||||||
CColor m_BorderColor;
|
CColor m_BorderColor;
|
||||||
@@ -118,9 +104,6 @@ struct SGUIImage
|
|||||||
*/
|
*/
|
||||||
class CGUISprite
|
class CGUISprite
|
||||||
{
|
{
|
||||||
// For CGUI::DrawSprite()
|
|
||||||
friend class CGUI;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CGUISprite() {}
|
CGUISprite() {}
|
||||||
virtual ~CGUISprite() {}
|
virtual ~CGUISprite() {}
|
||||||
@@ -132,9 +115,34 @@ public:
|
|||||||
*/
|
*/
|
||||||
void AddImage(const SGUIImage &image) { m_Images.push_back(image); }
|
void AddImage(const SGUIImage &image) { m_Images.push_back(image); }
|
||||||
|
|
||||||
private:
|
|
||||||
/// List of images
|
/// List of images
|
||||||
std::vector<SGUIImage> m_Images;
|
std::vector<SGUIImage> m_Images;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include "GUIRenderer.h"
|
||||||
|
|
||||||
|
// An instance of a sprite, usually stored in IGUIObjects - basically a string
|
||||||
|
// giving the sprite's name, but with some extra data to cache rendering
|
||||||
|
// calculations between draw calls.
|
||||||
|
class CGUISpriteInstance
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CGUISpriteInstance();
|
||||||
|
CGUISpriteInstance(CStr SpriteName);
|
||||||
|
CGUISpriteInstance &operator=(CStr SpriteName);
|
||||||
|
void Draw(CRect Size, std::map<CStr, CGUISprite> &Sprites);
|
||||||
|
void Invalidate();
|
||||||
|
bool IsEmpty() const;
|
||||||
|
CStr GetName() { return m_SpriteName; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CStr m_SpriteName;
|
||||||
|
|
||||||
|
// Stored drawing calls, for more efficient rendering
|
||||||
|
GUIRenderer::DrawCalls m_DrawCallCache;
|
||||||
|
// Size of previously rendered sprite; the cache is invalidated
|
||||||
|
// whenever this changes.
|
||||||
|
CRect m_CachedSize;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using namespace std;
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
CImage::CImage()
|
CImage::CImage()
|
||||||
{
|
{
|
||||||
AddSetting(GUIST_CStr, "sprite");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite");
|
||||||
}
|
}
|
||||||
|
|
||||||
CImage::~CImage()
|
CImage::~CImage()
|
||||||
@@ -30,8 +30,8 @@ void CImage::Draw()
|
|||||||
{
|
{
|
||||||
float bz = GetBufferedZ();
|
float bz = GetBufferedZ();
|
||||||
|
|
||||||
CStr sprite;
|
CGUISpriteInstance sprite;
|
||||||
GUI<CStr>::GetSetting(this, "sprite", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite", sprite);
|
||||||
|
|
||||||
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ using namespace std;
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
CInput::CInput() : m_iBufferPos(0)
|
CInput::CInput() : m_iBufferPos(0)
|
||||||
{
|
{
|
||||||
AddSetting(GUIST_float, "buffer-zone");
|
AddSetting(GUIST_float, "buffer-zone");
|
||||||
AddSetting(GUIST_CStrW, "caption");
|
AddSetting(GUIST_CStrW, "caption");
|
||||||
AddSetting(GUIST_CStr, "font");
|
AddSetting(GUIST_CStr, "font");
|
||||||
AddSetting(GUIST_bool, "scrollbar");
|
AddSetting(GUIST_bool, "scrollbar");
|
||||||
AddSetting(GUIST_CStr, "scrollbar-style");
|
AddSetting(GUIST_CStr, "scrollbar-style");
|
||||||
AddSetting(GUIST_CStr, "sprite");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite");
|
||||||
AddSetting(GUIST_CColor, "textcolor");
|
AddSetting(GUIST_CColor, "textcolor");
|
||||||
// TODO Gee: (2004-08-14)
|
// TODO Gee: (2004-08-14)
|
||||||
// Add a setting for buffer zone
|
// Add a setting for buffer zone
|
||||||
//AddSetting(GUIST_int, "
|
//AddSetting(GUIST_int, "
|
||||||
@@ -344,8 +344,8 @@ void CInput::Draw()
|
|||||||
|
|
||||||
if (GetGUI())
|
if (GetGUI())
|
||||||
{
|
{
|
||||||
CStr sprite;
|
CGUISpriteInstance sprite;
|
||||||
GUI<CStr>::GetSetting(this, "sprite", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite", sprite);
|
||||||
|
|
||||||
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ using namespace std;
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
CProgressBar::CProgressBar()
|
CProgressBar::CProgressBar()
|
||||||
{
|
{
|
||||||
AddSetting(GUIST_CStr, "sprite-background");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite-background");
|
||||||
AddSetting(GUIST_CStr, "sprite-bar");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite-bar");
|
||||||
AddSetting(GUIST_float, "caption"); // aka value from 0 to 100
|
AddSetting(GUIST_float, "caption"); // aka value from 0 to 100
|
||||||
}
|
}
|
||||||
|
|
||||||
CProgressBar::~CProgressBar()
|
CProgressBar::~CProgressBar()
|
||||||
@@ -58,10 +58,10 @@ void CProgressBar::Draw()
|
|||||||
{
|
{
|
||||||
float bz = GetBufferedZ();
|
float bz = GetBufferedZ();
|
||||||
|
|
||||||
CStr sprite_background, sprite_bar;
|
CGUISpriteInstance sprite_background, sprite_bar;
|
||||||
float value;
|
float value;
|
||||||
GUI<CStr>::GetSetting(this, "sprite-background", sprite_background);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-background", sprite_background);
|
||||||
GUI<CStr>::GetSetting(this, "sprite-bar", sprite_bar);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite-bar", sprite_bar);
|
||||||
GUI<float>::GetSetting(this, "caption", value);
|
GUI<float>::GetSetting(this, "caption", value);
|
||||||
|
|
||||||
GetGUI()->DrawSprite(sprite_background, bz, m_CachedActualSize);
|
GetGUI()->DrawSprite(sprite_background, bz, m_CachedActualSize);
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ using namespace std;
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
CText::CText()
|
CText::CText()
|
||||||
{
|
{
|
||||||
AddSetting(GUIST_float, "buffer-zone");
|
AddSetting(GUIST_float, "buffer-zone");
|
||||||
AddSetting(GUIST_CGUIString, "caption");
|
AddSetting(GUIST_CGUIString, "caption");
|
||||||
AddSetting(GUIST_CStr, "font");
|
AddSetting(GUIST_CStr, "font");
|
||||||
AddSetting(GUIST_bool, "scrollbar");
|
AddSetting(GUIST_bool, "scrollbar");
|
||||||
AddSetting(GUIST_CStr, "scrollbar-style");
|
AddSetting(GUIST_CStr, "scrollbar-style");
|
||||||
AddSetting(GUIST_CStr, "sprite");
|
AddSetting(GUIST_CGUISpriteInstance, "sprite");
|
||||||
AddSetting(GUIST_CColor, "textcolor");
|
AddSetting(GUIST_CColor, "textcolor");
|
||||||
// TODO Gee: (2004-08-14)
|
// TODO Gee: (2004-08-14)
|
||||||
// Add a setting for buffer zone
|
// Add a setting for buffer zone
|
||||||
//AddSetting(GUIST_int, "
|
//AddSetting(GUIST_int, "
|
||||||
@@ -161,8 +161,8 @@ void CText::Draw()
|
|||||||
|
|
||||||
if (GetGUI())
|
if (GetGUI())
|
||||||
{
|
{
|
||||||
CStr sprite;
|
CGUISpriteInstance sprite;
|
||||||
GUI<CStr>::GetSetting(this, "sprite", sprite);
|
GUI<CGUISpriteInstance>::GetSetting(this, "sprite", sprite);
|
||||||
|
|
||||||
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
GetGUI()->DrawSprite(sprite, bz, m_CachedActualSize);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
#include "precompiled.h"
|
||||||
|
|
||||||
|
#include "GUIRenderer.h"
|
||||||
|
|
||||||
|
#include "lib/ogl.h"
|
||||||
|
|
||||||
|
#include "ps/CLogger.h"
|
||||||
|
#define LOG_CATEGORY "gui"
|
||||||
|
|
||||||
|
void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, CStr &SpriteName, CRect &Size, std::map<CStr, CGUISprite> &Sprites)
|
||||||
|
{
|
||||||
|
Calls.clear();
|
||||||
|
|
||||||
|
std::map<CStr, CGUISprite>::iterator it (Sprites.find(SpriteName));
|
||||||
|
if (it == Sprites.end())
|
||||||
|
{
|
||||||
|
// Sprite not found. Check whether this a special sprite:
|
||||||
|
// stretched:filename.ext
|
||||||
|
// filename.ext
|
||||||
|
// and if so, try to create it as a new sprite.
|
||||||
|
|
||||||
|
// TODO: Implement this.
|
||||||
|
|
||||||
|
// Otherwise, just complain and give up:
|
||||||
|
LOG(ERROR, LOG_CATEGORY, "Trying to use a sprite that doesn't exist (\"%s\").", (const char*)SpriteName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Calls.reserve(it->second.m_Images.size());
|
||||||
|
|
||||||
|
// Iterate through all the sprite's images
|
||||||
|
std::vector<SGUIImage>::const_iterator cit;
|
||||||
|
for (cit = it->second.m_Images.begin(); cit != it->second.m_Images.end(); ++cit)
|
||||||
|
{
|
||||||
|
SDrawCall Call;
|
||||||
|
if (cit->m_TextureName.Length())
|
||||||
|
{
|
||||||
|
Handle h = tex_load(cit->m_TextureName);
|
||||||
|
if (h <= 0)
|
||||||
|
{
|
||||||
|
LOG(ERROR, LOG_CATEGORY, "Error reading texture '%s': %lld", (const char*)cit->m_TextureName, h);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Call.m_TexHandle = h;
|
||||||
|
|
||||||
|
int err = tex_upload(Call.m_TexHandle);
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
LOG(ERROR, LOG_CATEGORY, "Error uploading texture '%s': %d", (const char*)cit->m_TextureName, err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fmt, t_w, t_h;
|
||||||
|
tex_info(Call.m_TexHandle, &t_w, &t_h, &fmt, NULL, NULL);
|
||||||
|
Call.m_EnableBlending = (fmt == GL_RGBA || fmt == GL_BGRA);
|
||||||
|
|
||||||
|
CRect real = cit->m_Size.GetClientArea(Size);
|
||||||
|
|
||||||
|
// Get the screen position/size of a single tiling of the texture
|
||||||
|
CRect TexSize = cit->m_TextureSize.GetClientArea(real);
|
||||||
|
|
||||||
|
CRect TexCoords;
|
||||||
|
|
||||||
|
TexCoords.left = (TexSize.left - real.left) / TexSize.GetWidth();
|
||||||
|
TexCoords.right = TexCoords.left + real.GetWidth() / TexSize.GetWidth();
|
||||||
|
|
||||||
|
// 'Bottom' is actually the top in screen-space (I think),
|
||||||
|
// because the GUI puts (0,0) at the top-left
|
||||||
|
TexCoords.bottom = (TexSize.bottom - real.bottom) / TexSize.GetHeight();
|
||||||
|
TexCoords.top = TexCoords.bottom + real.GetHeight() / TexSize.GetHeight();
|
||||||
|
|
||||||
|
if (cit->m_TexturePlacementInFile != CRect())
|
||||||
|
{
|
||||||
|
// Save the width/height, because we'll change the values one at a time and need
|
||||||
|
// to be able to use the unchanged width/height
|
||||||
|
float width = TexCoords.GetWidth(),
|
||||||
|
height = TexCoords.GetHeight();
|
||||||
|
|
||||||
|
float fTW=(float)t_w, fTH=(float)t_h;
|
||||||
|
|
||||||
|
// notice left done after right, so that left is still unchanged, that is important.
|
||||||
|
TexCoords.right = TexCoords.left + width * cit->m_TexturePlacementInFile.right/fTW;
|
||||||
|
TexCoords.left += width * cit->m_TexturePlacementInFile.left/fTW;
|
||||||
|
|
||||||
|
TexCoords.bottom = TexCoords.top + height * cit->m_TexturePlacementInFile.bottom/fTH;
|
||||||
|
TexCoords.top += height * cit->m_TexturePlacementInFile.top/fTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
Call.m_TexCoords = TexCoords;
|
||||||
|
Call.m_Vertices = real;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Call.m_TexHandle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Call.m_BackColor = cit->m_BackColor;
|
||||||
|
Call.m_BorderColor = cit->m_Border ? cit->m_BorderColor : CColor();
|
||||||
|
Call.m_DeltaZ = cit->m_DeltaZ;
|
||||||
|
|
||||||
|
Calls.push_back(Call);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
glColor4f(cit->m_BackColor.r, cit->m_BackColor.g, cit->m_BackColor.b, cit->m_BackColor.a);
|
||||||
|
|
||||||
|
if (cit->m_EnableBlending)
|
||||||
|
{
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cit->m_TexHandle)
|
||||||
|
{
|
||||||
|
// TODO: Handle the GL state in a nicer way
|
||||||
|
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
|
|
||||||
|
tex_bind(cit->m_TexHandle);
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
|
glTexCoord2f(cit->m_TexCoords.right,cit->m_TexCoords.bottom);
|
||||||
|
glVertex3f(cit->m_Vertices.right, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
|
||||||
|
glTexCoord2f(cit->m_TexCoords.left, cit->m_TexCoords.bottom);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
|
||||||
|
glTexCoord2f(cit->m_TexCoords.left, cit->m_TexCoords.top);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.top, cit->m_DeltaZ);
|
||||||
|
|
||||||
|
glTexCoord2f(cit->m_TexCoords.right,cit->m_TexCoords.top);
|
||||||
|
glVertex3f(cit->m_Vertices.right, cit->m_Vertices.top, cit->m_DeltaZ);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex3f(cit->m_Vertices.right, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.top, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.right, cit->m_Vertices.top, cit->m_DeltaZ);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
|
if (cit->m_BorderColor != CColor())
|
||||||
|
{
|
||||||
|
glColor4f(cit->m_BorderColor.r, cit->m_BorderColor.g, cit->m_BorderColor.b, cit->m_BorderColor.a);
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.top+1.f, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.right-1.f, cit->m_Vertices.top+1.f, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.right-1.f, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
glVertex3f(cit->m_Vertices.left, cit->m_Vertices.bottom, cit->m_DeltaZ);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#ifndef GUIRenderer_h
|
||||||
|
#define GUIRenderer_h
|
||||||
|
|
||||||
|
#include "lib/res/handle.h"
|
||||||
|
#include "ps/Overlay.h"
|
||||||
|
#include "ps/CStr.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace GUIRenderer
|
||||||
|
{
|
||||||
|
struct SDrawCall
|
||||||
|
{
|
||||||
|
Handle m_TexHandle;
|
||||||
|
|
||||||
|
bool m_EnableBlending;
|
||||||
|
|
||||||
|
CRect m_Vertices;
|
||||||
|
CRect m_TexCoords;
|
||||||
|
float m_DeltaZ;
|
||||||
|
|
||||||
|
CColor m_BorderColor; // == CColor() for no border
|
||||||
|
CColor m_BackColor;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<SDrawCall> DrawCalls;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "gui/CGUISprite.h"
|
||||||
|
|
||||||
|
namespace GUIRenderer
|
||||||
|
{
|
||||||
|
void UpdateDrawCallCache(DrawCalls &Calls, CStr &SpriteName, CRect& Size, std::map<CStr, CGUISprite> &Sprites);
|
||||||
|
|
||||||
|
void Draw(DrawCalls &Calls);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GUIRenderer_h
|
||||||
@@ -153,7 +153,7 @@ void CGUIString::GenerateTextCall(SFeedback &Feedback,
|
|||||||
SpriteCall.m_Area += displacement;
|
SpriteCall.m_Area += displacement;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpriteCall.m_TextureName = icon.m_TextureName;
|
SpriteCall.m_Sprite = icon.m_TextureName;
|
||||||
|
|
||||||
// Add sprite call
|
// Add sprite call
|
||||||
Feedback.m_SpriteCalls.push_back(SpriteCall);
|
Feedback.m_SpriteCalls.push_back(SpriteCall);
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ gee@pyro.nu
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
#include "CGUISprite.h"
|
||||||
|
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Declarations
|
// Declarations
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
@@ -59,9 +61,9 @@ struct SGUIText
|
|||||||
CRect m_Area;
|
CRect m_Area;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Texture name from texture database.
|
* Sprite from global GUI sprite database.
|
||||||
*/
|
*/
|
||||||
CStr m_TextureName;
|
CGUISpriteInstance m_Sprite;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+10
-2
@@ -184,7 +184,7 @@ bool __ParseString<EVAlign>(const CStr &Value, EVAlign &Output)
|
|||||||
template <>
|
template <>
|
||||||
bool __ParseString<CGUIString>(const CStr& Value, CGUIString &Output)
|
bool __ParseString<CGUIString>(const CStr& Value, CGUIString &Output)
|
||||||
{
|
{
|
||||||
// Translate the Value and retrieve the locilised string in
|
// Translate the Value and retrieve the localised string in
|
||||||
// Unicode.
|
// Unicode.
|
||||||
|
|
||||||
Output.SetValue(translate((CStrW)Value));
|
Output.SetValue(translate((CStrW)Value));
|
||||||
@@ -194,13 +194,20 @@ bool __ParseString<CGUIString>(const CStr& Value, CGUIString &Output)
|
|||||||
template <>
|
template <>
|
||||||
bool __ParseString<CStrW>(const CStr& Value, CStrW &Output)
|
bool __ParseString<CStrW>(const CStr& Value, CStrW &Output)
|
||||||
{
|
{
|
||||||
// Translate the Value and retrieve the locilised string in
|
// Translate the Value and retrieve the localised string in
|
||||||
// Unicode.
|
// Unicode.
|
||||||
|
|
||||||
Output = translate((CStrW)Value);
|
Output = translate((CStrW)Value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
bool __ParseString<CGUISpriteInstance>(const CStr& Value, CGUISpriteInstance &Output)
|
||||||
|
{
|
||||||
|
Output = Value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Help Classes/Structs for the GUI implementation
|
// Help Classes/Structs for the GUI implementation
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
@@ -397,6 +404,7 @@ void CInternalCGUIAccessorBase::HandleMessage(IGUIObject *pObject, const SGUIMes
|
|||||||
TYPE(CStrW)
|
TYPE(CStrW)
|
||||||
TYPE(CColor)
|
TYPE(CColor)
|
||||||
TYPE(CGUIString)
|
TYPE(CGUIString)
|
||||||
|
TYPE(CGUISpriteInstance)
|
||||||
TYPE(EAlign)
|
TYPE(EAlign)
|
||||||
TYPE(EVAlign)
|
TYPE(EVAlign)
|
||||||
#undef TYPE
|
#undef TYPE
|
||||||
|
|||||||
+7
-37
@@ -21,7 +21,6 @@ gee@pyro.nu
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Includes / Compiler directives
|
// Includes / Compiler directives
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
#include "GUI.h"
|
|
||||||
#include "Parser.h"
|
#include "Parser.h"
|
||||||
// TODO Gee: New
|
// TODO Gee: New
|
||||||
#include "Overlay.h"
|
#include "Overlay.h"
|
||||||
@@ -36,39 +35,6 @@ class CGUIString;
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
bool __ParseString(const CStr& Value, T &tOutput);
|
bool __ParseString(const CStr& Value, T &tOutput);
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<bool>(const CStr& Value, bool &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<int>(const CStr& Value, int &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<float>(const CStr& Value, float &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CRect>(const CStr& Value, CRect &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CClientArea>(const CStr& Value, CClientArea &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CColor>(const CStr& Value, CColor &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CSize>(const CStr& Value, CSize &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<EAlign>(const CStr& Value, EAlign &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<EVAlign>(const CStr& Value, EVAlign &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CGUIString>(const CStr& Value, CGUIString &Output);
|
|
||||||
|
|
||||||
template <>
|
|
||||||
bool __ParseString<CStrW>(const CStr& Value, CStrW &Output);
|
|
||||||
|
|
||||||
|
|
||||||
// Icon, you create them in the XML file with root element <setup>
|
// Icon, you create them in the XML file with root element <setup>
|
||||||
// you use them in text owned by different objects... Such as CText.
|
// you use them in text owned by different objects... Such as CText.
|
||||||
@@ -129,6 +95,8 @@ public:
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
class CGUI;
|
class CGUI;
|
||||||
class IGUIObject;
|
class IGUIObject;
|
||||||
|
struct SGUIMessage;
|
||||||
|
class CGUISpriteInstance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gustav Larsson
|
* @author Gustav Larsson
|
||||||
@@ -211,7 +179,7 @@ public:
|
|||||||
* Sets a value by name using a real datatype as input.
|
* Sets a value by name using a real datatype as input.
|
||||||
*
|
*
|
||||||
* This is the official way of setting a setting, no other
|
* This is the official way of setting a setting, no other
|
||||||
* way should only causiously be used!
|
* way should only cautiously be used!
|
||||||
*
|
*
|
||||||
* @param pObject Object pointer
|
* @param pObject Object pointer
|
||||||
* @param Setting Setting by name
|
* @param Setting Setting by name
|
||||||
@@ -338,10 +306,12 @@ public:
|
|||||||
* @param sec Secondary sprite if Primary should fail
|
* @param sec Secondary sprite if Primary should fail
|
||||||
* @return Resulting string
|
* @return Resulting string
|
||||||
*/
|
*/
|
||||||
static CStr FallBackSprite(const CStr& prim, const CStr& sec)
|
static CGUISpriteInstance& FallBackSprite(
|
||||||
|
CGUISpriteInstance& prim,
|
||||||
|
CGUISpriteInstance& sec)
|
||||||
{
|
{
|
||||||
// CStr() == empty string, null
|
// CStr() == empty string, null
|
||||||
return ((prim!=CStr())?(prim):(sec));
|
return (prim.IsEmpty() ? sec : prim);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -88,10 +88,10 @@ CColor IGUIButtonBehavior::ChooseColor()
|
|||||||
|
|
||||||
void IGUIButtonBehavior::DrawButton(const CRect &rect,
|
void IGUIButtonBehavior::DrawButton(const CRect &rect,
|
||||||
const float &z,
|
const float &z,
|
||||||
const CStr& sprite,
|
CGUISpriteInstance& sprite,
|
||||||
const CStr& sprite_over,
|
CGUISpriteInstance& sprite_over,
|
||||||
const CStr& sprite_pressed,
|
CGUISpriteInstance& sprite_pressed,
|
||||||
const CStr& sprite_disabled)
|
CGUISpriteInstance& sprite_disabled)
|
||||||
{
|
{
|
||||||
if (GetGUI())
|
if (GetGUI())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ gee@pyro.nu
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
#include "GUI.h"
|
#include "GUI.h"
|
||||||
|
|
||||||
|
class CGUISpriteInstance;
|
||||||
|
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Macros
|
// Macros
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
@@ -74,10 +76,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
void DrawButton(const CRect &rect,
|
void DrawButton(const CRect &rect,
|
||||||
const float &z,
|
const float &z,
|
||||||
const CStr& sprite,
|
CGUISpriteInstance& sprite,
|
||||||
const CStr& sprite_over,
|
CGUISpriteInstance& sprite_over,
|
||||||
const CStr& sprite_pressed,
|
CGUISpriteInstance& sprite_pressed,
|
||||||
const CStr& sprite_disabled);
|
CGUISpriteInstance& sprite_disabled);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Choosing which color of the following according to
|
* Choosing which color of the following according to
|
||||||
|
|||||||
@@ -67,12 +67,13 @@ IGUIObject::~IGUIObject()
|
|||||||
TYPE(CColor);
|
TYPE(CColor);
|
||||||
TYPE(CClientArea);
|
TYPE(CClientArea);
|
||||||
TYPE(CGUIString);
|
TYPE(CGUIString);
|
||||||
|
TYPE(CGUISpriteInstance);
|
||||||
TYPE(CStr);
|
TYPE(CStr);
|
||||||
TYPE(CStrW);
|
TYPE(CStrW);
|
||||||
TYPE(EAlign);
|
TYPE(EAlign);
|
||||||
TYPE(EVAlign);
|
TYPE(EVAlign);
|
||||||
default:
|
default:
|
||||||
assert(!"Invalid setting type");
|
debug_warn("Invalid setting type");
|
||||||
}
|
}
|
||||||
#undef TYPE
|
#undef TYPE
|
||||||
}
|
}
|
||||||
@@ -170,6 +171,7 @@ void IGUIObject::AddSetting(const EGUISettingType &Type, const CStr& Name)
|
|||||||
CASE_TYPE(CStrW)
|
CASE_TYPE(CStrW)
|
||||||
CASE_TYPE(CColor)
|
CASE_TYPE(CColor)
|
||||||
CASE_TYPE(CGUIString)
|
CASE_TYPE(CGUIString)
|
||||||
|
CASE_TYPE(CGUISpriteInstance)
|
||||||
CASE_TYPE(EAlign)
|
CASE_TYPE(EAlign)
|
||||||
CASE_TYPE(EVAlign)
|
CASE_TYPE(EVAlign)
|
||||||
|
|
||||||
@@ -225,7 +227,7 @@ void IGUIObject::UpdateMouseOver(IGUIObject * const &pMouseOver)
|
|||||||
bool IGUIObject::SettingExists(const CStr& Setting) const
|
bool IGUIObject::SettingExists(const CStr& Setting) const
|
||||||
{
|
{
|
||||||
// Because GetOffsets will direct dynamically defined
|
// Because GetOffsets will direct dynamically defined
|
||||||
// classes with polymorifsm to respective ms_SettingsInfo
|
// classes with polymorphism to respective ms_SettingsInfo
|
||||||
// we need to make no further updates on this function
|
// we need to make no further updates on this function
|
||||||
// in derived classes.
|
// in derived classes.
|
||||||
//return (GetSettingsInfo().count(Setting) >= 1);
|
//return (GetSettingsInfo().count(Setting) >= 1);
|
||||||
@@ -264,6 +266,7 @@ PS_RESULT IGUIObject::SetSetting(const CStr& Setting, const CStr& Value)
|
|||||||
ADD_TYPE(CColor)
|
ADD_TYPE(CColor)
|
||||||
ADD_TYPE(CClientArea)
|
ADD_TYPE(CClientArea)
|
||||||
ADD_TYPE(CGUIString)
|
ADD_TYPE(CGUIString)
|
||||||
|
ADD_TYPE(CGUISpriteInstance)
|
||||||
ADD_TYPE(EAlign)
|
ADD_TYPE(EAlign)
|
||||||
ADD_TYPE(EVAlign)
|
ADD_TYPE(EVAlign)
|
||||||
else
|
else
|
||||||
@@ -438,7 +441,7 @@ void IGUIObject::RegisterScriptHandler(const CStr& Action, const CStr& Code, CGU
|
|||||||
|
|
||||||
void IGUIObject::ScriptEvent(const CStr& Action)
|
void IGUIObject::ScriptEvent(const CStr& Action)
|
||||||
{
|
{
|
||||||
map<CStr, void*>::iterator it = m_ScriptHandlers.find(Action);
|
map<CStr, JSFunction*>::iterator it = m_ScriptHandlers.find(Action);
|
||||||
if (it == m_ScriptHandlers.end())
|
if (it == m_ScriptHandlers.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -474,7 +477,7 @@ void IGUIObject::ScriptEvent(const CStr& Action)
|
|||||||
paramData[0] = OBJECT_TO_JSVAL(mouseObj);
|
paramData[0] = OBJECT_TO_JSVAL(mouseObj);
|
||||||
|
|
||||||
jsval result;
|
jsval result;
|
||||||
JSBool ok = JS_CallFunction(g_ScriptingHost.getContext(), jsGuiObject, (JSFunction*)((*it).second), 1, paramData, &result);
|
JSBool ok = JS_CallFunction(g_ScriptingHost.getContext(), jsGuiObject, it->second, 1, paramData, &result);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
{
|
{
|
||||||
JS_ReportError(g_ScriptingHost.getContext(), "Errors executing script action \"%s\"", Action.c_str());
|
JS_ReportError(g_ScriptingHost.getContext(), "Errors executing script action \"%s\"", Action.c_str());
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ class CGUI;
|
|||||||
// Map with pointers
|
// Map with pointers
|
||||||
typedef std::map<CStr, SGUISetting> map_Settings;
|
typedef std::map<CStr, SGUISetting> map_Settings;
|
||||||
|
|
||||||
|
struct JSObject;
|
||||||
|
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
// Error declarations
|
// Error declarations
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
@@ -78,6 +80,7 @@ enum EGUISettingType
|
|||||||
GUIST_CGUIString,
|
GUIST_CGUIString,
|
||||||
GUIST_CStr,
|
GUIST_CStr,
|
||||||
GUIST_CStrW,
|
GUIST_CStrW,
|
||||||
|
GUIST_CGUISpriteInstance,
|
||||||
GUIST_EAlign,
|
GUIST_EAlign,
|
||||||
GUIST_EVAlign
|
GUIST_EVAlign
|
||||||
};
|
};
|
||||||
@@ -433,7 +436,7 @@ protected:
|
|||||||
/**
|
/**
|
||||||
* Internal storage for registered script handlers.
|
* Internal storage for registered script handlers.
|
||||||
*/
|
*/
|
||||||
std::map<CStr, void*> m_ScriptHandlers;
|
std::map<CStr, JSFunction*> m_ScriptHandlers;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void IGUIScrollBar::SetupBarSize()
|
|||||||
m_BarSize = min((float)m_ScrollSpace/(float)m_ScrollRange, 1.f);
|
m_BarSize = min((float)m_ScrollSpace/(float)m_ScrollRange, 1.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SGUIScrollBarStyle *IGUIScrollBar::GetStyle() const
|
SGUIScrollBarStyle *IGUIScrollBar::GetStyle() const
|
||||||
{
|
{
|
||||||
if (!m_pHostObject)
|
if (!m_pHostObject)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
+22
-22
@@ -83,38 +83,38 @@ struct SGUIScrollBarStyle
|
|||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
CStr m_SpriteButtonTop;
|
CGUISpriteInstance m_SpriteButtonTop;
|
||||||
CStr m_SpriteButtonTopPressed;
|
CGUISpriteInstance m_SpriteButtonTopPressed;
|
||||||
CStr m_SpriteButtonTopDisabled;
|
CGUISpriteInstance m_SpriteButtonTopDisabled;
|
||||||
CStr m_SpriteButtonTopOver;
|
CGUISpriteInstance m_SpriteButtonTopOver;
|
||||||
|
|
||||||
CStr m_SpriteButtonBottom;
|
CGUISpriteInstance m_SpriteButtonBottom;
|
||||||
CStr m_SpriteButtonBottomPressed;
|
CGUISpriteInstance m_SpriteButtonBottomPressed;
|
||||||
CStr m_SpriteButtonBottomDisabled;
|
CGUISpriteInstance m_SpriteButtonBottomDisabled;
|
||||||
CStr m_SpriteButtonBottomOver;
|
CGUISpriteInstance m_SpriteButtonBottomOver;
|
||||||
|
|
||||||
CStr m_SpriteBarVertical;
|
CGUISpriteInstance m_SpriteBarVertical;
|
||||||
CStr m_SpriteBarVerticalOver;
|
CGUISpriteInstance m_SpriteBarVerticalOver;
|
||||||
CStr m_SpriteBarVerticalPressed;
|
CGUISpriteInstance m_SpriteBarVerticalPressed;
|
||||||
|
|
||||||
CStr m_SpriteBackVertical;
|
CGUISpriteInstance m_SpriteBackVertical;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
/** @name Verical Sprites */
|
/** @name Vertical Sprites */
|
||||||
//--------------------------------------------------------
|
//--------------------------------------------------------
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
CStr m_SpriteButtonLeft;
|
CGUISpriteInstance m_SpriteButtonLeft;
|
||||||
CStr m_SpriteButtonLeftPressed;
|
CGUISpriteInstance m_SpriteButtonLeftPressed;
|
||||||
CStr m_SpriteButtonLeftDisabled;
|
CGUISpriteInstance m_SpriteButtonLeftDisabled;
|
||||||
|
|
||||||
CStr m_SpriteButtonRight;
|
CGUISpriteInstance m_SpriteButtonRight;
|
||||||
CStr m_SpriteButtonRightPressed;
|
CGUISpriteInstance m_SpriteButtonRightPressed;
|
||||||
CStr m_SpriteButtonRightDisabled;
|
CGUISpriteInstance m_SpriteButtonRightDisabled;
|
||||||
|
|
||||||
CStr m_SpriteBackHorizontal;
|
CGUISpriteInstance m_SpriteBackHorizontal;
|
||||||
CStr m_SpriteBarHorizontal;
|
CGUISpriteInstance m_SpriteBarHorizontal;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
};
|
};
|
||||||
@@ -288,7 +288,7 @@ public:
|
|||||||
* Get style used by the scrollbar
|
* Get style used by the scrollbar
|
||||||
* @return Scroll bar style struct.
|
* @return Scroll bar style struct.
|
||||||
*/
|
*/
|
||||||
const SGUIScrollBarStyle * GetStyle() const;
|
SGUIScrollBarStyle * GetStyle() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ void IGUIScrollBarOwner::AddScrollBar(IGUIScrollBar * scrollbar)
|
|||||||
m_ScrollBars.push_back(scrollbar);
|
m_ScrollBars.push_back(scrollbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SGUIScrollBarStyle * IGUIScrollBarOwner::GetScrollBarStyle(const CStr& style) const
|
SGUIScrollBarStyle * IGUIScrollBarOwner::GetScrollBarStyle(const CStr& style) const
|
||||||
{
|
{
|
||||||
if (!GetGUI())
|
if (!GetGUI())
|
||||||
{
|
{
|
||||||
@@ -58,7 +58,7 @@ const SGUIScrollBarStyle * IGUIScrollBarOwner::GetScrollBarStyle(const CStr& sty
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &GetGUI()->m_ScrollBarStyles.find(style)->second;
|
return &((CGUI*)GetGUI())->m_ScrollBarStyles.find(style)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IGUIScrollBarOwner::HandleMessage(const SGUIMessage &Message)
|
void IGUIScrollBarOwner::HandleMessage(const SGUIMessage &Message)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Interface for the m_ScrollBar to use.
|
* Interface for the m_ScrollBar to use.
|
||||||
*/
|
*/
|
||||||
virtual const SGUIScrollBarStyle *GetScrollBarStyle(const CStr& style) const;
|
virtual SGUIScrollBarStyle *GetScrollBarStyle(const CStr& style) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a scroll-bar
|
* Add a scroll-bar
|
||||||
|
|||||||
@@ -37,17 +37,17 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
// the private IGUIObject* has been set (and thus crash). The others are
|
// the private IGUIObject* has been set (and thus crash). The others are
|
||||||
// just for efficiency, and to allow correct reporting of attempts to access
|
// just for efficiency, and to allow correct reporting of attempts to access
|
||||||
// nonexistent properties.)
|
// nonexistent properties.)
|
||||||
if (propName == (CStr)"constructor" ||
|
if (propName == "constructor" ||
|
||||||
propName == (CStr)"prototype" ||
|
propName == "prototype" ||
|
||||||
propName == (CStr)"toString" ||
|
propName == "toString" ||
|
||||||
propName == (CStr)"getByName"
|
propName == "getByName"
|
||||||
)
|
)
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
|
|
||||||
IGUIObject* e = (IGUIObject*)JS_GetPrivate(cx, obj);
|
IGUIObject* e = (IGUIObject*)JS_GetPrivate(cx, obj);
|
||||||
|
|
||||||
// Handle the "parent" property specially
|
// Handle the "parent" property specially
|
||||||
if (propName == (CStr)"parent")
|
if (propName == "parent")
|
||||||
{
|
{
|
||||||
IGUIObject* parent = e->GetParent();
|
IGUIObject* parent = e->GetParent();
|
||||||
if (parent)
|
if (parent)
|
||||||
@@ -65,7 +65,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
// Also handle "name" specially
|
// Also handle "name" specially
|
||||||
else if (propName == (CStr)"name")
|
else if (propName == "name")
|
||||||
{
|
{
|
||||||
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, e->GetName()));
|
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, e->GetName()));
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
@@ -163,7 +163,6 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
{
|
{
|
||||||
CGUIString value;
|
CGUIString value;
|
||||||
GUI<CGUIString>::GetSetting(e, propName, value);
|
GUI<CGUIString>::GetSetting(e, propName, value);
|
||||||
// Create a garbage-collectable copy of the string
|
|
||||||
JSString* s = StringConvert::wchars_to_jsstring(cx, value.GetRawString().c_str());
|
JSString* s = StringConvert::wchars_to_jsstring(cx, value.GetRawString().c_str());
|
||||||
*vp = STRING_TO_JSVAL(s);
|
*vp = STRING_TO_JSVAL(s);
|
||||||
break;
|
break;
|
||||||
@@ -173,8 +172,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
{
|
{
|
||||||
CStr value;
|
CStr value;
|
||||||
GUI<CStr>::GetSetting(e, propName, value);
|
GUI<CStr>::GetSetting(e, propName, value);
|
||||||
// Create a garbage-collectible copy of the string
|
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, value));
|
||||||
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, value.c_str() ));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,8 +180,15 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
{
|
{
|
||||||
CStrW value;
|
CStrW value;
|
||||||
GUI<CStrW>::GetSetting(e, propName, value);
|
GUI<CStrW>::GetSetting(e, propName, value);
|
||||||
// Create a garbage-collectible copy of the string
|
*vp = STRING_TO_JSVAL(JS_NewUCStringCopyZ(cx, value.utf16().c_str()));
|
||||||
*vp = STRING_TO_JSVAL(JS_NewUCStringCopyZ(cx, value.utf16().c_str() ));
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GUIST_CGUISpriteInstance:
|
||||||
|
{
|
||||||
|
CGUISpriteInstance value;
|
||||||
|
GUI<CGUISpriteInstance>::GetSetting(e, propName, value);
|
||||||
|
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, value.GetName()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,7 +208,7 @@ JSBool JSI_IGUIObject::setProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
{
|
{
|
||||||
IGUIObject* e = (IGUIObject*)JS_GetPrivate(cx, obj);
|
IGUIObject* e = (IGUIObject*)JS_GetPrivate(cx, obj);
|
||||||
CStr propName = g_ScriptingHost.ValueToString(id);
|
CStr propName = g_ScriptingHost.ValueToString(id);
|
||||||
if (propName == (CStr)"name")
|
if (propName == "name")
|
||||||
{
|
{
|
||||||
CStr propValue = JS_GetStringBytes(JS_ValueToString(cx, *vp));
|
CStr propValue = JS_GetStringBytes(JS_ValueToString(cx, *vp));
|
||||||
e->SetName(propValue);
|
e->SetName(propValue);
|
||||||
@@ -223,7 +228,7 @@ JSBool JSI_IGUIObject::setProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
|
|
||||||
case GUIST_CStr:
|
case GUIST_CStr:
|
||||||
{
|
{
|
||||||
CStr value = JS_GetStringBytes(JS_ValueToString(cx, *vp));
|
CStr value (JS_GetStringBytes(JS_ValueToString(cx, *vp)));
|
||||||
GUI<CStr>::SetSetting(e, propName, value);
|
GUI<CStr>::SetSetting(e, propName, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -235,6 +240,13 @@ JSBool JSI_IGUIObject::setProperty(JSContext* cx, JSObject* obj, jsval id, jsval
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case GUIST_CGUISpriteInstance:
|
||||||
|
{
|
||||||
|
CStr value (JS_GetStringBytes(JS_ValueToString(cx, *vp)));
|
||||||
|
GUI<CGUISpriteInstance>::SetSetting(e, propName, value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case GUIST_CGUIString:
|
case GUIST_CGUIString:
|
||||||
{
|
{
|
||||||
std::wstring value;
|
std::wstring value;
|
||||||
|
|||||||
Reference in New Issue
Block a user