From 13aadb42819766b73d4f3b287abd74223c8f9029 Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Sun, 14 Jan 2024 02:44:35 +0000 Subject: [PATCH] Add utility functions and fix bug when reallocating lines array --- src/drawing.c | 52 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/drawing.c b/src/drawing.c index 367b58e..720eb5f 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -8,6 +8,22 @@ #define square(x) (x * x) +typedef struct line line_t; +struct line { + point_t p0; + point_t p1; +}; + +typedef struct triangle triangle_t; +struct triangle { + point_t p0; + point_t p1; + point_t p2; +}; + +INTERNAL void draw_line(SDL_Renderer *renderer, line_t ln); +INTERNAL void draw_triangle(SDL_Renderer *renderer, triangle_t triangle); + bool init_arrows_arr(arrows_t *lines, u64 capacity) { u64 size = capacity * sizeof(arrow_t); @@ -36,6 +52,8 @@ void add_arrow(arrows_t *lines, arrow_t ln) { lines->lines = ptr; return; } + + lines->capacity = new_capacity; } lines->lines[(lines->count)++] = (arrow_t){ @@ -57,8 +75,9 @@ INTERNAL f32 vec2_magnitude(const vec2_t *vec) { return sqrtf((f32)vec->x * vec->x + (f32)vec->y * vec->y); } -INTERNAL void draw_arrow_head(SDL_Renderer *renderer, const arrow_t *arrow, - const point_t *arrow_end) { +INTERNAL triangle_t calculate_arrow_head(SDL_Renderer *renderer, + const arrow_t *arrow, + const point_t *arrow_end) { // m = line_slope // dx = change_in_x // dy = change_in_y @@ -129,14 +148,7 @@ INTERNAL void draw_arrow_head(SDL_Renderer *renderer, const arrow_t *arrow, arrow_base_p1.y = arrow_end->y + perpendicular_dy; } - SDL_RenderDrawLine(renderer, arrow_end->x, arrow_end->y, arrow_base_p0.x, - arrow_base_p0.y); - SDL_RenderDrawLine(renderer, arrow_end->x, arrow_end->y, arrow_base_p1.x, - arrow_base_p1.y); - SDL_RenderDrawLine(renderer, arrow_tip.x, arrow_tip.y, arrow_base_p0.x, - arrow_base_p0.y); - SDL_RenderDrawLine(renderer, arrow_tip.x, arrow_tip.y, arrow_base_p1.x, - arrow_base_p1.y); + return (triangle_t){arrow_tip, arrow_base_p0, arrow_base_p1}; } void draw_arrow(SDL_Renderer *renderer, const arrow_t *arrow, colour_t colour) { @@ -147,10 +159,26 @@ void draw_arrow(SDL_Renderer *renderer, const arrow_t *arrow, colour_t colour) { arrow->origin.x + arrow->direction.x, arrow->origin.y + arrow->direction.y, }; + line_t line = (line_t){arrow->origin, end}; if (vec2_magnitude(&(arrow->direction)) != 0) { - draw_arrow_head(renderer, arrow, &end); + triangle_t triangle = calculate_arrow_head(renderer, arrow, &end); + draw_triangle(renderer, triangle); } - SDL_RenderDrawLine(renderer, arrow->origin.x, arrow->origin.y, end.x, end.y); + draw_line(renderer, line); +} + +INTERNAL void draw_line(SDL_Renderer *renderer, line_t ln) { + SDL_RenderDrawLine(renderer, ln.p0.x, ln.p0.y, ln.p1.x, ln.p1.y); +} + +INTERNAL void draw_triangle(SDL_Renderer *renderer, triangle_t triangle) { + line_t ln0 = (line_t){triangle.p0, triangle.p1}; + line_t ln1 = (line_t){triangle.p0, triangle.p2}; + line_t ln2 = (line_t){triangle.p1, triangle.p2}; + + draw_line(renderer, ln0); + draw_line(renderer, ln1); + draw_line(renderer, ln2); }