aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/PerlinNoise.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/PerlinNoise.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/PerlinNoise.cpp')
-rw-r--r--Minecraft.World/PerlinNoise.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/Minecraft.World/PerlinNoise.cpp b/Minecraft.World/PerlinNoise.cpp
new file mode 100644
index 00000000..b4fd8004
--- /dev/null
+++ b/Minecraft.World/PerlinNoise.cpp
@@ -0,0 +1,98 @@
+#include "stdafx.h"
+#include "PerlinNoise.h"
+#include "Mth.h"
+
+PerlinNoise::PerlinNoise(int levels)
+{
+ Random random;
+ init(&random, levels);
+}
+
+PerlinNoise::PerlinNoise(Random *random, int levels)
+{
+ init(random, levels);
+}
+
+void PerlinNoise::init(Random *random, int levels)
+{
+ MemSect(2);
+ this->levels = levels;
+ noiseLevels = new ImprovedNoise *[levels];
+ for (int i = 0; i < levels; i++)
+ {
+ noiseLevels[i] = new ImprovedNoise(random);
+ }
+ MemSect(0);
+}
+
+PerlinNoise::~PerlinNoise()
+{
+ for( int i = 0; i < levels; i++ )
+ {
+ delete noiseLevels[i];
+ }
+ delete [] noiseLevels;
+}
+
+double PerlinNoise::getValue(double x, double y)
+{
+ double value = 0;
+ double pow = 1;
+
+ for (int i = 0; i < levels; i++)
+ {
+ value += noiseLevels[i]->getValue(x * pow, y * pow) / pow;
+ pow /= 2;
+ }
+
+ return value;
+}
+
+double PerlinNoise::getValue(double x, double y, double z)
+{
+ double value = 0;
+ double pow = 1;
+
+ for (int i = 0; i < levels; i++)
+ {
+ value += noiseLevels[i]->getValue(x * pow, y * pow, z * pow) / pow;
+ pow /= 2;
+ }
+
+ return value;
+}
+
+doubleArray PerlinNoise::getRegion(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize, double xScale, double yScale, double zScale)
+{
+ if (buffer.data == NULL) buffer = doubleArray(xSize * ySize * zSize);
+ else for (unsigned int i = 0; i < buffer.length; i++)
+ buffer[i] = 0;
+
+
+ double pow = 1;
+
+ for (int i = 0; i < levels; i++)
+ {
+ // value += noiseLevels[i].getValue(x * pow, y * pow, z * pow) / pow;
+ double xx = x * pow * xScale;
+ double yy = y * pow * yScale;
+ double zz = z * pow * zScale;
+ __int64 xb = Mth::lfloor(xx);
+ __int64 zb = Mth::lfloor(zz);
+ xx -= xb;
+ zz -= zb;
+ xb %= 16777216;
+ zb %= 16777216;
+ xx += xb;
+ zz += zb;
+ noiseLevels[i]->add(buffer, xx, yy, zz, xSize, ySize, zSize, xScale * pow, yScale * pow, zScale * pow, pow);
+ pow /= 2;
+ }
+
+ return buffer;
+}
+
+doubleArray PerlinNoise::getRegion(doubleArray sr, int x, int z, int xSize, int zSize, double xScale, double zScale, double pow)
+{
+ return getRegion(sr, x, 10, z, xSize, 1, zSize, xScale, 1, zScale);
+} \ No newline at end of file