rendered paste bodydirectx_graphics.cpp:
//******************************* FOR MORE SEE THE .h file ********************************//
#include "direct_x_graphics.h"
//Initialise Cbn_DirectXGraphics
bn_Core::bn_DirectXGraphics::bn_DirectXGraphics()
{
//Sets it 0
m_lpD3D = NULL;
m_lpD3DDevice = NULL;
m_iBackBuffer = NULL;
}
//Destructor clears the class
bn_Core::bn_DirectXGraphics::~bn_DirectXGraphics()
{
//Clean
if (NULL != m_lpD3DDevice)
{
m_lpD3DDevice->Release();
m_lpD3DDevice=NULL;
}
//Clean
if (NULL != m_lpD3D)
{
m_lpD3D->Release();
m_lpD3D=NULL;
}
}
//Resets the object
void bn_Core::bn_DirectXGraphics::RestoreObject()
{
//Resets the device
DXTestForError(m_lpD3DDevice->Reset(&m_PresentParams),
"Error by reseting the Device",2,1);
}
//Tests for lost device
int bn_Core::bn_DirectXGraphics::TestCooperativeLevel()
{
HRESULT hrLostDevice = m_lpD3DDevice->TestCooperativeLevel();
//Do nothing
if (hrLostDevice == D3DERR_DEVICELOST)
return 2;
//Reset it
else if (hrLostDevice == D3DERR_DEVICENOTRESET)
return 1;
//Shut down!
else if (hrLostDevice == D3DERR_DRIVERINTERNALERROR)
ExceptionGameError("",0,0,"Internal error -shuting down",1);
return 0;
}
//Initialise Cbn_DirectXGraphics
void bn_Core::bn_DirectXGraphics::Init(HWND hWnd,unsigned int *pRefreshRate,bool bWindowed, int iBackBuffer, bool bCPUCalculate,int ScreenWidth,int ScreenHeight)
{
//Creates a D3D Object
if (FAILED(m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION)))
ExceptionGameError("",0,1,"Error, can't create a D3D Object.",1);
//Gets gfx-card informations
m_lpD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&m_DisplayMode);
//Zero Memory
ZeroMemory(&m_PresentParams,sizeof(m_PresentParams));
//Settings
m_PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_PresentParams.hDeviceWindow = hWnd; //Gives the windows to the struct
m_PresentParams.Windowed = bWindowed; //Fullscreen / Windowed
m_PresentParams.BackBufferFormat = D3DFMT_A8R8G8B8; //Sets 32 Bit
m_PresentParams.BackBufferCount = 1;
//m_PresentParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//m_PresentParams.FullScreen_RefreshRateInHz = 0;
*pRefreshRate = m_DisplayMode.RefreshRate;
//If there is an backbuffer
if (iBackBuffer)
{
m_iBackBuffer = iBackBuffer;
m_PresentParams.EnableAutoDepthStencil = true;
if (iBackBuffer == 16)
m_PresentParams.AutoDepthStencilFormat = D3DFMT_D16;
else if (iBackBuffer == 32)
m_PresentParams.AutoDepthStencilFormat = D3DFMT_D32;
}
//Sets the screen width if bWindowed == true
if (!bWindowed)
{
m_PresentParams.BackBufferWidth = ScreenWidth; //Sets the Width
m_PresentParams.BackBufferHeight = ScreenHeight; //Sets the Height
//m_PresentParams.FullScreen_RefreshRateInHz = m_DisplayMode.RefreshRate;
}
else
{
MoveWindow(hWnd,10,10,ScreenWidth,ScreenHeight,true);
}
//Typ of the device
D3DDEVTYPE DeviceTyp;
//If its CPU calculated
if (bCPUCalculate)
{
DeviceTyp = D3DDEVTYPE_REF;
//Errorfile
ExceptionGameError("",0,11,"Starting DirectGraphics, in Reference Device Mode");
}
else DeviceTyp = D3DDEVTYPE_HAL;
//Creates the device
DXTestForError(m_lpD3D->CreateDevice(D3DADAPTER_DEFAULT,DeviceTyp,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&m_PresentParams,&m_lpD3DDevice),
"Error by creating a Device",2,1);
// This is how you find out how many texture stages your hardware will support
D3DCAPS9 Caps;
m_lpD3DDevice->GetDeviceCaps(&Caps);
Adapter.dwMaxTextureBlendStages = Caps.MaxTextureBlendStages;
Adapter.dwPixelShaderVersion = Caps.PixelShaderVersion;
Adapter.dwVertexShaderVersion = Caps.VertexShaderVersion;
if (Adapter.dwMaxTextureBlendStages < 4)
{
ucs::string strBuffer = "Error, your hardware supports only ";
strBuffer += Adapter.dwMaxTextureBlendStages;
strBuffer += " textures per Object";
ExceptionGameError("",0,1,(char*)strBuffer.c_str(),true);
}
}
//Deletes the Surface
void bn_Core::bn_DirectXGraphics::Clear(D3DCOLOR Color,int iX,int iY,int iWidth,int iHeight)
{
D3DRECT rRect;
if ((iWidth == 0) || (iHeight == 0))
{
//If there is a backbuffer
if (m_iBackBuffer)
m_lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,Color,1.0f,0);
else m_lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET,Color,0,0);
}
else
{
rRect.x1 = iX;
rRect.y1 = iY;
rRect.x2 = iX + iWidth;
rRect.y2 = iY + iHeight;
//If there is a backbuffer
if (m_iBackBuffer)
m_lpD3DDevice->Clear(1,&rRect,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,Color,1.0f,0);
else m_lpD3DDevice->Clear(1,&rRect,D3DCLEAR_TARGET,Color,0,0);
}
}
//Begins with the Scene
void bn_Core::bn_DirectXGraphics::BeginScene()
{
m_lpD3DDevice->BeginScene();
}
//Present the Scene
HRESULT bn_Core::bn_DirectXGraphics:resent()
{
//Presents it
m_lpD3DDevice->EndScene();
return m_lpD3DDevice->Present(0,0,0,0);
}
//Gives the backbuffer back
LPDIRECT3DSURFACE9 bn_Core::bn_DirectXGraphics::GetBackBuffer()
{
LPDIRECT3DSURFACE9 BackBuffer;
m_lpD3DDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&BackBuffer);
return BackBuffer;
}
//Creates a Screenshot
void bn_Core::bn_DirectXGraphics::CreateScreenshot(ucs::string strFileName)
{
//Creates a surface for the screenshot
LPDIRECT3DSURFACE9 lpSurface;
m_lpD3DDevice->CreateOffscreenPlainSurface(
1024,768,
D3DFMT_A8R8G8B8,
D3DPOOL_SYSTEMMEM,
&lpSurface,0);
//Copys the screenshot into the front buffer
m_lpD3DDevice->GetFrontBufferData(0,lpSurface);
//Saves it in a file
D3DXSaveSurfaceToFile(strFileName.c_str(),D3DXIFF_BMP,
lpSurface,0,NULL);
//Cleans the surface
lpSurface->Release();
}