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

📄 display.cpp

📁 VC++ DEMO, used for the beginners and the amour
💻 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 + -