X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxelalgorithms.h;h=1452f30f4ed5ea29cd56b2823b78033714e66d99;hb=88f514ad7a849eb4a67b5ee2c41c93856cf3808f;hp=2a5fc394e239a41cdc8e9f715be983c0a232a646;hpb=979ca23f1eae1adeb8b0083dffe7203c54d87395;p=minetest.git diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 2a5fc394e..1452f30f4 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -17,40 +17,141 @@ 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 "util/container.h" + +class Map; +class ServerMap; +class MapBlock; +class MMVManip; namespace voxalgo { -// TODO: Move unspreadLight and spreadLight from VoxelManipulator to here +/*! + * Updates the lighting on the map. + * The result will be correct only if + * no nodes were changed except the given ones. + * Before calling this procedure make sure that all new nodes on + * the map have zero light level! + * + * \param oldnodes contains the MapNodes that were replaced by the new + * MapNodes and their positions + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void update_lighting_nodes( + Map *map, + 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); -void setLight(VoxelManipulator &v, VoxelArea a, u8 light, - INodeDefManager *ndef); +/*! + * 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); -void clearLightAndCollectSources(VoxelManipulator &v, VoxelArea a, - enum LightBank bank, INodeDefManager *ndef, - core::map & light_sources, - core::map & unlight_from); +/*! + * 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); -struct SunlightPropagateResult +/*! + * This class iterates trough voxels that intersect with + * a line. The collision detection does not see nodeboxes, + * every voxel is a cube and is returned. + * This iterator steps to all nodes exactly once. + */ +struct VoxelLineIterator { - bool bottom_sunlight_valid; +public: + //! Starting position of the line in world coordinates. + v3f m_start_position; + //! Direction and length of the line in world coordinates. + v3f m_line_vector; + /*! + * Each component stores the next smallest positive number, by + * which multiplying the line's vector gives a vector that ends + * on the intersection of two nodes. + */ + 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 { 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 { 1, 1, 1 }; + //! Position of the current node. + v3s16 m_current_node_pos; + //! 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; - SunlightPropagateResult(bool bottom_sunlight_valid_): - bottom_sunlight_valid(bottom_sunlight_valid_) - {} -}; + /*! + * Creates a voxel line iterator with the given line. + * @param start_position starting point of the line + * in voxel coordinates + * @param line_vector length and direction of the + * line in voxel coordinates. start_position+line_vector + * is the end of the line + */ + VoxelLineIterator(const v3f &start_position,const v3f &line_vector); -SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, - bool inexistent_top_provides_sunlight, - core::map & light_sources, - INodeDefManager *ndef); + /*! + * Steps to the next voxel. + * Updates m_current_node_pos and + * m_previous_node_pos. + * Note that it works even if hasNext() is false, + * continuing the line as a ray. + */ + void next(); -} // namespace voxalgo + /*! + * Returns true if the next voxel intersects the given line. + */ + inline bool hasNext() const + { + return m_current_index < m_last_index; + } -#endif + /*! + * 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