⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgdevice.cpp

📁 zip压缩,解压缩 英文版本的,大家凑货看
💻 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 + -