📄 display.h
字号:
#ifdef CGE_HEADER_H
#ifndef CGE_DISPLAY_H
#define CGE_DISPLAY_H
namespace CGE
{
namespace DISPLAY_SYSTEM
{
class BEHAVIOR;
typedef class MEMBER
{
public:
MEMBER()
:Behavior(0)
{};
virtual ~MEMBER(){};
virtual BOOL Install() = 0;
virtual BOOL UnInstall() = 0;
BEHAVIOR* Behavior;
}MEMBER,*LPMEMBER;
typedef class BEHAVIOR
{
public:
BEHAVIOR();
virtual ~BEHAVIOR();
public:
BOOL BehaviorCreate(MEMBER * Mem,VOID * hWnd,LONG w,LONG h,BOOL bWindowed = TRUE);
BOOL SetRenderBehavior( LONG Width, LONG Height,BOOL bWindowed = TRUE);
BOOL SetDefaultVertexBuffer( LONG Length );
BOOL CheckCooperativeLevel();
LONG BackBufferHeight();
LONG BackBufferWidth();
LPDIRECT3DDEVICE8 GetSafeDevice() { return DEVICE; }
D3DFORMAT CheckDisplayMode(LONG nWidth,LONG nHeight,INT nDepth);
LPDIRECT3DVERTEXBUFFER8 GetSafeDefaultVertBuffer() { return DEFAULT_VERT_BUFFER; }
LONG GetVertexBufferLength() { return VERT_BUFFER_LENGTH; }
protected:
LPDIRECT3DDEVICE8 DEVICE;
LPDIRECT3D8 DIRECTX;
LPDIRECT3DSURFACE8 MOUSE_SURFACE;
LPDIRECT3DSURFACE8 BACK_SURFACE;
LPDIRECT3DVERTEXBUFFER8 DEFAULT_VERT_BUFFER;
LONG VERT_BUFFER_LENGTH;
D3DPRESENT_PARAMETERS D3DPARAMETER;
MEMBER* MEMBERVAR;
}*LPBEHAVIOR;
CGE_INLINE
BOOL BEHAVIOR::BehaviorCreate(MEMBER * Mem,VOID * hWnd,LONG w,LONG h,BOOL bWindowed)
{
DIRECTX = Direct3DCreate8(D3D_SDK_VERSION);
if(DIRECTX == NULL)
{
return FALSE;
}
if( (MEMBERVAR = Mem) == NULL ) return FALSE;
MEMBERVAR->Behavior = this;
ZeroMemory(&D3DPARAMETER,sizeof(D3DPRESENT_PARAMETERS));
D3DPARAMETER.Windowed = bWindowed;
D3DPARAMETER.BackBufferCount = 1;
D3DPARAMETER.BackBufferWidth = w;
D3DPARAMETER.BackBufferHeight = h;
D3DPARAMETER.hDeviceWindow = (HWND)hWnd;
D3DPARAMETER.SwapEffect = bWindowed ? D3DSWAPEFFECT_FLIP:D3DSWAPEFFECT_COPY_VSYNC;
D3DPARAMETER.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
D3DPARAMETER.FullScreen_PresentationInterval = bWindowed ? 0:D3DPRESENT_INTERVAL_ONE;
D3DDISPLAYMODE d3ddm;
if ( bWindowed )
{
DIRECTX->GetAdapterDisplayMode(0,&d3ddm);
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
d3ddm.Format = CheckDisplayMode(w , h, 32);
if(d3ddm.Format != D3DFMT_UNKNOWN)
{
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
d3ddm.Format = CheckDisplayMode(w, h, 16);
if( d3ddm.Format != D3DFMT_UNKNOWN)
{
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
return FALSE;
}
}
}
if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK)
{
D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D32;
D3DPARAMETER.EnableAutoDepthStencil = TRUE;
}
else if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) == D3D_OK)
{
D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D24X8;
D3DPARAMETER.EnableAutoDepthStencil = TRUE;
}
else if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) == D3D_OK)
{
D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D16;
D3DPARAMETER.EnableAutoDepthStencil = TRUE;
}
else
{
D3DPARAMETER.EnableAutoDepthStencil = FALSE;
}
if(FAILED(DIRECTX->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DPARAMETER.hDeviceWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPARAMETER, &DEVICE)))
{
SAFE_RELEASE(DIRECTX);
return FALSE;
}
if(FAILED(DEVICE->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&BACK_SURFACE)))
{
SAFE_RELEASE(DIRECTX);
SAFE_RELEASE(DEVICE);
return FALSE;
}
return MEMBERVAR->Install();
}
CGE_INLINE
D3DFORMAT BEHAVIOR::CheckDisplayMode(LONG nWidth, LONG nHeight, INT nDepth)
{
register UINT x;
D3DDISPLAYMODE d3ddm;
for(x = 0; x < DIRECTX->GetAdapterModeCount(0); x++)
{
DIRECTX->EnumAdapterModes(0, x, &d3ddm);
if(d3ddm.Width == nWidth)
{
if(d3ddm.Height == nHeight)
{
if((d3ddm.Format == D3DFMT_R5G6B5) || (d3ddm.Format == D3DFMT_X1R5G5B5) || (d3ddm.Format == D3DFMT_X4R4G4B4))
{
if(nDepth == 16)
{
return d3ddm.Format;
}
}
else if((d3ddm.Format == D3DFMT_R8G8B8) || (d3ddm.Format == D3DFMT_X8R8G8B8))
{
if(nDepth == 32)
{
return d3ddm.Format;
}
}
}
}
}
return D3DFMT_UNKNOWN;
}
CGE_INLINE
BOOL BEHAVIOR::SetDefaultVertexBuffer(LONG Length)
{
SAFE_RELEASE(DEFAULT_VERT_BUFFER);
VERT_BUFFER_LENGTH = Length;
if(FAILED(DEVICE->CreateVertexBuffer( VERT_BUFFER_LENGTH ,
D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS,
0, D3DPOOL_DEFAULT, &DEFAULT_VERT_BUFFER )))
{
return FALSE;
}
return TRUE;
}
CGE_INLINE
BOOL BEHAVIOR::CheckCooperativeLevel()
{
HRESULT hr;
if( FAILED( hr = DEVICE->TestCooperativeLevel() ) )
{
// 当设备丢失时,要等到设备有效后方可继续
if( D3DERR_DEVICELOST==hr )
return FALSE;
// 重置设备
if( D3DERR_DEVICENOTRESET==hr )
{
if ( MEMBERVAR == NULL )
return FALSE;
// 在重置前必须要释放资源
if ( TRUE == MEMBERVAR->UnInstall() )
{
SAFE_RELEASE(BACK_SURFACE);
SAFE_RELEASE(DEFAULT_VERT_BUFFER);
if( FAILED( DEVICE->Reset(&D3DPARAMETER) ) )
return FALSE;
if(FAILED(DEVICE->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&BACK_SURFACE)))
{
SAFE_RELEASE(DIRECTX);
SAFE_RELEASE(DEVICE);
return FALSE;
}
if ( SetDefaultVertexBuffer(VERT_BUFFER_LENGTH) == FALSE )
{
SAFE_RELEASE(DIRECTX);
SAFE_RELEASE(DEVICE);
return FALSE;
}
// 在重置后必须要重新载入资源
return MEMBERVAR->Install();
}
}
return FALSE;
}
return TRUE;
}
CGE_INLINE
BOOL BEHAVIOR::SetRenderBehavior(LONG Width, LONG Height, BOOL bWindowed)
{
if( !Width || !Height )
return FALSE;
D3DPARAMETER.BackBufferWidth = Width;
D3DPARAMETER.BackBufferHeight = Height;
D3DDISPLAYMODE d3ddm;
if ( bWindowed )
{
DIRECTX->GetAdapterDisplayMode(0,&d3ddm);
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
d3ddm.Format = CheckDisplayMode(Width , Height, 32);
if(d3ddm.Format != D3DFMT_UNKNOWN)
{
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
d3ddm.Format = CheckDisplayMode(Width, Height, 16);
if( d3ddm.Format != D3DFMT_UNKNOWN)
{
D3DPARAMETER.BackBufferFormat = d3ddm.Format;
}
else
{
return FALSE;
}
}
}
if ( SUCCEEDED(DEVICE->Reset(&D3DPARAMETER)))
{
return TRUE;
}
return CheckCooperativeLevel();
}
CGE_INLINE
LONG BEHAVIOR::BackBufferWidth()
{
D3DSURFACE_DESC desc;
if ( BACK_SURFACE )
{
BACK_SURFACE->GetDesc(&desc);
return desc.Width;
}
return -1;
}
CGE_INLINE
LONG BEHAVIOR::BackBufferHeight()
{
D3DSURFACE_DESC desc;
if ( BACK_SURFACE )
{
BACK_SURFACE->GetDesc(&desc);
return desc.Height;
}
return -1;
}
CGE_INLINE
BEHAVIOR::BEHAVIOR()
{
DIRECTX = NULL;
DEVICE = NULL;
BACK_SURFACE = NULL;
DEFAULT_VERT_BUFFER = NULL;
MOUSE_SURFACE = NULL;
VERT_BUFFER_LENGTH = NULL;
MEMBERVAR = NULL;
}
CGE_INLINE
BEHAVIOR::~BEHAVIOR()
{
SAFE_RELEASE(MOUSE_SURFACE);
SAFE_RELEASE(DEFAULT_VERT_BUFFER);
SAFE_RELEASE(DEVICE);
SAFE_RELEASE(BACK_SURFACE);
SAFE_RELEASE(DIRECTX);
SAFE_DELETE(MEMBERVAR);
}
}
}
#endif
#endif //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -