Skip to content

Commit

Permalink
Revert binary database block position encoding
Browse files Browse the repository at this point in the history
This reverts commits a2003b0 and 54ffe2e.

These weren't correct.  Add a black magic warning instead.
  • Loading branch information
ShadowNinja committed Apr 23, 2014
1 parent 9ec281c commit 41bc244
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
39 changes: 30 additions & 9 deletions src/database.cpp
Expand Up @@ -20,6 +20,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "database.h"
#include "irrlichttypes.h"


/****************
* Black magic! *
****************
* The position hashing is very messed up.
* It's a lot more complicated than it looks.
*/

This comment has been minimized.

Copy link
@celeron55

celeron55 Apr 23, 2014

Member

How about eg. copying my explanation instead of thinking that if you can't understand it, nobody can understand it? It's not black magic, it's just multiplication which is a bit weird to revert back.

http://irc.minetest.ru/minetest-dev/2014-04-16#i_3652179


static inline s16 unsigned_to_signed(u16 i, u16 max_positive)
{
if (i < max_positive) {
Expand All @@ -30,19 +38,32 @@ static inline s16 unsigned_to_signed(u16 i, u16 max_positive)
}


// Modulo of a negative number does not work consistently in C
static inline s64 pythonmodulo(s64 i, s16 mod)
{
if (i >= 0) {
return i % mod;
}
return mod - ((-i) % mod);
}


s64 Database::getBlockAsInteger(const v3s16 pos) const
{
return (((u64) pos.Z) << 24) +
(((u64) pos.Y) << 12) +
((u64) pos.X);
return (u64) pos.Z * 0x1000000 +
(u64) pos.Y * 0x1000 +
(u64) pos.X;
}

v3s16 Database::getIntegerAsBlock(const s64 i) const

v3s16 Database::getIntegerAsBlock(s64 i) const
{
v3s16 pos;
pos.Z = unsigned_to_signed((i >> 24) & 0xFFF, 0x1000 / 2);
pos.Y = unsigned_to_signed((i >> 12) & 0xFFF, 0x1000 / 2);
pos.X = unsigned_to_signed((i ) & 0xFFF, 0x1000 / 2);
return pos;
v3s16 pos;
pos.X = unsigned_to_signed(pythonmodulo(i, 4096), 2048);
i = (i - pos.X) / 4096;
pos.Y = unsigned_to_signed(pythonmodulo(i, 4096), 2048);
i = (i - pos.Y) / 4096;
pos.Z = unsigned_to_signed(pythonmodulo(i, 4096), 2048);
return pos;
}

2 changes: 1 addition & 1 deletion src/database.h
Expand Up @@ -35,7 +35,7 @@ class Database
virtual void saveBlock(MapBlock *block)=0;
virtual MapBlock* loadBlock(v3s16 blockpos)=0;
s64 getBlockAsInteger(const v3s16 pos) const;
v3s16 getIntegerAsBlock(const s64 i) const;
v3s16 getIntegerAsBlock(s64 i) const;
virtual void listAllLoadableBlocks(std::list<v3s16> &dst)=0;
virtual int Initialized(void)=0;
virtual ~Database() {};
Expand Down

2 comments on commit 41bc244

@Megaf
Copy link
Contributor

@Megaf Megaf commented on 41bc244 Apr 25, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fixed the #1243 indeed.

@sfan5
Copy link
Member

@sfan5 sfan5 commented on 41bc244 Apr 25, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This probably explains why migrating to leveldb did not work...

Please sign in to comment.