aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparamat <paramat@users.noreply.github.com>2017-09-30 10:23:57 +0100
committerparamat <mat.gregory@virginmedia.com>2017-10-01 22:31:44 +0100
commite2afcf85ce5945a6ed08313dfed9f68d02912f73 (patch)
tree684f7f9bec103e188289fc2996b495a701651f48
parent9fa78b7387ec6eb5f6e3419d37ae631085c69e1a (diff)
downloadminetest-e2afcf85ce5945a6ed08313dfed9f68d02912f73.tar.gz
minetest-e2afcf85ce5945a6ed08313dfed9f68d02912f73.tar.bz2
minetest-e2afcf85ce5945a6ed08313dfed9f68d02912f73.zip
Stratum ore: Allow use with no noise for simple horizontal strata
If either of the 2 noise parameters are omitted the ore will occur from y_min to y_max in a simple horizontal stratum. As this does not compute noise performance improves, and is ideal for placing many layers. Clean up some nearby ore documentation.
-rw-r--r--doc/lua_api.txt49
-rw-r--r--src/mg_ore.cpp32
-rw-r--r--src/mg_ore.h2
-rw-r--r--src/script/lua_api/l_mapgen.cpp4
4 files changed, 62 insertions, 25 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index a2722b2f5..9890486c5 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1098,12 +1098,17 @@ Creates a deformed sphere of ore according to 3d perlin noise described by
### `vein`
Creates veins of ore varying in density by according to the intersection of two
instances of 3d perlin noise with diffferent seeds, both described by
-`noise_params`. `random_factor` varies the influence random chance has on
-placement of an ore inside the vein, which is `1` by default. Note that
-modifying this parameter may require adjusting `noise_threshold`.
+`noise_params`.
+
+`random_factor` varies the influence random chance has on placement of an ore
+inside the vein, which is `1` by default. Note that modifying this parameter may
+require adjusting `noise_threshold`.
+
The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored
-by this ore type. This ore type is difficult to control since it is sensitive
-to small changes. The following is a decent set of parameters to work from:
+by this ore type.
+
+This ore type is difficult to control since it is sensitive to small changes.
+The following is a decent set of parameters to work from:
noise_params = {
offset = 0,
@@ -1122,16 +1127,24 @@ computationally expensive than any other ore.
### `stratum`
Creates a single undulating ore stratum that is continuous across mapchunk
borders and horizontally spans the world.
+
The 2D perlin noise described by `noise_params` varies the Y co-ordinate of the
stratum midpoint. The 2D perlin noise described by `np_stratum_thickness`
varies the stratum's vertical thickness (in units of nodes). Due to being
continuous across mapchunk borders the stratum's vertical thickness is
unlimited.
+
`y_min` and `y_max` define the limits of the ore generation and for performance
reasons should be set as close together as possible but without clipping the
stratum's Y variation.
+
+If either of the 2 noise parameters are omitted the ore will occur from y_min
+to y_max in a simple horizontal stratum. As this does not compute noise
+performance improves, and is ideal for placing many layers.
+
Each node in the stratum has a 1-in-`clust_scarcity` chance of being ore, so a
solid-ore stratum would require a `clust_scarcity` of 1.
+
The parameters `clust_num_ores`, `clust_size`, `noise_threshold` and
`random_factor` are ignored by this ore type.
@@ -4713,24 +4726,36 @@ Definition tables
-- ^ Number of ores in a cluster
clust_size = 3,
-- ^ Size of the bounding box of the cluster
- -- ^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes are coal ore
+ -- ^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes
+ -- ^ are coal ore.
y_min = -31000,
y_max = 64,
-- ^ Lower and upper limits for ore.
flags = "",
-- ^ Attributes for this ore generation
noise_threshold = 0.5,
- -- ^ If noise is above this threshold, ore is placed. Not needed for a uniform distribution
- noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70}
- -- ^ NoiseParams structure describing the perlin noise used for ore distribution.
- -- ^ Needed for sheet ore_type. Omit from scatter ore_type for a uniform ore distribution
+ -- ^ If noise is above this threshold, ore is placed. Not needed for a
+ -- ^ uniform distribution.
+ noise_params = {
+ offset = 0,
+ scale = 1,
+ spread = {x = 100, y = 100, z = 100},
+ seed = 23,
+ octaves = 3,
+ persist = 0.7
+ },
+ -- ^ NoiseParams structure describing one of the perlin noises used for ore
+ -- ^ distribution.
+ -- ^ Omit from "scatter" ore for a uniform ore distribution.
+ -- ^ Omit from "stratum ore for a simple horizontal strata from y_min to y_max.
random_factor = 1.0,
-- ^ Multiplier of the randomness contribution to the noise value at any
-- ^ given point to decide if ore should be placed. Set to 0 for solid veins.
-- ^ This parameter is only valid for ore_type == "vein".
biomes = {"desert", "rainforest"}
- -- ^ List of biomes in which this decoration occurs. Occurs in all biomes if this is omitted,
- -- ^ and ignored if the Mapgen being used does not support biomes.
+ -- ^ List of biomes in which this decoration occurs.
+ -- ^ Occurs in all biomes if this is omitted, and ignored if the Mapgen being
+ -- ^ used does not support biomes.
-- ^ Can be a list of (or a single) biome names, IDs, or definitions.
}
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index 4f4c9c711..979135ed4 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -433,14 +433,16 @@ void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed,
PcgRandom pr(blockseed + 4234);
MapNode n_ore(c_ore, 0, ore_param2);
- if (!noise) {
- int sx = nmax.X - nmin.X + 1;
- int sz = nmax.Z - nmin.Z + 1;
- noise = new Noise(&np, 0, sx, sz);
- noise_stratum_thickness = new Noise(&np_stratum_thickness, 0, sx, sz);
+ if (flags & OREFLAG_USE_NOISE) {
+ if (!(noise && noise_stratum_thickness)) {
+ int sx = nmax.X - nmin.X + 1;
+ int sz = nmax.Z - nmin.Z + 1;
+ noise = new Noise(&np, 0, sx, sz);
+ noise_stratum_thickness = new Noise(&np_stratum_thickness, 0, sx, sz);
+ }
+ noise->perlinMap2D(nmin.X, nmin.Z);
+ noise_stratum_thickness->perlinMap2D(nmin.X, nmin.Z);
}
- noise->perlinMap2D(nmin.X, nmin.Z);
- noise_stratum_thickness->perlinMap2D(nmin.X, nmin.Z);
size_t index = 0;
@@ -452,10 +454,18 @@ void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed,
continue;
}
- float nmid = noise->result[index];
- float nhalfthick = noise_stratum_thickness->result[index] / 2.0f;
- int y0 = MYMAX(nmin.Y, nmid - nhalfthick);
- int y1 = MYMIN(nmax.Y, nmid + nhalfthick);
+ int y0;
+ int y1;
+
+ if (flags & OREFLAG_USE_NOISE) {
+ float nmid = noise->result[index];
+ float nhalfthick = noise_stratum_thickness->result[index] / 2.0f;
+ y0 = MYMAX(nmin.Y, nmid - nhalfthick);
+ y1 = MYMIN(nmax.Y, nmid + nhalfthick);
+ } else {
+ y0 = nmin.Y;
+ y1 = nmax.Y;
+ }
for (int y = y0; y <= y1; y++) {
if (pr.range(1, clust_scarcity) != 1)
diff --git a/src/mg_ore.h b/src/mg_ore.h
index 4801b152e..e715f348b 100644
--- a/src/mg_ore.h
+++ b/src/mg_ore.h
@@ -135,7 +135,7 @@ public:
class OreStratum : public Ore {
public:
- static const bool NEEDS_NOISE = true;
+ static const bool NEEDS_NOISE = false;
NoiseParams np_stratum_thickness;
Noise *noise_stratum_thickness = nullptr;
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 7757ea80c..b179ac407 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -1156,7 +1156,9 @@ int ModApiMapgen::l_register_ore(lua_State *L)
OreStratum *orestratum = (OreStratum *)ore;
lua_getfield(L, index, "np_stratum_thickness");
- read_noiseparams(L, -1, &orestratum->np_stratum_thickness);
+ // If thickness noise missing unset 'use noise' flag
+ if (!read_noiseparams(L, -1, &orestratum->np_stratum_thickness))
+ ore->flags &= ~OREFLAG_USE_NOISE;
lua_pop(L, 1);
break;