mud_easy3d\common
// D3DDev8.h
// 2006-02-18
#ifndef _WIN32API_D3DDEV_H_
#define _WIN32API_D3DDEV_H_
#include
#include
#include
/// D3Dデバイス
class CD3DDev {
public:
/// コンストラクタ
CD3DDev();
/// デストラクタ
~CD3DDev();
/// オブジェクト取得
LPDIRECT3D8 GetD3D() {
return m_lpD3D;
}
/// オブジェクト取得
LPDIRECT3DDEVICE8 GetDevice() {
return m_lpD3DDevice;
}
/// 初期化
HRESULT Init( HWND hWnd );
/// 解放
void Kill();
///
void BeginScene( void );
///
bool EndScene( void );
protected:
/// D3Dデバイスオブジェクト
LPDIRECT3DDEVICE8 m_lpD3DDevice;
/// D3Dオブジェクト
static LPDIRECT3D8 m_lpD3D;
/// 参照カウンタ
static int m_cnt;
};
#endif //_WIN32API_D3DDEV_H_
// D3DDev8.cpp
#include "Util.h"
#include "D3DDev.h"
#define FULLSCREEN (0)
LPDIRECT3D8 CD3DDev::m_lpD3D = NULL;
int CD3DDev::m_cnt = 0;
CD3DDev::CD3DDev()
{
Debugout("CD3DDev");
m_lpD3DDevice = NULL;
}
CD3DDev::~CD3DDev()
{
Debugout("~CD3DDev");
if ( 0!=m_cnt ) {
Error( "D3Dオブジェクトの参照カウンタが異常です。D3Dオブジェクトは解放されていません。" );
// 1ならばここでKill()を呼んでもいいだろう
}
}
HRESULT CD3DDev::Init( HWND hWnd ) // bFullScreen
{
Debugout("CD3DDev::Init");
// オブジェクト初期化
if ( 0==m_cnt ) {
m_lpD3D = ::Direct3DCreate8( D3D_SDK_VERSION );
// エラー処理(未)
Debugout( "CD3DDev::Init D3Dオブジェクト生成しました。" );
}
m_cnt++;
// 現在の画面モードを取得
D3DDISPLAYMODE d3ddm;
if( FAILED( m_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) {
return E_FAIL;
}
// デバイスのパラメータを設定
D3DPRESENT_PARAMETERS param;
::ZeroMemory( ¶m, sizeof(param) );
param.BackBufferCount = 1; // バックバッファの数
if (FULLSCREEN) {
param.Windowed = FALSE; // フルスクリーン
param.BackBufferWidth = 640; // 解像度・幅
param.BackBufferHeight = 480; // 解像度・高さ
} else {
param.Windowed = TRUE; // ウインドウモード
}
param.BackBufferFormat = d3ddm.Format;
param.SwapEffect = D3DSWAPEFFECT_DISCARD; // 表示する方法
// param.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
param.hDeviceWindow = hWnd;
// Z バッファの自動作成
param.EnableAutoDepthStencil = 1;
param.AutoDepthStencilFormat = D3DFMT_D16;
// デバイス作成
D3DDEVTYPE DeviceType = D3DDEVTYPE_HAL;
DWORD BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
HRESULT hr = GetD3D()->CreateDevice(
D3DADAPTER_DEFAULT, // プライマリディスプレイアダプタ
DeviceType,
hWnd, // ウインドウハンドル
BehaviorFlags,
¶m, // パラメータ
&m_lpD3DDevice
);
if (FAILED(hr)) {
::MessageBox(NULL,"Direct3D の初期化に失敗しました。","エラー",MB_OK | MB_ICONSTOP);
return E_FAIL;
}
Debugout( "CD3DDev::Init D3Dデバイス生成しました。" );
return S_OK;
}
void CD3DDev::Kill()
{
Debugout("CD3DDev::Kill");
// 解放
SAFE_RELEASE( m_lpD3DDevice );
Debugout( "CD3DDev::Kill D3Dデバイス解放しました。" );
--m_cnt;
if (0>=m_cnt) {
SAFE_RELEASE( m_lpD3D );
Debugout( "CD3DDev::Kill D3Dオブジェクト解放しました。" );
}
}
void CD3DDev::BeginScene( void )
{
GetDevice()->Clear( 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,127), 1.0, 0 );
GetDevice()->BeginScene();
}
bool CD3DDev::EndScene( void )
{
GetDevice()->EndScene();
GetDevice()->Present( NULL, NULL, NULL, NULL );
return true;
}