Скачиваний:
0
Добавлен:
16.04.2026
Размер:
2.91 Кб
Скачать
#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