From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/PerlinNoise.cpp | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Minecraft.World/PerlinNoise.cpp (limited to 'Minecraft.World/PerlinNoise.cpp') 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 -- cgit v1.2.3