X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmapgen%2Fmg_ore.cpp;h=c36249cb9e1fa0ffe55dfaf6e66dfafefa8b316a;hb=37923920a07f06d201662d8f1f4e5821efcc7b09;hp=2974724202bb442af2060d8bf9dcc220127c5426;hpb=4b553ece09908dfdee59e9841fdc9420350eda9f;p=oweals%2Fminetest.git diff --git a/src/mapgen/mg_ore.cpp b/src/mapgen/mg_ore.cpp index 297472420..c36249cb9 100644 --- a/src/mapgen/mg_ore.cpp +++ b/src/mapgen/mg_ore.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2014-2016 kwolekr, Ryan Kwolek -Copyright (C) 2015-2017 paramat +Copyright (C) 2014-2018 kwolekr, Ryan Kwolek +Copyright (C) 2015-2018 paramat 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 @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "log.h" #include "util/numeric.h" +#include #include @@ -345,7 +346,7 @@ void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed, float ydist = (s32)y1 - (s32)csize / 2; float zdist = (s32)z1 - (s32)csize / 2; - noiseval -= (sqrt(xdist * xdist + ydist * ydist + zdist * zdist) / csize); + noiseval -= std::sqrt(xdist * xdist + ydist * ydist + zdist * zdist) / csize; if (noiseval < nthresh) continue; @@ -371,17 +372,23 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed, PcgRandom pr(blockseed + 520); MapNode n_ore(c_ore, 0, ore_param2); - u32 sizex = (nmax.X - nmin.X + 1); - - if (!noise) { - int sx = nmax.X - nmin.X + 1; - int sy = nmax.Y - nmin.Y + 1; - int sz = nmax.Z - nmin.Z + 1; - noise = new Noise(&np, mapseed, sx, sy, sz); - noise2 = new Noise(&np, mapseed + 436, sx, sy, sz); + int sizex = nmax.X - nmin.X + 1; + int sizey = nmax.Y - nmin.Y + 1; + // Because this ore uses 3D noise the perlinmap Y size can be different in + // different mapchunks due to ore Y limits. So recreate the noise objects + // if Y size has changed. + // Because these noise objects are created multiple times for this ore type + // it is necessary to 'delete' them here. + if (!noise || sizey != sizey_prev) { + delete noise; + delete noise2; + int sizez = nmax.Z - nmin.Z + 1; + noise = new Noise(&np, mapseed, sizex, sizey, sizez); + noise2 = new Noise(&np, mapseed + 436, sizex, sizey, sizez); + sizey_prev = sizey; } - bool noise_generated = false; + bool noise_generated = false; size_t index = 0; for (int z = nmin.Z; z <= nmax.Z; z++) for (int y = nmin.Y; y <= nmax.Y; y++) @@ -469,7 +476,7 @@ void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed, noise_stratum_thickness->result[index] : (float)stratum_thickness) / 2.0f; float nmid = noise->result[index]; - y0 = MYMAX(nmin.Y, ceil(nmid - nhalfthick)); + y0 = MYMAX(nmin.Y, std::ceil(nmid - nhalfthick)); y1 = MYMIN(nmax.Y, nmid + nhalfthick); } else { // Simple horizontal stratum y0 = nmin.Y;