Skip to content
Permalink
Browse files

Revert binary database block position encoding

This reverts commits a2003b0 and 54ffe2e.

These weren't correct.  Add a black magic warning instead.
  • Loading branch information...
ShadowNinja committed Apr 22, 2014
1 parent 9ec281c commit 41bc24477b732b74bd18839a9742d32bd85d1b44
Showing with 31 additions and 10 deletions.
  1. +30 −9 src/database.cpp
  2. +1 −1 src/database.h
@@ -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) {
@@ -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;
}

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

2 comments on commit 41bc244

@Megaf

This comment has been minimized.

Copy link
Contributor

Megaf replied Apr 25, 2014

This fixed the #1243 indeed.

@sfan5

This comment has been minimized.

Copy link
Member

sfan5 replied Apr 25, 2014

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

Please sign in to comment.
You can’t perform that action at this time.