- bugfix for rendering labels (now properly lines up with other controls)

This commit is contained in:
Mark Vejvoda 2011-10-02 02:14:05 +00:00
parent 75e73ec85d
commit 5d0eea51e3
5 changed files with 147 additions and 42 deletions

View File

@ -251,6 +251,13 @@ void GraphicComponent::resetFade(){
const int GraphicLabel::defH= 20;
const int GraphicLabel::defW= 70;
GraphicLabel::GraphicLabel() {
centered = false;
wordWrap = false;
centeredW = -1;
centeredH = 1;
}
void GraphicLabel::init(int x, int y, int w, int h, bool centered, Vec3f textColor, bool wordWrap) {
GraphicComponent::init(x, y, w, h);
this->centered= centered;
@ -258,6 +265,22 @@ void GraphicLabel::init(int x, int y, int w, int h, bool centered, Vec3f textCol
this->wordWrap = wordWrap;
}
bool GraphicLabel::getCenteredW() const {
bool result = (centered || centeredW == 1);
return result;
}
void GraphicLabel::setCenteredW(bool centered) {
centeredW = (centered ? 1 : 0);
}
bool GraphicLabel::getCenteredH() const {
bool result = (centered || centeredH == 1);
return result;
}
void GraphicLabel::setCenteredH(bool centered) {
centeredH = (centered ? 1 : 0);
}
// =====================================================
// class GraphicButton
// =====================================================

View File

@ -125,11 +125,22 @@ private:
Vec3f textColor;
bool wordWrap;
int centeredW;
int centeredH;
public:
GraphicLabel();
void init(int x, int y, int w=defW, int h=defH, bool centered= false, Vec3f textColor=Vec3f(1.f, 1.f, 1.f), bool wordWrap=false);
bool getCentered() const {return centered;}
void setCentered(bool centered) {this->centered= centered;}
bool getCenteredW() const;
void setCenteredW(bool centered);
bool getCenteredH() const;
void setCenteredH(bool centered);
Vec3f getTextColor() const {return textColor;}
void setTextColor(Vec3f color) {this->textColor= color;}

View File

@ -1655,9 +1655,11 @@ void Renderer::renderTextBoundingBox3D(const string &text, Font3D *font, float a
getCentered3DPos(text, font, pos, w, h, centeredW, centeredH);
}
textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
//textRenderer3D->begin(font);
textRenderer3D->render(text, pos.x, pos.y);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glDisable(GL_BLEND);
glPopAttrib();
@ -1671,9 +1673,11 @@ void Renderer::renderText3D(const string &text, Font3D *font, float alpha, int x
Vec2i pos= Vec2i(x, y);
//Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
textRenderer3D->render(text, pos.x, pos.y, centered);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glDisable(GL_BLEND);
glPopAttrib();
@ -1686,9 +1690,11 @@ void Renderer::renderText(const string &text, Font2D *font, float alpha, int x,
Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer->begin(font);
//textRenderer->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer,font);
textRenderer->render(text, pos.x, pos.y);
textRenderer->end();
//textRenderer->end();
safeTextRender.end();
glPopAttrib();
}
@ -1725,7 +1731,7 @@ Vec2f Renderer::getCentered3DPos(const string &text, Font3D *font, Vec2f &pos, i
//pos.y += (lineHeight / 2);
}
else if(lineHeight > h) {
//printf("line %d, lineHeight [%f] h [%d] text [%s]\n",__LINE__,lineHeight,h,text.c_str());
printf("line %d, lineHeight [%f] h [%d] text [%s]\n",__LINE__,lineHeight,h,text.c_str());
#ifdef USE_STREFLOP
pos.y += (streflop::ceil((float)lineHeight - (float)h));
@ -1748,9 +1754,11 @@ void Renderer::renderTextBoundingBox3D(const string &text, Font3D *font, const V
getCentered3DPos(text, font, pos, w, h,centeredW,centeredH);
}
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
textRenderer3D->render(text, pos.x, pos.y);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glPopAttrib();
}
@ -1762,9 +1770,11 @@ void Renderer::renderText3D(const string &text, Font3D *font, const Vec3f &color
Vec2i pos= Vec2i(x, y);
//Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
textRenderer3D->render(text, pos.x, pos.y, centered);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glPopAttrib();
}
@ -1775,9 +1785,11 @@ void Renderer::renderText(const string &text, Font2D *font, const Vec3f &color,
Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer->begin(font);
//textRenderer->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer,font);
textRenderer->render(text, pos.x, pos.y);
textRenderer->end();
//textRenderer->end();
safeTextRender.end();
glPopAttrib();
}
@ -1794,9 +1806,11 @@ void Renderer::renderTextBoundingBox3D(const string &text, Font3D *font, const V
getCentered3DPos(text, font, pos, w, h,centeredW,centeredH);
}
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
textRenderer3D->render(text, pos.x, pos.y);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glDisable(GL_BLEND);
glPopAttrib();
@ -1810,9 +1824,11 @@ void Renderer::renderText3D(const string &text, Font3D *font, const Vec4f &color
Vec2i pos= Vec2i(x, y);
//Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
textRenderer3D->render(text, pos.x, pos.y, centered);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glDisable(GL_BLEND);
glPopAttrib();
@ -1825,9 +1841,11 @@ void Renderer::renderText(const string &text, Font2D *font, const Vec4f &color,
Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer->begin(font);
//textRenderer->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer,font);
textRenderer->render(text, pos.x, pos.y);
textRenderer->end();
//textRenderer->end();
safeTextRender.end();
glPopAttrib();
}
@ -1841,7 +1859,8 @@ void Renderer::renderTextShadow3D(const string &text, Font3D *font,const Vec4f &
Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer3D->begin(font);
//textRenderer3D->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer3D,font);
if(color.w < 0.5) {
glColor3f(0.0f, 0.0f, 0.0f);
@ -1850,7 +1869,8 @@ void Renderer::renderTextShadow3D(const string &text, Font3D *font,const Vec4f &
glColor3f(color.x,color.y,color.z);
textRenderer3D->render(text, pos.x, pos.y);
textRenderer3D->end();
//textRenderer3D->end();
safeTextRender.end();
glPopAttrib();
}
@ -1864,7 +1884,8 @@ void Renderer::renderTextShadow(const string &text, Font2D *font,const Vec4f &co
Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
textRenderer->begin(font);
//textRenderer->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer,font);
if(color.w < 0.5) {
glColor3f(0.0f, 0.0f, 0.0f);
@ -1873,7 +1894,8 @@ void Renderer::renderTextShadow(const string &text, Font2D *font,const Vec4f &co
glColor3f(color.x,color.y,color.z);
textRenderer->render(text, pos.x, pos.y);
textRenderer->end();
//textRenderer->end();
safeTextRender.end();
glPopAttrib();
}
@ -1932,10 +1954,11 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) {
if(renderText3DEnabled == true) {
//renderText3D(lines[i], label->getFont3D(), (*color), textPos.x, textPos.y, label->getCentered());
//printf("Text Render3D [%s] font3d [%p]\n",lines[i].c_str(),label->getFont3D());
renderTextBoundingBox3D(lines[i], label->getFont3D(), (*color), x, y, w, h, label->getCentered(),label->getCentered());
//printf("Label render C\n");
renderTextBoundingBox3D(lines[i], label->getFont3D(), (*color), x, y, w, h, label->getCenteredW(),label->getCenteredH());
}
else {
//printf("Label render D\n");
renderText(lines[i], label->getFont(), (*color), textPos.x, textPos.y, label->getCentered());
}
}
@ -1943,10 +1966,11 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) {
if(renderText3DEnabled == true) {
//renderText3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered());
//printf("Text Render3D [%s] font3d [%p]\n",lines[i].c_str(),label->getFont3D());
renderTextBoundingBox3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), x, y, w, h, label->getCentered(),label->getCentered());
//printf("Label render E\n");
renderTextBoundingBox3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), x, y, w, h, label->getCenteredW(),label->getCenteredH());
}
else {
//printf("Label render F\n");
renderText(lines[i], label->getFont(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered());
}
}
@ -5991,14 +6015,16 @@ void Renderer::renderProgressBar(int size, int x, int y, Font2D *font, int custo
//text
glColor3fv(defColor.ptr());
textRenderer->begin(font);
//textRenderer->begin(font);
TextRendererSafeWrapper safeTextRender(textRenderer,font);
if(centeredText == true) {
textRenderer->render(renderText.c_str(), x + maxSize / 2, y, centeredText);
}
else {
textRenderer->render(renderText.c_str(), x, y, centeredText);
}
textRenderer->end();
//textRenderer->end();
safeTextRender.end();
}

View File

@ -19,6 +19,7 @@ namespace Shared { namespace Graphics { namespace Gl {
class Font2DGl;
class Font3DGl;
class TextRenderer2DGl;
class TextRenderer3DGl;
// =====================================================
@ -64,6 +65,46 @@ public:
virtual void end();
};
class TextRendererSafeWrapper {
protected:
TextRenderer *renderer;
Font *font;
bool mustEnd;
public:
TextRendererSafeWrapper(TextRenderer *renderer,Font *font) {
mustEnd = false;
this->renderer = renderer;
this->font = font;
begin();
}
~TextRendererSafeWrapper() {
end();
}
void begin() {
if(this->renderer != NULL) {
if(dynamic_cast<TextRenderer2DGl *>(renderer) != NULL) {
dynamic_cast<TextRenderer2DGl *>(renderer)->begin(dynamic_cast<Font2D *>(this->font));
mustEnd = true;
}
if(dynamic_cast<TextRenderer3DGl *>(renderer) != NULL) {
mustEnd = true;
dynamic_cast<TextRenderer3DGl *>(renderer)->begin(dynamic_cast<Font3D *>(this->font));
}
}
}
void end() {
if(this->renderer != NULL && mustEnd == true) {
this->renderer->end();
mustEnd = false;
}
}
};
}}}//end namespace
#endif

View File

@ -404,22 +404,26 @@ void TextRenderer3DGl::render(const string &text, float x, float y, bool center
}
void TextRenderer3DGl::specialFTGLErrorCheckWorkaround(string text) {
GLenum error = glGetError();
if(error) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\n\nIn [%s::%s Line: %d] error = %d for text [%s]\n\n",__FILE__,__FUNCTION__,__LINE__,error,text.c_str());
if(currentFTGLErrorCount > 0) {
printf("\n**FTGL Error = %d [%s] for text [%s] currentFTGLErrorCount = %d\n\n",error,gluErrorString(error),text.c_str(),currentFTGLErrorCount);
fflush(stdout);
for(GLenum error = glGetError(); error != GL_NO_ERROR; error = glGetError()) {
//error = glGetError();
//if(error) {
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\n\nIn [%s::%s Line: %d] error = %d for text [%s]\n\n",__FILE__,__FUNCTION__,__LINE__,error,text.c_str());
assertGlWithErrorNumber(error);
if(currentFTGLErrorCount > 0) {
printf("\n**FTGL Error = %d [%s] for text [%s] currentFTGLErrorCount = %d\n\n",error,gluErrorString(error),text.c_str(),currentFTGLErrorCount);
fflush(stdout);
assertGlWithErrorNumber(error);
}
else {
printf("\n**FTGL #2 Error = %d [%s] for text [%s] currentFTGLErrorCount = %d\n\n",error,gluErrorString(error),text.c_str(),currentFTGLErrorCount);
fflush(stdout);
}
currentFTGLErrorCount++;
}
else {
//printf("\n**FTGL #2 Error = %d for text [%s] currentFTGLErrorCount = %d\n\n",error,text.c_str(),currentFTGLErrorCount);
}
currentFTGLErrorCount++;
}
//}
}
void TextRenderer3DGl::internalRender(const string &text, float x, float y, bool centered, Vec3f *color) {