Optimize a little bit isBlockInSight, adjustDist & collisions (#7193)
authorLoïc Blot <nerzhul@users.noreply.github.com>
Tue, 3 Apr 2018 22:43:08 +0000 (00:43 +0200)
committerGitHub <noreply@github.com>
Tue, 3 Apr 2018 22:43:08 +0000 (00:43 +0200)
* Use constexpr + unroll some calculations to cache definitively some calculations
* Unroll some calls in collision code & use a constref instead of a copy in one occurence

src/collision.cpp
src/util/numeric.cpp

index e966ad19deb84289c6d0d6034c3342013420a692..99874dbfd8c1337d71e9fb440687573ad446d00c 100644 (file)
@@ -322,9 +322,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                        }
                        std::vector<aabb3f> nodeboxes;
                        n.getCollisionBoxes(gamedef->ndef(), &nodeboxes, neighbors);
+
+                       // Calculate float position only once
+                       v3f posf = intToFloat(p, BS);
                        for (auto box : nodeboxes) {
-                               box.MinEdge += intToFloat(p, BS);
-                               box.MaxEdge += intToFloat(p, BS);
+                               box.MinEdge += posf;
+                               box.MaxEdge += posf;
                                cinfo.emplace_back(false, false, n_bouncy_value, p, box);
                        }
                } else {
@@ -437,7 +440,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                        Go through every nodebox, find nearest collision
                */
                for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
-                       NearbyCollisionInfo box_info = cinfo[boxindex];
+                       const NearbyCollisionInfo &box_info = cinfo[boxindex];
                        // Ignore if already stepped up this nodebox.
                        if (box_info.is_step_up)
                                continue;
index b88b4d5458db6742a5f3824b6e9ccf6a465c4d9a..f533c275fb1bdf36d45eff4f239cfff19568bc31 100644 (file)
@@ -108,7 +108,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
 {
        // Maximum radius of a block.  The magic number is
        // sqrt(3.0) / 2.0 in literal form.
-       const f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
+       static constexpr const f32 block_max_radius = 0.866025403784f * MAP_BLOCKSIZE * BS;
 
        v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
 
@@ -125,16 +125,16 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
        // Total distance
        f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius);
 
-       if(distance_ptr)
+       if (distance_ptr)
                *distance_ptr = d;
 
        // If block is far away, it's not in sight
-       if(d > range)
+       if (d > range)
                return false;
 
        // If block is (nearly) touching the camera, don't
        // bother validating further (that is, render it anyway)
-       if(d == 0)
+       if (d == 0)
                return true;
 
        // Adjust camera position, for purposes of computing the angle,
@@ -166,12 +166,13 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
 s16 adjustDist(s16 dist, float zoom_fov)
 {
        // 1.775 ~= 72 * PI / 180 * 1.4, the default on the client
-       const float default_fov = 1.775f;
+       static constexpr const float default_fov = 1.775f / 2.0f;
        // heuristic cut-off for zooming
-       if (zoom_fov > default_fov / 2.0f)
+       if (zoom_fov > default_fov)
                return dist;
 
        // new_dist = dist * ((1 - cos(FOV / 2)) / (1-cos(zoomFOV /2))) ^ (1/3)
-       return round(dist * std::cbrt((1.0f - std::cos(default_fov / 2.0f)) /
+       // note: FOV is calculated at compilation time
+       return round(dist * std::cbrt((1.0f - std::cos(default_fov)) /
                (1.0f - std::cos(zoom_fov / 2.0f))));
 }