|
|
#include"d3d9.h"
IDirect3DDevice9* device = 0;
LRESULT CALLBACK WndProc( HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam )
{
switch( msg )
{
case WM_DESTROY:
: ostQuitMessage( 0 );
break;
case WM_KEYDOWN:
if( wparam == VK_ESCAPE )
: estroyWindow( hwnd );
break;
}
return ::DefWindowProc( hwnd,msg,wparam,lparam );
}
bool InitD3D( HINSTANCE hinstance,
int width,int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device )
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = ( HBRUSH )GetStockObject( WHITE_BRUSH );
wc.hCursor = LoadCursor( 0,IDC_ARROW );
wc.hIcon = LoadIcon( 0,IDI_APPLICATION );
wc.hInstance = hinstance;
wc.lpfnWndProc = ( WNDPROC )WndProc;
wc.lpszClassName = L"Demo Window";
wc.lpszMenuName = 0;
wc.style = CS_HREDRAW | CS_VREDRAW;
if( !RegisterClass( &wc ) )
{
::MessageBox( 0,L"RegisterClass() - FAILED",0,0 );
return false;
}
HWND hwnd = 0;
hwnd = ::CreateWindow( L"Demo_window",L"Demo_window",
WS_EX_TOPMOST,
0,0,width,height,
0,0,hinstance,0 );
::ShowWindow( hwnd,SW_SHOW );
::UpdateWindow( hwnd );
HRESULT hr = 0;
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9( D3D_SDK_VERSION );
if( !d3d9 )
{
::MessageBox( 0,L"Direct3DCreate9() - FAILED",0,0 );
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 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 = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);
if( FAILED(hr) )
{
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);
if( FAILED(hr) )
{
d3d9->Release();
::MessageBox(0, L"CreateDevice() - FAILED", 0, 0);
return false;
}
}
d3d9->Release();
return true;
}
bool Setup()
{
return true;
}
void Cleanup()
{
}
bool Display( float timeDelta )
{
if( device )
{
device->Clear( 0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0 );
device-> resent( 0,0,0,0 );
}
return true;
}
int EnterMsgLoop( bool ( *display )( float timeDelta ) )
{
MSG msg;
::ZeroMemory( &msg,sizeof( MSG ) );
static float lastTime = ( float )timeGetTime();
while( msg.message != WM_QUIT )
{
if( ::PeekMessage( &msg,0,0,0,PM_REMOVE ) )
{
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
else
{
float currTime = ( float )timeGetTime();
float timeDelta = ( currTime - lastTime )*0.001f;
display( timeDelta );
lastTime = currTime;
}
}
return msg.wParam;
}
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevInstance,
LPSTR cmdline,
int showCmd )
{
if( !InitD3D( hinstance,640,480,true,D3DDEVTYPE_HAL,&device ) )
{
::MessageBox( 0,L"InitD3D() - FAILED",0,0 );
return false;
}
if( !Setup() )
{
::MessageBox( 0,L"setup() - FAILED",0,0 );
return false;
}
EnterMsgLoop( Display );
Cleanup();
device->Release();
return 0;
}
|
|