]> git.lizzy.rs Git - minetest.git/blobdiff - src/environment.cpp
Fix CAO light calculation issue
[minetest.git] / src / environment.cpp
index 906f35219b746ffc728bb0a2217d28478712861c..b04f77557190d03bfae6830fd2a6d7883dfb2a9f 100644 (file)
@@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "environment.h"
 #include "collision.h"
 #include "raycast.h"
-#include "serverobject.h"
 #include "scripting_server.h"
 #include "server.h"
 #include "daynightratio.h"
@@ -37,6 +36,7 @@ Environment::Environment(IGameDef *gamedef):
        m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval");
        m_cache_abm_interval = g_settings->getFloat("abm_interval");
        m_cache_nodetimer_interval = g_settings->getFloat("nodetimer_interval");
+       m_cache_abm_time_budget = g_settings->getFloat("abm_time_budget");
 
        m_time_of_day = g_settings->getU32("world_start_time");
        m_time_of_day_f = (float)m_time_of_day / 24000.0f;
@@ -83,6 +83,24 @@ float Environment::getTimeOfDayF()
        return m_time_of_day_f;
 }
 
+bool Environment::line_of_sight(v3f pos1, v3f pos2, v3s16 *p)
+{
+       // Iterate trough nodes on the line
+       voxalgo::VoxelLineIterator iterator(pos1 / BS, (pos2 - pos1) / BS);
+       do {
+               MapNode n = getMap().getNode(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;
+}
+
 /*
        Check if a node is pointable
 */
@@ -151,6 +169,12 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result)
                        new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z;
                }
 
+               if (new_nodes.MaxEdge.X == S16_MAX ||
+                       new_nodes.MaxEdge.Y == S16_MAX ||
+                       new_nodes.MaxEdge.Z == S16_MAX) {
+                       break; // About to go out of bounds
+               }
+
                // For each untested node
                for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++)
                for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++)