/*
Minetest
-Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2017 paramat
+Copyright (C) 2014-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+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
#include "map.h"
#include "log.h"
#include "util/numeric.h"
+#include <cmath>
#include <algorithm>
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;
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++)
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;