X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.cpp;h=6751f39e434f40a99682597c8b4b554787425b8f;hb=a9c3a423231e26ea3edee51d5f0bf949ca8e529b;hp=23ec645737979d3b339102a9b7ac1bf277fa2af6;hpb=9c669016d1578a5c62f932c6ccb7a2b4b1e21f0a;p=minetest.git diff --git a/src/environment.cpp b/src/environment.cpp index 23ec64573..6751f39e4 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -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" @@ -36,7 +35,6 @@ Environment::Environment(IGameDef *gamedef): m_cache_enable_shaders = g_settings->getBool("enable_shaders"); m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval"); m_cache_abm_interval = g_settings->getFloat("abm_interval"); - m_cache_ao_interval = g_settings->getFloat("active_object_interval"); m_cache_nodetimer_interval = g_settings->getFloat("nodetimer_interval"); m_time_of_day = g_settings->getU32("world_start_time"); @@ -84,11 +82,29 @@ 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 */ inline static bool isPointableNode(const MapNode &n, - INodeDefManager *nodedef , bool liquids_pointable) + const NodeDefManager *nodedef , bool liquids_pointable) { const ContentFeatures &features = nodedef->get(n); return features.pointable || @@ -97,7 +113,7 @@ inline static bool isPointableNode(const MapNode &n, void Environment::continueRaycast(RaycastState *state, PointedThing *result) { - INodeDefManager *nodedef = getMap().getNodeDefManager(); + const NodeDefManager *nodedef = getMap().getNodeDefManager(); if (state->m_initialization_needed) { // Add objects if (state->m_objects_pointable) { @@ -160,7 +176,7 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) v3s16 np(x, y, z); bool is_valid_position; - n = map.getNodeNoEx(np, &is_valid_position); + n = map.getNode(np, &is_valid_position); if (!(is_valid_position && isPointableNode(n, nodedef, state->m_liquids_pointable))) { continue; @@ -176,12 +192,12 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) bool is_colliding = false; // Minimal distance of all collisions float min_distance_sq = 10000000; + // ID of the current box (loop counter) + u16 id = 0; v3f npf = intToFloat(np, BS); - for (std::vector::const_iterator i = boxes.begin(); - i != boxes.end(); ++i) { - // Get current collision box - aabb3f box = *i; + // This loop translates the boxes to their in-world place. + for (aabb3f &box : boxes) { box.MinEdge += npf; box.MaxEdge += npf; @@ -189,8 +205,10 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) v3s16 intersection_normal; if (!boxLineCollision(box, state->m_shootline.start, state->m_shootline.getVector(), &intersection_point, - &intersection_normal)) + &intersection_normal)) { + ++id; continue; + } f32 distanceSq = (intersection_point - state->m_shootline.start).getLengthSQ(); @@ -199,9 +217,11 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) min_distance_sq = distanceSq; result.intersection_point = intersection_point; result.intersection_normal = intersection_normal; + result.box_id = id; found_boxcenter = box.getCenter(); is_colliding = true; } + ++id; } // If there wasn't a collision, stop if (!is_colliding) {