diff options
author | kwolekr <kwolekr@minetest.net> | 2015-01-04 02:34:33 -0500 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-01-04 02:42:31 -0500 |
commit | 7233a1228eb161cbcbb46c6e801cabd89ef3d2ab (patch) | |
tree | af3b728cb6052e3bd409ac39cd6b2db7c633076d /src | |
parent | 060ae29eafbca089824cfbcedc9bc36b7fda5d5e (diff) | |
download | minetest-7233a1228eb161cbcbb46c6e801cabd89ef3d2ab.tar.gz minetest-7233a1228eb161cbcbb46c6e801cabd89ef3d2ab.tar.bz2 minetest-7233a1228eb161cbcbb46c6e801cabd89ef3d2ab.zip |
Lighting: Fix nearly all issues
The cause of a single light source seemingly being lit without spread
was due to its creation in the +Y mapblock boundary layer during map
generation, which was ignored as the overtop. This overtop explicitly
needs to be omitted during sunlight propagation, however. To accomplish
this, Mapgen::calcLighting() was split into separate functions taking
separate parameters.
Additionally, do not diminish light too early during spread. This fixes the
output inconsistency between Map::updateLighting and Mapgen::calcLighting.
Diffstat (limited to 'src')
-rw-r--r-- | src/mapgen.cpp | 48 | ||||
-rw-r--r-- | src/mapgen.h | 4 | ||||
-rw-r--r-- | src/mapgen_singlenode.cpp | 3 | ||||
-rw-r--r-- | src/mapgen_v5.cpp | 3 | ||||
-rw-r--r-- | src/mapgen_v6.cpp | 5 | ||||
-rw-r--r-- | src/mapgen_v7.cpp | 3 | ||||
-rw-r--r-- | src/script/lua_api/l_vmanip.cpp | 18 |
7 files changed, 54 insertions, 30 deletions
diff --git a/src/mapgen.cpp b/src/mapgen.cpp index c1b8889a8..44df35a07 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -243,14 +243,28 @@ void Mapgen::lightSpread(VoxelArea &a, v3s16 p, u8 light) void Mapgen::calcLighting(v3s16 nmin, v3s16 nmax) { - VoxelArea a(nmin, nmax); - bool block_is_underground = (water_level >= nmax.Y); - ScopeProfiler sp(g_profiler, "EmergeThread: mapgen lighting update", SPT_AVG); //TimeTaker t("updateLighting"); - // first, send vertical rays of sunshine downward + propagateSunlight( + nmin - v3s16(1, 1, 1) * MAP_BLOCKSIZE, + nmax + v3s16(1, 0, 1) * MAP_BLOCKSIZE); + + spreadLight( + nmin - v3s16(1, 1, 1) * MAP_BLOCKSIZE, + nmax + v3s16(1, 1, 1) * MAP_BLOCKSIZE); + + //printf("updateLighting: %dms\n", t.stop()); +} + + +void Mapgen::propagateSunlight(v3s16 nmin, v3s16 nmax) +{ + //TimeTaker t("propagateSunlight"); + VoxelArea a(nmin, nmax); + bool block_is_underground = (water_level >= nmax.Y); v3s16 em = vm->m_area.getExtent(); + for (int z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) { for (int x = a.MinEdge.X; x <= a.MaxEdge.X; x++) { // see if we can get a light value from the overtop @@ -272,8 +286,17 @@ void Mapgen::calcLighting(v3s16 nmin, v3s16 nmax) } } } + //printf("propagateSunlight: %dms\n", t.stop()); +} + + + +void Mapgen::spreadLight(v3s16 nmin, v3s16 nmax) +{ + //TimeTaker t("spreadLight"); + VoxelArea a(nmin, nmax); + v3s16 em = vm->m_area.getExtent(); - // now spread the sunlight and light up any sources for (int z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) { for (int y = a.MinEdge.Y; y <= a.MaxEdge.Y; y++) { u32 i = vm->m_area.index(a.MinEdge.X, y, z); @@ -289,21 +312,22 @@ void Mapgen::calcLighting(v3s16 nmin, v3s16 nmax) u8 light = n.param1 & 0x0F; if (light) { - lightSpread(a, v3s16(x, y, z + 1), light - 1); - lightSpread(a, v3s16(x, y + 1, z ), light - 1); - lightSpread(a, v3s16(x + 1, y, z ), light - 1); - lightSpread(a, v3s16(x, y, z - 1), light - 1); - lightSpread(a, v3s16(x, y - 1, z ), light - 1); - lightSpread(a, v3s16(x - 1, y, z ), light - 1); + lightSpread(a, v3s16(x, y, z + 1), light); + lightSpread(a, v3s16(x, y + 1, z ), light); + lightSpread(a, v3s16(x + 1, y, z ), light); + lightSpread(a, v3s16(x, y, z - 1), light); + lightSpread(a, v3s16(x, y - 1, z ), light); + lightSpread(a, v3s16(x - 1, y, z ), light); } } } } - //printf("updateLighting: %dms\n", t.stop()); + //printf("spreadLight: %dms\n", t.stop()); } + void Mapgen::calcLightingOld(v3s16 nmin, v3s16 nmax) { enum LightBank banks[2] = {LIGHTBANK_DAY, LIGHTBANK_NIGHT}; diff --git a/src/mapgen.h b/src/mapgen.h index aaa89d3bc..2ac66d354 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -156,7 +156,11 @@ public: void updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax); void setLighting(v3s16 nmin, v3s16 nmax, u8 light); void lightSpread(VoxelArea &a, v3s16 p, u8 light); + void calcLighting(v3s16 nmin, v3s16 nmax); + void propagateSunlight(v3s16 nmin, v3s16 nmax); + void spreadLight(v3s16 nmin, v3s16 nmax); + void calcLightingOld(v3s16 nmin, v3s16 nmax); virtual void makeChunk(BlockMakeData *data) {} diff --git a/src/mapgen_singlenode.cpp b/src/mapgen_singlenode.cpp index 2e7b3dc88..5f81aba98 100644 --- a/src/mapgen_singlenode.cpp +++ b/src/mapgen_singlenode.cpp @@ -101,8 +101,7 @@ void MapgenSinglenode::makeChunk(BlockMakeData *data) // Calculate lighting if (flags & MG_LIGHT) - calcLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE, - node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE); + calcLighting(node_min, node_max); this->generating = false; } diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index 24c81e56d..16fe4be5d 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -290,8 +290,7 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Calculate lighting if (flags & MG_LIGHT) - calcLighting(node_min - v3s16(0, 1, 0) - v3s16(1, 0, 1) * MAP_BLOCKSIZE, - node_max + v3s16(0, 1, 0) + v3s16(1, 0, 1) * MAP_BLOCKSIZE); + calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0)); this->generating = false; } diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index b97512535..3d9f4c517 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -534,7 +534,7 @@ void MapgenV6::makeChunk(BlockMakeData *data) } // Add top and bottom side of water to transforming_liquid queue - updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); + //updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); // Grow grass growGrass(); @@ -551,8 +551,7 @@ void MapgenV6::makeChunk(BlockMakeData *data) // Calculate lighting if (flags & MG_LIGHT) - calcLighting(node_min - v3s16(1, 1, 1) * MAP_BLOCKSIZE, - node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE); + calcLighting(node_min, node_max); this->generating = false; } diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp index 3b7c20b96..a7a56f378 100644 --- a/src/mapgen_v7.cpp +++ b/src/mapgen_v7.cpp @@ -260,8 +260,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); if (flags & MG_LIGHT) - calcLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE, - node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE); + calcLighting(node_min, node_max); //setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE, // node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF); diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index 6c12baf92..bf702eaff 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -168,10 +168,8 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L) EmergeManager *emerge = getServer(L)->getEmergeManager(); ManualMapVoxelManipulator *vm = o->vm; - v3s16 p1 = lua_istable(L, 2) ? read_v3s16(L, 2) : - vm->m_area.MinEdge + v3s16(0, 1, 0) * MAP_BLOCKSIZE; - v3s16 p2 = lua_istable(L, 3) ? read_v3s16(L, 3) : - vm->m_area.MaxEdge - v3s16(0, 1, 0) * MAP_BLOCKSIZE; + v3s16 p1 = lua_istable(L, 2) ? read_v3s16(L, 2) : vm->m_area.MinEdge; + v3s16 p2 = lua_istable(L, 3) ? read_v3s16(L, 3) : vm->m_area.MaxEdge; sortBoxVerticies(p1, p2); Mapgen mg; @@ -179,7 +177,11 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L) mg.ndef = ndef; mg.water_level = emerge->params.water_level; - mg.calcLighting(p1, p2); + // Mapgen::calcLighting assumes the coordinates of + // the central chunk; correct for this + mg.calcLighting( + p1 + v3s16(1, 1, 1) * MAP_BLOCKSIZE, + p2 - v3s16(1, 1, 1) * MAP_BLOCKSIZE); return 0; } @@ -201,10 +203,8 @@ int LuaVoxelManip::l_set_lighting(lua_State *L) ManualMapVoxelManipulator *vm = o->vm; - v3s16 p1 = lua_istable(L, 3) ? read_v3s16(L, 3) : - vm->m_area.MinEdge + v3s16(0, 1, 0) * MAP_BLOCKSIZE; - v3s16 p2 = lua_istable(L, 4) ? read_v3s16(L, 4) : - vm->m_area.MaxEdge - v3s16(0, 1, 0) * MAP_BLOCKSIZE; + v3s16 p1 = lua_istable(L, 3) ? read_v3s16(L, 3) : vm->m_area.MinEdge; + v3s16 p2 = lua_istable(L, 4) ? read_v3s16(L, 4) : vm->m_area.MaxEdge; sortBoxVerticies(p1, p2); Mapgen mg; |