X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnoise.cpp;h=8b84803b392ba014de32c5f184916e6c4a659975;hb=d6050bee5187d0d456e9d95406fc74ba163ea3aa;hp=f67771b8885e3679b90cc7619cccfd1d73bbedb1;hpb=e9d70057994172d1b1f52c1ae40842de82a55f86;p=oweals%2Fminetest.git diff --git a/src/noise.cpp b/src/noise.cpp index f67771b88..8b84803b3 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -23,10 +23,10 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "noise.h" #include -#include // memset +#include // memset #include "debug.h" #include "util/numeric.h" #include "util/string.h" @@ -130,7 +130,9 @@ s32 PcgRandom::range(s32 min, s32 max) if (max < min) throw PrngException("Invalid range (max < min)"); - u32 bound = max - min + 1; + // We have to cast to s64 because otherwise this could overflow, + // and signed overflow is undefined behavior. + u32 bound = (s64)max - (s64)min + 1; return range(bound) + min; } @@ -260,8 +262,8 @@ float noise2d_gradient(float x, float y, s32 seed, bool eased) // Interpolate if (eased) return biLinearInterpolation(v00, v10, v01, v11, xl, yl); - else - return biLinearInterpolationNoEase(v00, v10, v01, v11, xl, yl); + + return biLinearInterpolationNoEase(v00, v10, v01, v11, xl, yl); } @@ -290,12 +292,12 @@ float noise3d_gradient(float x, float y, float z, s32 seed, bool eased) v000, v100, v010, v110, v001, v101, v011, v111, xl, yl, zl); - } else { - return triLinearInterpolationNoEase( - v000, v100, v010, v110, - v001, v101, v011, v111, - xl, yl, zl); } + + return triLinearInterpolationNoEase( + v000, v100, v010, v110, + v001, v101, v011, v111, + xl, yl, zl); } @@ -776,7 +778,7 @@ float *Noise::perlinMap3D(float x, float y, float z, float *persistence_map) void Noise::updateResults(float g, float *gmap, - float *persistence_map, size_t bufsize) + const float *persistence_map, size_t bufsize) { // This looks very ugly, but it is 50-70% faster than having // conditional statements inside the loop