diff --git a/perlin.c b/perlin.c index dd3eb5b..b64bfa7 100644 --- a/perlin.c +++ b/perlin.c @@ -84,3 +84,14 @@ double perlin_noise(const PerlinData *data, Point3 p) { return perlin_interp(c, u, v, w); } + +double perlin_turbulence(const PerlinData *data, Point3 p, int depth) { + double accum = 0.0; + double weight = 1.0; + for (int i = 0; i < depth; ++i) { + accum += weight * perlin_noise(data, p); + weight *= 0.5; + p = (Point3){2 * p.x, 2 * p.y, 2 * p.z}; + } + return fabs(accum); +} diff --git a/perlin.h b/perlin.h index 9261786..b980908 100644 --- a/perlin.h +++ b/perlin.h @@ -5,10 +5,13 @@ #include "point3.h" #define PERLIN_DEFAULT_POINT_COUNT 256 +#define PERLIN_DEFAULT_TURBULENCE_DEPTH 7 typedef struct PerlinData PerlinData; PerlinData *perlin_init(int point_count, Arena *arena); + double perlin_noise(const PerlinData *data, Point3 p); +double perlin_turbulence(const PerlinData *data, Point3 p, int depth); #endif /* INCLUDED_PERLIN_H */ diff --git a/texture.c b/texture.c index c85276d..c402307 100644 --- a/texture.c +++ b/texture.c @@ -65,8 +65,9 @@ Color checker_value(const CheckerTexture *checker, double u, double v, Color perlin_value(const PerlinNoiseTexture *perlin, Point3 p) { double noise_value = - 0.5 * (1.0 + perlin_noise(perlin->data, (Point3){perlin->scale * p.x, - perlin->scale * p.y, - perlin->scale * p.z})); + 0.5 * + (1.0 + sin(perlin->scale * p.z + + 10 * perlin_turbulence(perlin->data, p, + PERLIN_DEFAULT_TURBULENCE_DEPTH))); return color_mul_const(noise_value, (Color){1.0, 1.0, 1.0}); }