#include "NoiseInterpolator.h" #include "Text.h" using namespace Framework; NoiseInterpolator::NoiseInterpolator( int seed, std::function noiseSupplier, int width, int height) : Noise(), noiseSize(width, height), cache( 10, [](int k) { return k; }, CacheCleanupStrategy::LONGEST_NOT_USED), noiseSupplier(noiseSupplier), seed(seed) {} double NoiseInterpolator::getRealNoise(double x, double y, double z) { int ix = (int)ceil(x), iy = (int)ceil(y); int xOff = ix % noiseSize.x, yOff = iy % noiseSize.y; int xI = ix / noiseSize.x, yI = iy / noiseSize.y; if (ix < 0) xI--; if (iy < 0) yI--; int key = ((xI & 0xFFFF) << 16) | (yI & 0xFFFF); if (!cache.has(key)) cache.put(key, RCPointer::of(noiseSupplier(key + seed))); return cache.get(key)->getNoise( (xOff + 1 - (ix - x)), (yOff + 1 - (iy - y)), z); } double NoiseInterpolator::getNoise(double x, double y, double z) { const double weights[6] = {0.32, 0.17, 0.09, 0.05, 0.03, 0.02}; double sum = 0; for (int xi = -5; xi <= 5; xi++) { for (int yi = -5; yi <= 5; yi++) sum += getRealNoise(x + xi, y + yi, z) * weights[abs(xi)] * weights[abs(yi)]; } return sum; } int NoiseInterpolator::getSeed() const { return seed; }