www.pudn.com > 3D_Tank.rar > d3dUtility.cpp


#include "d3dUtility.h" 
 
bool d3d::InitD3D( 
	HINSTANCE hInstance, 
	int width, int height, 
	bool windowed, 
	D3DDEVTYPE deviceType, 
	IDirect3DDevice9** device, 
	HWND *hWindow, HINSTANCE *instance) 
{ 
	WNDCLASS wc; 
 
	wc.style         = CS_HREDRAW | CS_VREDRAW; 
	wc.lpfnWndProc   = (WNDPROC)d3d::WndProc;  
	wc.cbClsExtra    = 0; 
	wc.cbWndExtra    = 0; 
	wc.hInstance     = hInstance; 
	wc.hIcon         = LoadIcon(0, IDI_APPLICATION); 
	wc.hCursor       = LoadCursor(0, IDC_ARROW); 
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
	wc.lpszMenuName  = 0; 
	wc.lpszClassName = "Direct3D9App"; 
 
	*instance = hInstance; 
 
	if( !RegisterClass(&wc) )  
	{ 
		::MessageBox(0, "RegisterClass() - FAILED", 0, 0); 
		return false; 
	} 
		 
	HWND hwnd; 
	hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",  
		WS_EX_TOPMOST, 
		0, 0, width, height, 
		0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);  
 
	if( !(hwnd) ) 
	{ 
		::MessageBox(0, "CreateWindow() - FAILED", 0, 0); 
		return false; 
	} 
	*hWindow = hwnd; 
	 
	::ShowWindow(hwnd, SW_SHOW); 
	::UpdateWindow(hwnd); 
 
	HRESULT hr = 0; 
 
	IDirect3D9* d3d9 = 0; 
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION); 
 
    if( !d3d9 ) 
	{ 
		::MessageBox(0, "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, "CreateDevice() - FAILED", 0, 0); 
			return false; 
		} 
	} 
 
	 
 
	d3d9->Release();  
	 
	return true; 
} 
 
int d3d::EnterMsgLoop( bool (*ptr_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; 
 
			ptr_display(timeDelta); 
 
			lastTime = currTime; 
        } 
    } 
 
	return (int)msg.wParam; 
}