diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-05-19 16:46:13 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-05-19 18:19:31 +0200 |
| commit | b0998910dd974280b3c6f3f65e21bfd5859b117f (patch) | |
| tree | 5a7049ac6cf0d05370df3324b2bb4b591c2bac87 /src/event.c | |
| parent | 6a80b1b70ec069b051c0e31aafac6eb596e20261 (diff) | |
| download | mandelbrot-b0998910dd974280b3c6f3f65e21bfd5859b117f.tar.gz mandelbrot-b0998910dd974280b3c6f3f65e21bfd5859b117f.tar.bz2 mandelbrot-b0998910dd974280b3c6f3f65e21bfd5859b117f.zip | |
Basic explorer with window resize, iterations change, moving around
Diffstat (limited to 'src/event.c')
| -rw-r--r-- | src/event.c | 96 |
1 files changed, 83 insertions, 13 deletions
diff --git a/src/event.c b/src/event.c index d0354eb..f0f0e14 100644 --- a/src/event.c +++ b/src/event.c @@ -1,6 +1,10 @@ #include "mandel.h" -void event_handle(State *state) +static void st_zoom(State *state, bool zoom_in); +static void st_move_horizontal(State *state, bool move_right); +static void st_move_vertical(State *state, bool move_down); + +void event_handle(State *state) { SDL_Event e; @@ -11,46 +15,112 @@ void event_handle(State *state) case SDL_QUIT: state->running = false; break; + case SDL_KEYDOWN: switch (e.key.keysym.sym) { + case SDLK_r: + state->iterations += 10; + state->palette = color_palette_new(state->palette, state->iterations); + break; + case SDLK_e: + state->iterations -= 10; + if (state->iterations <= 0) + state->iterations = 1; + state->palette = color_palette_new(state->palette, state->iterations); + break; case SDLK_UP: case SDLK_k: - + st_move_vertical(state, false); break; case SDLK_DOWN: case SDLK_j: - + st_move_vertical(state, true); break; case SDLK_LEFT: case SDLK_h: - + st_move_horizontal(state, false); break; case SDLK_RIGHT: case SDLK_l: - + st_move_horizontal(state, true); break; - case SDLK_PLUS: - case SDLK_p: - + case SDLK_EQUALS: + case SDLK_f: + st_zoom(state, true); break; case SDLK_MINUS: - case SDLK_m: - + case SDLK_d: + st_zoom(state, false); break; case SDLK_q: state->running = false; } break; + case SDL_MOUSEWHEEL: if (e.wheel.y == -1) - ; + st_zoom(state, true); else if (e.wheel.y == 1) - ; + st_zoom(state, false); break; - case SDL_MOUSEBUTTONDOWN: + + case SDL_WINDOWEVENT: + if (e.window.event == SDL_WINDOWEVENT_RESIZED) + { + int width; + int height; + SDL_QueryTexture(state->texture, NULL, NULL, &width, &height); + + double w_ratio = (double)width / (double)e.window.data1; + double h_ratio = (double)height / (double)e.window.data2; + + state->real_start /= w_ratio; + state->real_end /= w_ratio; + state->imag_start /= h_ratio; + state->imag_end /= h_ratio; + + SDL_DestroyTexture(state->texture); + SDL_CALL(state->texture = SDL_CreateTexture( + state->renderer, + SDL_PIXELFORMAT_RGB888, + SDL_TEXTUREACCESS_STREAMING, + e.window.data1, + e.window.data2 + )); + } break; } } } +#define MANDEL_ZOOM_RATIO 30 + +static void st_zoom(State *state, bool zoom_in) +{ + double factor = zoom_in ? 1 : -1; + double real_change = (state->real_end - state->real_start) / MANDEL_ZOOM_RATIO; + double imag_change = (state->imag_end - state->imag_start) / MANDEL_ZOOM_RATIO; + state->real_start += factor * real_change; + state->real_end -= factor * real_change; + state->imag_start += factor * imag_change; + state->imag_end -= factor * imag_change; +} + +#define MANDEL_MOVE_RATIO 20 + +static void st_move_horizontal(State *state, bool move_right) +{ + double factor = move_right ? 1 : -1; + double real_change = (state->real_end - state->real_start) / MANDEL_MOVE_RATIO; + state->real_start += factor * real_change; + state->real_end += factor * real_change; +} + +static void st_move_vertical(State *state, bool move_down) +{ + double factor = move_down ? 1 : -1; + double imag_change = (state->imag_end - state->imag_start) / MANDEL_MOVE_RATIO; + state->imag_start += factor * imag_change; + state->imag_end += factor * imag_change; +} |
