From e2afcf85ce5945a6ed08313dfed9f68d02912f73 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 30 Sep 2017 10:23:57 +0100 Subject: [PATCH] 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. --- doc/lua_api.txt | 49 +++++++++++++++++++++++++-------- src/mg_ore.cpp | 32 +++++++++++++-------- src/mg_ore.h | 2 +- src/script/lua_api/l_mapgen.cpp | 4 ++- 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;