aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorWeblate <42@minetest.ru>2013-06-01 13:18:52 +0200
committerWeblate <42@minetest.ru>2013-06-01 13:18:52 +0200
commit1dfc2e02b3c358af4bb20bb3cb60ac7bd3ed1124 (patch)
tree54660f353f3342f89b6259ea6a5dfedfa20dc16f /src/util
parentec039a3d123120f9918812b13f5971e94546b9af (diff)
parent64627817fcca52f20948c24b60ce192b218f6ce2 (diff)
downloadminetest-1dfc2e02b3c358af4bb20bb3cb60ac7bd3ed1124.tar.gz
minetest-1dfc2e02b3c358af4bb20bb3cb60ac7bd3ed1124.tar.bz2
minetest-1dfc2e02b3c358af4bb20bb3cb60ac7bd3ed1124.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src/util')
-rw-r--r--src/util/CMakeLists.txt8
-rw-r--r--src/util/numeric.cpp33
2 files changed, 25 insertions, 16 deletions
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
new file mode 100644
index 000000000..9cb8a19b6
--- /dev/null
+++ b/src/util/CMakeLists.txt
@@ -0,0 +1,8 @@
+set(UTIL_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/directiontables.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/numeric.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/pointedthing.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/serialize.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/string.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/timetaker.cpp
+ PARENT_SCOPE)
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index ed83df7d7..0e2772c32 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -159,40 +159,41 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
// Block position relative to camera
v3f blockpos_relative = blockpos - camera_pos;
- // Distance in camera direction (+=front, -=back)
- f32 dforward = blockpos_relative.dotProduct(camera_dir);
-
// Total distance
f32 d = blockpos_relative.getLength();
if(distance_ptr)
*distance_ptr = d;
- // If block is very close, it is always in sight
- if(d < 1.44*1.44*MAP_BLOCKSIZE*BS/2)
- return true;
-
// If block is far away, it's not in sight
if(d > range)
return false;
- // Maximum radius of a block
- f32 block_max_radius = 0.5*1.44*1.44*MAP_BLOCKSIZE*BS;
+ // Maximum radius of a block. The magic number is
+ // sqrt(3.0) / 2.0 in literal form.
+ f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
// If block is (nearly) touching the camera, don't
// bother validating further (that is, render it anyway)
if(d < block_max_radius)
return true;
-
+
+ // Adjust camera position, for purposes of computing the angle,
+ // such that a block that has any portion visible with the
+ // current camera position will have the center visible at the
+ // adjusted postion
+ f32 adjdist = block_max_radius / cos((M_PI - camera_fov) / 2);
+
+ // Block position relative to adjusted camera
+ v3f blockpos_adj = blockpos - (camera_pos - camera_dir * adjdist);
+
+ // Distance in camera direction (+=front, -=back)
+ f32 dforward = blockpos_adj.dotProduct(camera_dir);
+
// Cosine of the angle between the camera direction
// and the block direction (camera_dir is an unit vector)
- f32 cosangle = dforward / d;
+ f32 cosangle = dforward / blockpos_adj.getLength();
- // Compensate for the size of the block
- // (as the block has to be shown even if it's a bit off FOV)
- // This is an estimate, plus an arbitary factor
- cosangle += block_max_radius / d * 0.5;
-
// If block is not in the field of view, skip it
if(cosangle < cos(camera_fov / 2))
return false;