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/PerlinSimplexNoise.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/PerlinSimplexNoise.cpp')
| -rw-r--r-- | Minecraft.World/PerlinSimplexNoise.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/Minecraft.World/PerlinSimplexNoise.cpp b/Minecraft.World/PerlinSimplexNoise.cpp new file mode 100644 index 00000000..dbc570a4 --- /dev/null +++ b/Minecraft.World/PerlinSimplexNoise.cpp @@ -0,0 +1,115 @@ +#include "stdafx.h" +#include "PerlinSimplexNoise.h" + +PerlinSimplexNoise::PerlinSimplexNoise(int levels) +{ + Random random; + init(&random,levels); +} + +PerlinSimplexNoise::PerlinSimplexNoise(Random *random, int levels) +{ + init(random,levels); + delete random; +} + +void PerlinSimplexNoise::init(Random *random, int levels) +{ + MemSect(3); + this->levels = levels; + noiseLevels = new SimplexNoise *[levels]; + for (int i = 0; i < levels; i++) + { + noiseLevels[i] = new SimplexNoise(random); + } + MemSect(0); +} + +PerlinSimplexNoise::~PerlinSimplexNoise() +{ + for(int i = 0; i < levels; i++ ) + { + delete noiseLevels[i]; + } + delete[] noiseLevels; +} + +double PerlinSimplexNoise::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 PerlinSimplexNoise::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 PerlinSimplexNoise::getRegion(doubleArray buffer, double x, double y, int xSize, int ySize, double xScale, double yScale, double sizeScale) +{ + return getRegion(buffer, x, y, xSize, ySize, xScale, yScale, sizeScale, 0.5); +} + +doubleArray PerlinSimplexNoise::getRegion(doubleArray buffer, double x, double y, int xSize, int ySize, double xScale, double yScale, double sizeScale, double powScale) +{ + xScale/=1.5; + yScale/=1.5; + + if (buffer.data == NULL || (int) buffer.length < xSize * ySize) + { + if( buffer.data ) delete [] buffer.data; + buffer = doubleArray(xSize * ySize); + } + else for (unsigned int i = 0; i < buffer.length; i++) + buffer[i] = 0; + + + double pow = 1; + double scale = 1; + for (int i = 0; i < levels; i++) + { + noiseLevels[i]->add(buffer, x, y, xSize, ySize, xScale * scale, yScale * scale, 0.55/pow); + scale *= sizeScale; + pow *= powScale; + } + + return buffer; +} + +doubleArray PerlinSimplexNoise::getRegion(doubleArray buffer, double x, double y, double z, int xSize, int ySize, int zSize, double xScale, double yScale, double zScale) +{ + xScale/=1.5; + yScale/=1.5; + + 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; + noiseLevels[i]->add(buffer, x, y, z, xSize, ySize, zSize, xScale * pow, yScale * pow, zScale * pow, 0.55/pow); + pow *= 0.5; + } + + return buffer; +}
\ No newline at end of file |
