Problem implementing a BMFont renderer

Started by
1 comment, last by Zylann 11 years, 3 months ago
Hi,
I'm implementing a custom BMFont renderer in C++, but I get weird results with xoffset and yoffset :
bmfont_arial32_problem_add.png
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;

// 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 : https://dl.dropbox.com/u/60408088/INFO/bmfont_impl_src_part.zip
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).
Advertisement

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

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

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

This topic is closed to new replies.

Advertisement