diff --git a/src/draw.c b/src/draw.c index d23663c9..67d6c445 100644 --- a/src/draw.c +++ b/src/draw.c @@ -28,12 +28,12 @@ struct draw_startup_receipt draw_startup(struct gpu_startup_receipt *gpu_sr, * Texture * ========================== */ -void draw_quad_texture_ex(struct gpu_cmd_buffer *cmdbuff, struct gpu_texture texture, struct sprite_tag sprite, struct clip_rect clip, u32 tint0_srgb, u32 tint1_srgb, struct quad quad) +void draw_quad_texture(struct gpu_cmd_buffer *cmdbuff, struct draw_texture_params params) { struct gpu_cmd_parameters cmd_params = ZI; cmd_params.kind = SHADER_TRIANGLE; - cmd_params.texture_params.texture = texture; - cmd_params.texture_params.sprite = sprite; + cmd_params.texture_params.texture = params.texture; + cmd_params.texture_params.sprite = params.sprite; gpu_cmd_buffer_ensure_cmd(cmdbuff, &cmd_params); struct triangle_shader_vertex *vertices = NULL; @@ -42,27 +42,27 @@ void draw_quad_texture_ex(struct gpu_cmd_buffer *cmdbuff, struct gpu_texture tex /* Top left */ vertices[0] = (struct triangle_shader_vertex) { - .pos = quad.p0, - .uv = { clip.p0.x, clip.p0.y }, - .tint_srgb = tint0_srgb + .pos = params.quad.p0, + .uv = { params.clip.p0.x, params.clip.p0.y }, + .tint_srgb = params.tint0_srgb }; /* Top right */ vertices[1] = (struct triangle_shader_vertex) { - .pos = quad.p1, - .uv = { clip.p1.x, clip.p0.y }, - .tint_srgb = tint0_srgb + .pos = params.quad.p1, + .uv = { params.clip.p1.x, params.clip.p0.y }, + .tint_srgb = params.tint0_srgb }; /* Bottom right */ vertices[2] = (struct triangle_shader_vertex) { - .pos = quad.p2, - .uv = { clip.p1.x, clip.p1.y }, - .tint_srgb = tint1_srgb + .pos = params.quad.p2, + .uv = { params.clip.p1.x, params.clip.p1.y }, + .tint_srgb = params.tint1_srgb }; /* Bottom left */ vertices[3] = (struct triangle_shader_vertex) { - .pos = quad.p3, - .uv = { clip.p0.x, clip.p1.y }, - .tint_srgb = tint1_srgb + .pos = params.quad.p3, + .uv = { params.clip.p0.x, params.clip.p1.y }, + .tint_srgb = params.tint1_srgb }; /* Top / right triangle */ @@ -76,11 +76,6 @@ void draw_quad_texture_ex(struct gpu_cmd_buffer *cmdbuff, struct gpu_texture tex indices[5] = offset + 3; } -void draw_quad_texture(struct gpu_cmd_buffer *cmdbuff, struct draw_texture_params params, struct quad quad) -{ - draw_quad_texture_ex(cmdbuff, params.texture, params.sprite, params.clip, params.tint, params.tint, quad); -} - /* ========================== * * Solid fill shapes * ========================== */ @@ -144,7 +139,7 @@ void draw_circle(struct gpu_cmd_buffer *cmdbuff, struct v2 pos, f32 radius, u32 void draw_quad(struct gpu_cmd_buffer *cmdbuff, struct quad quad, u32 srgb) { - draw_quad_texture_ex(cmdbuff, G.solid_white, sprite_tag_nil(), CLIP_ALL, srgb, srgb, quad); + draw_quad_texture(cmdbuff, DRAW_TEXTURE_PARAMS(.texture = G.solid_white, .tint0_srgb = srgb, .tint1_srgb = srgb, .quad = quad)); } /* ========================== * @@ -154,7 +149,7 @@ void draw_quad(struct gpu_cmd_buffer *cmdbuff, struct quad quad, u32 srgb) void draw_gradient_line(struct gpu_cmd_buffer *cmdbuff, struct v2 start, struct v2 end, f32 thickness, u32 start_srgb, u32 end_srgb) { struct quad quad = quad_from_line(start, end, thickness); - draw_quad_texture_ex(cmdbuff, G.solid_white, sprite_tag_nil(), CLIP_ALL, start_srgb, end_srgb, quad); + draw_quad_texture(cmdbuff, DRAW_TEXTURE_PARAMS(.texture = G.solid_white, .tint0_srgb = start_srgb, .tint1_srgb = end_srgb, .quad = quad)); } void draw_line(struct gpu_cmd_buffer *cmdbuff, struct v2 start, struct v2 end, f32 thickness, u32 srgb) @@ -335,13 +330,13 @@ void draw_grid(struct gpu_cmd_buffer *cmdbuff, struct rect rect, u32 bg0_srgb, u * ========================== */ /* Returns the rect that the drawn text spans */ -struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, struct v2 pos, f32 scale, enum draw_text_alignment alignment, enum draw_text_offset_x offset_x, enum draw_text_offset_x offset_y, struct string str) +struct rect draw_text(struct gpu_cmd_buffer *cmdbuff, struct draw_text_params params) { struct temp_arena scratch = scratch_begin_no_conflict(); - f32 inv_font_image_width = 1.0 / (f32)font->image_width; - f32 inv_font_image_height = 1.0 / (f32)font->image_height; - f32 line_spacing = font->point_size * 1.5f * scale; + f32 inv_font_image_width = 1.0 / (f32)params.font->image_width; + f32 inv_font_image_height = 1.0 / (f32)params.font->image_height; + f32 line_spacing = params.font->point_size * 1.5f * params.scale; struct drawable_glyph { f32 off_x; @@ -367,9 +362,9 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru f32 first_line_top_offset = 0; f32 last_line_bottom_offset = 0; - if (str.len > 0) { + if (params.str.len > 0) { b32 string_done = false; - struct string_codepoint_iter iter = string_codepoint_iter_begin(str); + struct string_codepoint_iter iter = string_codepoint_iter_begin(params.str); while (!string_done) { f32 line_width = 0; f32 top_offset = 0; @@ -391,12 +386,12 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru } else { struct drawable_glyph *tg = arena_push(scratch.arena, struct drawable_glyph); ++num_line_glyphs; - struct font_glyph *glyph = font_get_glyph(font, codepoint); - tg->off_x = glyph->off_x * scale; - tg->off_y = glyph->off_y * scale; - tg->width = glyph->width * scale; - tg->height = glyph->height * scale; - tg->advance = glyph->advance * scale; + struct font_glyph *glyph = font_get_glyph(params.font, codepoint); + tg->off_x = glyph->off_x * params.scale; + tg->off_y = glyph->off_y * params.scale; + tg->width = glyph->width * params.scale; + tg->height = glyph->height * params.scale; + tg->advance = glyph->advance * params.scale; struct rect glyph_atlas_rect = glyph->atlas_rect; tg->clip = (struct clip_rect) { { @@ -438,13 +433,13 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru } struct rect bounds = ZI; - bounds.x = pos.x; - bounds.y = pos.y; + bounds.x = params.pos.x; + bounds.y = params.pos.y; bounds.width = widest_line; bounds.height = num_lines * line_spacing + first_line_top_offset + last_line_bottom_offset; /* Offset bounds X */ - switch (offset_x) { + switch (params.offset_x) { case DRAW_TEXT_OFFSET_X_LEFT: break; case DRAW_TEXT_OFFSET_X_CENTER: { @@ -457,7 +452,7 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru } /* Offset bounds Y */ - switch (offset_y) { + switch (params.offset_y) { case DRAW_TEXT_OFFSET_Y_TOP: { if (first_line) { @@ -483,7 +478,7 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru draw_pos.y += line_number * line_spacing; /* Alignment */ - switch (alignment) { + switch (params.alignment) { case DRAW_TEXT_ALIGNMENT_LEFT: break; case DRAW_TEXT_ALIGNMENT_CENTER: { @@ -501,7 +496,7 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru f32 x = draw_pos.x + tg->off_x; f32 y = draw_pos.y + tg->off_y; struct quad quad = quad_from_rect(RECT(x, y, tg->width, tg->height)); - draw_quad_texture_ex(cmdbuff, font->texture, sprite_tag_nil(), tg->clip, COLOR_WHITE, COLOR_WHITE, quad); + draw_quad_texture(cmdbuff, DRAW_TEXTURE_PARAMS(.texture = params.font->texture, .clip = tg->clip, .quad = quad)); draw_pos.x += tg->advance; } @@ -511,9 +506,3 @@ struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, stru scratch_end(scratch); return bounds; } - -/* Returns the rect that the drawn text spans */ -struct rect draw_text(struct gpu_cmd_buffer *cmdbuff, struct font *font, struct v2 pos, struct string str) -{ - return draw_text_ex(cmdbuff, font, pos, 1.0, DRAW_TEXT_ALIGNMENT_LEFT, DRAW_TEXT_OFFSET_X_LEFT, DRAW_TEXT_OFFSET_Y_TOP, str); -} diff --git a/src/draw.h b/src/draw.h index 021e0844..e2deddd4 100644 --- a/src/draw.h +++ b/src/draw.h @@ -9,7 +9,8 @@ struct gpu_startup_receipt; struct font_startup_receipt; #define DRAW_TEXTURE_PARAMS(...) ((struct draw_texture_params) { \ - .tint = COLOR_WHITE, \ + .tint0_srgb = COLOR_WHITE, \ + .tint1_srgb = COLOR_WHITE, \ .clip = CLIP_ALL, \ __VA_ARGS__ \ }) @@ -18,7 +19,9 @@ struct draw_texture_params { struct gpu_texture texture; /* Overrides sprite if set */ struct sprite_tag sprite; struct clip_rect clip; - u32 tint; + struct quad quad; + u32 tint0_srgb; + u32 tint1_srgb; }; /* How is text aligned within its area */ @@ -29,7 +32,7 @@ enum draw_text_alignment { }; /* How does the specified text position relate to the text area. - * E.g. LEFT & TOP means the top left of the text area will snap to + * E.g. BOTTOM & RIGHT means the bottom-right of the text area will snap to * the specified position. */ enum draw_text_offset_x { DRAW_TEXT_OFFSET_X_LEFT, /* Default */ @@ -46,8 +49,15 @@ struct draw_startup_receipt { i32 _; }; struct draw_startup_receipt draw_startup(struct gpu_startup_receipt *gpu_sr, struct font_startup_receipt *font_sr); -void draw_quad_texture_ex(struct gpu_cmd_buffer *cmdbuff, struct gpu_texture texture, struct sprite_tag sprite, struct clip_rect clip, u32 tint0, u32 tint1, struct quad quad); -void draw_quad_texture(struct gpu_cmd_buffer *cmdbuff, struct draw_texture_params params, struct quad quad); +/* ========================== * + * Textures + * ========================== */ + +void draw_quad_texture(struct gpu_cmd_buffer *cmdbuff, struct draw_texture_params params); + +/* ========================== * + * Shapes + * ========================== */ void draw_poly(struct gpu_cmd_buffer *cmdbuff, struct v2_array array, u32 srgb); void draw_circle(struct gpu_cmd_buffer *cmdbuff, struct v2 pos, f32 radius, u32 srgb, u32 detail); @@ -65,7 +75,28 @@ void draw_collider_line(struct gpu_cmd_buffer *cmdbuff, struct xform draw_xf, st void draw_grid(struct gpu_cmd_buffer *cmdbuff, struct rect rect, u32 bg0_srgb, u32 bg1_srgb, u32 line_srgb, u32 x_srgb, u32 y_srgb, f32 thickness, f32 spacing, struct v2 offset); -struct rect draw_text(struct gpu_cmd_buffer *cmdbuff, struct font *font, struct v2 pos, struct string str); -struct rect draw_text_ex(struct gpu_cmd_buffer *cmdbuff, struct font *font, struct v2 pos, f32 scale, enum draw_text_alignment alignment, enum draw_text_offset_x offset_x, enum draw_text_offset_x offset_y, struct string str); +/* ========================== * + * Text + * ========================== */ + +#define DRAW_TEXT_PARAMS(...) ((struct draw_text_params) { \ + .scale = 1.0, \ + .alignment = DRAW_TEXT_ALIGNMENT_LEFT, \ + .offset_x = DRAW_TEXT_OFFSET_X_LEFT, \ + .offset_y = DRAW_TEXT_OFFSET_Y_TOP, \ + __VA_ARGS__ \ +}) + +struct draw_text_params { + struct font *font; + struct v2 pos; + f32 scale; + enum draw_text_alignment alignment; + enum draw_text_offset_x offset_x; + enum draw_text_offset_x offset_y; + struct string str; +}; + +struct rect draw_text(struct gpu_cmd_buffer *cmdbuff, struct draw_text_params params); #endif diff --git a/src/user.c b/src/user.c index 9fc170f0..f564749b 100644 --- a/src/user.c +++ b/src/user.c @@ -1099,10 +1099,11 @@ INTERNAL void user_update(void) /* TODO: Fade in placeholder if texture isn't loaded */ if (sheet->loaded) { + u32 tint = ent->sprite_tint; struct sprite_sheet_frame frame = sprite_sheet_get_frame(sheet, ent->animation_frame); struct quad quad = xform_mul_quad(sprite_xform, QUAD_UNIT_SQUARE_CENTERED); - struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.sprite = sprite, .tint = ent->sprite_tint, .clip = frame.clip); - draw_quad_texture(G.world_cmd_buffer, params, quad); + struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.sprite = sprite, .tint0_srgb = tint, .tint1_srgb = tint, .clip = frame.clip, .quad = quad); + draw_quad_texture(G.world_cmd_buffer, params); } } @@ -1123,8 +1124,8 @@ INTERNAL void user_update(void) struct v2 pos = sim_pos_from_world_tile_index(world_tile_index); struct quad quad = quad_from_rect(RECT(pos.x, pos.y, tile_size, tile_size)); - struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.sprite = tile_sprite); - draw_quad_texture(G.world_cmd_buffer, params, quad); + struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.sprite = tile_sprite, .quad = quad); + draw_quad_texture(G.world_cmd_buffer, params); } } } @@ -1565,7 +1566,6 @@ INTERNAL void user_update(void) if (!G.debug_camera) { __profscope(draw_crosshair); struct v2 crosshair_pos = G.ui_cursor; - u32 tint = RGBA_F(1, 1, 1, 1); struct sprite_tag crosshair_tag = sprite_tag_from_path(LIT("sprites/crosshair.ase")); struct sprite_texture *t = sprite_texture_from_tag_async(sprite_frame_scope, crosshair_tag); @@ -1573,7 +1573,7 @@ INTERNAL void user_update(void) struct v2 size = V2(t->width, t->height); struct xform xf = XFORM_TRS(.t = crosshair_pos, .s = size); struct quad quad = xform_mul_quad(xf, QUAD_UNIT_SQUARE_CENTERED); - draw_quad_texture(G.ui_cmd_buffer, DRAW_TEXTURE_PARAMS(.sprite = crosshair_tag, .tint = tint), quad); + draw_quad_texture(G.ui_cmd_buffer, DRAW_TEXTURE_PARAMS(.sprite = crosshair_tag, .quad = quad)); struct rect cursor_clip = RECT_FROM_V2(G.ui_screen_offset, G.ui_size); cursor_clip.pos = v2_add(cursor_clip.pos, v2_mul(size, 0.5f)); @@ -1767,14 +1767,7 @@ INTERNAL void user_update(void) struct string dbg_text = ZI; dbg_text.text = arena_dry_push(temp.arena, u8); dbg_text.len += get_ent_debug_text(temp.arena, ent).len; -#if 0 - draw_text(G.ui_cmd_buffer, font, pos, dbg_text); -#else - enum draw_text_alignment alignment = DRAW_TEXT_ALIGNMENT_LEFT; - enum draw_text_offset_y offset_y = DRAW_TEXT_OFFSET_Y_TOP; - enum draw_text_offset_x offset_x = DRAW_TEXT_OFFSET_X_LEFT; - draw_text_ex(G.ui_cmd_buffer, font, pos, 1, alignment, offset_x, offset_y, dbg_text); -#endif + draw_text(G.ui_cmd_buffer, DRAW_TEXT_PARAMS(.font = font, .pos = pos, .str = dbg_text)); arena_temp_end(temp); } @@ -1884,10 +1877,7 @@ INTERNAL void user_update(void) //draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, LIT("blended world entities: %F/%F"), FMT_UINT(G.ss_blended->num_ents_allocated), FMT_UINT(G.ss_blended->num_ents_reserved))); //draw_text(G.ui_cmd_buffer, font, pos, text); - enum draw_text_alignment alignment = DRAW_TEXT_ALIGNMENT_LEFT; - enum draw_text_offset_x offset_x = DRAW_TEXT_OFFSET_X_LEFT; - enum draw_text_offset_y offset_y = DRAW_TEXT_OFFSET_Y_BOTTOM; - draw_text_ex(G.ui_cmd_buffer, font, pos, 1, alignment, offset_x, offset_y, text); + draw_text(G.ui_cmd_buffer, DRAW_TEXT_PARAMS(.font = font, .pos = pos, .str = text, .offset_y = DRAW_TEXT_OFFSET_Y_BOTTOM)); arena_temp_end(temp); } @@ -1939,23 +1929,23 @@ INTERNAL void user_update(void) { /* Draw world texture to final */ { - struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.world_texture); struct quad quad = quad_from_rect(RECT_FROM_V2(V2(0, 0), V2_FROM_V2I32(ui_resolution))); - draw_quad_texture(G.final_cmd_buffer, params, quad); + struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.world_texture, .quad = quad); + draw_quad_texture(G.final_cmd_buffer, params); } /* Draw ui texture to final */ { - struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.ui_texture); struct quad quad = quad_from_rect(RECT_FROM_V2(V2(0, 0), V2_FROM_V2I32(ui_resolution))); - draw_quad_texture(G.final_cmd_buffer, params, quad); + struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.ui_texture, .quad = quad); + draw_quad_texture(G.final_cmd_buffer, params); } /* Draw final texture to backbuffer */ { - struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.final_texture); struct quad quad = quad_from_rect(RECT_FROM_V2(G.ui_screen_offset, V2_FROM_V2I32(G.ui_size))); - draw_quad_texture(G.backbuffer_cmd_buffer, params, quad); + struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.final_texture, .quad = quad); + draw_quad_texture(G.backbuffer_cmd_buffer, params); } }