diff options
Diffstat (limited to 'graphics.c')
-rwxr-xr-x | graphics.c | 61 |
1 files changed, 33 insertions, 28 deletions
@@ -122,7 +122,8 @@ typedef struct graphics_request_ { } triangle; struct { vec4_f32 color; - Box area; + vec2 position; + vec2 scale; i64 num_triangles; vec2 * vertices; } triangles; @@ -213,7 +214,7 @@ b8 hit_line (vec2 vertices[2], f64 width, vec2 point); void draw_pixels_to_buffer (Pixel_Buffer dst, Box area, Pixel_Buffer src); void fill_rectangle_to_buffer (Pixel_Buffer dst, vec4_f32 color, Box area); void fill_triangle_to_buffer (Pixel_Buffer dst, vec4_f32 color, vec2 vertices[3]); -void fill_triangles_to_buffer (Pixel_Buffer dst, vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices); +void fill_triangles_to_buffer (Pixel_Buffer dst, vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices); void fill_quad_to_buffer (Pixel_Buffer dst, vec4_f32 color, vec2 vertices[4]); void fill_ellipse_to_buffer (Pixel_Buffer dst, vec4_f32 color, Box area); void fill_line_to_buffer (Pixel_Buffer dst, vec4_f32 color, vec2 vertices[2], f64 width); @@ -223,7 +224,7 @@ void draw_text_cursor_to_buffer(Pixel_Buffer dst, vec4_f32 color, Box area, vec2 void draw_pixels_cached (Box area, Pixel_Buffer src); void fill_rectangle_cached (vec4_f32 color, Box area); void fill_triangle_cached (vec4_f32 color, vec2 vertices[3]); -void fill_triangles_cached (vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices); +void fill_triangles_cached (vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices); void fill_quad_cached (vec4_f32 color, vec2 vertices[4]); void fill_ellipse_cached (vec4_f32 color, Box area); void fill_line_cached (vec4_f32 color, vec2 vertices[2], f64 width); @@ -233,7 +234,7 @@ void draw_text_cursor_cached(vec4_f32 color, Box area, vec2 max_size, i64 num_ch void draw_pixels (Box area, Pixel_Buffer src); void fill_rectangle (vec4_f32 color, Box area); void fill_triangle (vec4_f32 color, vec2 vertices[3]); -void fill_triangles (vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices); +void fill_triangles (vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices); void fill_quad (vec4_f32 color, vec2 vertices[4]); void fill_ellipse (vec4_f32 color, Box area); void fill_line (vec4_f32 color, vec2 vertices[2], f64 width); @@ -416,26 +417,26 @@ void fill_triangle_to_buffer(Pixel_Buffer dst, vec4_f32 color, vec2 vertices[3]) } } -static void triangles_area_(f64 *x0, f64 *y0, f64 *x1, f64 *y1, i64 num, vec2 *v) { +static void triangles_area_(f64 *x0, f64 *y0, f64 *x1, f64 *y1, vec2 p, vec2 s, i64 num, vec2 *v) { if (num <= 0) return; - *x0 = min3_(v[0].x, v[1].x, v[2].x); - *y0 = min3_(v[0].y, v[1].y, v[2].y); - *x1 = max3_(v[0].x, v[1].x, v[2].x); - *y1 = max3_(v[0].y, v[1].y, v[2].y); + *x0 = min3_(p.x + v[0].x * s.x, p.x + v[1].x * s.x, p.x + v[2].x * s.x); + *y0 = min3_(p.y + v[0].y * s.y, p.y + v[1].y * s.y, p.y + v[2].y * s.y); + *x1 = max3_(p.x + v[0].x * s.x, p.x + v[1].x * s.x, p.x + v[2].x * s.x); + *y1 = max3_(p.y + v[0].y * s.y, p.y + v[1].y * s.y, p.y + v[2].y * s.y); for (i64 i = 1; i < num; ++i) { - *x0 = min4_(*x0, v[i * 3].x, v[i * 3 + 1].x, v[i * 3 + 2].x); - *y0 = min4_(*y0, v[i * 3].y, v[i * 3 + 1].y, v[i * 3 + 2].y); - *x1 = max4_(*x1, v[i * 3].x, v[i * 3 + 1].x, v[i * 3 + 2].x); - *y1 = max4_(*y1, v[i * 3].y, v[i * 3 + 1].y, v[i * 3 + 2].y); + *x0 = min4_(*x0, p.x + v[i * 3].x * s.x, p.x + v[i * 3 + 1].x * s.x, p.x + v[i * 3 + 2].x * s.x); + *y0 = min4_(*y0, p.y + v[i * 3].y * s.y, p.y + v[i * 3 + 1].y * s.y, p.y + v[i * 3 + 2].y * s.y); + *x1 = max4_(*x1, p.x + v[i * 3].x * s.x, p.x + v[i * 3 + 1].x * s.x, p.x + v[i * 3 + 2].x * s.x); + *y1 = max4_(*y1, p.y + v[i * 3].y * s.y, p.y + v[i * 3 + 1].y * s.y, p.y + v[i * 3 + 2].y * s.y); } } -void fill_triangles_to_buffer(Pixel_Buffer dst, vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices) { +void fill_triangles_to_buffer(Pixel_Buffer dst, vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices) { f64 x0, y0, x1, y1; - triangles_area_(&x0, &y0, &x1, &y1, num_triangles, vertices); + triangles_area_(&x0, &y0, &x1, &y1, position, scale, num_triangles, vertices); i64 i0 = (i64) x0; i64 j0 = (i64) y0; @@ -1285,14 +1286,15 @@ void fill_triangle_cached(vec4_f32 color, vec2 vertices[3]) { ); } -void fill_triangles_cached(vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices) { +void fill_triangles_cached(vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices) { perform_graphics_request( (Graphics_Context) {0}, (Graphics_Request) { .op = GRAPHICS_FILL_TRIANGLES, .triangles = { .color = color, - .area = area, + .position = position, + .scale = scale, .num_triangles = num_triangles, .vertices = vertices, }, @@ -1422,14 +1424,15 @@ void fill_triangle(vec4_f32 color, vec2 vertices[3]) { ); } -void fill_triangles(vec4_f32 color, Box area, i64 num_triangles, vec2 *vertices) { +void fill_triangles(vec4_f32 color, vec2 position, vec2 scale, i64 num_triangles, vec2 *vertices) { perform_graphics_request( (Graphics_Context) { .disable_cache = 1, }, (Graphics_Request) { .op = GRAPHICS_FILL_TRIANGLES, .triangles = { .color = color, - .area = area, + .position = position, + .scale = scale, .num_triangles = num_triangles, .vertices = vertices, }, @@ -1549,7 +1552,8 @@ static void graphics_request_hash_(Blake2b_State *S, Graphics_Request req) { switch (req.op) { case GRAPHICS_FILL_TRIANGLES: blake2b_update(S, (u8 *) &req.triangles.color, sizeof req.triangles.color); - blake2b_update(S, (u8 *) &req.triangles.area, sizeof req.triangles.area); + blake2b_update(S, (u8 *) &req.triangles.position, sizeof req.triangles.position); + blake2b_update(S, (u8 *) &req.triangles.scale, sizeof req.triangles.scale); blake2b_update(S, (u8 *) &req.triangles.num_triangles, sizeof req.triangles.num_triangles); blake2b_update(S, (u8 *) req.triangles.vertices, req.triangles.num_triangles * 3 * sizeof *req.triangles.vertices); break; @@ -1635,10 +1639,10 @@ static Graphics_Request graphics_request_scaled_(Graphics_Request req, vec2 scal break; case GRAPHICS_FILL_TRIANGLES: - scaled.triangles.area.x *= scale.x; - scaled.triangles.area.y *= scale.y; - scaled.triangles.area.width *= scale.x; - scaled.triangles.area.height *= scale.y; + scaled.triangles.position.x *= scale.x; + scaled.triangles.position.y *= scale.y; + scaled.triangles.scale.x *= scale.x; + scaled.triangles.scale.y *= scale.y; break; case GRAPHICS_FILL_QUAD: @@ -1730,8 +1734,8 @@ static Graphics_Request graphics_request_moved_(Graphics_Request req, vec2 offse break; case GRAPHICS_FILL_TRIANGLES: - moved.triangles.area.x += offset.x; - moved.triangles.area.y += offset.y; + moved.triangles.position.x += offset.x; + moved.triangles.position.y += offset.y; break; case GRAPHICS_FILL_QUAD: @@ -1794,7 +1798,7 @@ static Box graphics_request_area_(Graphics_Request req) { case GRAPHICS_FILL_TRIANGLES: if (req.triangles.num_triangles > 0) { f64 x0, y0, x1, y1; - triangles_area_(&x0, &y0, &x1, &y1, req.triangles.num_triangles, req.triangles.vertices); + triangles_area_(&x0, &y0, &x1, &y1, req.triangles.position, req.triangles.scale, req.triangles.num_triangles, req.triangles.vertices); area.x = x0; area.y = y0; @@ -1874,7 +1878,8 @@ static void perform_graphics_request_to_buffer_(Pixel_Buffer dst, Graphics_Reque fill_triangles_to_buffer( dst, req.triangles.color, - req.triangles.area, + req.triangles.position, + req.triangles.scale, req.triangles.num_triangles, req.triangles.vertices ); |