Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <SDL2/SDL.h>
- #define WIN_W 800
- #define WIN_H 600
- #define NOISE_W 800
- #define NOISE_H 600
- void SDLerr(int, char*);
- void updateScreen(double[][NOISE_W], double[][NOISE_W], double[][NOISE_W], SDL_Surface*);
- void text(SDL_Renderer*, int, int, char*, SDL_Texture**, SDL_Rect*);
- void generateNoise(double[][NOISE_W]);
- double interpolate(double[][NOISE_W], double, double);
- double mipmap(double[][NOISE_W], double, double, double);
- int main(void) {
- if (SDL_Init(SDL_INIT_VIDEO) < 0) SDLerr(1, "Unable to initialize SDL!");
- srand(time(NULL));
- SDL_Window* window = SDL_CreateWindow("RGB Perlin", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIN_W, WIN_H, SDL_WINDOW_SHOWN);
- if (window == NULL) SDLerr(2, "Unable to create window!");
- SDL_Surface* screen = SDL_GetWindowSurface(window);
- if (screen == NULL) SDLerr(3, "Unable to get window surface");
- double** redNoise = malloc(NOISE_H * sizeof(double*) + NOISE_H * NOISE_W * sizeof(double));
- double** greenNoise = malloc(NOISE_H * sizeof(double*) + NOISE_H * NOISE_W * sizeof(double));
- double** blueNoise = malloc(NOISE_H * sizeof(double*) + NOISE_H * NOISE_W * sizeof(double));
- generateNoise(redNoise);
- generateNoise(greenNoise);
- generateNoise(blueNoise);
- updateScreen(blueNoise, greenNoise, redNoise, screen);
- SDL_Event event;
- do
- {
- SDL_UpdateWindowSurface(window);
- SDL_WaitEvent(&event);
- }
- while (event.type != SDL_QUIT);
- SDL_FreeSurface(screen);
- SDL_DestroyWindow(window);
- SDL_Quit();
- return 0;
- }
- void SDLerr(int errnum, char* errmsg) {
- fprintf(stderr, "%s SDL_Error: %s\n", errmsg, SDL_GetError());
- exit(errnum);
- }
- void updateScreen(double blue[][NOISE_W], double green[][NOISE_W], double red[][NOISE_W], SDL_Surface* screen) {
- unsigned char* pixels = screen -> pixels;
- int p;
- for (int x = 0; x < NOISE_W; x++)
- for (int y = 0; y < NOISE_H; y++) {
- p = (y * NOISE_W + x) * 4;
- pixels[p] = (char) (mipmap(blue, y, x, 64));
- pixels[p + 1] = (char) (mipmap(green, y, x, 64));
- pixels[p + 2] = (char) (mipmap(red, y, x, 64));
- }
- }
- void generateNoise(double noise[][NOISE_W]) {
- for (int x = 0; x < NOISE_W; x++)
- for (int y = 0; y < NOISE_H; y++)
- noise[y][x] = (rand() % RAND_MAX) / (double) RAND_MAX;
- }
- double interpolate(double noise[][NOISE_W], double x, double y) {
- int x1 = (int) x, y1 = (int) y;
- int x2 = (x1 + NOISE_W - 1) % NOISE_W;
- int y2 = (y1 + NOISE_H - 1) % NOISE_H;
- double fX = x - x1, fY = y - y1;
- double val = fX * fY * noise[y1][x1];
- val += (1 - fX) * fY * noise[y1][x2];
- val += fX * (1 - fY) * noise[y2][x1];
- return val + (1 - fX) * (1 - fY) * noise[y2][x2];
- }
- double mipmap(double noise[][NOISE_W], double x, double y, double size) {
- double val = 0.;
- for (double d = size; d >= 1; d /= 2.)
- val += interpolate(noise, x / d, y / d) * d;
- return 128. * val / size;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement