mirror of
https://github.com/minetest/minetestmapper.git
synced 2025-07-02 00:20:22 +02:00
Added block position decoder.
This commit is contained in:
@ -22,13 +22,17 @@ TileGenerator::TileGenerator():
|
||||
m_drawOrigin(false),
|
||||
m_drawPlayers(false),
|
||||
m_drawScale(false),
|
||||
m_drawUnderground(false)
|
||||
|
||||
m_drawUnderground(false),
|
||||
m_db(0)
|
||||
{
|
||||
}
|
||||
|
||||
TileGenerator::~TileGenerator()
|
||||
{
|
||||
if (m_db != 0) {
|
||||
sqlite3_close(m_db);
|
||||
m_db = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void TileGenerator::setBgColor(const std::string &bgColor)
|
||||
@ -71,10 +75,6 @@ void TileGenerator::setDrawUnderground(bool drawUnderground)
|
||||
m_drawUnderground = drawUnderground;
|
||||
}
|
||||
|
||||
void TileGenerator::generate(const std::string &/*input*/, const std::string &/*output*/)
|
||||
{
|
||||
}
|
||||
|
||||
void TileGenerator::parseColorsFile(const std::string &fileName)
|
||||
{
|
||||
ifstream in;
|
||||
@ -108,3 +108,61 @@ void TileGenerator::parseColorsFile(const std::string &fileName)
|
||||
}
|
||||
}
|
||||
|
||||
void TileGenerator::generate(const std::string &input, const std::string &/*output*/)
|
||||
{
|
||||
openDb(input);
|
||||
loadBlocks();
|
||||
}
|
||||
|
||||
void TileGenerator::openDb(const std::string &input)
|
||||
{
|
||||
string db_name = input + "map.sqlite";
|
||||
if (sqlite3_open(db_name.c_str(), &m_db) != SQLITE_OK) {
|
||||
throw DbError();
|
||||
}
|
||||
}
|
||||
|
||||
void TileGenerator::loadBlocks()
|
||||
{
|
||||
sqlite3_stmt *statement;
|
||||
string sql = "SELECT pos FROM blocks";
|
||||
if (sqlite3_prepare_v2(m_db, sql.c_str(), sql.length(), &statement, 0) == SQLITE_OK) {
|
||||
//int cols = sqlite3_column_count(statement);
|
||||
int result = 0;
|
||||
while (true) {
|
||||
result = sqlite3_step(statement);
|
||||
if(result == SQLITE_ROW) {
|
||||
sqlite3_int64 blocknum = sqlite3_column_int64(statement, 0);
|
||||
decodeBlockPos(blocknum);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw DbError();
|
||||
}
|
||||
}
|
||||
|
||||
inline BlockPos TileGenerator::decodeBlockPos(sqlite3_int64 blockId)
|
||||
{
|
||||
BlockPos pos;
|
||||
pos.x = unsignedToSigned(blockId % 4096, 2048);
|
||||
blockId = blockId / 4096;
|
||||
pos.y = unsignedToSigned(blockId % 4096, 2048);
|
||||
blockId = blockId / 4096;
|
||||
pos.z = unsignedToSigned(blockId % 4096, 2048);
|
||||
return pos;
|
||||
}
|
||||
|
||||
inline int TileGenerator::unsignedToSigned(long i, long max_positive)
|
||||
{
|
||||
if (i < max_positive) {
|
||||
return i;
|
||||
}
|
||||
else {
|
||||
return i - 2l * max_positive;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user