class CD3DEnv

【概要】
 3Dレンダリングを可能にする描画環境

重要度メソッド名・解説アクセス
CD3DEnv
コンストラクタ
public
~CD3DEnv
デストラクタ
public
virtual HRESULT InitD3D(HWND hWnd)
Direct3D9を初期化し、この描画環境を描画可能な状態にする。
public
void ReloadGraphics()
モデル・テクスチャなどのデータを、グラフィックデバイスへ転送する。既に転送されているデータも全て転送しなおす。
public
void LoadGraphics()
モデル・テクスチャなどのデータを、グラフィックデバイスへ転送する。既に転送されているデータは再転送されない。
public
virtual void UpdateScene(AnimationCallback animCB, RenderSceneCallback renderCB)
アニメーションを行った後シーンのレンダリングを行う。
アニメーションの為にanimCB を呼び出し、レンダリングの為に renderCB を呼び出す。
public
virtual void RenderSceneWithVP(RECT* rcWindow, RenderSceneCallback renderCB)
ビューポートを設定し、画面の一部をレンダリングする。
ビューポートを設定した後、レンダリングの為に renderCB を呼び出す。
public
virtual void UpdateScene(AnimationCallback2 animCB, RenderSceneCallback2 renderCB, PVOID lpUser)
アニメーションを行った後シーンのレンダリングを行う。
アニメーションの為にanimCB を呼び出し、レンダリングの為に renderCB を呼び出す。
呼び出し時、lpUserの値がコールバックに渡される。
public
virtual void RenderSceneWithVP(RECT* rcWindow, RenderSceneCallback2 renderCB, PVOID lpUser, BOOL bClear=TRUE)
ビューポートを設定し、画面の一部をレンダリングする。
ビューポートを設定した後、レンダリングの為に renderCB を呼び出す。
呼び出し時、lpUserの値がコールバックに渡される。
public
virtual void RenderSceneIntoSurface(LPDIRECT3DSURFACE9 pSurface, D3DCOLOR bgcolor, RenderSceneCallback2 renderCB, PVOID lpUser);
指定されたサーフェイスに、シーンをレンダリングする。
レンダリングの為に renderCB を呼び出す。呼び出し時、lpUserの値がコールバックに渡される。
public
void SetBackgroundColor(D3DCOLOR c)
シーンをレンダリングする時画面をクリアするカラーを設定する。
public
HRESULT ToggleFullscreen()
ウィンドウモード<-->フルスクリーンモード相互の切り替えを行う。
public
BOOL IsWindowed()
描画環境がウィンドウモードであればtrue を返す
public
HRESULT GetD3DDevice(LPDIRECT3DDEVICE9 *pDevice)
リファレンスカウントをインクリメントして、現在使用中の Direct3DDevice9 を返す。
public
void AddGraphicsObject(CGraphicsObject *pObj)
指定されたCGraphicsObject をシステムの管理下に置く。
public
void RemoveGraphicsObject(CGraphicsObject *pObj)
指定されたCGraphicsObject をシステムの管理下から除く。
public
virtual void InitFail(HWND hWnd, LPCTSTR szError,...);
初期化エラー処理。
デフォルトではダイアログウィンドウでエラーが通知されるが、オーバーライド可能
public
D3DXMATRIX *GetSystemView()
システムが描画に使用するビュー行列を返す
public
D3DXMATRIX *GetSystemProjection()
システムが描画に使用するプロジェクション行列を返す
public
D3DXVECTOR3 *GetSystemLightDirection()
システムが描画に使用する有向光源の方向を返す
システムは有向光源を一つだけ使用する。
public
D3DCAPS9 *GetCurrentDeviceCaps()
システムが使用中の Direct3DDevice9 の能力を示すデータを返す。
public
D3DPRESENT_PARAMETERS *GetD3DPresentParameters()
システムの Direct3DDevice9 に対する設定を返す。
public
BOOL IsDepthBufferActive()
Z-BUFFER を使用可能であれば、true を返す。
public
virtual DWORD SelectMode(D3DModeInfo *modes, DWORD numModes)
描画環境初期化時にグラフィックモードを選択する。初期化時にグラフィックモードを指定したい場合は、この関数をオーバーロードする。
protected
BOOL GetDI8KeyState(int key)
key で指定されたキーの状態を調べる
public
virtual void SetJoyButtonToKeyMap(int bno, BYTE key)()
ジョイスティックボタンのキーコード(DIK_*)への変換を設定する。
public
virtual HRESULT InitDI(HWND hWnd)
DirectInput を初期化する。このメソッドを何もせず、S_OK を返すメソッドにオーバーロードする事で、DirectInput を使用しない設定にする事ができる。
protected
virtual void DoIO()
DirectInput を用いてデバイスから入力を行う。入力処理を変えたい場合は、このメソッドをオーバーロード可能。
protected
virtual void ReleaseDI(HWND hWnd)
DirectInput を終了する。入力デバイスを変更した場合など、必要があればオーバーロードする。
protected
D3DLIGHT9 *GetSystemLight()
システムが使用するライトを返す。変更する場合、有向光源を使用する事。
public
void SetAmbientColor(D3DCOLOR c)
システムが使用アンビエント光源を設定する。
public
D3DCOLOR GetAmbientColor()
システムが使用アンビエント光源を取得する。
public
DWORD GetBackBufferWidth()
バックバッファの幅をピクセル単位で返す。
public
DWORD GetBackBufferHeight()
バックバッファの高さをピクセル単位で返す。
public
HRESULT CheckDeviceFormat(DWORD usage, D3DRESOURCETYPE rtype, D3DFORMAT format)
現在使用中のデバイスに対して、利用可能なテクスチャフォーマットなどを確認する。
public
void RenderTriangle3D(D3DXVECTOR3 *p,D3DCOLOR c, D3DXMATRIX *pMat=NULL)
座標と頂点色を指定して三次元空間内に三角形を描画する。
public
void RenderQuadrilateral3D(D3DXVECTOR3 *p,D3DCOLOR c, D3DXMATRIX *pMat=NULL)
座標と頂点色を指定して三次元空間内に四角形を描画する。
public
void RenderLine3D(D3DXVECTOR3 *p, D3DCOLOR c, D3DXMATRIX *pMat = NULL)
座標と頂点色を指定して三次元空間内に直線を描画する。
public
void TextureDBRegisterNewKey(LPSTR key,CTextureNode **pRet)
ファイル名を指定して共有テクスチャを登録する。
public
CShaderContainer *GetShaderContainer(GUID guid)
guid で管理されたCShaderContainerオブジェクトを取得する。
public
BOOL ConfirmDevice(D3DCAPS9 *pCaps,DWORD dwBehavior,D3DFORMAT fmt);
デバイスの性能をテストするメソッド。
public
FLOAT GetElapsedTime()
経過時間タイマの現在地を取得する。タイマー値は、UpdateScene のコールバックに与えられる値と同じだが、 このメソッドを呼び出しても、タイマはリセットされない為、処理の軽減などに使用可能である。
public
FLOAT ResetTimer()
経過時間タイマの値を0にリセットする。
public

※重要度の意味:

◎これを知らないとこのライブラリを使えないもの。
○知っておいたほうが良いもの。
△知らなくても支障は無いもの。


CD3DEnv()

コンストラクタ。クラスのメンバ変数の初期化は行うが、Direct3Dの初期化は行わない為、 この描画環境を使用する前に、InitD3D(HWND hWnd)を呼び出す必要がある。


~CD3DEnv()

デストラクタ。登録されている全てのフォント、メッシュ、ビルボードを破棄して、 Direct3D9を終了させる。またDirectInput が初期化され、有効化されていれば、 DirectInput の終了処理を行う。


virtual HRESULT InitD3D(HWND hWnd)

引数:描画に使用するウインドウハンドル
返値:成功ならS_OK 失敗した場合は失敗原因を返す DWORD 値。
デフォルトでは、Direct3D9 および DirectInput を初期化し、 ウインドウへの描画を可能な描画環境を構築する。DirectInput は単一のジョイスティックをサポートする。

初期化・終了のプログラム例


void ReloadGraphics()

引数:無し
返値:無し

描画環境が使用するグラフィックデバイスに対し、テクスチャや 頂点バッファを転送する。MeshやBillboard はクラスを生成した だけではデータを転送しない為、クラスの生成後、このメソッドを 呼び出してグラフィックデバイスにデータを転送しなければ、なら ない。


void LoadGraphics()

引数:無し
返値:無し

ReloadGraphics の高速版。
ReloadGraphics は全てのデータをデバイスへ転送しなおすが、 このメソッドは転送済みデータは転送しない為、読み込みが高速である。 反面。読み込み・削除を繰り返す環境ではメモリの利用効率が下がる 可能性が高い。

なお、このメソッドによる転送を行う場合、新たなデータの転送中に、 転送済みグラフィックスの使用が可能である。これにより、 ロード中画面表示などを実装する事が可能になる。


virtual void UpdateScene(AnimationCallback animCB, RenderSceneCallback renderCB)

引数:AnimationCallback animCB, RenderSceneCallback renderCB
返値:無し

シーンのレンダリングを行う。オーバーロード可能である。デフォルトの動作では、 シーンのレンダリングを行う前に、animCBで示される関数を呼び出し、スクリーンを 消去した後で、シーンを開始する。renderCBで示されるプログラムを呼び出した後、 スクリーンを画面に表示する。

アプリケーションプログラムは、animCBにゲームのアニメーションを記述し、 renderCBでキャラクタや背景の描画を行う事で画面表示を行う事ができる。

いずれかのコールバックが不要な場合には、NULL を指定する事が可能。
(両方ともNULLでも支障は無い。)

AnimationCallback および RenderSceneCallback の形式は以下の通り
typedef void (*AnimationCallback)(float);
引数:前フレームからの経過時間(float)
返値:無し

typedef void (*RenderSceneCallback)(LPDIRECT3DDEVICE9 lpd3ddev);
引数:シーンの描画に使用するデバイス(LPDIRECT3DDEVICE9)
返値:無し


virtual void RenderSceneWithVP(RECT *rcWindow, RenderSceneCallback renderCB,BOOL bClear=TRUE)

引数:rcWindow:ビューポートを指定する矩形を指定する。
renderCB:描画の為のコールバックを指定する。
bClear:True…レンダリングに際し画面をクリアする,/False…画面をクリアしない。
返値:無し

ビューポートを指定し、そのビューポートに対してレンダリングを行う。
このメソッドは、UpdateScene メソッドから呼び出されるアニメーション用 コールバックの中から呼び出さなければならない。


virtual void UpdateScene(AnimationCallback2 animCB, RenderSceneCallback2 renderCB, PVOID lpUser)

引数:AnimationCallback2 animCB, RenderSceneCallback2 renderCB
返値:無し

シーンのレンダリングを行う。オーバーロード可能である。デフォルトの動作では、 シーンのレンダリングを行う前に、animCBで示される関数を呼び出し、スクリーンを 消去した後で、シーンを開始する。 renderCBで示されるプログラムを呼び出した後、スクリーンを画面に表示する。

アプリケーションプログラムは、animCBにゲームのアニメーションを記述し、 renderCBでキャラクタや背景の描画を行う事で画面表示を行う事ができる。

いずれかのコールバックが不要な場合には、NULL を指定する事が可能。
(両方ともNULLでも支障は無い。)
コールバック呼び出し時、lpUser の値がコールバックに渡される。

AnimationCallback2 および RenderSceneCallback2 の形式は以下の通り
typedef void (*AnimationCallback2)(float timeElapsed, PVOID lpUser);
引数:前フレームからの経過時間(float), lpUser に渡した値(PVOID)
返値:無し

typedef void (*RenderSceneCallback)(LPDIRECT3DDEVICE9 lpd3ddev, PVOID lpUser);
引数:シーンの描画に使用するデバイス(LPDIRECT3DDEVICE9), lpUser に渡した値(PVOID)
返値:無し


virtual void RenderSceneWithVP(RECT *rcWindow, RenderSceneCallback2 renderCB, PVOID lpUser, BOOL bClear=TRUE)

引数:rcWindow:ビューポートを指定する矩形を指定する。
renderCB:描画の為のコールバックを指定する。
lpUser:描画の為のコールバックに与える引数を指定する。
bClear:画面およびZ-Buffer をクリアしてから描画するときは、TRUE。
返値:無し

ビューポートを指定し、そのビューポートに対してレンダリングを行う。
このメソッドは、UpdateScene メソッドから呼び出されるアニメーション用 コールバックの中から呼び出さなければならない。
コールバック呼び出し時、lpUser の値がコールバックに渡される。
bClear を False にして呼び出すと、描画を終了したビューポートに対して上書きで描画が可能。


virtual void RenderSceneIntoSurface(LPDIRECT3DSURFACE9 pSurface, D3DCOLOR bgcolor, RenderSceneCallback2 renderCB, PVOID lpUser)

引数:pSurface:レンダリングターゲットとなるサーフェス。
bgcolor:画面クリアに使用する色を指定する。
renderCB:描画の為のコールバックを指定する。
lpUser:描画の為のコールバックに与える引数を指定する。
返値:無し

サーフェスを指定し、そのサーフェスに対してレンダリングを行う。
このメソッドは、UpdateScene メソッドから呼び出されるアニメーション用 コールバックの中から呼び出さなければならない。
コールバック呼び出し時、lpUser の値がコールバックに渡される。


void SetBackgroundColor(D3DCOLOR c)

引数:D3DCOLOR c:スクリーンをクリアする際に塗りつぶす色を指定
返値:無し

デフォルトの UpdateScene メソッドは、画面描画に際してスクリーンの クリアを行うが、スクリーンのクリアは単一の色でスクリーンを塗りつぶす 事で行う。このメソッドを使用して、スクリーンのクリアに使用するカラーを指定できる。


HRESULT ToggleFullscreen()

引数:無し
返値:結果を示すコード(通常は S_OK を返す)

現在の描画環境がウインドウモードであればフルスクリーンモードに切り替える。 現在の描画環境がフルスクリーンモードであればウインドウモードに切り替える。 現在のモードを確認するには、IsWindowed()を使用する。


BOOL IsWindowed()

引数:無し
返値:描画環境の現在のモード(BOOL)

現在の描画環境がウインドウモードであればTRUEを返し、フルスクリーンモード であれば、FALSEを返す。


HRESULT GetD3DDevice(LPDIRECT3DDEVICE9 *pDevice)

引数:デバイスを返す為のポインタ
返値:成功・失敗を返すコード。通常は(S_OK)

描画環境が使用しているDirect3D9 デバイスを返す。デバイスのリファレンスカウント をインクリメントする為、使用終了時必ずReleaseする必要がある。
//【使用例】
LPDIRECT3DDEVICE9 pDevice;
if (SUCCEEDED(lpd3denv->GetD3DDevice(&pDevice))){

    //       :
    //       :

    //	Do some rendering.

    //       :
    //       :

    pDevice->Release();
}


void AddGraphicsObject(CGraphicsObject *pObj)

引数:登録する CGraphicsObject オブジェクト
返値:なし

指定されたCGraphicsObject をシステムの管理下に置く。
登録されたオブジェクトは FIFO に格納され、
登録された順序で、デバイス依存データのリロード・解放が行われる。


void RemoveGraphicsObject(CGraphicsObject *pObj)

引数:システム管理下から取り除く CGraphicsObject オブジェクト
返値:なし

指定されたCGraphicsObject をシステムの管理下からはずす。


virtual DWORD SelectMode(D3DModeInfo *modes, DWORD numModes)

引数:D3DModeInfo *modes:表示モードを表すデータ配列へのポインタ
   DWORD numModes:表示モード配列の要素数。
返値:使用するモードの要素番号を返す。

 使用する表示モードの選択を行う。デフォルトの動作では、640×480のモードを 選択する。このメソッドをオーバーロードする事で、他のモードでの初期化が可能に なる。
//【オーバーロードにより、1024×768のモードに設定する例】
DWORD    MyCD3DEnv::SelectMode(D3DModeInfo *modes, DWORD numModes)
{
    DWORD    dwCurrent = 0;
    // 解像度 1024x768 のモードを初期値とする。
    //(ピクセルフォーマットが16ビットのモードを優先する)
    for(DWORD m=0L; m<numModes; m++ ){
        if( modes[m].Width==1024 && modes[m].Height==768 )
        {
            dwCurrent = m;
            if( modes[m].Format == D3DFMT_R5G6B5 ||
                modes[m].Format == D3DFMT_X1R5G5B5 ||
                modes[m].Format == D3DFMT_A1R5G5B5 )
            {
                break;
            }
        }
    }
    return    dwCurrent;
}


BOOL GetDI8KeyState(int key)

引数:キーコード DIK_* で指定する。
返値:指定したキーが押されていればTRUE を返す。

ジョイスティックの状態はカーソルキーとして返される。 ジョイスティックのボタンの一つ目が押されていれば、スペースキーが 押されたものとみなす。


virtual HRESULT InitDI(HWND hWnd)

引数:HWND hWnd : アプリケーションが使用するウインドウへのハンドル
返値:初期化の成否を返す。

DirectInput を初期化する内部メソッド。オーバーロードが可能である。
//【DirectInputを使用しない例】
class	MyCD3DEnv : public CD3DEnv
{
public:
    virtual	HRESULT	InitDI(HWND hWnd){    return S_OK;    }
};


virtual HRESULT CheckDeviceFormat(DWORD usage, D3DRESOURCETYPE rtype, D3DFORMAT format)

引数:usage:要求する使用方法をD3DUSAGE および D3DUSAGE_QUERY 定数の任意の組み合わせで指定する。
rtype:リソース タイプを、D3DRESOURCETYPE のメンバで指定する。
例えばテクスチャであれば、D3DRTYPE_TEXTURE を指定する。
format:使用しようとするサーフェイスのフォーマットD3DFORMAT のメンバで指定する。
テクスチャであればテクスチャフォーマット。
返値:使用可能であればS_OK

現在使用中のデバイス上で、指定されたリソースが使用可能かどうかを確認する。
例えば現在使用中のデバイス上で、あるテクスチャのフォーマットが使用可能かどうかを 確認するような場合に使用できる。


void RenderTriangle3D(D3DXVECTOR3 *p,D3DCOLOR c, D3DXMATRIX *pMat=NULL);

引数:p:3つの頂点の座標を時計回りで指定する。
c:頂点カラーをD3DCOLOR 型で指定する。
pMat:描画に使用するワールド行列を指定する。(省略可)
返値:なし

指定された座標を用いて三次元空間内に三角形を描画する。ワールド行列が省略されると、 カメラ空間内に直接三角形を描画する。


void RenderQuadrilateral3D(D3DXVECTOR3 *p,D3DCOLOR c, D3DXMATRIX *pMat=NULL)

引数:p:4つの頂点の座標を時計回りで指定する。
c:頂点カラーをD3DCOLOR 型で指定する。
pMat:描画に使用するワールド行列を指定する。(省略可)
返値:なし

指定された座標を用いて三次元空間内に四角形を描画する。ワールド行列が省略されると、 カメラ空間内に直接四角形を描画する。


void RenderLine3D(D3DXVECTOR3 *p, D3DCOLOR c, D3DXMATRIX *pMat = NULL)

引数:p:2つの頂点の座標を指定する。
c:頂点カラーをD3DCOLOR 型で指定する。
pMat:描画に使用するワールド行列を指定する。(省略可)
返値:なし

指定された座標を用いて三次元空間内に直線を描画する。ワールド行列が省略されると、 カメラ空間内に直接四角形を描画する。


BOOL TextureDBRegisterNewKey(LPSTR key,CTextureNode **pRet)

引数:key:テクスチャを特定するキーワード(現在の実装ではファイル名)。
pRet:共有テクスチャクラスのインスタンスを受け取る為のポインタ。

返値:新しくテクスチャが読み込まれる場合には、TRUE すでに登録されている場合は FALSE

複数のモデルや単一モデル内の複数のマテリアルが、同じテクスチャを重複ロードする事を 避ける為の共有システム。テクスチャのファイル名を渡して、共有テクスチャのインスタンスを 取得する。既に読まれているテクスチャの場合、読まれているテクスチャを返すが、 読まれていなければ新たにインスタンスを生成する。

※ファイル名はフルパスで指定すること。


CShaderContainer *GetShaderContainer(GUID guid);

引数:guidシェーダを特定するGUID。
返値:CShaderContainer オブジェクト見つからなければ NULL

システムに登録されている CShaderContainer オブジェクトを返す。
返す際、参照カウントがインクリメントされる為、使用終了後 CShaderContainer::Release()を呼び出し、 必ずデクリメントする事。


BOOL ConfirmDevice(D3DCAPS9 *pCaps,DWORD dwBehavior,D3DFORMAT fmt);

引数:pCaps:D3DCAPS9 型のポインタ。デバイスの性能を受け取る。
dwBehavior:デバイスの動作モードを受け取る。
fmt:バックバッファのピクセルフォーマットを受け取る。

このメソッドは、アプリケーションに応じて、必要とする性能を持ったデバイス・モードを判定する為に オーバーライドして設定する。

標準では以下のプログラムになっている。

BOOL    CD3DEnv::ConfirmDevice(D3DCAPS9 *pCaps,DWORD dwBehavior,D3DFORMAT fmt){
    if( (dwBehavior & D3DCREATE_HARDWARE_VERTEXPROCESSING ) ||
        (dwBehavior & D3DCREATE_MIXED_VERTEXPROCESSING ) )
    {
        if( pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
            return    E_FAIL;
    }
    if( pCaps->PixelShaderVersion < D3DPS_VERSION(1,1) )
        return    E_FAIL;
    return S_OK;
}


D3DQuickLib のTOPページへ。