X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxelalgorithms.h;h=1452f30f4ed5ea29cd56b2823b78033714e66d99;hb=0e88176db8ce9f3fb631feb56bdd29d4ada054f5;hp=5eff8f7ac86329f3376704f38fd1c11067871afe;hpb=3f8261830e0503cd59d8713d5c9aab12fc1491db;p=dragonfireclient.git diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 5eff8f7ac..1452f30f4 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -17,44 +17,20 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef VOXELALGORITHMS_HEADER -#define VOXELALGORITHMS_HEADER +#pragma once #include "voxel.h" #include "mapnode.h" -#include -#include +#include "util/container.h" class Map; +class ServerMap; class MapBlock; +class MMVManip; namespace voxalgo { -// TODO: Move unspreadLight and spreadLight from VoxelManipulator to here - -void setLight(VoxelManipulator &v, VoxelArea a, u8 light, - INodeDefManager *ndef); - -void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, - enum LightBank bank, INodeDefManager *ndef, - std::set & light_sources, - std::map & unlight_from); - -struct SunlightPropagateResult -{ - bool bottom_sunlight_valid; - - SunlightPropagateResult(bool bottom_sunlight_valid_): - bottom_sunlight_valid(bottom_sunlight_valid_) - {} -}; - -SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, - bool inexistent_top_provides_sunlight, - std::set & light_sources, - INodeDefManager *ndef); - /*! * Updates the lighting on the map. * The result will be correct only if @@ -69,10 +45,41 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, */ void update_lighting_nodes( Map *map, - INodeDefManager *ndef, std::vector > &oldnodes, std::map &modified_blocks); +/*! + * Updates borders of the given mapblock. + * Only updates if the block was marked with incomplete + * lighting and the neighbor is also loaded. + * + * \param block the block to update + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void update_block_border_lighting(Map *map, MapBlock *block, + std::map &modified_blocks); + +/*! + * Copies back nodes from a voxel manipulator + * to the map and updates lighting. + * For server use only. + * + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void blit_back_with_light(ServerMap *map, MMVManip *vm, + std::map *modified_blocks); + +/*! + * Corrects the light in a map block. + * For server use only. + * + * \param block the block to update + */ +void repair_block_light(ServerMap *map, MapBlock *block, + std::map *modified_blocks); + /*! * This class iterates trough voxels that intersect with * a line. The collision detection does not see nodeboxes, @@ -91,21 +98,25 @@ struct VoxelLineIterator * which multiplying the line's vector gives a vector that ends * on the intersection of two nodes. */ - v3f m_next_intersection_multi; + v3f m_next_intersection_multi { 10000.0f, 10000.0f, 10000.0f }; /*! * Each component stores the smallest positive number, by which * m_next_intersection_multi's components can be increased. */ - v3f m_intersection_multi_inc; + v3f m_intersection_multi_inc { 10000.0f, 10000.0f, 10000.0f }; /*! * Direction of the line. Each component can be -1 or 1 (if a * component of the line's vector is 0, then there will be 1). */ - v3s16 m_step_directions; + v3s16 m_step_directions { 1, 1, 1 }; //! Position of the current node. v3s16 m_current_node_pos; - //! If true, the next node will intersect the line, too. - bool m_has_next; + //! Index of the current node + s16 m_current_index = 0; + //! Position of the start node. + v3s16 m_start_node_pos; + //! Index of the last node + s16 m_last_index; /*! * Creates a voxel line iterator with the given line. @@ -129,12 +140,18 @@ struct VoxelLineIterator /*! * Returns true if the next voxel intersects the given line. */ - inline bool hasNext() const { return m_has_next; } + inline bool hasNext() const + { + return m_current_index < m_last_index; + } + + /*! + * Returns how many times next() must be called until + * voxel==m_current_node_pos. + * If voxel does not intersect with the line, + * the result is undefined. + */ + s16 getIndex(v3s16 voxel); }; } // namespace voxalgo - - - -#endif -