diff options
author | Dániel Juhász <juhdanad@gmail.com> | 2016-12-01 20:15:37 +0100 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2017-12-26 21:51:32 +0000 |
commit | 2153965cf92ab61b0d7e095cf3c2755924fdc221 (patch) | |
tree | 3895bdca9684f0f94a2a9f8653e013eecc0d4e1e /src/serverenvironment.cpp | |
parent | ca64f564cd23dba45bc93b57a718dfe81df5ba27 (diff) | |
download | minetest-2153965cf92ab61b0d7e095cf3c2755924fdc221.tar.gz minetest-2153965cf92ab61b0d7e095cf3c2755924fdc221.tar.bz2 minetest-2153965cf92ab61b0d7e095cf3c2755924fdc221.zip |
Line_of_sight: Improve using VoxelLineIterator
This commit rewrites line_of_sight with VoxelLineIterator.
Stepsize is no longer needed, the results will be always accurate.
Diffstat (limited to 'src/serverenvironment.cpp')
-rw-r--r-- | src/serverenvironment.cpp | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index f2d55fccc..13e127705 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -489,30 +489,21 @@ bool ServerEnvironment::removePlayerFromDatabase(const std::string &name) return m_player_database->removePlayer(name); } -bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p) +bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p) { - float distance = pos1.getDistanceFrom(pos2); - - //calculate normalized direction vector - v3f normalized_vector = v3f((pos2.X - pos1.X)/distance, - (pos2.Y - pos1.Y)/distance, - (pos2.Z - pos1.Z)/distance); - - //find out if there's a node on path between pos1 and pos2 - for (float i = 1; i < distance; i += stepsize) { - v3s16 pos = floatToInt(v3f(normalized_vector.X * i, - normalized_vector.Y * i, - normalized_vector.Z * i) +pos1,BS); - - MapNode n = getMap().getNodeNoEx(pos); - - if(n.param0 != CONTENT_AIR) { - if (p) { - *p = pos; - } + // Iterate trough nodes on the line + voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS); + do { + MapNode n = getMap().getNodeNoEx(iterator.m_current_node_pos); + + // Return non-air + if (n.param0 != CONTENT_AIR) { + if (p) + *p = iterator.m_current_node_pos; return false; } - } + iterator.next(); + } while (iterator.m_current_index <= iterator.m_last_index); return true; } |