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();
}