Added block position decoder.

This commit is contained in:
Miroslav Bendík 2012-08-23 13:32:22 +02:00
parent 957a72e2b4
commit 65ae97f54b
3 changed files with 84 additions and 8 deletions

@ -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;
}
}

@ -10,9 +10,10 @@
#ifndef TILEGENERATOR_H_JJNUCARH
#define TILEGENERATOR_H_JJNUCARH
#include <map>
#include <sqlite3.h>
#include <stdint.h>
#include <string>
#include <map>
struct Color {
uint8_t r;
@ -20,6 +21,15 @@ struct Color {
uint8_t b;
};
struct BlockPos {
int x;
int y;
int z;
};
class DbError {
};
class TileGenerator
{
private:
@ -36,8 +46,14 @@ public:
void setDrawPlayers(bool drawPlayers);
void setDrawScale(bool drawScale);
void setDrawUnderground(bool drawUnderground);
void generate(const std::string &input, const std::string &output);
void parseColorsFile(const std::string &fileName);
void generate(const std::string &input, const std::string &output);
private:
void openDb(const std::string &input);
void loadBlocks();
BlockPos decodeBlockPos(sqlite3_int64 blockId);
int unsignedToSigned(long i, long max_positive);
private:
std::string m_bgColor;
@ -48,6 +64,7 @@ private:
bool m_drawPlayers;
bool m_drawScale;
bool m_drawUnderground;
sqlite3 *m_db;
ColorMap m_colors;
}; /* ----- end of class TileGenerator ----- */

@ -105,4 +105,5 @@ int main(int argc, char *argv[])
abort();
}
}
generator.generate(input, output);
}