cursor trails

This commit is contained in:
Ryan Fleury
2025-11-07 12:00:40 -08:00
parent bc49b806c1
commit 0c7630e41c
7 changed files with 47 additions and 8 deletions
+2
View File
@@ -318,6 +318,7 @@ dr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32
inst->border_thickness = border_thickness; inst->border_thickness = border_thickness;
inst->edge_softness = edge_softness; inst->edge_softness = edge_softness;
inst->white_texture_override = 1.f; inst->white_texture_override = 1.f;
inst->shear = 0.f;
bucket->last_cmd_stack_gen = bucket->stack_gen; bucket->last_cmd_stack_gen = bucket->stack_gen;
return inst; return inst;
} }
@@ -363,6 +364,7 @@ dr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_rad
inst->border_thickness = border_thickness; inst->border_thickness = border_thickness;
inst->edge_softness = edge_softness; inst->edge_softness = edge_softness;
inst->white_texture_override = 0.f; inst->white_texture_override = 0.f;
inst->shear = 0.f;
bucket->last_cmd_stack_gen = bucket->stack_gen; bucket->last_cmd_stack_gen = bucket->stack_gen;
return inst; return inst;
} }
File diff suppressed because one or more lines are too long
+4
View File
@@ -264,6 +264,10 @@ RD_VocabTable:
@default(1) @display_name('Cursor Scope Lines') @description("Controls whether or not scopes containing the cursor in text views are drawn.") @default(1) @display_name('Cursor Scope Lines') @description("Controls whether or not scopes containing the cursor in text views are drawn.")
'cursor_scope_lines': bool, 'cursor_scope_lines': bool,
//- rjf: cursor decorations
@default(1) @display_name('Cursor Trail') @description("Controls whether or not a movement trail of the cursor is drawn.")
'cursor_trail': bool,
//- rjf: thread & breakpoint decorations //- rjf: thread & breakpoint decorations
@default(1) @display_name('Thread Lines') @description("Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.") @default(1) @display_name('Thread Lines') @description("Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.")
'thread_lines': bool, 'thread_lines': bool,
+31
View File
@@ -1277,6 +1277,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
B32 do_bp_lines = rd_setting_b32_from_name(str8_lit("breakpoint_lines")); B32 do_bp_lines = rd_setting_b32_from_name(str8_lit("breakpoint_lines"));
B32 do_bp_glow = rd_setting_b32_from_name(str8_lit("breakpoint_glow")); B32 do_bp_glow = rd_setting_b32_from_name(str8_lit("breakpoint_glow"));
B32 do_scope_lines = rd_setting_b32_from_name(str8_lit("cursor_scope_lines")); B32 do_scope_lines = rd_setting_b32_from_name(str8_lit("cursor_scope_lines"));
B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit("cursor_trail"));
Vec4F32 pop_color = {0}; Vec4F32 pop_color = {0};
UI_TagF("pop") UI_TagF("pop")
{ {
@@ -2775,7 +2776,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
{ {
S64 column = cursor->column; S64 column = cursor->column;
Vec2F32 advance = fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1)); Vec2F32 advance = fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1));
F32 cursor_y = line_box->rect.y0-params->font_size*0.125f;
F32 cursor_y__animated = ui_anim(ui_key_from_stringf(text_container_box->key, "cursor_y_px"), cursor_y);
F32 cursor_off_pixels = advance.x; F32 cursor_off_pixels = advance.x;
F32 cursor_off_pixels__animated = ui_anim(ui_key_from_stringf(text_container_box->key, "cursor_off_px"), cursor_off_pixels);
F32 cursor_thickness = ClampBot(1.f, floor_f32(line_box->font_size/10.f)); F32 cursor_thickness = ClampBot(1.f, floor_f32(line_box->font_size/10.f));
Rng2F32 cursor_rect = Rng2F32 cursor_rect =
{ {
@@ -2784,12 +2788,39 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness, ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness,
line_box->rect.y1+params->font_size*0.125f, line_box->rect.y1+params->font_size*0.125f,
}; };
Rng1F32 trail_off_span = r1f32(cursor_off_pixels__animated, cursor_off_pixels);
Rng2F32 trail_rect =
{
ui_box_text_position(line_box).x+trail_off_span.min,
line_box->rect.y0-params->font_size*0.125f,
ui_box_text_position(line_box).x+trail_off_span.max,
line_box->rect.y1+params->font_size*0.125f,
};
Vec4F32 cursor_color = ui_color_from_name(str8_lit("cursor")); Vec4F32 cursor_color = ui_color_from_name(str8_lit("cursor"));
Vec4F32 trail_color = cursor_color;
if(!is_focused) if(!is_focused)
{ {
cursor_color.w *= 0.5f; cursor_color.w *= 0.5f;
} }
trail_color.w *= 0.25f;
dr_rect(cursor_rect, cursor_color, 1.f, 0, 0.f); dr_rect(cursor_rect, cursor_color, 1.f, 0, 0.f);
if(do_cursor_trail)
{
R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f);
trail_inst->shear = cursor_y - cursor_y__animated;
if(cursor_off_pixels > cursor_off_pixels__animated)
{
trail_inst->dst = shift_2f32(trail_inst->dst, v2f32(0, -trail_inst->shear));
trail_inst->colors[Corner_00].w *= 0.1f;
trail_inst->colors[Corner_01].w *= 0.1f;
}
else
{
trail_inst->shear *= -1;
trail_inst->colors[Corner_10].w *= 0.1f;
trail_inst->colors[Corner_11].w *= 0.1f;
}
}
} }
// rjf: extra rendering for lines with line-info that match the hovered // rjf: extra rendering for lines with line-info that match the hovered
@@ -58,7 +58,7 @@ str8_lit_comp(
" float4 color10 : COL2;\n" " float4 color10 : COL2;\n"
" float4 color11 : COL3;\n" " float4 color11 : COL3;\n"
" float4 corner_radii_px : CRAD;\n" " float4 corner_radii_px : CRAD;\n"
" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused\n" " float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n"
" uint vertex_id : SV_VertexID;\n" " uint vertex_id : SV_VertexID;\n"
"};\n" "};\n"
"\n" "\n"
@@ -113,14 +113,15 @@ str8_lit_comp(
" float border_thickness_px = cpu2vertex.style_params.x;\n" " float border_thickness_px = cpu2vertex.style_params.x;\n"
" float softness_px = cpu2vertex.style_params.y;\n" " float softness_px = cpu2vertex.style_params.y;\n"
" float omit_texture = cpu2vertex.style_params.z;\n" " float omit_texture = cpu2vertex.style_params.z;\n"
" float shear_px = cpu2vertex.style_params.w;\n"
" \n" " \n"
" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" " //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n"
" float2 dst_p_verts_px[] =\n" " float2 dst_p_verts_px[] =\n"
" {\n" " {\n"
" float2(dst_p0_px.x, dst_p1_px.y),\n" " float2(dst_p0_px.x, dst_p1_px.y),\n"
" float2(dst_p0_px.x, dst_p0_px.y),\n" " float2(dst_p0_px.x, dst_p0_px.y),\n"
" float2(dst_p1_px.x, dst_p1_px.y),\n" " float2(dst_p1_px.x, dst_p1_px.y + shear_px),\n"
" float2(dst_p1_px.x, dst_p0_px.y),\n" " float2(dst_p1_px.x, dst_p0_px.y + shear_px),\n"
" };\n" " };\n"
" float2 src_p_verts_px[] =\n" " float2 src_p_verts_px[] =\n"
" {\n" " {\n"
+4 -3
View File
@@ -56,7 +56,7 @@ struct CPU2Vertex
float4 color10 : COL2; float4 color10 : COL2;
float4 color11 : COL3; float4 color11 : COL3;
float4 corner_radii_px : CRAD; float4 corner_radii_px : CRAD;
float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear
uint vertex_id : SV_VertexID; uint vertex_id : SV_VertexID;
}; };
@@ -111,14 +111,15 @@ vs_main(CPU2Vertex cpu2vertex)
float border_thickness_px = cpu2vertex.style_params.x; float border_thickness_px = cpu2vertex.style_params.x;
float softness_px = cpu2vertex.style_params.y; float softness_px = cpu2vertex.style_params.y;
float omit_texture = cpu2vertex.style_params.z; float omit_texture = cpu2vertex.style_params.z;
float shear_px = cpu2vertex.style_params.w;
//- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius) //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)
float2 dst_p_verts_px[] = float2 dst_p_verts_px[] =
{ {
float2(dst_p0_px.x, dst_p1_px.y), float2(dst_p0_px.x, dst_p1_px.y),
float2(dst_p0_px.x, dst_p0_px.y), float2(dst_p0_px.x, dst_p0_px.y),
float2(dst_p1_px.x, dst_p1_px.y), float2(dst_p1_px.x, dst_p1_px.y + shear_px),
float2(dst_p1_px.x, dst_p0_px.y), float2(dst_p1_px.x, dst_p0_px.y + shear_px),
}; };
float2 src_p_verts_px[] = float2 src_p_verts_px[] =
{ {
+1 -1
View File
@@ -103,7 +103,7 @@ struct R_Rect2DInst
F32 border_thickness; F32 border_thickness;
F32 edge_softness; F32 edge_softness;
F32 white_texture_override; F32 white_texture_override;
F32 _unused_[1]; F32 shear;
}; };
typedef struct R_Mesh3DInst R_Mesh3DInst; typedef struct R_Mesh3DInst R_Mesh3DInst;