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"
-#include "util/cpp11_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<v3s16> & light_sources,
- std::map<v3s16, u8> & 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<v3s16> & light_sources,
- INodeDefManager *ndef);
-
/*!
* Updates the lighting on the map.
* The result will be correct only if
*/
void update_lighting_nodes(
Map *map,
- std::vector<std::pair<v3s16, MapNode> > &oldnodes,
+ const std::vector<std::pair<v3s16, MapNode>> &oldnodes,
std::map<v3s16, MapBlock*> &modified_blocks);
/*!
* \param modified_blocks output, contains all map blocks that
* the function modified
*/
-void blit_back_with_light(ServerMap *map, MMVManip *vm,
+void blit_back_with_light(Map *map, MMVManip *vm,
std::map<v3s16, MapBlock*> *modified_blocks);
/*!
*
* \param block the block to update
*/
-void repair_block_light(ServerMap *map, MapBlock *block,
+void repair_block_light(Map *map, MapBlock *block,
std::map<v3s16, MapBlock*> *modified_blocks);
/*!
* 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.
/*!
* 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
-