• R/O
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

修訂73 (tree)
時間2015-03-24 02:49:43
作者xops-mikan

Log Message

OpenGLにてシステムフォントへの対応を試みる(不完全)、DirectXのマップデータ描画処理を修正

Change Summary

差異

--- trunk/d3dgraphics.cpp (revision 72)
+++ trunk/d3dgraphics.cpp (revision 73)
@@ -1006,6 +1006,10 @@
10061006 pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
10071007 pd3dDevice->SetTexture(0, NULL);
10081008 }
1009+ else if( ptextures[ mapTextureID[textureID] ] == NULL ){
1010+ pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
1011+ pd3dDevice->SetTexture(0, NULL);
1012+ }
10091013 else{
10101014 pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);
10111015 pd3dDevice->SetTexture(0, ptextures[mapTextureID[textureID]] );
@@ -1553,6 +1557,11 @@
15531557 hGLRC = NULL;
15541558 width = 0;
15551559 height = 0;
1560+ SystemFont = NULL;
1561+ now_SystemFontUStr = new WCHAR [1];
1562+ now_SystemFontUStr[0] = NULL;
1563+ SystemFontListIdx = 0;
1564+ SystemFontListIdxSize = 0;
15561565 now_textureid = -1;
15571566
15581567 camera_x = 0.0f;
@@ -1580,8 +1589,19 @@
15801589 CleanupTexture(i);
15811590 }
15821591
1592+ if( SystemFont != NULL ){
1593+ DeleteObject(SystemFont);
1594+ }
1595+ if( now_SystemFontUStr != NULL ){
1596+ delete [] now_SystemFontUStr;
1597+ }
1598+ if( SystemFontListIdx != 0 ){
1599+ glDeleteLists(SystemFontListIdx, SystemFontListIdxSize);
1600+ }
1601+
15831602 if( hGLRC != NULL ){ wglDeleteContext(hGLRC); }
15841603
1604+ //libjpeg解放
15851605 jpeg_destroy_decompress(&cinfo);
15861606 }
15871607
@@ -1660,7 +1680,11 @@
16601680 //デバイスコンテキスト解放
16611681 ReleaseDC(hWnd, hDC);
16621682
1683+ //システムフォント用意
1684+ //フォント名:MS ゴシック サイズ:18
1685+ SystemFont = CreateFont(18, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "MS ゴシック");
16631686
1687+
16641688 //テクスチャフォント用画像のファイル名を設定
16651689 strcpy(TextureFontFname, TextureFontFilename);
16661690
@@ -3109,10 +3133,76 @@
31093133 //! @param y y座標
31103134 //! @param str 文字列 (改行コード:可)
31113135 //! @param color 色
3112-//! @warning <b>本関数の処理は実装されていません。</b>
3136+//! @warning <b>描画は非常に低速です。</b>画面内で何度も呼び出すとパフォーマンスに影響します。
3137+//! @warning「改行コードを活用し一度に描画する」「日本語が必要ない文字はテクスチャフォントを活用する」などの対応を講じてください。
3138+//! @attention フォントの種類やサイズは固定です。 文字を二重に重ねて立体感を出さないと見にくくなります。
3139+//! @todo 文字を二重に重ねると、上下関係が正しく処理されない。
3140+//! @todo 1文字目が欠ける場合がある。
31133141 void D3DGraphics::Draw2DMSFontText(int x, int y, char *str, int color)
31143142 {
3115- //
3143+ int len = strlen(str);
3144+ WCHAR *ustr;
3145+
3146+ Start2DRender();
3147+
3148+ //テクスチャ無効
3149+ glDisable(GL_TEXTURE_2D);
3150+
3151+ //Unicode文字列へ変換
3152+ ustr = new WCHAR [len+1];
3153+ MultiByteToWideChar(CP_ACP, 0, str, -1, ustr, len + 1);
3154+
3155+ //新たな文字列なら、リソースを作り直す
3156+ if( lstrcmpW(ustr, now_SystemFontUStr) != 0 ){
3157+ GLuint listIdx;
3158+ HDC hDC;
3159+
3160+ //古いデータを削除
3161+ glDeleteLists(SystemFontListIdx, SystemFontListIdxSize);
3162+ delete [] now_SystemFontUStr;
3163+
3164+ //デバイスコンテキスト設定
3165+ hDC = GetDC(hWnd);
3166+ wglMakeCurrent(hDC, hGLRC);
3167+ SelectObject(hDC, SystemFont);
3168+
3169+ //ディスプレイリストを作成
3170+ listIdx = glGenLists(len);
3171+ for(int i=0; i<lstrlenW(ustr); i++){
3172+ wglUseFontBitmapsW(hDC, ustr[i], 1, listIdx+i);
3173+ }
3174+
3175+ //デバイスコンテキスト廃棄
3176+ ReleaseDC(hWnd, hDC);
3177+
3178+ //設定を記録
3179+ now_SystemFontUStr = new WCHAR [len+1];
3180+ lstrcpyW(now_SystemFontUStr, ustr);
3181+ SystemFontListIdx = listIdx;
3182+ SystemFontListIdxSize = len;
3183+ }
3184+
3185+ //座標と色を設定
3186+ glBitmap(0, 0, 0, 0, 10, 0, NULL);
3187+ glRasterPos2i(x, y);
3188+ glColor4ub((color>>24)&0xFF, (color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
3189+
3190+ for(int i=0; i<lstrlenW(ustr); i++){
3191+ if( ustr[i] == '\n' ){
3192+ //改行する
3193+ y += 19;
3194+ glRasterPos2i(x, y);
3195+ }
3196+ else{
3197+ //ディスプレイリスト描画
3198+ glCallList(SystemFontListIdx + i);
3199+ }
3200+ }
3201+
3202+ //Unicode文字列の廃棄
3203+ delete [] ustr;
3204+
3205+ End2DRender();
31163206 }
31173207
31183208 //! @brief 文字を中央揃えで描画(システムフォント使用)
@@ -3122,10 +3212,10 @@
31223212 //! @param h 縦の大きさ
31233213 //! @param str 文字列 (改行コード:可)
31243214 //! @param color 色
3125-//! @warning <b>本関数の処理は実装されていません。</b>
3215+//! @warning <b>正しく中央揃えになりません。</b>
31263216 void D3DGraphics::Draw2DMSFontTextCenter(int x, int y, int w, int h, char *str, int color)
31273217 {
3128- //
3218+ Draw2DMSFontText(x, y, str, color);
31293219 }
31303220
31313221 //! @brief 2D描画用設定
--- trunk/d3dgraphics.h (revision 72)
+++ trunk/d3dgraphics.h (revision 73)
@@ -200,6 +200,10 @@
200200 MODELDATA pmodel[MAX_MODEL]; //!< モデルデータを格納
201201 TEXTUREDATA ptextures[MAX_TEXTURE]; //!< テクスチャを格納
202202 GLuint textureobjname[MAX_TEXTURE]; //!< テクスチャオブジェクト
203+ HFONT SystemFont; //!< システムフォント用の論理フォント
204+ WCHAR *now_SystemFontUStr; //!< 現在表示中のシステムフォントによる文字列(Unicode)
205+ GLuint SystemFontListIdx; //!< システムフォントのディスプレイリスト
206+ int SystemFontListIdxSize; //!< システムフォントのディスプレイリストのサイズ
203207 int now_textureid; //!< 現在設定中のテクスチャ番号
204208
205209 float camera_x; //!< カメラ座標