summaryrefslogtreecommitdiff
path: root/src/mg_ore.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2014-12-28 21:17:12 -0500
committerkwolekr <kwolekr@minetest.net>2014-12-28 21:17:12 -0500
commit61dfa912f5f37f435e41b3c7d8cdb6244562e597 (patch)
treeb3cde6151a714d3cee7d0646aac1936f89410eb3 /src/mg_ore.cpp
parent900fa26965a2fbdf2b9de74e2d680c083de91482 (diff)
downloadminetest-61dfa912f5f37f435e41b3c7d8cdb6244562e597.tar.gz
minetest-61dfa912f5f37f435e41b3c7d8cdb6244562e597.tar.bz2
minetest-61dfa912f5f37f435e41b3c7d8cdb6244562e597.zip
Ore: Add Vein ore type
Diffstat (limited to 'src/mg_ore.cpp')
-rw-r--r--src/mg_ore.cpp60
1 files changed, 55 insertions, 5 deletions
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index 2c5712da7..95bc02f4f 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -27,10 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
const char *OreManager::ELEMENT_TITLE = "ore";
FlagDesc flagdesc_ore[] = {
- {"absheight", OREFLAG_ABSHEIGHT},
- {"scatter_noisedensity", OREFLAG_DENSITY},
- {"claylike_nodeisnt", OREFLAG_NODEISNT},
- {NULL, 0}
+ {"absheight", OREFLAG_ABSHEIGHT},
+ {NULL, 0}
};
@@ -217,7 +215,7 @@ void OreBlob::generate(ManualMapVoxelManipulator *vm, int seed, u32 blockseed,
int volume = (nmax.X - nmin.X + 1) *
(nmax.Y - nmin.Y + 1) *
(nmax.Z - nmin.Z + 1);
- int csize = clust_size;
+ int csize = clust_size;
int nblobs = volume / clust_scarcity;
if (!noise)
@@ -261,3 +259,55 @@ void OreBlob::generate(ManualMapVoxelManipulator *vm, int seed, u32 blockseed,
}
}
}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+OreVein::~OreVein()
+{
+ delete noise2;
+}
+
+
+void OreVein::generate(ManualMapVoxelManipulator *vm, int seed, u32 blockseed,
+ v3s16 nmin, v3s16 nmax)
+{
+ PseudoRandom pr(blockseed + 520);
+ MapNode n_ore(c_ore, 0, ore_param2);
+
+ 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, seed, sx, sy, sz);
+ noise2 = new Noise(&np, seed + 436, sx, sy, sz);
+ }
+ 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++)
+ for (int x = nmin.X; x <= nmax.X; x++, index++) {
+ u32 i = vm->m_area.index(x, y, z);
+ if (!vm->m_area.contains(i))
+ continue;
+ if (!CONTAINS(c_wherein, vm->m_data[i].getContent()))
+ continue;
+
+ // Same lazy generation optimization as in OreBlob
+ if (!noise_generated) {
+ noise_generated = true;
+ noise->perlinMap3D(nmin.X, nmin.Y, nmin.Z);
+ noise2->perlinMap3D(nmin.X, nmin.Y, nmin.Z);
+ }
+
+ // randval ranges from -1..1
+ float randval = (float)pr.next() / (PSEUDORANDOM_MAX / 2) - 1.f;
+ float noiseval = contour(noise->result[index]);
+ float noiseval2 = contour(noise2->result[index]);
+ if (noiseval * noiseval2 + randval * random_factor < nthresh)
+ continue;
+
+ vm->m_data[i] = n_ore;
+ }
+}