📄 cgdevice.cpp
字号:
#include "CGDevice.h"
#include "CManage.h"
CGDevice *CGDevice::Instance=0;
CGDevice *CGDevice::GetInstance()
{
static CGDevice Dev;
if(!Instance)
Instance=&Dev;
return Instance;
}
CGDevice::CGDevice():m_pD3D(0),m_pd3dDevice(0),mHwnd(0)
{
mHinstance=GetModuleHandle(NULL);
}
CGDevice::~CGDevice()
{
SAFE_RELEASE(m_pd3dDevice);
SAFE_RELEASE(m_pD3D);
}
HRESULT CGDevice::InitDevice(int width,int height,int windowed,CManage *Manage)
{
//创建窗口
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance=mHinstance;
wndClass.lpfnWndProc=WindowProc;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpszClassName=TEXT("simpleD3d");
if(!RegisterClass(&wndClass))
return S_FALSE;
mHwnd=CreateWindow(TEXT("simpleD3d"),TEXT("myShipFunny"),
WS_POPUP|WS_VISIBLE|WS_CAPTION,
CW_USEDEFAULT,CW_USEDEFAULT,width,height,NULL,NULL,mHinstance,NULL);
UpdateWindow(mHwnd);
//创建D3d设备
HRESULT hr;
if(NULL==(m_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return S_FALSE;
mWidth=width;
mHeight=height;
bWindowed=windowed;
if(windowed) //创建窗口模式下的缓冲区格式
{
SetPresentAsWindow();
}
else //创建全屏缓冲区格式
{
SetPresentAsFull();
}
hr=m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&mPresentParam,
&m_pd3dDevice);
SetProject(); //设置投影
SetViewPort(); //设置视口
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,FALSE);
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
this->pManage=Manage;
return S_OK;
}
void CGDevice::SetPresentAsFull()
{
ZeroMemory(&mPresentParam,sizeof(mPresentParam));
mPresentParam.Windowed=FALSE;
mPresentParam.BackBufferWidth=mWidth;
mPresentParam.BackBufferHeight=mHeight;
mPresentParam.BackBufferFormat=D3DFMT_A8R8G8B8;
mPresentParam.SwapEffect=D3DSWAPEFFECT_DISCARD;
mPresentParam.hDeviceWindow=mHwnd;
mPresentParam.FullScreen_RefreshRateInHz=0;
mPresentParam.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE;
mPresentParam.EnableAutoDepthStencil= TRUE;
mPresentParam.AutoDepthStencilFormat=D3DFMT_D16;
}
void CGDevice::SetPresentAsWindow()
{
D3DDISPLAYMODE d3ddm;
m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);
ZeroMemory(&mPresentParam,sizeof(mPresentParam));
mPresentParam.Windowed=TRUE;
mPresentParam.BackBufferWidth=mWidth;
mPresentParam.BackBufferHeight=mHeight;
mPresentParam.BackBufferFormat=d3ddm.Format;
mPresentParam.SwapEffect=D3DSWAPEFFECT_DISCARD;
mPresentParam.hDeviceWindow=mHwnd;
mPresentParam.FullScreen_RefreshRateInHz=0;
mPresentParam.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE;
mPresentParam.EnableAutoDepthStencil= TRUE;
mPresentParam.AutoDepthStencilFormat=D3DFMT_D16;
}
HRESULT CGDevice::Run()
{
MSG msg;
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pManage->Update();
m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
m_pd3dDevice->BeginScene();
pManage->Render();
m_pd3dDevice->EndScene();
m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
return S_OK;
}
LRESULT CALLBACK CGDevice::WindowProc(HWND hwnd,UINT uMsg,
WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
void CGDevice::SetProject()
{
D3DXMATRIX matProject;
D3DXMatrixPerspectiveFovLH(&matProject,D3DX_PI/2.0f,(float)mWidth/(float)mHeight,1.0f,50000.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProject);
}
void CGDevice::SetViewPort()
{
D3DVIEWPORT9 view;
view.Height=mHeight;
view.Width=mWidth;
view.X=0;
view.Y=0;
view.MaxZ=1.0f;
view.MinZ=0.0f;
m_pd3dDevice->SetViewport(&view);
}
void CGDevice::VertexMulMatrix(D3DXVECTOR3 *pVer,D3DXMATRIX *pMat)
{
D3DXVECTOR4 tVer(pVer->x,pVer->y,pVer->z,1.0f);
D3DXVECTOR4 Result;
Result.x=tVer.x*pMat->_11+tVer.y*pMat->_21+tVer.z*pMat->_31+tVer.w*pMat->_41;
Result.y=tVer.x*pMat->_12+tVer.y*pMat->_22+tVer.z*pMat->_32+tVer.w*pMat->_42;
Result.z=tVer.x*pMat->_13+tVer.y*pMat->_23+tVer.z*pMat->_33+tVer.w*pMat->_43;
Result.w=tVer.x*pMat->_14+tVer.y*pMat->_24+tVer.z*pMat->_34+tVer.w*pMat->_44;
Result.x/=Result.w;
Result.y/=Result.w;
Result.z/=Result.w;
pVer->x=Result.x;
pVer->y=Result.y;
pVer->z=Result.z;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -