mirror of
https://github.com/minetest/minetestmapper.git
synced 2025-07-01 16:10:23 +02:00
Add a --tilesize option.
The produces tiled output way faster than repeatedly using --geometry because it only reads the databse once.
This commit is contained in:
@ -95,6 +95,8 @@ TileGenerator::TileGenerator():
|
||||
m_geomY(-2048),
|
||||
m_geomX2(2048),
|
||||
m_geomY2(2048),
|
||||
m_tileW(INT_MAX),
|
||||
m_tileH(INT_MAX),
|
||||
m_zoom(1),
|
||||
m_scales(SCALE_LEFT | SCALE_TOP)
|
||||
{
|
||||
@ -190,6 +192,13 @@ void TileGenerator::setGeometry(int x, int y, int w, int h)
|
||||
m_geomY2 = round_multiple_nosign(y + h, 16) / 16;
|
||||
}
|
||||
|
||||
void TileGenerator::setTileSize(int w, int h)
|
||||
{
|
||||
m_tileW = round_multiple_nosign(w, 16) / 16;
|
||||
m_tileH = round_multiple_nosign(h, 16) / 16;
|
||||
}
|
||||
|
||||
|
||||
void TileGenerator::setMinY(int y)
|
||||
{
|
||||
m_yMin = y;
|
||||
@ -251,19 +260,66 @@ void TileGenerator::generate(const std::string &input, const std::string &output
|
||||
}
|
||||
|
||||
createImage();
|
||||
renderMap();
|
||||
|
||||
|
||||
if (m_tileW < INT_MAX || m_tileH < INT_MAX)
|
||||
{
|
||||
tilePositions();
|
||||
|
||||
int trueXMin = m_xMin;
|
||||
int trueZMin = m_zMin;
|
||||
|
||||
for (int x = 0; x < m_numTilesX; x++)
|
||||
{
|
||||
for (int y = 0; y < m_numTilesY; y++)
|
||||
{
|
||||
TileMap::iterator t = m_tiles.find(x + (y << 16));
|
||||
m_xMin = trueXMin + x * m_tileW;
|
||||
m_zMin = trueZMin + y * m_tileH;
|
||||
m_xMax = m_xMin + m_tileW - 1;
|
||||
m_zMax = m_zMin + m_tileH -1;
|
||||
|
||||
if (t != m_tiles.end() || !m_dontWriteEmpty)
|
||||
{
|
||||
m_image->fill(m_bgColor);
|
||||
if (t != m_tiles.end())
|
||||
renderMap(t->second);
|
||||
if (m_drawScale) {
|
||||
renderScale();
|
||||
}
|
||||
if (m_drawOrigin) {
|
||||
renderOrigin();
|
||||
}
|
||||
if (m_drawPlayers) {
|
||||
renderPlayers(input_path);
|
||||
}
|
||||
ostringstream fn;
|
||||
fn << x << '_' << y << '_' << output;
|
||||
writeImage(fn.str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_image->fill(m_bgColor);
|
||||
renderMap(m_positions);
|
||||
if (m_drawScale) {
|
||||
renderScale();
|
||||
}
|
||||
if (m_drawOrigin) {
|
||||
renderOrigin();
|
||||
}
|
||||
if (m_drawPlayers) {
|
||||
renderPlayers(input_path);
|
||||
}
|
||||
writeImage(output);
|
||||
}
|
||||
closeDatabase();
|
||||
if (m_drawScale) {
|
||||
renderScale();
|
||||
}
|
||||
if (m_drawOrigin) {
|
||||
renderOrigin();
|
||||
}
|
||||
if (m_drawPlayers) {
|
||||
renderPlayers(input_path);
|
||||
}
|
||||
writeImage(output);
|
||||
printUnknown();
|
||||
|
||||
delete m_image;
|
||||
m_image = NULL;
|
||||
}
|
||||
|
||||
void TileGenerator::parseColorsStream(std::istream &in)
|
||||
@ -380,8 +436,17 @@ void TileGenerator::createImage()
|
||||
m_zMax = m_geomY2-1;
|
||||
}
|
||||
|
||||
m_mapWidth = (m_xMax - m_xMin + 1) * 16;
|
||||
m_mapHeight = (m_zMax - m_zMin + 1) * 16;
|
||||
m_mapWidth = (m_xMax - m_xMin + 1);
|
||||
m_mapHeight = (m_zMax - m_zMin + 1);
|
||||
|
||||
if (m_mapWidth > m_tileW)
|
||||
m_mapWidth = m_tileW;
|
||||
|
||||
if (m_mapHeight > m_tileH)
|
||||
m_mapHeight = m_tileH;
|
||||
|
||||
m_mapWidth *= 16;
|
||||
m_mapHeight *= 16;
|
||||
|
||||
m_xBorder = (m_scales & SCALE_LEFT) ? scale_d : 0;
|
||||
m_yBorder = (m_scales & SCALE_TOP) ? scale_d : 0;
|
||||
@ -401,15 +466,15 @@ void TileGenerator::createImage()
|
||||
m_image->drawFilledRect(0, 0, image_width, image_height, m_bgColor); // Background
|
||||
}
|
||||
|
||||
void TileGenerator::renderMap()
|
||||
void TileGenerator::renderMap(PositionsList &positions)
|
||||
{
|
||||
BlockDecoder blk;
|
||||
std::list<int> zlist = getZValueList();
|
||||
std::list<int> zlist = getZValueList(positions);
|
||||
for (std::list<int>::iterator zPosition = zlist.begin(); zPosition != zlist.end(); ++zPosition) {
|
||||
int zPos = *zPosition;
|
||||
std::map<int16_t, BlockList> blocks;
|
||||
m_db->getBlocksOnZ(blocks, zPos);
|
||||
for (std::list<std::pair<int, int> >::const_iterator position = m_positions.begin(); position != m_positions.end(); ++position) {
|
||||
for (PositionsList::const_iterator position = positions.begin(); position != positions.end(); ++position) {
|
||||
if (position->second != zPos)
|
||||
continue;
|
||||
|
||||
@ -637,9 +702,12 @@ void TileGenerator::renderPlayers(const std::string &inputPath)
|
||||
{
|
||||
PlayerAttributes players(inputPath);
|
||||
for (PlayerAttributes::Players::iterator player = players.begin(); player != players.end(); ++player) {
|
||||
if (player->x < m_xMin * 16 || player->x > m_xMax * 16 ||
|
||||
player->z < m_zMin * 16 || player->z > m_zMax * 16)
|
||||
if (player->x < m_xMin*16 || player->x > m_xMax * 16 ||
|
||||
player->z < m_zMin*16 || player->z > m_zMax * 16 )
|
||||
{
|
||||
continue;
|
||||
|
||||
}
|
||||
if (player->y < m_yMin || player->y > m_yMax)
|
||||
continue;
|
||||
int imageX = getImageX(player->x, true),
|
||||
@ -651,10 +719,10 @@ void TileGenerator::renderPlayers(const std::string &inputPath)
|
||||
}
|
||||
}
|
||||
|
||||
inline std::list<int> TileGenerator::getZValueList() const
|
||||
inline std::list<int> TileGenerator::getZValueList(PositionsList &positions) const
|
||||
{
|
||||
std::list<int> zlist;
|
||||
for (std::list<std::pair<int, int> >::const_iterator position = m_positions.begin(); position != m_positions.end(); ++position)
|
||||
for (PositionsList::const_iterator position = positions.begin(); position != positions.end(); ++position)
|
||||
zlist.push_back(position->second);
|
||||
zlist.sort();
|
||||
zlist.unique();
|
||||
@ -665,8 +733,7 @@ inline std::list<int> TileGenerator::getZValueList() const
|
||||
void TileGenerator::writeImage(const std::string &output)
|
||||
{
|
||||
m_image->save(output);
|
||||
delete m_image;
|
||||
m_image = NULL;
|
||||
cout << "wrote image:" << output << endl;
|
||||
}
|
||||
|
||||
void TileGenerator::printUnknown()
|
||||
@ -696,3 +763,30 @@ inline void TileGenerator::setZoomed(int x, int y, Color color)
|
||||
{
|
||||
m_image->drawFilledRect(getImageX(x), getImageY(y), m_zoom, m_zoom, color);
|
||||
}
|
||||
|
||||
|
||||
void TileGenerator::tilePositions()
|
||||
{
|
||||
m_numTilesX = round_multiple_nosign(m_xMax - m_xMin + 1, m_tileW) / m_tileW;
|
||||
m_numTilesY = round_multiple_nosign(m_zMax - m_zMin + 1, m_tileH) / m_tileH;
|
||||
|
||||
for (PositionsList::iterator p = m_positions.begin(); p != m_positions.end(); p++)
|
||||
{
|
||||
int xtile = (p->first - m_xMin) / m_tileW;
|
||||
int ytile = (p->second - m_zMin) / m_tileH;
|
||||
|
||||
int key = xtile + (ytile << 16);
|
||||
|
||||
TileMap::iterator t = m_tiles.find(key);
|
||||
|
||||
if (t == m_tiles.end())
|
||||
{
|
||||
PositionsList l;
|
||||
m_tiles.insert(std::pair<int, PositionsList>(key, l));
|
||||
t = m_tiles.find(key);
|
||||
}
|
||||
|
||||
t->second.push_back(std::pair<int, int>(p->first, p->second));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user