#include "Device.h"
#include "Camera.h"
#include "Texture.h"
//////////////////////////////////////////////////////////////////////////
CRenderDevice::DevSettings::DevSettings()
{
bFullScreen = false;
unScreenWidth = 0;
unScreenHeight = 0;
hWnd = NULL;
eBackBufferFormat = D3DFMT_UNKNOWN;
eDevtype = D3DDEVTYPE_HAL;
dwBehavior = 0;
bImmediate = TRUE;
}
//////////////////////////////////////////////////////////////////////////
CRenderDevice::DevSettings::~DevSettings()
{
// do nothing
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::DevSettings::RestoreDefault()
{
bFullScreen = false;
unScreenWidth = 800;
unScreenHeight = 600;
eBackBufferFormat = D3DFMT_X8R8G8B8;
eDevtype = D3DDEVTYPE_HAL;
dwBehavior = D3DCREATE_HARDWARE_VERTEXPROCESSING;
bImmediate = TRUE;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
CRenderDevice::CRenderDevice() : m_pD3D(NULL) , m_pDevice(NULL) , m_pDebugFont(NULL)
{
}
//////////////////////////////////////////////////////////////////////////
CRenderDevice::~CRenderDevice()
{
Destroy();
}
//////////////////////////////////////////////////////////////////////////
bool CRenderDevice::Initialize( const DevSettings& datas )
{
// 已经建立,那么应先销毁-------------------------------------------------------
if ( m_pDevice )
{ Destroy(); }
// 改变外部窗口的几何属性-------------------------------------------------------
RECT rct;
// 获取窗口的大小
::GetWindowRect( datas.hWnd , &rct );
// 改变大小
rct.right = rct.left + datas.unScreenWidth;
rct.bottom = rct.top + datas.unScreenHeight;
// 重设窗口
WINDOWINFO info;
info.cbSize = sizeof(WINDOWINFO);
if ( !::GetWindowInfo( datas.hWnd , &info ) )
{ return false; }
if( !::AdjustWindowRectEx( &rct , info.dwStyle , (::GetMenu(datas.hWnd) != NULL) , info.dwExStyle ) )
{ return false; }
::MoveWindow( datas.hWnd , 0 , 0 , rct.right - rct.left , rct.bottom - rct.top , TRUE );
// 生成Driver-------------------------------------------------------
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
{ return false; }
// 读取设置
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = !datas.bFullScreen;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.BackBufferCount = 1;
d3dpp.hDeviceWindow = datas.hWnd;
d3dpp.BackBufferWidth = datas.unScreenWidth;
d3dpp.BackBufferHeight = datas.unScreenHeight;
d3dpp.BackBufferFormat = datas.eBackBufferFormat;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
if ( datas.bImmediate )
{ d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; }
else
{ d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; }
HRESULT hr;
// 生成Device-------------------------------------------------------
if( FAILED( hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT , datas.eDevtype , datas.hWnd , datas.dwBehavior, &d3dpp, &m_pDevice ) ) )
{
const char* error = DXGetErrorDescription9( hr );
if ( datas.eDevtype == D3DDEVTYPE_HAL )
{
// 如果刚刚用硬件设备生成的,那么这里尝试用参考设备再生成一次
if ( FAILED( hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_REF , datas.hWnd , datas.dwBehavior, &d3dpp, &m_pDevice ) ) )
{
const char* error = DXGetErrorDescription9( hr );
return false;
}
}
// 如果本来就是参考设备,那么这里也不必再生成一次了,挂吧!
else
{ return false; }
}
m_Settings = datas;
// 生成DebugFont-------------------------------------------------------
D3DXFONT_DESC fd;
memset( &fd, 0, sizeof(D3DXFONT_DESC) ); // zero out structure
fd.CharSet = GB2312_CHARSET;
fd.Height = 12;
strcpy( fd.FaceName, "宋体" );
D3DXCreateFontIndirect( m_pDevice , &fd , &m_pDebugFont );
return true;
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::Destroy()
{
SafeRelease(m_pDebugFont);
SafeRelease(m_pDevice);
SafeRelease(m_pD3D);
}
//////////////////////////////////////////////////////////////////////////
bool CRenderDevice::StartRender()
{
if( FAILED( m_pDevice->BeginScene() ) )
{ return false; }
if ( m_pCurrentCamera )
{ m_pCurrentCamera->Update(); }
return true;
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::ClearScreen( BYTE r , BYTE g , BYTE b )
{
m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , D3DCOLOR_XRGB( r , g , b ) , 1.0f , 0 );
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::EndRender()
{
// 交换BackBuffer到屏幕
m_pDevice->EndScene();
m_pDevice->Present( NULL, NULL, NULL, NULL );
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::OutputDebugText( INT x , INT y , D3DCOLOR clr , const char* str , ... )
{
static char szBuffer[512];
va_list list;
va_start(list , str);
vsprintf( szBuffer , str , list);
va_end(list);
RECT rct;
rct.left = x;
rct.top = y;
rct.right = x + 10;
rct.bottom = y + 10;
m_pDebugFont->DrawText( NULL , szBuffer , strlen(szBuffer) , &rct , DT_NOCLIP | DT_LEFT | DT_TOP , clr );
}
//------------------------------------------------------------------------
void CRenderDevice::SetCamera( CCamera* cam )
{
m_pCurrentCamera = cam;
}
//------------------------------------------------------------------------
void CRenderDevice::SetWorldMatrix( D3DXMATRIX& mat )
{
m_pDevice->SetTransform( D3DTS_WORLD , &mat );
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::SetViewMatrix( D3DXMATRIX& mat )
{
m_pDevice->SetTransform( D3DTS_VIEW , &mat );
}
//////////////////////////////////////////////////////////////////////////
void CRenderDevice::SetProjMatrix( D3DXMATRIX& mat )
{
m_pDevice->SetTransform( D3DTS_PROJECTION , &mat );
}
void CRenderDevice::SetTexture( int slot , CTexture& tex )
{
m_pDevice->SetTexture( slot , tex.GetD3DTexture() );
}
huangzhtao
- 粉丝: 50
- 资源: 16
最新资源
- 光纤到户及通信基础设施报装申请表.docx
- 踝关节功能丧失程度评定表.docx
- 环保设施投资估算表.docx
- 既有建筑物通信报装申请表.docx
- 既有建筑物通信报装现场查勘报告.docx
- 监督机构检查记录表.docx
- 肩关节功能丧失程度评定表.docx
- 大学生创新创业训练计划大创项目的全流程指南
- 简易低风险工业厂房通信报装申请表.docx
- 建设工程消防验收各阶段意见回复表.docx
- 建设工程消防验收模拟验收意见表.docx
- 建设工程消防验收图纸核查意见表.docx
- 建设工程消防验收现场指导意见表.docx
- 建筑工程竣工验收消防设计质量检查报告(表格填写模板).docx
- 建筑工程消防查验意见和结论.docx
- 建筑工程消防施工竣工报告(表格填写模板).docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页