draw_text params struct
This commit is contained in:
parent
99d95d882f
commit
f6b4e3ed35
81
src/draw.c
81
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);
|
||||
}
|
||||
|
||||
45
src/draw.h
45
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
|
||||
|
||||
38
src/user.c
38
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user