From 5d0eea51e33ea08f9fc5007e4d24793d122f0e9e Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sun, 2 Oct 2011 02:14:05 +0000 Subject: [PATCH] - bugfix for rendering labels (now properly lines up with other controls) --- source/glest_game/facilities/components.cpp | 23 +++++ source/glest_game/facilities/components.h | 11 +++ source/glest_game/graphics/renderer.cpp | 84 ++++++++++++------- .../include/graphics/gl/text_renderer_gl.h | 41 +++++++++ .../sources/graphics/gl/text_renderer_gl.cpp | 30 ++++--- 5 files changed, 147 insertions(+), 42 deletions(-) diff --git a/source/glest_game/facilities/components.cpp b/source/glest_game/facilities/components.cpp index 1a18fd6d..91e9de0b 100644 --- a/source/glest_game/facilities/components.cpp +++ b/source/glest_game/facilities/components.cpp @@ -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 // ===================================================== diff --git a/source/glest_game/facilities/components.h b/source/glest_game/facilities/components.h index 562abceb..8116dc29 100644 --- a/source/glest_game/facilities/components.h +++ b/source/glest_game/facilities/components.h @@ -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;} diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index cee30289..4295144e 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -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(); } diff --git a/source/shared_lib/include/graphics/gl/text_renderer_gl.h b/source/shared_lib/include/graphics/gl/text_renderer_gl.h index 021e1466..e99ccca3 100644 --- a/source/shared_lib/include/graphics/gl/text_renderer_gl.h +++ b/source/shared_lib/include/graphics/gl/text_renderer_gl.h @@ -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(renderer) != NULL) { + dynamic_cast(renderer)->begin(dynamic_cast(this->font)); + mustEnd = true; + } + if(dynamic_cast(renderer) != NULL) { + mustEnd = true; + dynamic_cast(renderer)->begin(dynamic_cast(this->font)); + } + } + } + void end() { + if(this->renderer != NULL && mustEnd == true) { + this->renderer->end(); + mustEnd = false; + } + } +}; + }}}//end namespace #endif diff --git a/source/shared_lib/sources/graphics/gl/text_renderer_gl.cpp b/source/shared_lib/sources/graphics/gl/text_renderer_gl.cpp index 5bea479d..8187ba28 100644 --- a/source/shared_lib/sources/graphics/gl/text_renderer_gl.cpp +++ b/source/shared_lib/sources/graphics/gl/text_renderer_gl.cpp @@ -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) {