]> git.lizzy.rs Git - minetest.git/blobdiff - src/voxel.cpp
Migrate to STL containers/algorithms.
[minetest.git] / src / voxel.cpp
index c8482939ee3855f5af1e7846c358b219577f859e..f859a1f0382cf6025a41c0b60dd48a7c83ad3eb2 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -19,9 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "voxel.h"
 #include "map.h"
-#include "utility.h" // For TimeTaker
 #include "gettime.h"
 #include "nodedef.h"
+#include "util/timetaker.h"
 
 /*
        Debug stuff
@@ -244,7 +244,13 @@ void VoxelManipulator::copyTo(MapNode *dst, VoxelArea dst_area,
        {
                s32 i_dst = dst_area.index(dst_pos.X, dst_pos.Y+y, dst_pos.Z+z);
                s32 i_local = m_area.index(from_pos.X, from_pos.Y+y, from_pos.Z+z);
-               memcpy(&dst[i_dst], &m_data[i_local], size.X*sizeof(MapNode));
+               for (s16 x = 0; x < size.X; x++) {
+                       if (m_data[i_local].getContent() != CONTENT_IGNORE)
+                               dst[i_dst] = m_data[i_local];
+                       i_dst++;
+                       i_local++;
+               }
+               //memcpy(&dst[i_dst], &m_data[i_local], size.X*sizeof(MapNode));
        }
 }
 
@@ -296,7 +302,7 @@ void VoxelManipulator::clearFlag(u8 flags)
 }
 
 void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
-               core::map<v3s16, bool> & light_sources, INodeDefManager *nodemgr)
+               std::set<v3s16> & light_sources, INodeDefManager *nodemgr)
 {
        v3s16 dirs[6] = {
                v3s16(0,0,1), // back
@@ -354,7 +360,7 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
                        }
                }
                else{
-                       light_sources.insert(n2pos, true);
+                       light_sources.insert(n2pos);
                }
        }
 }
@@ -378,24 +384,16 @@ void VoxelManipulator::unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
        values of from_nodes are lighting values.
 */
 void VoxelManipulator::unspreadLight(enum LightBank bank,
-               core::map<v3s16, u8> & from_nodes,
-               core::map<v3s16, bool> & light_sources, INodeDefManager *nodemgr)
+               std::map<v3s16, u8> & from_nodes,
+               std::set<v3s16> & light_sources, INodeDefManager *nodemgr)
 {
        if(from_nodes.size() == 0)
                return;
        
-       core::map<v3s16, u8>::Iterator j;
-       j = from_nodes.getIterator();
-
-       for(; j.atEnd() == false; j++)
+       for(std::map<v3s16, u8>::iterator j = from_nodes.begin();
+               j != from_nodes.end(); ++j)
        {
-               v3s16 pos = j.getNode()->getKey();
-               
-               //MapNode &n = m_data[m_area.index(pos)];
-               
-               u8 oldlight = j.getNode()->getValue();
-
-               unspreadLight(bank, pos, oldlight, light_sources, nodemgr);
+               unspreadLight(bank, j->first, j->second, light_sources, nodemgr);
        }
 }
 #endif
@@ -603,7 +601,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
        goes on recursively.
 */
 void VoxelManipulator::spreadLight(enum LightBank bank,
-               core::map<v3s16, bool> & from_nodes, INodeDefManager *nodemgr)
+               std::set<v3s16> & from_nodes, INodeDefManager *nodemgr)
 {
        const v3s16 dirs[6] = {
                v3s16(0,0,1), // back
@@ -617,13 +615,12 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
        if(from_nodes.size() == 0)
                return;
        
-       core::map<v3s16, bool> lighted_nodes;
-       core::map<v3s16, bool>::Iterator j;
-       j = from_nodes.getIterator();
+       std::set<v3s16> lighted_nodes;
 
-       for(; j.atEnd() == false; j++)
+       for(std::set<v3s16>::iterator j = from_nodes.begin();
+               j != from_nodes.end(); ++j)
        {
-               v3s16 pos = j.getNode()->getKey();
+               v3s16 pos = *j;
 
                emerge(VoxelArea(pos - v3s16(1,1,1), pos + v3s16(1,1,1)));
 
@@ -660,7 +657,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
                                */
                                if(light2 > undiminish_light(oldlight))
                                {
-                                       lighted_nodes.insert(n2pos, true);
+                                       lighted_nodes.insert(n2pos);
                                }
                                /*
                                        If the neighbor is dimmer than how much light this node
@@ -671,7 +668,7 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
                                        if(nodemgr->get(n2).light_propagates)
                                        {
                                                n2.setLight(bank, newlight, nodemgr);
-                                               lighted_nodes.insert(n2pos, true);
+                                               lighted_nodes.insert(n2pos);
                                        }
                                }
                        }