Добавил:
Вуз:
Предмет:
Файл:
#include "EngineBase.h"
#pragma comment (lib, "d2d1")
#pragma comment (lib, "dwrite")
#pragma comment (lib, "Windowscodecs.lib")
#include <wincodec.h>
#include "settings.h"
template<class Interface>
inline void SafeRelease(Interface** ppInterfaceToRelease)
{
if (*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
EngineBase::EngineBase() : mDirect2DFactory(NULL), mRenderTarget(NULL)
{
}
EngineBase::~EngineBase()
{
SafeRelease(&mDirect2DFactory);
SafeRelease(&mRenderTarget);
}
HRESULT EngineBase::InitializeD2D(HWND hwnd)
{
D2D1_SIZE_U size = D2D1::SizeU(X_RES, Y_RES);
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &mDirect2DFactory);
mDirect2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(hwnd, size, D2D1_PRESENT_OPTIONS_IMMEDIATELY),
&mRenderTarget
);
return S_OK;
}
HRESULT EngineBase::Draw()
{
HRESULT hr;
mRenderTarget->BeginDraw();
mRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
mRenderTarget->Clear(D2D1::ColorF(0.50f, 0.50f, 0.50f, 1.0f));
std::list<MazeObjectBase*>::iterator iter;
for (iter = objlist.begin(); iter != objlist.end(); iter++)
{
(*iter)->Draw(mRenderTarget);
}
hr = mRenderTarget->EndDraw();
return S_OK;
}
ID2D1Bitmap* EngineBase::LoadImage(LPCWSTR imageFile)
{
IWICBitmapDecoder* pDecoder = NULL;
IWICBitmapFrameDecode* pSource = NULL;
IWICFormatConverter* pConverter = NULL;
IWICImagingFactory* pIWICFactory = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void**>(&pIWICFactory)
);
HRESULT hr = pIWICFactory->CreateDecoderFromFilename(
imageFile,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&pDecoder
);
if (SUCCEEDED(hr))
{
hr = pDecoder->GetFrame(0, &pSource);
}
if (SUCCEEDED(hr))
{
hr = pIWICFactory->CreateFormatConverter(&pConverter);
}
if (SUCCEEDED(hr))
{
hr = pConverter->Initialize(
pSource,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
NULL,
0.f,
WICBitmapPaletteTypeMedianCut
);
}
ID2D1Bitmap* toReturn(NULL);
if (SUCCEEDED(hr))
{
hr = mRenderTarget->CreateBitmapFromWicBitmap(
pConverter,
NULL,
&toReturn
);
}
pIWICFactory->Release();
pDecoder->Release();
pSource->Release();
pConverter->Release();
return toReturn;
}
void EngineBase::AddObject(MazeObjectBase* obj)
{
obj->engine = this;
objlist.push_back(obj);
}
void EngineBase::Logic(double elapsed_time)
{
std::list<MazeObjectBase*>::iterator iter;
for (iter = objlist.begin(); iter != objlist.end(); iter++)
{
(*iter)->Logic(elapsed_time);
}
}
Соседние файлы в папке 6
