2024-10-28 15:57:39 +01:00
|
|
|
// Luanti
|
|
|
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2012-10-23 01:18:44 +04:00
|
|
|
|
|
|
|
#include "database.h"
|
2013-09-10 15:49:43 +02:00
|
|
|
#include "irrlichttypes.h"
|
2012-10-23 01:18:44 +04:00
|
|
|
|
2014-04-22 12:52:48 -04:00
|
|
|
|
|
|
|
/****************
|
|
|
|
* Black magic! *
|
|
|
|
****************
|
|
|
|
* The position hashing is very messed up.
|
|
|
|
* It's a lot more complicated than it looks.
|
|
|
|
*/
|
|
|
|
|
2014-04-15 16:07:53 -04:00
|
|
|
static inline s16 unsigned_to_signed(u16 i, u16 max_positive)
|
2012-10-23 01:18:44 +04:00
|
|
|
{
|
2014-04-15 16:07:53 -04:00
|
|
|
if (i < max_positive) {
|
2012-10-23 01:18:44 +04:00
|
|
|
return i;
|
2014-04-15 16:07:53 -04:00
|
|
|
}
|
2017-08-17 23:02:50 +02:00
|
|
|
|
|
|
|
return i - (max_positive * 2);
|
2012-10-23 01:18:44 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-04-22 12:52:48 -04:00
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-04-23 14:35:08 +02:00
|
|
|
s64 MapDatabase::getBlockAsInteger(const v3s16 &pos)
|
2014-04-15 16:07:53 -04:00
|
|
|
{
|
2014-04-22 12:52:48 -04:00
|
|
|
return (u64) pos.Z * 0x1000000 +
|
|
|
|
(u64) pos.Y * 0x1000 +
|
|
|
|
(u64) pos.X;
|
2012-10-23 01:18:44 +04:00
|
|
|
}
|
|
|
|
|
2014-04-22 12:52:48 -04:00
|
|
|
|
2017-04-23 14:35:08 +02:00
|
|
|
v3s16 MapDatabase::getIntegerAsBlock(s64 i)
|
2014-04-15 16:07:53 -04:00
|
|
|
{
|
2014-04-22 12:52:48 -04:00
|
|
|
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;
|
2012-10-23 01:18:44 +04:00
|
|
|
}
|
2014-04-15 16:07:53 -04:00
|
|
|
|