Removes complex transform from TextRenderer.
This was SVN commit r25648.
This commit is contained in:
parent
94d669c198
commit
83608c9205
@ -203,7 +203,7 @@ void CCanvas2D::DrawText(CTextRenderer& textRenderer)
|
|||||||
CShaderProgramPtr shader = m->Tech->GetShader();
|
CShaderProgramPtr shader = m->Tech->GetShader();
|
||||||
shader->Uniform(str_grayscaleFactor, 0.0f);
|
shader->Uniform(str_grayscaleFactor, 0.0f);
|
||||||
|
|
||||||
textRenderer.Render(shader);
|
textRenderer.Render(shader, GetDefaultGuiMatrix());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCanvas2D::Flush()
|
void CCanvas2D::Flush()
|
||||||
|
@ -23,51 +23,29 @@
|
|||||||
#include "graphics/FontManager.h"
|
#include "graphics/FontManager.h"
|
||||||
#include "graphics/ShaderProgram.h"
|
#include "graphics/ShaderProgram.h"
|
||||||
#include "lib/ogl.h"
|
#include "lib/ogl.h"
|
||||||
|
#include "maths/Matrix3D.h"
|
||||||
#include "ps/CStrIntern.h"
|
#include "ps/CStrIntern.h"
|
||||||
#include "ps/CStrInternStatic.h"
|
#include "ps/CStrInternStatic.h"
|
||||||
#include "ps/GameSetup/Config.h"
|
|
||||||
#include "renderer/Renderer.h"
|
#include "renderer/Renderer.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
CTextRenderer::CTextRenderer()
|
CTextRenderer::CTextRenderer()
|
||||||
{
|
{
|
||||||
ResetTransform();
|
ResetTranslate();
|
||||||
SetCurrentColor(CColor(1.0f, 1.0f, 1.0f, 1.0f));
|
SetCurrentColor(CColor(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
SetCurrentFont(str_sans_10);
|
SetCurrentFont(str_sans_10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTextRenderer::ResetTransform()
|
void CTextRenderer::ResetTranslate(const CVector2D& translate)
|
||||||
{
|
{
|
||||||
float xres = g_xres / g_GuiScale;
|
m_Translate = translate;
|
||||||
float yres = g_yres / g_GuiScale;
|
|
||||||
|
|
||||||
m_Transform.SetIdentity();
|
|
||||||
m_Transform.Scale(1.0f, -1.f, 1.0f);
|
|
||||||
m_Transform.Translate(0.0f, yres, -1000.0f);
|
|
||||||
|
|
||||||
CMatrix3D proj;
|
|
||||||
proj.SetOrtho(0.f, xres, 0.f, yres, -1.f, 1000.f);
|
|
||||||
m_Transform = proj * m_Transform;
|
|
||||||
m_Dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CMatrix3D CTextRenderer::GetTransform()
|
|
||||||
{
|
|
||||||
return m_Transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTextRenderer::SetTransform(const CMatrix3D& transform)
|
|
||||||
{
|
|
||||||
m_Transform = transform;
|
|
||||||
m_Dirty = true;
|
m_Dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTextRenderer::Translate(float x, float y)
|
void CTextRenderer::Translate(float x, float y)
|
||||||
{
|
{
|
||||||
CMatrix3D m;
|
m_Translate += CVector2D{x, y};
|
||||||
m.SetTranslation(x, y, 0.0f);
|
|
||||||
m_Transform = m_Transform * m;
|
|
||||||
m_Dirty = true;
|
m_Dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,7 +157,7 @@ void CTextRenderer::PutString(float x, float y, const std::wstring* buf, bool ow
|
|||||||
{
|
{
|
||||||
SBatch batch;
|
SBatch batch;
|
||||||
batch.chars = 0;
|
batch.chars = 0;
|
||||||
batch.transform = m_Transform;
|
batch.translate = m_Translate;
|
||||||
batch.color = m_Color;
|
batch.color = m_Color;
|
||||||
batch.font = m_Font;
|
batch.font = m_Font;
|
||||||
m_Batches.push_back(batch);
|
m_Batches.push_back(batch);
|
||||||
@ -212,24 +190,24 @@ struct SBatchCompare
|
|||||||
return true;
|
return true;
|
||||||
if (b.font < a.font)
|
if (b.font < a.font)
|
||||||
return false;
|
return false;
|
||||||
// TODO: is it worth sorting by color/transform too?
|
// TODO: is it worth sorting by color/translate too?
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void CTextRenderer::Render(const CShaderProgramPtr& shader)
|
void CTextRenderer::Render(const CShaderProgramPtr& shader, const CMatrix3D& transform)
|
||||||
{
|
{
|
||||||
std::vector<u16> indexes;
|
std::vector<u16> indexes;
|
||||||
std::vector<t2f_v2i> vertexes;
|
std::vector<t2f_v2i> vertexes;
|
||||||
|
|
||||||
// Try to merge non-consecutive batches that share the same font/color/transform:
|
// Try to merge non-consecutive batches that share the same font/color/translate:
|
||||||
// sort the batch list by font, then merge the runs of adjacent compatible batches
|
// sort the batch list by font, then merge the runs of adjacent compatible batches
|
||||||
m_Batches.sort(SBatchCompare());
|
m_Batches.sort(SBatchCompare());
|
||||||
for (std::list<SBatch>::iterator it = m_Batches.begin(); it != m_Batches.end(); )
|
for (std::list<SBatch>::iterator it = m_Batches.begin(); it != m_Batches.end(); )
|
||||||
{
|
{
|
||||||
std::list<SBatch>::iterator next = it;
|
std::list<SBatch>::iterator next = it;
|
||||||
++next;
|
++next;
|
||||||
if (next != m_Batches.end() && it->font == next->font && it->color == next->color && it->transform == next->transform)
|
if (next != m_Batches.end() && it->font == next->font && it->color == next->color && it->translate == next->translate)
|
||||||
{
|
{
|
||||||
it->chars += next->chars;
|
it->chars += next->chars;
|
||||||
it->runs.splice(it->runs.end(), next->runs);
|
it->runs.splice(it->runs.end(), next->runs);
|
||||||
@ -252,7 +230,9 @@ void CTextRenderer::Render(const CShaderProgramPtr& shader)
|
|||||||
shader->BindTexture(str_tex, batch.font->GetTexture());
|
shader->BindTexture(str_tex, batch.font->GetTexture());
|
||||||
}
|
}
|
||||||
|
|
||||||
shader->Uniform(str_transform, batch.transform);
|
CMatrix3D translation;
|
||||||
|
translation.SetTranslation(batch.translate.X, batch.translate.Y, 0.0f);
|
||||||
|
shader->Uniform(str_transform, transform * translation);
|
||||||
|
|
||||||
// ALPHA-only textures will have .rgb sampled as 0, so we need to
|
// ALPHA-only textures will have .rgb sampled as 0, so we need to
|
||||||
// replace it with white (but not affect RGBA textures)
|
// replace it with white (but not affect RGBA textures)
|
||||||
|
@ -20,13 +20,14 @@
|
|||||||
|
|
||||||
#include "graphics/Color.h"
|
#include "graphics/Color.h"
|
||||||
#include "graphics/ShaderProgramPtr.h"
|
#include "graphics/ShaderProgramPtr.h"
|
||||||
#include "maths/Matrix3D.h"
|
|
||||||
#include "maths/Rect.h"
|
#include "maths/Rect.h"
|
||||||
|
#include "maths/Vector2D.h"
|
||||||
#include "ps/CStrIntern.h"
|
#include "ps/CStrIntern.h"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
class CFont;
|
class CFont;
|
||||||
|
class CMatrix3D;
|
||||||
|
|
||||||
class CTextRenderer
|
class CTextRenderer
|
||||||
{
|
{
|
||||||
@ -34,14 +35,11 @@ public:
|
|||||||
CTextRenderer();
|
CTextRenderer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the text transform to the default, with (0,0) in the top-left of the screen.
|
* Reset the text transform to the default, with (0,0) in the top-left corner.
|
||||||
*/
|
*/
|
||||||
void ResetTransform();
|
void ResetTranslate(const CVector2D& translate = CVector2D{});
|
||||||
|
|
||||||
CMatrix3D GetTransform();
|
|
||||||
|
|
||||||
void SetTransform(const CMatrix3D& transform);
|
|
||||||
|
|
||||||
|
const CVector2D& GetTranslate() const { return m_Translate; }
|
||||||
void Translate(float x, float y);
|
void Translate(float x, float y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -104,7 +102,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Render all of the previously printed text calls.
|
* Render all of the previously printed text calls.
|
||||||
*/
|
*/
|
||||||
void Render(const CShaderProgramPtr& shader);
|
void Render(const CShaderProgramPtr& shader, const CMatrix3D& transform);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend struct SBatchCompare;
|
friend struct SBatchCompare;
|
||||||
@ -151,7 +149,7 @@ private:
|
|||||||
struct SBatch
|
struct SBatch
|
||||||
{
|
{
|
||||||
size_t chars; // sum of runs[i].text->size()
|
size_t chars; // sum of runs[i].text->size()
|
||||||
CMatrix3D transform;
|
CVector2D translate;
|
||||||
CColor color;
|
CColor color;
|
||||||
std::shared_ptr<CFont> font;
|
std::shared_ptr<CFont> font;
|
||||||
std::list<SBatchRun> runs;
|
std::list<SBatchRun> runs;
|
||||||
@ -159,9 +157,7 @@ private:
|
|||||||
|
|
||||||
void PutString(float x, float y, const std::wstring* buf, bool owned);
|
void PutString(float x, float y, const std::wstring* buf, bool owned);
|
||||||
|
|
||||||
CShaderProgramPtr m_Shader;
|
CVector2D m_Translate;
|
||||||
|
|
||||||
CMatrix3D m_Transform;
|
|
||||||
CRect m_Clipping;
|
CRect m_Clipping;
|
||||||
|
|
||||||
CColor m_Color;
|
CColor m_Color;
|
||||||
|
@ -1433,7 +1433,7 @@ void CInput::Draw(CCanvas2D& canvas)
|
|||||||
if (m_MultiLine && buffered_y + m_BufferZone > m_CachedActualSize.GetHeight())
|
if (m_MultiLine && buffered_y + m_BufferZone > m_CachedActualSize.GetHeight())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CMatrix3D savedTransform = textRenderer.GetTransform();
|
const CVector2D savedTranslate = textRenderer.GetTranslate();
|
||||||
|
|
||||||
// Text must always be drawn in integer values. So we have to convert scroll
|
// Text must always be drawn in integer values. So we have to convert scroll
|
||||||
if (m_MultiLine)
|
if (m_MultiLine)
|
||||||
@ -1504,7 +1504,7 @@ void CInput::Draw(CCanvas2D& canvas)
|
|||||||
textRenderer.SetCurrentColor(m_TextColorSelected);
|
textRenderer.SetCurrentColor(m_TextColorSelected);
|
||||||
}
|
}
|
||||||
|
|
||||||
textRenderer.SetTransform(savedTransform);
|
textRenderer.ResetTranslate(savedTranslate);
|
||||||
}
|
}
|
||||||
|
|
||||||
textRenderer.Translate(0.f, ls);
|
textRenderer.Translate(0.f, ls);
|
||||||
|
@ -190,11 +190,9 @@ void CConsole::Render()
|
|||||||
|
|
||||||
CTextRenderer textRenderer;
|
CTextRenderer textRenderer;
|
||||||
textRenderer.SetCurrentFont(CStrIntern(CONSOLE_FONT));
|
textRenderer.SetCurrentFont(CStrIntern(CONSOLE_FONT));
|
||||||
// animation: slide in from top of screen
|
// Animation: slide in from top of screen.
|
||||||
CMatrix3D transform = GetDefaultGuiMatrix();
|
|
||||||
const float DeltaY = (1.0f - m_fVisibleFrac) * m_fHeight;
|
const float DeltaY = (1.0f - m_fVisibleFrac) * m_fHeight;
|
||||||
transform.PostTranslate(m_fX, m_fY - DeltaY, 0.0f); // move to window position
|
textRenderer.Translate(m_fX, m_fY - DeltaY);
|
||||||
textRenderer.SetTransform(transform);
|
|
||||||
|
|
||||||
DrawHistory(textRenderer);
|
DrawHistory(textRenderer);
|
||||||
DrawBuffer(textRenderer);
|
DrawBuffer(textRenderer);
|
||||||
@ -257,7 +255,7 @@ void CConsole::DrawBuffer(CTextRenderer& textRenderer)
|
|||||||
if (m_fHeight < m_iFontHeight)
|
if (m_fHeight < m_iFontHeight)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CMatrix3D savedTransform = textRenderer.GetTransform();
|
const CVector2D savedTranslate = textRenderer.GetTranslate();
|
||||||
|
|
||||||
textRenderer.Translate(2.0f, m_fHeight - (float)m_iFontOffset + 1.0f);
|
textRenderer.Translate(2.0f, m_fHeight - (float)m_iFontOffset + 1.0f);
|
||||||
|
|
||||||
@ -276,7 +274,7 @@ void CConsole::DrawBuffer(CTextRenderer& textRenderer)
|
|||||||
DrawCursor(textRenderer);
|
DrawCursor(textRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
textRenderer.SetTransform(savedTransform);
|
textRenderer.ResetTranslate(savedTranslate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConsole::DrawCursor(CTextRenderer& textRenderer)
|
void CConsole::DrawCursor(CTextRenderer& textRenderer)
|
||||||
|
@ -242,14 +242,14 @@ void CLogger::Render()
|
|||||||
textRenderer.SetCurrentColor(CColor(1.0f, 0.0f, 0.0f, 1.0f));
|
textRenderer.SetCurrentColor(CColor(1.0f, 0.0f, 0.0f, 1.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
CMatrix3D savedTransform = textRenderer.GetTransform();
|
const CVector2D savedTranslate = textRenderer.GetTranslate();
|
||||||
|
|
||||||
textRenderer.PrintfAdvance(L"[%8.3f] %hs: ", msg.time, type);
|
textRenderer.PrintfAdvance(L"[%8.3f] %hs: ", msg.time, type);
|
||||||
// Display the actual message in white so it's more readable
|
// Display the actual message in white so it's more readable
|
||||||
textRenderer.SetCurrentColor(CColor(1.0f, 1.0f, 1.0f, 1.0f));
|
textRenderer.SetCurrentColor(CColor(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
textRenderer.Put(0.0f, 0.0f, msg.message.c_str());
|
textRenderer.Put(0.0f, 0.0f, msg.message.c_str());
|
||||||
|
|
||||||
textRenderer.SetTransform(savedTransform);
|
textRenderer.ResetTranslate(savedTranslate);
|
||||||
|
|
||||||
textRenderer.Translate(0.0f, (float)lineSpacing);
|
textRenderer.Translate(0.0f, (float)lineSpacing);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user