Эм… Ну что сказать… Опять глюк нашёл
Есть функция
void glTextOut(float xPos, float yPos, char* sText, ...)
{
//glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureIdFont);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, static_cast<double>(viewportWidth), 0.0, static_cast<double>(viewportHeight), -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(xPos, static_cast<float>(viewportHeight) - yPos - fontSize - 4.0f, 0.0f);
glListBase(glyphListsId - 32);
char text[256];
va_list vl;
va_start(vl, sText);
vsprintf_s(text, sText, vl);
va_end(vl);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_LIGHTING);
}
Вызываю так:
void DrawHudText()
{
glColor3f(1.0f, 1.0f, 1.0f);
glTextOut(0.0f, 0.0f, (char*)"Position: %.2f %.2f %.2f", camera->GetPositionX(), camera->GetPositionY(), camera->GetPositionZ());
glColor3f(0.0f, 1.0f, 0.0f);
glTextOut(0.0f, fontSize, (char*)"Rotation: %.2f %.2f", camera->GetRotationYaw(), camera->GetRotationPitch());
}
Работает правильно.
Но если поменять прототип на такой:
void glTextOut(char* sText, float xPos, float yPos, ...);
И , соответственно, поменять вызов, то уже не работает. Первый переданный аргумент встаёт на второе место, второй на третье и т.д. А вместо первого получается либо 0, либо какая-то хрень (всегда одна и та же).
То есть, если вызвать
glTextOut((char*)"%.2f %.2f %.2f", 0.0f, 0.0f, 2.0f, -6.0f, 7.0f);
то получится 25463333333.33, 2.00 -6.00
.
В принципе, не критично. Если вынести форматирование в отдельную функцию, то работает. Но почему так?
Кстати, так только в вижуалке. В MinGW
такого нет. Но там vsprintf
, а не vsprintf_s
.