/*
需要包含以下库
d3d9.lib
d3dx9.lib
winmm.lib
*/
#include <d3dx9.h>
namespace d3d {
bool InitD3D(HWND hwd,
HINSTANCE hInstance, //[in]应用程序实例
int width, int height,//[in]Back buffer尺寸
bool windowed, //[in]是否全屏
D3DDEVTYPE deviceType,//[in]HAL or REF
IDirect3DDevice9** device); //[out]创建的设备
LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
int EnterMsgLoop(bool(*ptr_display)(float timeDelta));
template<class T>
void Release(T t)
{
if (t)
{
t->Release();
t = 0;
}
}
template<class T>
void Delete(T t)
{
if (t)
{
delete t;
t = 0;
}
}
}
#include "stdafx.h"
#include "d3dUtility.h"
bool d3d::InitD3D(HWND hwd,
HINSTANCE hInstance, //[in]应用程序实例
int width, int height,//[in]Back buffer尺寸
bool windowed, //[in]是否全屏
D3DDEVTYPE deviceType,//[in]HAL or REF
IDirect3DDevice9** device) //[out]创建的设备
{
// ***第一步,获得IDirect3D9接口
IDirect3D9* _d3d9;
_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if (_d3d9 == NULL) return false;
// ***第二步,检查设备能力
D3DCAPS9 caps;
_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, //主显示设备
deviceType, //设备类型
&caps);
//是否支持使用硬件顶点处理?
int vp = 0;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
//是,支持硬件顶点处理
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
//不,只能用软件顶点处理
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
//***第三步,初始化D3DPRESENT_PARAMETERS结构
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//***第四步,创建IDirect3DDevice9对象
HRESULT hr = _d3d9->CreateDevice(D3DADAPTER_DEFAULT,
deviceType,
hwd,
vp,
&d3dpp,
device);
if (FAILED(hr))
{
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
return true;
}
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if (wParam==VK_ESCAPE)
::PostQuitMessage(0);//::DestoryWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
int d3d::EnterMsgLoop(bool(*ptr_display)(float timeDelta))
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));
static float lastTime = 0; //(float)timeGetTime();
while (msg.message!=WM_QUIT)
{
if (::PeekMessage(&msg,0,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime = 0; //(float)timeGetTime();
float timeDelta = (currTime - lastTime)*0.001f;
ptr_display(timeDelta);
lastTime = currTime;
}
}
return msg.wParam;
}
