前回作ったライブラリを実際に使ってみた

イメージ 1

前回作った、ネイティブAPIを使ってテキストを画像データにするライブラリとOpenGLを使って、
簡単なサンプルを作ってみました。
↓ライブラリ紹介エントリ
http://blogs.yahoo.co.jp/mocchi_2003/38911375.html


OpenGLのためのウィンドウ周りのライブラリとしてfreeglutを使ってみました。
テクスチャのサイズが2のn乗になっていないので、OpenGLのバージョンが古い環境では
動かないかもしれません。

↓サンプルのソースはこちら
#include <cstdio>
#include <cmath>
#include <GL/freeglut.h>
#include "font_renderer.h"

#define WIDTH 700
#define HEIGHT 300

int window;
int width, height;
double rad = 0.0, scale = 1.0;
font_renderer fl;
GLuint fonttex;

void display_2d(void){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)width, (GLdouble)height, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_TEXTURE_2D);
glPushMatrix();
glColor3d(1.0, 1.0, 1.0);
glTranslated*1;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &fonttex);
glBindTexture(GL_TEXTURE_2D, fonttex);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, fl.get_width(), fl.get_height(), GL_RGB, GL_UNSIGNED_BYTE, fl.get_image());
}

int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
window = glutCreateWindow("Hello" );
init();
glutMainLoop();
glDeleteTextures(1 , &fonttex);
}


関連
- font_rendererバージョンアップ
- 前回作ったライブラリを実際に使ってみた
- ネイティブAPIを用いたマルチプラットフォームフォントレンダラーライブラリ



もっちーの小部屋 自作のソフトを公開してます。
http://www.geocities.jp/mocchi_2003/index.html

*1:GLdouble)(width/2), (GLdouble)(height/2), 0.0);
glScaled(scale, scale, 0.0);
glBindTexture(GL_TEXTURE_2D, fonttex);
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 0.0); glVertex2i(-fl.get_width()/4, -fl.get_height()/4);
glTexCoord2d(0.0, 1.0); glVertex2i(-fl.get_width()/4, fl.get_height()/4);
glTexCoord2d(1.0, 1.0); glVertex2i( fl.get_width()/4, fl.get_height()/4);
glTexCoord2d(1.0, 0.0); glVertex2i( fl.get_width()/4, -fl.get_height()/4);
glEnd();
glPopMatrix();

glDisable(GL_TEXTURE_2D);
glPushMatrix();
glColor3d(1.0, 1.0, 0.6);
glTranslated((GLdouble)WIDTH/2.0,(GLdouble)HEIGHT/2.0,0.0);
glRotated(rad, 0.0, 0.0, 1.0);
glTranslated(-(GLdouble)WIDTH/2.0,-(GLdouble)HEIGHT/2.0,0.0);
glBegin(GL_TRIANGLES);
glVertex2d(150.0, 0.0);
glVertex2d(0.0, 280.0);
glVertex2d(280.0, 280.0);
glEnd();
glPopMatrix();


}

void display_3d(void){
}

void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
display_3d();
display_2d();
glutSwapBuffers();
}

void reshape(int w , int h) {
width = w, height = h;
glViewport(0, 0, width, height);
display();
}

void timer(int id){
glMatrixMode(GL_MODELVIEW);
rad += 5.0;
scale = 2.0 + std::sin(rad/180.0 * 3.14159265358979);
display();
glutTimerFunc(10, timer, 0);
}

void imagesize(int &width, int &height){
int texsize = width, scale = 0;
if (texsize < height) texsize = height;
if (texsize > 0) --texsize;
while(texsize){
texsize /= 2;
++scale;
}
width = height = (1 << scale);
}

void init(){
glutReshapeWindow(WIDTH, HEIGHT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(10, timer, 0);

fl.render("☆OpenGLテスト★", 80, false, false, false,
font_renderer::rgb_type(128,128,128),font_renderer::rgb_type(0,255,255