diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/PerlinNoise.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/PerlinNoise.cpp')
| -rw-r--r-- | Minecraft.World/PerlinNoise.cpp | 98 |
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 |
