X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxel.cpp;h=87773b240f8edeb1bf9444e9b621c2794dd73131;hb=2035bfc3a64e7c0c82f0cb100cd7d4cc588d0203;hp=335ab307c97f49d00239c211586c9e28eef9ad8a;hpb=10e0cf8b2c27917a3fd45e73a5d835af4313db3b;p=dragonfireclient.git diff --git a/src/voxel.cpp b/src/voxel.cpp index 335ab307c..87773b240 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -46,21 +46,15 @@ VoxelManipulator::VoxelManipulator(): VoxelManipulator::~VoxelManipulator() { clear(); - if(m_data) - delete[] m_data; - if(m_flags) - delete[] m_flags; } void VoxelManipulator::clear() { // Reset area to volume=0 m_area = VoxelArea(); - if(m_data) - delete[] m_data; + delete[] m_data; m_data = NULL; - if(m_flags) - delete[] m_flags; + delete[] m_flags; m_flags = NULL; } @@ -145,7 +139,7 @@ void VoxelManipulator::print(std::ostream &o, INodeDefManager *ndef, void VoxelManipulator::addArea(const VoxelArea &area) { // Cancel if requested area has zero volume - if(area.getExtent() == v3s16(0,0,0)) + if (area.hasEmptyExtent()) return; // Cancel if m_area already contains the requested area @@ -157,7 +151,7 @@ void VoxelManipulator::addArea(const VoxelArea &area) // Calculate new area VoxelArea new_area; // New area is the requested area if m_area has zero volume - if(m_area.getExtent() == v3s16(0,0,0)) + if(m_area.hasEmptyExtent()) { new_area = area; } @@ -179,7 +173,7 @@ void VoxelManipulator::addArea(const VoxelArea &area) dstream<<", new_size="<first, j->second, light_sources, nodemgr); } } -#endif - -#if 0 -/* - Goes recursively through the neighbours of the node. - - Alters only transparent nodes. - - If the lighting of the neighbour is lower than the lighting of - the node was (before changing it to 0 at the step before), the - lighting of the neighbour is set to 0 and then the same stuff - repeats for the neighbour. - - The ending nodes of the routine are stored in light_sources. - This is useful when a light is removed. In such case, this - routine can be called for the light node and then again for - light_sources to re-light the area without the removed light. - - values of from_nodes are lighting values. -*/ -void VoxelManipulator::unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources) -{ - v3s16 dirs[6] = { - v3s16(0,0,1), // back - v3s16(0,1,0), // top - v3s16(1,0,0), // right - v3s16(0,0,-1), // front - v3s16(0,-1,0), // bottom - v3s16(-1,0,0), // left - }; - - if(from_nodes.size() == 0) - return; - - core::map unlighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); - - for(; j.atEnd() == false; j++) - { - v3s16 pos = j.getNode()->getKey(); - - addArea(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1))); - - //MapNode &n = m_data[m_area.index(pos)]; - - u8 oldlight = j.getNode()->getValue(); - - // Loop through 6 neighbors - for(u16 i=0; i<6; i++) - { - // Get the position of the neighbor node - v3s16 n2pos = pos + dirs[i]; - - u32 n2i = m_area.index(n2pos); - - if(m_flags[n2i] & VOXELFLAG_NO_DATA) - continue; - - MapNode &n2 = m_data[n2i]; - - /* - If the neighbor is dimmer than what was specified - as oldlight (the light of the previous node) - */ - if(n2.getLight(bank, nodemgr) < oldlight) - { - /* - And the neighbor is transparent and it has some light - */ - if(nodemgr->get(n2).light_propagates && n2.getLight(bank, nodemgr) != 0) - { - /* - Set light to 0 and add to queue - */ - - u8 current_light = n2.getLight(bank, nodemgr); - n2.setLight(bank, 0); - - unlighted_nodes.insert(n2pos, current_light); - - /* - Remove from light_sources if it is there - NOTE: This doesn't happen nearly at all - */ - /*if(light_sources.find(n2pos)) - { - std::cout<<"Removed from light_sources"< 0) - unspreadLight(bank, unlighted_nodes, light_sources); -} -#endif void VoxelManipulator::spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr) @@ -602,34 +484,9 @@ void VoxelManipulator::spreadLight(enum LightBank bank, v3s16 p, } } -#if 0 -/* - Lights neighbors of from_nodes, collects all them and then - goes on recursively. - - NOTE: This is faster on small areas but will overflow the - stack on large areas. Thus it is not used. -*/ -void VoxelManipulator::spreadLight(enum LightBank bank, - core::map & from_nodes) -{ - if(from_nodes.size() == 0) - return; - - core::map lighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); - - for(; j.atEnd() == false; j++) - { - v3s16 pos = j.getNode()->getKey(); - spreadLight(bank, pos); - } -} -#endif +const MapNode VoxelManipulator::ContentIgnoreNode = MapNode(CONTENT_IGNORE); -#if 1 /* Lights neighbors of from_nodes, collects all them and then goes on recursively. @@ -722,6 +579,5 @@ void VoxelManipulator::spreadLight(enum LightBank bank, if(!lighted_nodes.empty()) spreadLight(bank, lighted_nodes, nodemgr); } -#endif //END