OpenGLには、高レベルライブラリのGLUTにも、文字列描画関数は含まれていません。
(freeglutにはあるみたいですが。)
そこで、printfを実装することにしました。
#2011/2/20更新: windows以外の時glXGetProcAdressでglWindowPos2iのエントリポイント取得するようにした
基本的にはGLUTのglutBitmapCharacterのラッパー関数。
ダウンロードはこちらから
使い方等はreadme.txtを参考にどうぞ。
大雑把に言えばGLUTに実装されてるビットマップ文字出力関数のラッパー。
以下ソースコードです。
GLprintf.h
GLprintf.c
(freeglutにはあるみたいですが。)
そこで、printfを実装することにしました。
#2011/2/20更新: windows以外の時glXGetProcAdressでglWindowPos2iのエントリポイント取得するようにした
基本的にはGLUTのglutBitmapCharacterのラッパー関数。
ダウンロードはこちらから
使い方等はreadme.txtを参考にどうぞ。
大雑把に言えばGLUTに実装されてるビットマップ文字出力関数のラッパー。
以下ソースコードです。
GLprintf.h
/* この関数はGL/glut.hに含まれる、glutBitmapCharacter()関数のラップ関数です */ /* エスケープシーケンスはサポートしない。*/ /* 変換仕様は%d,%u,%o,%x,%s,%cのみサポート。 */ /* 1バイト文字のみ使用可 */ /* 作成するに当たってUNIXv7のソースコードを参考にした */ #include<stdarg.h> int GLprintf(int x, int y, void *font, const char* format, ...); void GLprintn(long num, int base, void *font);
GLprintf.c
#include"include/GLprintf.h"
#if defined (UNIX)
# define GL_GLEXT_PROTOTYPES
#endif
#if defined (__APPLE__)
# include <GLEW/glew.h>
#else
# include<GL/glew.h>
#endif
#if defined(_WIN32)
# include<GL/wglew.h>
typedef void (WINAPI *WINPOS)(int x, int y);
#else
# include<GL/glxew.h>
#endif
#if defined (__APPLE__)
# include <GLUT/glut.h>
#else
# include<GL/glut.h>
#endif
#include<stdio.h>
int GLprintf(int x, int y, void *font, const char* format, ...)
{
int count = 0;
char *ptr, *str;
char c;
va_list list;
#if defined(_WIN32)
WINPOS glWindowPos2i;
glWindowPos2i = (WINPOS)wglGetProcAddress("glWindowPos2i");
#else
PFNGLWINDOWPOS2IPROC glWindowPos2i;
glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glXGetProcAddress("glWindowPos2i");
#endif
ptr = (char *)format;
glWindowPos2i(x, y);
va_start(list, format);
while(*ptr)
{
if (*ptr != '%') { glutBitmapCharacter(font, *ptr++); ++count; }
else
{
++ptr;
switch (*ptr) {
case 's':
++ptr;
str = va_arg(list, char *);
while(*str) { glutBitmapCharacter(font, *str++); ++count; }
break;
case 'c':
++ptr;
c = va_arg(list, char);
glutBitmapCharacter(font, c);
++count;
break;
case 'd':
++ptr;
GLprintn(va_arg(list, long), 10, font);
++count;
break;
case 'u':
++ptr;
GLprintn(va_arg(list, long), 10, font);
++count;
break;
case 'o':
++ptr;
GLprintn(va_arg(list, long), 8, font);
++count;
break;
case 'x':
++ptr;
GLprintn(va_arg(list, long), 16,font);
++count;
break;
case '%':
++ptr;
glutBitmapCharacter(font, '%');
++count;
break;
default:
++ptr;
break;
}
}
}
va_end(list);
return count;
}
void GLprintn(long num, int base, void *font)
{
long a;
if (num < 0) {
glutBitmapCharacter(font, '-');
num = -num;
}
if (a = num / base)
GLprintn(a, base, font);
glutBitmapCharacter(font, "0123456789ABCDEF"[(int)(num % base)]);
return;
}