73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
#include "Direct3D.h"
|
|
#include "Utilities.h"
|
|
|
|
INT Direct3D::init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen)
|
|
{
|
|
// 1. create connection to Direct3D API
|
|
IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION);
|
|
if (pD3D == nullptr) return 200;
|
|
|
|
// 2. check compatibility
|
|
UINT adapter = D3DADAPTER_DEFAULT;
|
|
D3DDEVTYPE devType = D3DDEVTYPE_HAL;
|
|
D3DCAPS9 caps = {};
|
|
HRESULT hr = pD3D->GetDeviceCaps(adapter, devType, &caps);
|
|
CheckFailed(hr, 210);
|
|
|
|
DWORD vertexProcessing = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // fallback software fixed function pipeline
|
|
if (caps.VertexProcessingCaps == D3DDEVCAPS_HWTRANSFORMANDLIGHT)
|
|
{
|
|
// hardware support for fixed function pipeline
|
|
vertexProcessing = D3DCREATE_HARDWARE_VERTEXPROCESSING;
|
|
}
|
|
|
|
// 3. define presentation parameters
|
|
D3DPRESENT_PARAMETERS d3dpp = {};
|
|
d3dpp.hDeviceWindow = hWnd; // target render window
|
|
d3dpp.Windowed = !isFullscreen; // window or fullscreen mode
|
|
d3dpp.BackBufferCount = 1; // at least 1
|
|
d3dpp.BackBufferWidth = width;
|
|
d3dpp.BackBufferHeight = height;
|
|
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
|
|
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
|
|
|
// 4. create Direct3D device
|
|
hr = pD3D->CreateDevice(
|
|
adapter,
|
|
devType,
|
|
hWnd,
|
|
vertexProcessing, // optional parameters
|
|
&d3dpp,
|
|
&_pD3DDevice
|
|
);
|
|
CheckFailed(hr, 220);
|
|
|
|
// 5. tidy up
|
|
safeRelease(pD3D);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void Direct3D::beginScene(BYTE red, BYTE green, BYTE blue)
|
|
{
|
|
_pD3DDevice->BeginScene(); // init a frame, after this call we are allowed to do draw calls
|
|
|
|
// change background color
|
|
_pD3DDevice->Clear(
|
|
0, nullptr, // areas to clear, null -> everything
|
|
D3DCLEAR_TARGET, // what to clear, bitmask
|
|
D3DCOLOR_XRGB(red, green, blue), 1.0f, 0xFFFFFFFF // how to clean
|
|
);
|
|
}
|
|
|
|
void Direct3D::endScene()
|
|
{
|
|
_pD3DDevice->EndScene(); // close a frame, after this call we are not allowed to do draw calls
|
|
_pD3DDevice->Present(nullptr, nullptr, nullptr, nullptr); // swap back- with frontbuffer
|
|
}
|
|
|
|
void Direct3D::deInit()
|
|
{
|
|
safeRelease(_pD3DDevice);
|
|
}
|