From 9d8cb510b3ad398c4fcb214704a2c3a42e944e34 Mon Sep 17 00:00:00 2001 From: Jens Rottmann <30634967+JRottm@users.noreply.github.com> Date: Sun, 20 Aug 2017 19:37:55 +0200 Subject: [PATCH] Change BS constant from implicit double to float (#6286) the BS constant implicitly promotes all position calculations it is used in to double even though positions (= v3f) are only meant to be floats. There are many, many similar occurrences everywhere, but I'm not willing to hunt down all; I only fixed the little part I'm already familiar with. --- src/collision.cpp | 20 ++++++++++---------- src/constants.h | 2 +- src/util/numeric.h | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/collision.cpp b/src/collision.cpp index 7665699cd..9ef6b4263 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -227,13 +227,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, /* Calculate new velocity */ - if (dtime > 0.5) { + if (dtime > 0.5f) { if (!time_notification_done) { time_notification_done = true; infostream << "collisionMoveSimple: maximum step interval exceeded," " lost movement details!"<X, newpos_f.X), - MYMIN(pos_f->Y, newpos_f.Y) + 0.01 * BS, // bias rounding, player often at +/-n.5 + MYMIN(pos_f->Y, newpos_f.Y) + 0.01f * BS, // bias rounding, player often at +/-n.5 MYMIN(pos_f->Z, newpos_f.Z) ); v3f maxpos_f( @@ -355,7 +355,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, if (c_env != 0) { f32 distance = speed_f->getLength(); std::vector clientobjects; - c_env->getActiveObjects(*pos_f, distance * 1.5, clientobjects); + c_env->getActiveObjects(*pos_f, distance * 1.5f, clientobjects); for (auto &clientobject : clientobjects) { if (!self || (self != clientobject.obj)) { objects.push_back((ActiveObject*) clientobject.obj); @@ -369,7 +369,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, if (s_env != NULL) { f32 distance = speed_f->getLength(); std::vector s_objects; - s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5); + s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5f); for (u16 obj_id : s_objects) { ServerActiveObject *current = s_env->getActiveObject(obj_id); if (!self || (self != current)) { @@ -401,7 +401,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, Collision uncertainty radius Make it a bit larger than the maximum distance of movement */ - f32 d = pos_max_d * 1.1; + f32 d = pos_max_d * 1.1f; // A fairly large value in here makes moving smoother //f32 d = 0.15*BS; @@ -410,7 +410,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, int loopcount = 0; - while(dtime > BS * 1e-10) { + while(dtime > BS * 1e-10f) { //TimeTaker tt3("collisionMoveSimple dtime loop"); ScopeProfiler sp2(g_profiler, "collisionMoveSimple dtime loop avg", SPT_AVG); @@ -468,7 +468,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, d)); // Get bounce multiplier - float bounce = -(float)nearest_info.bouncy / 100.0; + float bounce = -(float)nearest_info.bouncy / 100.0f; // Move to the point of collision and reduce dtime by nearest_dtime if (nearest_dtime < 0) { @@ -525,7 +525,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, } info.new_speed = *speed_f; - if (info.new_speed.getDistanceFrom(info.old_speed) < 0.1 * BS) + if (info.new_speed.getDistanceFrom(info.old_speed) < 0.1f * BS) is_collision = false; if (is_collision) { @@ -561,7 +561,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, box.MinEdge += *pos_f; box.MaxEdge += *pos_f; } - if (fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.15 * BS) { + if (fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.15f * BS) { result.touching_ground = true; if (box_info.is_object) diff --git a/src/constants.h b/src/constants.h index dd5611ac7..4da66cc53 100644 --- a/src/constants.h +++ b/src/constants.h @@ -71,7 +71,7 @@ with this program; if not, write to the Free Software Foundation, Inc., // floating-point and integer positions, which potentially give wrong // results. (negative coordinates, values between nodes, ...) // Use floatToInt(p, BS) and intToFloat(p, BS). -#define BS (10.0) +#define BS 10.0f // Dimension of a MapBlock #define MAP_BLOCKSIZE 16 diff --git a/src/util/numeric.h b/src/util/numeric.h index 766efd366..f09c4e9f5 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -268,12 +268,12 @@ inline v3f intToFloat(v3s16 p, f32 d) inline aabb3f getNodeBox(v3s16 p, float d) { return aabb3f( - (float)p.X * d - 0.5 * d, - (float)p.Y * d - 0.5 * d, - (float)p.Z * d - 0.5 * d, - (float)p.X * d + 0.5 * d, - (float)p.Y * d + 0.5 * d, - (float)p.Z * d + 0.5 * d + (float)p.X * d - 0.5f * d, + (float)p.Y * d - 0.5f * d, + (float)p.Z * d - 0.5f * d, + (float)p.X * d + 0.5f * d, + (float)p.Y * d + 0.5f * d, + (float)p.Z * d + 0.5f * d ); }