?? cd3dapp.cpp
字號:
#include "CD3DApp.h"
#include "normal.h"
#include "MsgHelp.h"
#include "3dhelp.h"
#include "CShakingCamera.h"
#include "CSnapshot.h"
#include "CLight.h"
#include "CMaterialManager.h"
#include "CGameRender.h"
extern CShakingCamera theCamera;
extern CSnapshot theSnapshot;
extern CLight theLight;
extern CMaterialManager theMaterialManager; //材質管理器
extern CGameRender theGameRender;
CD3DApp::CD3DApp()
{
m_pD3D9 = NULL;
m_pDevice = NULL;
m_Color = D3DCOLOR_XRGB( 128, 128, 128 );
}
CD3DApp::~CD3DApp()
{
}
/////////////////////////////////////////////////////////////////////
//初始化D3D
/////////////////////////////////////////////////////////////////////
bool CD3DApp::InitD3D( bool IsWindow, HWND hWnd )
{
HRESULT hr;
//獲取D3D9對象指針:
m_pD3D9 = Direct3DCreate9( D3D_SDK_VERSION );
if ( m_pD3D9 == NULL )
{
Warn( "DX版本不符請正確安裝DX9版本" );
return false;
}
//獲取當前顯示模式:
D3DDISPLAYMODE d3dDisplayMode;
hr = m_pD3D9->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,
&d3dDisplayMode );
if ( FAILED( hr ) )
{
Warn( "獲取顯示模式失敗" );
return false;
}
//檢測硬件支持
DWORD vp = 0;
D3DCAPS9 d3dcaps;
hr = m_pD3D9->GetDeviceCaps( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, &d3dcaps );
if ( FAILED( hr ) )
{
Warn( "檢測硬件失敗" );
return false;
}
if ( d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
Warn( "不支持3D加速功能" );
}
//獲取窗口寬高:
RECT rc;
GetClientRect( hWnd, &rc );
//填充D3DPRESENT_PARAMETERS
D3DPRESENT_PARAMETERS m_d3dpp;
ZeroMemory( &m_d3dpp, sizeof( D3DPRESENT_PARAMETERS ) );
m_d3dpp.BackBufferWidth = rc.right - rc.left;
m_d3dpp.BackBufferHeight = rc.bottom - rc.top;
m_d3dpp.BackBufferFormat = d3dDisplayMode.Format;
m_d3dpp.BackBufferCount = 1;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.Windowed = IsWindow;
m_d3dpp.EnableAutoDepthStencil = TRUE; //FALSE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //D3DFMT_UNKNOWN;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //D3DSWAPEFFECT_FLIP
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //D3DPRESENT_INTERVAL_DEFAULT
hr = m_pD3D9->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
vp,
&m_d3dpp,
&m_pDevice
);
if ( FAILED( hr ) )
{
Warn( "創建設備失敗" );
return false;
}
return true;
}
/////////////////////////////////////////////////////////////////////
//釋放D3D
/////////////////////////////////////////////////////////////////////
void CD3DApp::FreeD3D()
{
SafeRelease( m_pDevice );
SafeRelease( m_pD3D9 );
}
/////////////////////////////////////////////////////////////////////
//初始化圖形層
/////////////////////////////////////////////////////////////////////
bool CD3DApp::InitApp()
{
if ( !theSnapshot.Init() )
{
Warn( "Snapshot init failed" );
return false;
}
if ( !theMaterialManager.Init() )
{
Warn( "MaterialManager init failed" );
return false;
}
if ( !theGameRender.Init( m_pDevice ) )
{
Warn( "GameRender init failed" );
return false;
}
theCamera.LookAtZ( -4.5f );
theCamera.RotationR( AngleToRadian(15.0f ) );
return true;
}
/////////////////////////////////////////////////////////////////////
//釋放圖形層
/////////////////////////////////////////////////////////////////////
void CD3DApp::FreeApp()
{
theSnapshot.Free();
theMaterialManager.Free();
theGameRender.Free();
}
/////////////////////////////////////////////////////////////////////
//渲染
/////////////////////////////////////////////////////////////////////
void CD3DApp::Render()
{
if ( m_pDevice == NULL ) return;
//設置視圖矩陣:
D3DXMATRIX v;
theCamera.GetViewMatirx( v );
m_pDevice->SetTransform( D3DTS_VIEW, &v );
//設置投影矩陣:
D3DXMATRIX m;
D3DXMatrixPerspectiveFovLH( &m,
D3DX_PI / 4.0f,
(float)800 / (float)600,
1.0f,
500.0f
);
m_pDevice->SetTransform( D3DTS_PROJECTION, &m );
//清空表面:
m_pDevice->Clear( 0, NULL,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
m_Color,
1.0f, 0
);
//繪制:
m_pDevice->BeginScene();
theLight.SetLight( m_pDevice );
theGameRender.Draw( m_pDevice );
m_pDevice->EndScene();
theSnapshot.ScreenShot( m_pDevice );
m_pDevice->Present( NULL, NULL, NULL, NULL );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -