ultimatepp/bazaar/MapBG/MapBG.cpp
Sc0rch 9959d8888c MapRender: First release (FormEditorCommon, FormEditorProperties, Map, MapBG, MapCommon, MapEditor, MapRenderTest.
git-svn-id: svn://ultimatepp.org/upp/trunk@4180 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-11-18 06:28:11 +00:00

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());
}