[colobot] 315/390: Implemented button rendering in SatCom (#232)
Didier Raboud
odyx at moszumanska.debian.org
Fri Jun 12 14:21:59 UTC 2015
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch upstream/latest
in repository colobot.
commit efe04be1c210c5d609df0d00bb784268033170b9
Author: krzys-h <krzys_h at interia.pl>
Date: Tue Apr 7 12:06:43 2015 +0200
Implemented button rendering in SatCom (#232)
Finally!
---
src/graphics/engine/text.cpp | 140 +++++++++++++++++++++++++++++++------------
src/ui/edit.cpp | 2 -
2 files changed, 102 insertions(+), 40 deletions(-)
diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp
index bebf30c..b383a6b 100644
--- a/src/graphics/engine/text.cpp
+++ b/src/graphics/engine/text.cpp
@@ -621,9 +621,6 @@ void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::itera
if (format + fmtIndex != end)
font = static_cast<FontType>(*(format + fmtIndex) & FONT_MASK_FONT);
- // TODO: if (font == FONT_BUTTON)
- if (font == FONT_BUTTON) continue;
-
UTF8Char ch = *it;
float offset = pos.x - start;
@@ -786,57 +783,124 @@ void CText::DrawHighlight(FontHighlight hl, Math::Point pos, Math::Point size)
void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, Math::Point &pos, Color color)
{
- // TODO: if (font == FONT_BUTTON)
- if (font == FONT_BUTTON) return;
+ if(font == FONT_BUTTON)
+ {
+ Math::IntPoint windowSize = m_engine->GetWindowSize();
+ float height = GetHeight(FONT_COLOBOT, size);
+ float width = height*(static_cast<float>(windowSize.y)/windowSize.x);
- CachedFont* cf = GetOrOpenFont(font, size);
+ Math::Point p1(pos.x, pos.y);
+ Math::Point p2(pos.x + width, pos.y + height);
- if (cf == nullptr)
- return;
+ Math::Vector n(0.0f, 0.0f, -1.0f); // normal
- int width = 1;
- if (ch.c1 > 0 && ch.c1 < 32)
- {
- if (ch.c1 == '\t')
- width = m_tabSize;
+ // For whatever reason ch.c1 is a SIGNED char, we need to fix that
+ unsigned int icon = static_cast<unsigned char>(ch.c1);
+ if ( icon >= 192 )
+ {
+ icon -= 192;
+ m_engine->SetTexture("textures/interface/text.png");
+ m_engine->SetState(ENG_RSTATE_TTEXTURE_WHITE);
+ }
+ else if ( icon >= 128 )
+ {
+ icon -= 128;
+ m_engine->SetTexture("textures/interface/button3.png");
+ m_engine->SetState(ENG_RSTATE_TTEXTURE_WHITE);
+ }
+ else if ( icon >= 64 )
+ {
+ icon -= 64;
+ m_engine->SetTexture("textures/interface/button2.png");
+ m_engine->SetState(ENG_RSTATE_TTEXTURE_WHITE);
+ }
+ else
+ {
+ m_engine->SetTexture("textures/interface/button1.png");
+ m_engine->SetState(ENG_RSTATE_TTEXTURE_WHITE);
+ }
- ch = TranslateSpecialChar(ch.c1);
- }
+ Math::Point uv1, uv2;
+ uv1.x = (32.0f / 256.0f) * (icon%8);
+ uv1.y = (32.0f / 256.0f) * (icon/8);
+ uv2.x = (32.0f / 256.0f) + uv1.x;
+ uv2.y = (32.0f / 256.0f) + uv1.y;
- auto it = cf->cache.find(ch);
- CharTexture tex;
- if (it != cf->cache.end())
- {
- tex = (*it).second;
+ float dp = 0.5f / 256.0f;
+ uv1.x += dp;
+ uv1.y += dp;
+ uv2.x -= dp;
+ uv2.y -= dp;
+
+ Vertex quad[4] =
+ {
+ Vertex(Math::Vector(p1.x, p1.y, 0.0f), n, Math::Point(uv1.x, uv2.y)),
+ Vertex(Math::Vector(p1.x, p2.y, 0.0f), n, Math::Point(uv1.x, uv1.y)),
+ Vertex(Math::Vector(p2.x, p1.y, 0.0f), n, Math::Point(uv2.x, uv2.y)),
+ Vertex(Math::Vector(p2.x, p2.y, 0.0f), n, Math::Point(uv2.x, uv1.y))
+ };
+
+ m_device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, quad, 4, color);
+ m_engine->AddStatisticTriangle(2);
+
+ // Don't ask my why but using height instead of width makes the buttons align perfectly with text without icons in category list in SatCom
+ // It's magic!
+ pos.x += height;
+
+ // Don't forget to restore the state!
+ m_engine->SetState(ENG_RSTATE_TEXT);
}
else
{
- tex = CreateCharTexture(ch, cf);
+ CachedFont* cf = GetOrOpenFont(font, size);
- if (tex.id == 0) // invalid
+ if (cf == nullptr)
return;
- cf->cache[ch] = tex;
- }
+ int width = 1;
+ if (ch.c1 > 0 && ch.c1 < 32)
+ {
+ if (ch.c1 == '\t')
+ width = m_tabSize;
- Math::Point p1(pos.x, pos.y + tex.charSize.y - tex.texSize.y);
- Math::Point p2(pos.x + tex.texSize.x, pos.y + tex.charSize.y);
+ ch = TranslateSpecialChar(ch.c1);
+ }
- Math::Vector n(0.0f, 0.0f, -1.0f); // normal
+ auto it = cf->cache.find(ch);
+ CharTexture tex;
+ if (it != cf->cache.end())
+ {
+ tex = (*it).second;
+ }
+ else
+ {
+ tex = CreateCharTexture(ch, cf);
- Vertex quad[4] =
- {
- Vertex(Math::Vector(p1.x, p1.y, 0.0f), n, Math::Point(0.0f, 1.0f)),
- Vertex(Math::Vector(p1.x, p2.y, 0.0f), n, Math::Point(0.0f, 0.0f)),
- Vertex(Math::Vector(p2.x, p1.y, 0.0f), n, Math::Point(1.0f, 1.0f)),
- Vertex(Math::Vector(p2.x, p2.y, 0.0f), n, Math::Point(1.0f, 0.0f))
- };
+ if (tex.id == 0) // invalid
+ return;
- m_device->SetTexture(0, tex.id);
- m_device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, quad, 4, color);
- m_engine->AddStatisticTriangle(2);
+ cf->cache[ch] = tex;
+ }
+
+ Math::Point p1(pos.x, pos.y + tex.charSize.y - tex.texSize.y);
+ Math::Point p2(pos.x + tex.texSize.x, pos.y + tex.charSize.y);
- pos.x += tex.charSize.x * width;
+ Math::Vector n(0.0f, 0.0f, -1.0f); // normal
+
+ Vertex quad[4] =
+ {
+ Vertex(Math::Vector(p1.x, p1.y, 0.0f), n, Math::Point(0.0f, 1.0f)),
+ Vertex(Math::Vector(p1.x, p2.y, 0.0f), n, Math::Point(0.0f, 0.0f)),
+ Vertex(Math::Vector(p2.x, p1.y, 0.0f), n, Math::Point(1.0f, 1.0f)),
+ Vertex(Math::Vector(p2.x, p2.y, 0.0f), n, Math::Point(1.0f, 0.0f))
+ };
+
+ m_device->SetTexture(0, tex.id);
+ m_device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, quad, 4, color);
+ m_engine->AddStatisticTriangle(2);
+
+ pos.x += tex.charSize.x * width;
+ }
}
CachedFont* CText::GetOrOpenFont(FontType font, float size)
diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp
index 35afd50..3ebc281 100644
--- a/src/ui/edit.cpp
+++ b/src/ui/edit.cpp
@@ -1662,14 +1662,12 @@ bool CEdit::ReadText(std::string filename, int addSize)
buffer[i+6] == 'n' &&
buffer[i+7] == ' ' )
{
- /* TODO: \button X; isn't working. Issue #232
if ( m_bSoluce || !bInSoluce )
{
m_text[j] = GetValueParam(buffer+i+8, 0);
m_format[j] = font|Gfx::FONT_BUTTON;
j ++;
}
- */
i += strchr(buffer+i, ';')-(buffer+i)+1;
}
else if ( //m_format.size() > 0 &&
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list