Do post-mapgen lighting using the VoxelManipulator-based functions (causes glitches...
authorPerttu Ahola <celeron55@gmail.com>
Fri, 27 Jan 2012 12:10:10 +0000 (14:10 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 27 Mar 2012 16:01:51 +0000 (19:01 +0300)
src/map.cpp
src/mapgen.cpp

index 1ab2b32ae55596999ffdee6f9548d17d6a8ca5fa..2625cbad56c642c4bb7f51b03ad902ad4016cb15 100644 (file)
@@ -2076,10 +2076,13 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos)
                                <<"("<<blockpos.X<<","<<blockpos.Y<<","<<blockpos.Z<<")"
                                <<std::endl;
        
-       s16 chunksize = 2;
-       v3s16 blockpos_div = getContainerPos(blockpos, chunksize);
+       s16 chunksize = 3;
+       v3s16 chunk_offset(-1,-1,-1);
+       v3s16 blockpos_div = getContainerPos(blockpos - chunk_offset, chunksize);
        v3s16 blockpos_min = blockpos_div * chunksize;
        v3s16 blockpos_max = blockpos_div * chunksize + v3s16(1,1,1)*(chunksize-1);
+       blockpos_min += chunk_offset;
+       blockpos_max += chunk_offset;
        
        // Do nothing if not inside limits (+-1 because of neighbors)
        if(blockpos_over_limit(blockpos_min - v3s16(1,1,1)) ||
@@ -2223,6 +2226,7 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
                Update lighting
        */
        {
+#if 0
                TimeTaker t("finishBlockMake lighting update");
 
                core::map<v3s16, MapBlock*> lighting_update_blocks;
@@ -2239,6 +2243,7 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
                }
 
                updateLighting(lighting_update_blocks, changed_blocks);
+#endif
                
                /*
                        Set lighting to non-expired state in all of them.
@@ -2253,8 +2258,10 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
                        getBlockNoCreateNoEx(p)->setLightingExpired(false);
                }
 
+#if 0
                if(enable_mapgen_debug_info == false)
                        t.stop(true); // Hide output
+#endif
        }
 
        // Center blocks
index 25fa427aa3ab4864c66382c3fd8652e6a26c9a1b..0ce211f30d9a8a22c0812b4823825fec50ac2731 100644 (file)
@@ -27,6 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "nodedef.h"
 #include "content_mapnode.h" // For content_mapnode_get_new_name
 #include "voxelalgorithms.h"
+#include "profiler.h"
+#include "main.h" // For g_profiler
 
 namespace mapgen
 {
@@ -2339,7 +2341,33 @@ void make_block(BlockMakeData *data)
        /*
                Calculate lighting
        */
+       {
+       ScopeProfiler sp(g_profiler, "EmergeThread: mapgen lighting update",
+                       SPT_AVG);
+       VoxelArea a(node_min, node_max);
+       enum LightBank banks[2] = {LIGHTBANK_DAY, LIGHTBANK_NIGHT};
+       for(int i=0; i<2; i++)
+       {
+               enum LightBank bank = banks[i];
+
+               core::map<v3s16, bool> light_sources;
+               core::map<v3s16, u8> unlight_from;
+
+               voxalgo::clearLightAndCollectSources(vmanip, a, bank, ndef,
+                               light_sources, unlight_from);
+               
+               // TODO: Get this from elsewhere
+               bool inexistent_top_provides_sunlight = true;
+               voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
+                               vmanip, a, inexistent_top_provides_sunlight,
+                               light_sources, ndef);
+               // TODO: Do stuff according to bottom_sunlight_valid
+
+               vmanip.unspreadLight(bank, unlight_from, light_sources, ndef);
 
+               vmanip.spreadLight(bank, light_sources, ndef);
+       }
+       }
 }
 
 BlockMakeData::BlockMakeData():