#include "SDL_mouse.h" #include "aliases/aliases.h" #include "drawing.h" #include #include #include #include #include #include #define WINDOW_WIDTH 1280 #define WINDOW_HEIGHT 720 typedef struct state state_t; struct state { i32 mouse_x; i32 mouse_y; i32 current_origin_x; i32 current_origin_y; bool running; bool drawing; arrows_t arrows; arrow_t tmp_arrow; }; int main(void) { SDL_Init(SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); SDL_Renderer *renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); state_t st = { .mouse_x = -1, .mouse_y = -1, .current_origin_x = -1, .current_origin_y = -1, .running = true, .drawing = false, .arrows = {0}, .tmp_arrow = {0}, }; SDL_Event event = {0}; if (!init_arrows_default(&(st.arrows))) { return EXIT_FAILURE; } while (st.running) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: st.running = false; break; case SDL_MOUSEBUTTONUP: if (event.button.button == SDL_BUTTON_LEFT) { if (st.drawing) { add_arrow(&(st.arrows), st.tmp_arrow); st.tmp_arrow = (arrow_t){0}; st.drawing = false; } else { st.current_origin_x = event.button.x; st.current_origin_y = event.button.y; st.drawing = true; } } else if (event.button.button == SDL_BUTTON_RIGHT) { st.current_origin_x = -1; st.current_origin_y = -1; st.drawing = false; } break; case SDL_MOUSEMOTION: st.mouse_x = event.motion.x; st.mouse_y = event.motion.y; break; } } SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); if (st.drawing) { st.tmp_arrow.origin = (point_t){st.current_origin_x, st.current_origin_y}; st.tmp_arrow.direction = (vec2_t){st.mouse_x - st.current_origin_x, st.mouse_y - st.current_origin_y}; draw_arrow(renderer, &(st.tmp_arrow), (colour_t){.abgr = 0xff0000ff}); } draw_arrows(renderer, &(st.arrows), (colour_t){.abgr = 0xff000000}); SDL_RenderPresent(renderer); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return EXIT_SUCCESS; }