#include #include #include #include #include #include "include/perlin.h" #define WIDTH 700 #define HEIGHT 500 //TODO: ADD ZOOM //TODO: add rgb from args, size from args int main(int argc, char** argv); uint32_t getargb(uint8_t r, uint8_t g, uint8_t b, uint8_t a); int main(int argc, char** argv) { SDL_Window* window = NULL; SDL_Init(SDL_INIT_VIDEO); window = SDL_CreateWindow("Perlin Noise Visualizer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN ); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); SDL_RenderSetLogicalSize(renderer, WIDTH, HEIGHT); SDL_Texture* sdlTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT); SDL_SetTextureBlendMode(sdlTexture, SDL_BLENDMODE_BLEND); srand(time(NULL)); static int seedx = 523213;//rand(); static int seedy = 1;//rand(); load: seedx += 10000; seedy += 50000; printf("Generating perlin noise...\n"); uint32_t* pixels = malloc(sizeof *pixels * WIDTH * HEIGHT); for(int i = 0, counter = 0; i < HEIGHT; i++) //no counter? for(int j = 0; j < WIDTH; j++) pixels[counter++] = getargb(214, 56, 203, (perlin_noise(i + seedx, j + seedy)-(-1))*(255-0)/(1-(-1))+ 0); reload: SDL_UpdateTexture(sdlTexture, NULL, pixels, WIDTH * sizeof(uint32_t)); SDL_RenderClear(renderer); static double zoom_value = 1; printf("zoom is %f\n", zoom_value); SDL_Rect zoom = { 0 }; zoom.h = HEIGHT * zoom_value; zoom.w = WIDTH * zoom_value; //zoom.x = -WIDTH; //zoom.y = -HEIGHT; //? https://wiki.libsdl.org/SDL_Rect SDL_RenderCopy(renderer, sdlTexture, NULL, &zoom); SDL_RenderPresent(renderer); while(1) { SDL_Event e; while (SDL_PollEvent(&e)) { switch(e.type) { case SDL_QUIT: exit(0); break; case SDL_KEYDOWN: switch(e.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_q: exit(0); break; case SDLK_F5: case SDLK_r: goto load; break; } break; case SDL_MOUSEWHEEL: if(e.wheel.y > 0) // scroll up { printf("scroll up! (%d, %d)\n", e.motion.x, e.motion.y); zoom_value += 0.1; goto reload; } else if(e.wheel.y < 0) // scroll down { printf("scroll down! (%d, %d)\n", e.motion.x, e.motion.y); //https://stackoverflow.com/questions/49111054/how-to-get-mouse-position-on-mouse-wheel-event zoom_value -= 0.1; zoom_value = zoom_value < 1.0 ? 1.0 : zoom_value; goto reload; } break; } } } free(pixels); SDL_DestroyWindow(window); SDL_Quit(); return 0; } uint32_t getargb(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { uint32_t res = 0; res |= a << 24; res |= b << 16; res |= g << 8; res |= r; return res; }