]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/voxel.cpp
.
[dragonfireclient.git] / src / voxel.cpp
index f8a98942cc7e72873803875a4c91791ce09a10d0..7ba4e21c6ef0d2dd8fdc78978c70e0d8245a56b8 100644 (file)
@@ -21,8 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "map.h"
 
 // For TimeTaker
-#include "main.h"
 #include "utility.h"
+#include "gettime.h"
 
 /*
        Debug stuff
@@ -138,7 +138,7 @@ void VoxelManipulator::addArea(VoxelArea area)
        if(m_area.contains(area))
                return;
        
-       TimeTaker timer("addArea", g_device, &addarea_time);
+       TimeTaker timer("addArea", &addarea_time);
 
        // Calculate new area
        VoxelArea new_area;
@@ -221,76 +221,11 @@ void VoxelManipulator::copyFrom(MapNode *src, VoxelArea src_area,
        }
 }
 
-void VoxelManipulator::interpolate(VoxelArea area)
-{
-       VoxelArea emerge_area = area;
-       emerge_area.MinEdge -= v3s16(1,1,1);
-       emerge_area.MaxEdge += v3s16(1,1,1);
-       emerge(emerge_area);
-
-       SharedBuffer<u8> buf(area.getVolume());
-
-       for(s32 z=area.MinEdge.Z; z<=area.MaxEdge.Z; z++)
-       for(s32 y=area.MinEdge.Y; y<=area.MaxEdge.Y; y++)
-       for(s32 x=area.MinEdge.X; x<=area.MaxEdge.X; x++)
-       {
-               v3s16 p(x,y,z);
-
-               v3s16 dirs[] = {
-                       v3s16(1,1,0),
-                       v3s16(1,0,1),
-                       v3s16(1,-1,0),
-                       v3s16(1,0,-1),
-                       v3s16(-1,1,0),
-                       v3s16(-1,0,1),
-                       v3s16(-1,-1,0),
-                       v3s16(-1,0,-1),
-               };
-               //const v3s16 *dirs = g_26dirs;
-               
-               s16 total = 0;
-               s16 airness = 0;
-               u8 m = CONTENT_IGNORE;
-
-               for(s16 i=0; i<8; i++)
-               //for(s16 i=0; i<26; i++)
-               {
-                       v3s16 p2 = p + dirs[i];
-
-                       u8 f = m_flags[m_area.index(p2)];
-                       assert(!(f & VOXELFLAG_NOT_LOADED));
-                       if(f & VOXELFLAG_INEXISTENT)
-                               continue;
-
-                       MapNode &n = m_data[m_area.index(p2)];
-
-                       airness += (n.d == CONTENT_AIR) ? 1 : -1;
-                       total++;
-
-                       if(m == CONTENT_IGNORE && n.d != CONTENT_AIR)
-                               m = n.d;
-               }
-
-               // 1 if air, 0 if not
-               buf[area.index(p)] = airness > -total/2 ? CONTENT_AIR : m;
-               //buf[area.index(p)] = airness > -total ? CONTENT_AIR : m;
-               //buf[area.index(p)] = airness >= -7 ? CONTENT_AIR : m;
-       }
-
-       for(s32 z=area.MinEdge.Z; z<=area.MaxEdge.Z; z++)
-       for(s32 y=area.MinEdge.Y; y<=area.MaxEdge.Y; y++)
-       for(s32 x=area.MinEdge.X; x<=area.MaxEdge.X; x++)
-       {
-               v3s16 p(x,y,z);
-               m_data[m_area.index(p)].d = buf[area.index(p)];
-       }
-}
-
 
 void VoxelManipulator::clearFlag(u8 flags)
 {
        // 0-1ms on moderate area
-       TimeTaker timer("clearFlag", g_device, &clearflag_time);
+       TimeTaker timer("clearFlag", &clearflag_time);
 
        v3s16 s = m_area.getExtent();
 
@@ -373,7 +308,7 @@ int VoxelManipulator::getWaterPressure(v3s16 p, s16 &highest_y, int recur_count)
                int pr;
 
                // If at ocean surface
-               if(n.pressure == 1 && n.d == CONTENT_OCEAN)
+               if(n.pressure == 1 && n.d == CONTENT_WATERSOURCE)
                //if(n.pressure == 1) // Causes glitches but is fast
                {
                        pr = 1;
@@ -539,8 +474,7 @@ void VoxelManipulator::updateAreaWaterPressure(VoxelArea a,
                core::map<v3s16, u8> &active_nodes,
                bool checked3_is_clear)
 {
-       TimeTaker timer("updateAreaWaterPressure", g_device,
-                       &updateareawaterpressure_time);
+       TimeTaker timer("updateAreaWaterPressure", &updateareawaterpressure_time);
 
        emerge(a, 3);
        
@@ -585,7 +519,7 @@ void VoxelManipulator::updateAreaWaterPressure(VoxelArea a,
                try
                {
                        // 0-1ms @ recur_count <= 100
-                       //TimeTaker timer("getWaterPressure", g_device);
+                       //TimeTaker timer("getWaterPressure", g_irrlicht);
                        pr = getWaterPressure(p, highest_y, recur_count);
                }
                catch(ProcessingLimitException &e)
@@ -613,7 +547,7 @@ void VoxelManipulator::updateAreaWaterPressure(VoxelArea a,
                try
                {
                        // 0ms
-                       //TimeTaker timer("spreadWaterPressure", g_device);
+                       //TimeTaker timer("spreadWaterPressure", g_irrlicht);
                        spreadWaterPressure(p, pr, a, active_nodes, 0);
                }
                catch(ProcessingLimitException &e)
@@ -653,7 +587,7 @@ bool VoxelManipulator::flowWater(v3s16 removed_pos,
        //dstream<<"s1="<<s1<<", s2="<<s2<<std::endl;
 
        {
-       TimeTaker timer1("flowWater pre", g_device, &flowwater_pre_time);
+       TimeTaker timer1("flowWater pre", &flowwater_pre_time);
        
        // Load neighboring nodes
        emerge(VoxelArea(removed_pos - v3s16(1,1,1), removed_pos + v3s16(1,1,1)), 4);
@@ -719,7 +653,7 @@ bool VoxelManipulator::flowWater(v3s16 removed_pos,
        u8 m = m_data[m_area.index(p)].d;
        u8 f = m_flags[m_area.index(p)];
 
-       if(m == CONTENT_OCEAN)
+       if(m == CONTENT_WATERSOURCE)
                from_ocean = true;
 
        // Move air bubble if not taking water from ocean
@@ -752,7 +686,7 @@ bool VoxelManipulator::flowWater(v3s16 removed_pos,
        
        /*
        NOTE: This does not work as-is
-       if(m == CONTENT_OCEAN)
+       if(m == CONTENT_WATERSOURCE)
        {
                // If block was raised to surface, increase pressure of
                // source node
@@ -802,11 +736,13 @@ bool VoxelManipulator::flowWater(v3s16 removed_pos,
                                debugprint, stoptime);
        }
        
-       if(stoptime != 0 && g_device != NULL)
+       if(stoptime != 0)
        {
-               u32 timenow = g_device->getTimer()->getRealTime();
-               if(timenow >= stoptime ||
-                               (stoptime < 0x80000000 && timenow > 0x80000000))
+               u32 timenow = getTimeMs();
+               // Well, it is a bit hard to guess because we don't know the
+               // start time...
+               bool overflow = timenow < stoptime - 100000;
+               if(timenow >= stoptime || overflow)
                {
                        dstream<<"flowWater: stoptime reached"<<std::endl;
                        throw ProcessingLimitException("flowWater stoptime reached");
@@ -870,16 +806,13 @@ void VoxelManipulator::flowWater(
                return;
        }
 
-       //TimeTaker timer1("flowWater (active_nodes)", g_device);
+       //TimeTaker timer1("flowWater (active_nodes)", g_irrlicht);
 
        //dstream<<"active_nodes.size() = "<<active_nodes.size()<<std::endl;
 
 
        u32 stoptime = 0;
-       if(g_device != NULL)
-       {
-               stoptime = g_device->getTimer()->getRealTime() + timelimit;
-       }
+       stoptime = getTimeMs() + timelimit;
 
        // Count of handled active nodes
        u32 handled_count = 0;
@@ -895,7 +828,7 @@ void VoxelManipulator::flowWater(
        */
        s32 k = 0;
        if(active_nodes.size() != 0)
-               k = (s32)rand() % (s32)active_nodes.size();
+               k = (s32)myrand() % (s32)active_nodes.size();
 
        // Flow water to active nodes
        for(;;)