📄 display.cpp
字号:
#include "HEADERS.H"
#include "DISPLAY.H"
USING NAMESPACE CGE::DISPLAY;
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_DISCARD: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_D16;
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();
}
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;
}
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;
}
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;
}
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();
}
LONG BEHAVIOR::BackBufferWidth()
{
D3DSURFACE_DESC desc;
if ( BACK_SURFACE )
{
BACK_SURFACE->GetDesc(&desc);
return desc.Width;
}
return -1;
}
LONG BEHAVIOR::BackBufferHeight()
{
D3DSURFACE_DESC desc;
if ( BACK_SURFACE )
{
BACK_SURFACE->GetDesc(&desc);
return desc.Height;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -