mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 06:05:58 -06:00
119 lines
2.6 KiB
C++
119 lines
2.6 KiB
C++
#include "MapBG.h"
|
|
|
|
MapBG::MapBG(IMapRender* render)
|
|
: IMapRender(render), _recalc(true), _currLevel(-1), _virtPage(Size(0, 0)),
|
|
_cachePageSize(CACHE_PAGE_SIZE), _cachePageInitSize(CACHE_PAGE_INIT_SIZE)
|
|
{}
|
|
|
|
void MapBG::Render(Draw* w)
|
|
{
|
|
if (_currLevel < 0 || _currLevel >= _levels.GetCount() || !GetTopRender())
|
|
return;
|
|
|
|
MipMapLevel& level = _levels[_currLevel];
|
|
|
|
Point offset = GetTopRender()->GetPageOffset();
|
|
Rect page = GetTopRender()->GetPageRect();
|
|
Point lt = GetTopRender()->GetPagePos();
|
|
|
|
for (int i = 0; i < level.GetMipMaps().GetCount(); ++i)
|
|
{
|
|
Rect itemRect(level.GetMipMaps().GetKey(i), level.GetBlockSize());
|
|
|
|
if (page.Intersects(itemRect))
|
|
if (level.GetMipMaps()[i])
|
|
{
|
|
level.GetMipMaps()[i]
|
|
->Render(w,
|
|
itemRect
|
|
.Offseted(-lt)
|
|
.Offseted(offset));
|
|
}
|
|
}
|
|
|
|
IMapRender::Render(w);
|
|
}
|
|
|
|
void MapBG::StatePerformed(dword state, const String& param)
|
|
{
|
|
if (_currLevel < 0 || _currLevel >= _levels.GetCount())
|
|
return;
|
|
|
|
MipMapLevel& level = _levels[_currLevel];
|
|
Rect pageRect = GetPageRect();
|
|
|
|
if (_recalc || !_virtPage.Contains(GetPageRect()))
|
|
{
|
|
_virtPage = pageRect.Inflated(level.GetBlockSize() * _cachePageInitSize);
|
|
_recalc = true;
|
|
}
|
|
|
|
Rect currVirtualPage = _virtPage.Inflated(level.GetBlockSize() * _cachePageSize);
|
|
|
|
if (!_recalc)
|
|
return;
|
|
|
|
for (int i = 0; i < level.GetMipMaps().GetCount(); ++i)
|
|
{
|
|
Point pi = level.GetMipMaps().GetKey(i);
|
|
Rect itemRect(pi, level.GetBlockSize());
|
|
|
|
if (!level.GetMipMaps()[i])
|
|
continue;
|
|
|
|
if (currVirtualPage.Intersects(itemRect))
|
|
{
|
|
level.GetMipMaps()[i]->Prepare(
|
|
AppendFileName(_mapDir, NFormat("%d-%d-%d.png", _currLevel, pi.x, pi.y)),
|
|
level.GetBlockSize()
|
|
);
|
|
}
|
|
else
|
|
level.GetMipMaps()[i]->Release();
|
|
}
|
|
|
|
_recalc = false;
|
|
}
|
|
|
|
bool MapBG::Load(const char* fp)
|
|
{
|
|
if (!FileExists(fp))
|
|
{
|
|
LOG(NFormat("MapBG: File not exists, \"%s\"", fp));
|
|
return false;
|
|
}
|
|
|
|
if (!LoadFromXMLFile(_levels, fp))
|
|
{
|
|
LOG("MapBG: Error while loading map from XML-file!");
|
|
return false;
|
|
}
|
|
|
|
_mapDir = AppendFileName(GetFileDirectory(fp), GetFileTitle(fp));
|
|
_currLevel = _levels.GetCount() > 0 ? 0 : -1;
|
|
if (_currLevel < 0)
|
|
{
|
|
LOG("MapBG: No zoom levels found in map!");
|
|
return false;
|
|
}
|
|
_recalc = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool MapBG::Zoom(int level)
|
|
{
|
|
if (level < 0 || level >= _levels.GetCount())
|
|
return false;
|
|
_currLevel = level;
|
|
_recalc = true;
|
|
return true;
|
|
}
|
|
|
|
Rect MapBG::GetRect()
|
|
{
|
|
if (_currLevel < 0 || _currLevel >= _levels.GetCount())
|
|
return Size(0, 0);
|
|
|
|
return Rect(Point(0, 0), _levels[_currLevel].GetTotalSize());
|
|
}
|