3D文字列のサンプル
以下サンプル。以下のサイトのgl_test4.lzhを参考にした。
#include <stdafx.h> #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include "wglfont.h" GBUN* create_3d_font(HDC hdc, char* str) { GBUN* bun; LOGFONT logfont; HFONT nf,of; // ------------------------------------------------------ // 「フォント作成時の注意事項」 // SHIFTJIS_CHARSET がセットされている必要がある。 // サイズ指定は無視される。(glScale で調整する) // ------------------------------------------------------ memset( &logfont,0,sizeof(LOGFONT) ); logfont.lfHeight = 0; logfont.lfWidth = 0; logfont.lfEscapement = 0; logfont.lfOrientation = logfont.lfEscapement; logfont.lfWeight = FW_NORMAL; logfont.lfItalic = FALSE; logfont.lfUnderline = FALSE; logfont.lfStrikeOut = FALSE; logfont.lfCharSet = SHIFTJIS_CHARSET; logfont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfPitchAndFamily= FF_DONTCARE | DEFAULT_PITCH; // lstrcpy(logfont.lfFaceName, "MS 明朝"); _tcscpy(logfont.lfFaceName, _T("MS ゴシック")); nf = CreateFontIndirect( &logfont ); of = (HFONT)SelectObject( hdc,nf ); bun = CreateBunsyou( hdc, str ); SelectObject( hdc,of ); DeleteObject( nf ); return bun; } GBUN* CreateBunsyou(HDC hdc,char *string) { int count; int m_count; int base; int i,k; DWORD c; GLYPHMETRICSFLOAT agmf; count = strlen( string ); m_count = count; for(i=0;i<count;i++){ if( IsDBCSLeadByte( string[i] ) ){ i++; m_count--; } } GLuint base_id = glGenLists(m_count); GBUN* bun = (GBUN*)malloc(sizeof(GBUN) * 1); bun->Width = 0.0f; bun->Height = 0.0f; bun->Count = m_count; bun->StartNumber = base_id; bun->Moji = (GMOJI *)GlobalAlloc( GPTR,sizeof(GMOJI)*m_count ); for(i=0, k=0; i < m_count; i++){ c = string[k]; if( IsDBCSLeadByte( (unsigned char)c ) ){ k++; c = (c << 8) | (unsigned char)string[k]; } k++; wglUseFontOutlines( hdc,c,1,base_id,0.0f,1.0f,WGL_FONT_POLYGONS,&agmf ); bun->Width += agmf.gmfCellIncX; // bun->Height = agmf.gmfCellIncY; bun->Moji[i].Width = agmf.gmfCellIncX; bun->Moji[i].Height = agmf.gmfCellIncY; bun->Moji[i].ListNumber = base_id; base_id++; } } void release_3d_font(GBUN *bun) { int i; for(i=0;i<bun->Count;i++){ glDeleteLists( bun->Moji[i].ListNumber, 1 ); } bun->Count = 0; bun->StartNumber = 0; GlobalFree( bun->Moji ); } void draw_3d_font(GBUN *bun) { register int i; // float sc = 10.0f; glPushAttrib(GL_POLYGON_BIT); // GL_FRONT_FACE を保存 glPushMatrix(); // センタリング glTranslatef( bun->Width / -2.0f, 0 / 2.0f, 0.0f); // glScalef( sc,sc,sc ); for(i=0;i<bun->Count;i++){ glCallList( bun->Moji[i].ListNumber ); } glPopMatrix(); glPopAttrib(); }