#include #include #include namespace { constexpr int SIZE = 256; double octaves(SimplexNoise1234& simplex, double x, double y, int layers, double persistence, double frequency) { double ampl = 1; double maxval = 0; double val = 0; for (int i = 0; i < layers; i++) { val += simplex.noise(x * frequency, y * frequency) * ampl; maxval += ampl; ampl *= persistence; frequency *= 2; } return val / maxval; } uint8_t data[SIZE * SIZE]; double ease(double n) { return pow(n, 1.5); } uint32_t color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { return (r << 24) | (g << 16) | (b << 8) | a; } int pick_pal(uint8_t height) { if (height > 20) { return 0; } if (height > 8) { return 1; } return 2; } void init(sprstk* instance, void* userdata) { sprstk_palette pal = {}; for (int i = 0; i < 24; i++) { uint8_t val = 0x33 / (12 - i / 2.0f) + 0x33; pal.colors[i] = color(val, val, val, 0x60); } for (int i = 24; i < 32; i++) { uint8_t val = 0x55 / (16 - i / 2.0f) + 0xAA; pal.colors[i] = color(val, val, val, 0x60); } sprstk_set_palette(instance, 0, &pal); for (int i = 0; i < 16; i++) { pal.colors[i] = color(0x70 / (5.0f - i / 4.0f), 0x35 / (5.0f - i / 4.0f), 0, 0x60); } for (int i = 16; i < 32; i++) { pal.colors[i] = color(0x05 / (8.5f - i / 2.5f) + 0x15, 0x40 / (8.5f - i / 2.5f) + 0x0, 0, 0x60); } sprstk_set_palette(instance, 1, &pal); for (int i = 0; i < 8; i++) { pal.colors[i] = color(0x20 / (8 - i) + 0x10, 0x40 / (8 - i) + 0x20, 0xB0 / (8 - i) + 0x40, 0x60); } sprstk_set_palette(instance, 2, &pal); sprstk_set_scale(instance, 0.4f); SimplexNoise1234 simplex; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { double value = octaves(simplex, i, j, 6, 0.4, 1.0 / 128.0); data[i + j * SIZE] = 28 * ease((value + 1) / 2) + 3; } } for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { sprstk_put(instance, i - SIZE / 2, j - SIZE / 2, data[i + SIZE * j], pick_pal(data[i + SIZE * j])); } } } void update(sprstk* instance, float dt, float* userdata) { *userdata += dt / 2; sprstk_set_angle(instance, *userdata); } } int main() { float data = 0; sprstk* instance = sprstk_new({.init = init, .update = (sprstk_update_fn)update}, &data); sprstk_run(instance); sprstk_stop(instance); return 0; }