Skip to content
Snippets Groups Projects
Commit 41bc2447 authored by ShadowNinja's avatar ShadowNinja
Browse files

Revert binary database block position encoding

This reverts commits a2003b0d and 54ffe2e5.

These weren't correct.  Add a black magic warning instead.
parent 9ec281c7
Branches
Tags
No related merge requests found
......@@ -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.
*/
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() {};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment