diff options
author | Jens Rottmann <30634967+JRottm@users.noreply.github.com> | 2017-08-05 01:42:39 +0200 |
---|---|---|
committer | SmallJoker <mk939@ymail.com> | 2018-06-03 17:31:59 +0200 |
commit | b3ffe675c33104936dc3914d482942d5685f645e (patch) | |
tree | 9b34e93624e2e330821ad45db140689509b36802 /src | |
parent | 90a9e4e69fac32f368b275428fa42407ea9b7883 (diff) | |
download | minetest-b3ffe675c33104936dc3914d482942d5685f645e.tar.gz minetest-b3ffe675c33104936dc3914d482942d5685f645e.tar.bz2 minetest-b3ffe675c33104936dc3914d482942d5685f645e.zip |
Add tiny Y offset in collisionMoveSimple() to tweak performance
Another small general problem: the player is always standing exactly on the
bondary between 2 nodes e.g. Y=1.5 is exactly between nodes Y=1 and Y=2.
floatToInt() and myround() will round +/-n.5 always 'outwards' to +/-(n+1),
which means they behave differently depending on where you are: they round
upwards above sea level and downwards when underground. This inconsistency
comes from the way the coordinates are calculated, independent of the
specific C++ code.
The result is a tiny bit of lost performance when moving underground,
because 1 node level more than necessary is checked for collisions. This can
be amended by adding a tiny offset to minpos_f.Y, like @paramat suggested.
This is not an elegant solution, but still better than wasting CPU.
Diffstat (limited to 'src')
-rw-r--r-- | src/collision.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/collision.cpp b/src/collision.cpp index c9a945916..4c3bd016d 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -261,7 +261,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, v3f newpos_f = *pos_f + *speed_f * dtime; v3f minpos_f( MYMIN(pos_f->X, newpos_f.X), - MYMIN(pos_f->Y, newpos_f.Y), + MYMIN(pos_f->Y, newpos_f.Y) + 0.01 * BS, // bias rounding, player often at +/-n.5 MYMIN(pos_f->Z, newpos_f.Z) ); v3f maxpos_f( |