Sign in to follow this  
Zylann

Problem implementing a BMFont renderer

Recommended Posts

Zylann    204
Hi,
I'm implementing a custom BMFont renderer in C++, but I get weird results with xoffset and yoffset :
[img]https://dl.dropbox.com/u/60408088/INFO/bmfont_arial32_problem_add.png[/img]
The green-red lines are the origin axes,
yellow rects are not offset char rects,
cyan rects are offset char rects.

Characters are not displayed the right way, but I can't find what I'm doing wronng :(
I believe it's not a bug of BMFont, as I used the same font in a Java game with Slick2D and it worked fine.

Here is my drawing code :
[source lang="cpp"]void Font::draw(const std::string text)
{
unsigned int originX = 0, originY = 0; // Cursor position
unsigned int x, y; // Shifted position
float tx, ty, tw, th; // Texture sub-rect coordinates
char c; // Current read character

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

for(unsigned int i = 0; i < text.size(); i++)
{
c = text[i];

// Line endings
if(c == '\n')
{
originY += m_settings.lineHeight;
originX = 0;
continue;
}
else if(c == '\r')
{
continue;
}

// Get character descriptor
const CharDescriptor * cd = m_settings.getChar©;
if(cd == nullptr)
{
//std::cout << "E" << (int)c;
break;
}

// Use the glyph atlas texture
const sf::Texture &amp; tex = m_textures[cd->page];
tex.bind();

// Get glyph texture sub-rect
const sf::Vector2u ts = tex.getSize();
tx = static_cast<float>(cd->x) / static_cast<float>(ts.x);
ty = static_cast<float>(cd->y) / static_cast<float>(ts.y);
tw = static_cast<float>(cd->width) / static_cast<float>(ts.x);
th = static_cast<float>(cd->height) / static_cast<float>(ts.y);

// Get drawing coordinates
x = originX + cd->xoffset;
y = originY + cd->yoffset;

// Draw glyph

glBegin(GL_QUADS);

glTexCoord2f(tx, ty + th); glVertex2i(x, y);
glTexCoord2f(tx + tw, ty + th); glVertex2i(x + cd->width, y);
glTexCoord2f(tx + tw, ty); glVertex2i(x + cd->width, y + cd->height);
glTexCoord2f(tx, ty); glVertex2i(x, y + cd->height);

glEnd();

// Advance cursor
originX += cd->xadvance;

// DEBUG
// Some code to draw the rects
}
}[/source]

The full implementation source code is available here : [url="https://dl.dropbox.com/u/60408088/INFO/bmfont_impl_src_part.zip"]https://dl.dropbox.com/u/60408088/INFO/bmfont_impl_src_part.zip[/url]
But it is not really useable alone because it has a few dependencies to other parts of a bigger project (will be on github in the future). Edited by Zylann

Share this post


Link to post
Share on other sites
WitchLord    4677

I had a similar bug in my own code when I first implemented it. It's caused by the difference in the coordinate system for the texture space and the screen coordinates. 

 

To fix it you need to invert the y-offset, i.e. subtract instead of add.

 

Regards,

Andreas

Share this post


Link to post
Share on other sites
Zylann    204

Oh. Yes, I inverted the Y axis and it works !

That's actually logic, we read a text from top to bottom...

 

Thanks for your help smile.png

Edited by Zylann

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this