// // Simplex Noise Test Program // // Copyright (c) 2010-2014 Sam Hocevar <sam@hocevar.net> // (c) 2013-2014 Guillaume Bittoun <guillaume.bittoun@gmail.com> // This program is free software; you can redistribute it and/or // modify it under the terms of the Do What The Fuck You Want To // Public License, Version 2, as published by Sam Hocevar. See // http://www.wtfpl.net/ for more details. // #if HAVE_CONFIG_H # include "config.h" #endif #include <lol/engine.h> using namespace lol; int main(int argc, char **argv) { UNUSED(argc, argv); int const period = 10; float const zoom = 0.02f; /* Create some gradients */ array2d<vec2> gradients(vec_t<ptrdiff_t, 2>({period, period})); for (int i = 0 ; i < period ; ++i) for (int j = 0 ; j < period ; ++j) gradients[i][j] = normalize(vec2(rand(-1.f, 1.f), rand(-1.f, 1.f))); simplex_interpolator<2> s; s.SetGradients(gradients); /* Create an image */ ivec2 const size(800, 600); Image img(size); array2d<vec4> &data = img.Lock2D<PixelFormat::RGBA_F32>(); /* Fill image with simplex noise */ for (int j = 0; j < size.y; ++j) for (int i = 0; i < size.x; ++i) { float p = 0.5f * s.Interp(zoom * vec2(i, j)); #if 0 for (int k = 2; k < 128; k *= 2) p += 0.5f / k * s.Interp(zoom * k * vec2(i, j)); #endif data[i][j] = vec4(saturate(0.5f + p), 0.f, 0.f, 1.f); } /* Mark simplex vertices */ vec2 diagonal = normalize(vec2(1.f)); vec2 dx = mat2::rotate(60.f) * diagonal; vec2 dy = mat2::rotate(-60.f) * diagonal; for (int j = -100; j < 100; ++j) for (int i = -100; i < 100; ++i) { ivec2 coord = ivec2(i / zoom * dx + j / zoom * dy); if (coord.x >= 0 && coord.x < size.x - 1 && coord.y >= 0 && coord.y < size.y - 1) { data[coord.x][coord.y] = vec4(1.f, 0.f, 1.f, 1.f); data[coord.x + 1][coord.y] = vec4(1.f, 0.f, 1.f, 1.f); data[coord.x][coord.y + 1] = vec4(1.f, 0.f, 1.f, 1.f); data[coord.x + 1][coord.y + 1] = vec4(1.f, 0.f, 1.f, 1.f); } } /* Save image */ img.Unlock2D(data); img.Save("simplex.png"); }