forked from Mirrorlandia_minetest/minetest
Fix rounding error in g/set_node caused by truncation to float
This commit is contained in:
parent
0bcc2f33eb
commit
026ad912af
@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include <vector3d.h>
|
#include <vector3d.h>
|
||||||
|
|
||||||
typedef core::vector3df v3f;
|
typedef core::vector3df v3f;
|
||||||
|
typedef core::vector3d<double> v3d;
|
||||||
typedef core::vector3d<s16> v3s16;
|
typedef core::vector3d<s16> v3s16;
|
||||||
typedef core::vector3d<u16> v3u16;
|
typedef core::vector3d<u16> v3u16;
|
||||||
typedef core::vector3d<s32> v3s32;
|
typedef core::vector3d<s32> v3s32;
|
||||||
|
@ -225,6 +225,44 @@ v3f check_v3f(lua_State *L, int index)
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v3d read_v3d(lua_State *L, int index)
|
||||||
|
{
|
||||||
|
v3d pos;
|
||||||
|
CHECK_POS_TAB(index);
|
||||||
|
lua_getfield(L, index, "x");
|
||||||
|
pos.X = lua_tonumber(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
lua_getfield(L, index, "y");
|
||||||
|
pos.Y = lua_tonumber(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
lua_getfield(L, index, "z");
|
||||||
|
pos.Z = lua_tonumber(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
v3d check_v3d(lua_State *L, int index)
|
||||||
|
{
|
||||||
|
v3d pos;
|
||||||
|
CHECK_POS_TAB(index);
|
||||||
|
lua_getfield(L, index, "x");
|
||||||
|
CHECK_POS_COORD("x");
|
||||||
|
pos.X = lua_tonumber(L, -1);
|
||||||
|
CHECK_FLOAT_RANGE(pos.X, "x")
|
||||||
|
lua_pop(L, 1);
|
||||||
|
lua_getfield(L, index, "y");
|
||||||
|
CHECK_POS_COORD("y");
|
||||||
|
pos.Y = lua_tonumber(L, -1);
|
||||||
|
CHECK_FLOAT_RANGE(pos.Y, "y")
|
||||||
|
lua_pop(L, 1);
|
||||||
|
lua_getfield(L, index, "z");
|
||||||
|
CHECK_POS_COORD("z");
|
||||||
|
pos.Z = lua_tonumber(L, -1);
|
||||||
|
CHECK_FLOAT_RANGE(pos.Z, "z")
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
void push_ARGB8(lua_State *L, video::SColor color)
|
void push_ARGB8(lua_State *L, video::SColor color)
|
||||||
{
|
{
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
@ -263,15 +301,15 @@ void push_v3s16(lua_State *L, v3s16 p)
|
|||||||
v3s16 read_v3s16(lua_State *L, int index)
|
v3s16 read_v3s16(lua_State *L, int index)
|
||||||
{
|
{
|
||||||
// Correct rounding at <0
|
// Correct rounding at <0
|
||||||
v3f pf = read_v3f(L, index);
|
v3d pf = read_v3d(L, index);
|
||||||
return floatToInt(pf, 1.0);
|
return doubleToInt(pf, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
v3s16 check_v3s16(lua_State *L, int index)
|
v3s16 check_v3s16(lua_State *L, int index)
|
||||||
{
|
{
|
||||||
// Correct rounding at <0
|
// Correct rounding at <0
|
||||||
v3f pf = check_v3f(L, index);
|
v3d pf = check_v3d(L, index);
|
||||||
return floatToInt(pf, 1.0);
|
return doubleToInt(pf, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool read_color(lua_State *L, int index, video::SColor *color)
|
bool read_color(lua_State *L, int index, video::SColor *color)
|
||||||
|
@ -254,6 +254,17 @@ inline v3s16 floatToInt(v3f p, f32 d)
|
|||||||
(p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d);
|
(p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns integer position of node in given double precision position
|
||||||
|
*/
|
||||||
|
inline v3s16 doubleToInt(v3d p, double d)
|
||||||
|
{
|
||||||
|
return v3s16(
|
||||||
|
(p.X + (p.X > 0 ? d / 2 : -d / 2)) / d,
|
||||||
|
(p.Y + (p.Y > 0 ? d / 2 : -d / 2)) / d,
|
||||||
|
(p.Z + (p.Z > 0 ? d / 2 : -d / 2)) / d);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns floating point position of node in given integer position
|
Returns floating point position of node in given integer position
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user