aboutsummaryrefslogtreecommitdiff
path: root/src/util/numeric.cpp
diff options
context:
space:
mode:
authorLoïc Blot <nerzhul@users.noreply.github.com>2018-04-04 00:43:08 +0200
committerGitHub <noreply@github.com>2018-04-04 00:43:08 +0200
commita90d27e1e23fa1c369c05a4d9c6083aa86ef7f52 (patch)
tree39f8d58d7ff29ae57a06e4239ae0b49b6dbed050 /src/util/numeric.cpp
parent05fe3b06c80fc7fa438ed5faf5805c79a92789e9 (diff)
downloadminetest-a90d27e1e23fa1c369c05a4d9c6083aa86ef7f52.tar.gz
minetest-a90d27e1e23fa1c369c05a4d9c6083aa86ef7f52.tar.bz2
minetest-a90d27e1e23fa1c369c05a4d9c6083aa86ef7f52.zip
Optimize a little bit isBlockInSight, adjustDist & collisions (#7193)
* 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
Diffstat (limited to 'src/util/numeric.cpp')
-rw-r--r--src/util/numeric.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index b88b4d545..f533c275f 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -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))));
}