製作8日目

DirectXのラッパーライブラリを作成し、ビルドすると

1>d3dx9d.lib(d3dx9d_36.dll) : warning LNK4006:
 __NULL_IMPORT_DESCRIPTOR は d3dxof.lib(d3dxof.dll)
 で定義されています。2 つ目以降の定義は無視されます。

というワーニングが。

たぶんいろんなとこで定義されてるんだろう。そう書いてあるし。
ぐぐった結果こちらのページによると、
追加の依存関係から削除し、#pragmaでlibを指定してあげるといいそうです。ワーニングなのでまぁ放置。


今回はスクリーンショットに収められるような変化は皆無なので割愛。
今日までの進歩は

  • DirectX初期化
  • フルスクリーン対応
  • アサート

です。

DirectX初期化

いろいろなサイト&数年前書いてそのままだった自分で書いたDirectXの初期化コードの
おかげでうまいこと初期化できたので省略

当時僕はコピペで済ませていたようです。

g_lpD3D->CreateDevice(0,D3DDEVTYPE_REF,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&param,&g_lpD3DDevice)

D3DDEVTYPE_REF & D3DCREATE_HARDWARE_VERTEXPROCESSING
この組み合わせがありえないということに気づいたのはついさっきです。

HAL T&L D3DDEVTYPE_HAL D3DCREATE_HARDWARE_VERTEXPROCESSING
HAL D3DDEVTYPE_HAL D3DCREATE_SOFTWARE_VERTEXPROCESSING
REF D3DDEVTYPE_REF D3DCREATE_SOFTWARE_VERTEXPROCESSING

なるほど。

HAL → Hardware Abstraction Layer
REF → REFerence rasterizer
T&L → Transformation & Lighting

なるほど。そういう意味なのか。
というか、DirectXのドキュメント最初から読めという話ですね。すいません。

  1. HAL T&L
  2. HAL
  3. REF

この順で初期化しなさいと書いてありました。ですよね。

フルスクリーン対応

D3DPRESENT_PARAMETERSのWindowedメンバをFALSEにしてあげるだけ。
しかもDirectXのほうで画面出力の解像度の変更までしてくれるんですね。なんという良心設計。

アサート


#include

void Hoge( int *p )
{
assert( p );// p == 0で止まる
*p = 100;
}

これで済むところを、わざわざライブラリでラッピングします。

#ifdef _DEBUG
#define LIB_ASSERT(exp) assert(exp)
#else
#define LIB_ASSERT(exp) ((void)0)
#endif /* _DEBUG */

void Hoge( int *p )
{
LIB_ASSERT( p );
*p = 100;
}

この行為には意味はないですが、アサートの種類を増やす必要が出てくると思うのでこうしてます。
たとえばLIB_ASSERT_MAXMINというのを定義します。

ライブラリ側
#include

#ifdef _DEBUG
#define LIB_ASSERT_MAXMIN( val, max, min ) assert( ( (val)<=(max) ) && ( (val)>=(min) ) )
#else
#define LIB_ASSERT_MAXMIN( val, max, min ) ((void)0)
#endif /* _DEBUG */

ソース側
int Hoge( int index )
{
int i[] = {0,1,2,3,-1,2,3};
LIB_ASSERT_MAXMIN( index, 0, sizeof(i)/sizeof(int) );
return i[index];
}

Hogeに渡す値が0以上sizeof(i)/sizeof(int)以下(9以下)でなければアサート停止します。
つまりi[]を参照するindexの値を保障するということです。


というわけで、そろそろプリミティブかテクスチャかモデルかなんか表示できそうです。