UI: 3D Text Caret

Changes to the text caret (cursor) when editing Text objects in the
3D Viewport.

See D15797 for more details and examples.

Differential Revision: https://developer.blender.org/D15797

Reviewed by Brecht Van Lommel
This commit is contained in:
Harley Acheson 2022-09-02 13:18:09 -07:00
parent 65a215b819
commit a1e01f4c02
5 changed files with 55 additions and 27 deletions

View File

@ -1422,7 +1422,8 @@ static bool vfont_to_curve(Object *ob,
for (i = 0; i <= selend; i++, ct++) {
if (i >= selstart) {
selboxes[i - selstart].x = ct->xof * font_size;
selboxes[i - selstart].y = ct->yof * font_size;
selboxes[i - selstart].y = (ct->yof - 0.25f) * font_size;
selboxes[i - selstart].h = font_size;
}
}
}
@ -1481,17 +1482,17 @@ static bool vfont_to_curve(Object *ob,
f = ef->textcurs[0];
f[0] = font_size * (-0.1f * co + ct->xof);
f[1] = font_size * (0.1f * si + ct->yof);
f[0] = font_size * (-0.02f * co + ct->xof);
f[1] = font_size * (0.1f * si - (0.25f * co) + ct->yof);
f[2] = font_size * (0.1f * co + ct->xof);
f[3] = font_size * (-0.1f * si + ct->yof);
f[2] = font_size * (0.02f * co + ct->xof);
f[3] = font_size * (-0.1f * si - (0.25f * co) + ct->yof);
f[4] = font_size * (0.1f * co + 0.8f * si + ct->xof);
f[5] = font_size * (-0.1f * si + 0.8f * co + ct->yof);
f[4] = font_size * (0.02f * co + 0.8f * si + ct->xof);
f[5] = font_size * (-0.1f * si + 0.75f * co + ct->yof);
f[6] = font_size * (-0.1f * co + 0.8f * si + ct->xof);
f[7] = font_size * (0.1f * si + 0.8f * co + ct->yof);
f[6] = font_size * (-0.02f * co + 0.8f * si + ct->xof);
f[7] = font_size * (0.1f * si + 0.75f * co + ct->yof);
}
if (mode == FO_SELCHANGE) {

View File

@ -7,6 +7,8 @@
#include "DRW_render.h"
#include "UI_resources.h"
#include "BKE_vfont.h"
#include "DNA_curve_types.h"
@ -38,17 +40,24 @@ void OVERLAY_edit_text_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_vec4_copy(grp, "color", G_draw.block.color_wire);
}
{
/* Cursor (text caret). */
state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
DRW_PASS_CREATE(psl->edit_text_overlay_ps, state | pd->clipping_state);
DRW_PASS_CREATE(psl->edit_text_cursor_ps, state | pd->clipping_state);
sh = OVERLAY_shader_uniform_color();
pd->edit_text_overlay_grp = grp = DRW_shgroup_create(sh, psl->edit_text_overlay_ps);
pd->edit_text_cursor_grp = grp = DRW_shgroup_create(sh, psl->edit_text_cursor_ps);
DRW_shgroup_uniform_vec4(grp, "color", pd->edit_text.cursor_color, 1);
DRW_shgroup_uniform_vec4(grp, "color", pd->edit_text.overlay_color, 1);
/* Selection boxes. */
state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
DRW_PASS_CREATE(psl->edit_text_selection_ps, state | pd->clipping_state);
sh = OVERLAY_shader_uniform_color();
pd->edit_text_selection_grp = grp = DRW_shgroup_create(sh, psl->edit_text_selection_ps);
DRW_shgroup_uniform_vec4(grp, "color", pd->edit_text.selection_color, 1);
state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_MUL | DRW_STATE_DEPTH_GREATER_EQUAL |
/* Highlight text within selection boxes. */
state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA | DRW_STATE_DEPTH_GREATER_EQUAL |
pd->clipping_state;
DRW_PASS_INSTANCE_CREATE(psl->edit_text_darken_ps, psl->edit_text_overlay_ps, state);
DRW_PASS_INSTANCE_CREATE(psl->edit_text_highlight_ps, psl->edit_text_selection_ps, state);
}
{
/* Create view which will render everything (hopefully) behind the text geometry. */
@ -112,7 +121,7 @@ static void edit_text_cache_populate_select(OVERLAY_Data *vedata, Object *ob)
v2_quad_corners_to_mat4(box, final_mat);
mul_m4_m4m4(final_mat, ob->obmat, final_mat);
DRW_shgroup_call_obmat(pd->edit_text_overlay_grp, geom, final_mat);
DRW_shgroup_call_obmat(pd->edit_text_selection_grp, geom, final_mat);
}
}
@ -128,7 +137,7 @@ static void edit_text_cache_populate_cursor(OVERLAY_Data *vedata, Object *ob)
mul_m4_m4m4(mat, ob->obmat, mat);
struct GPUBatch *geom = DRW_cache_quad_get();
DRW_shgroup_call_obmat(pd->edit_text_overlay_grp, geom, mat);
DRW_shgroup_call_obmat(pd->edit_text_cursor_grp, geom, mat);
}
static void edit_text_cache_populate_boxes(OVERLAY_Data *vedata, Object *ob)
@ -193,11 +202,18 @@ void OVERLAY_edit_text_draw(OVERLAY_Data *vedata)
DRW_view_set_active(pd->view_edit_text);
/* Alpha blended. */
copy_v4_fl4(pd->edit_text.overlay_color, 0.8f, 0.8f, 0.8f, 0.5f);
DRW_draw_pass(psl->edit_text_overlay_ps);
/* Selection Boxes. */
UI_GetThemeColor4fv(TH_WIDGET_TEXT_SELECTION, pd->edit_text.selection_color);
srgb_to_linearrgb_v4(pd->edit_text.selection_color, pd->edit_text.selection_color);
DRW_draw_pass(psl->edit_text_selection_ps);
/* Multiply previous result where depth test fail. */
copy_v4_fl4(pd->edit_text.overlay_color, 0.0f, 0.0f, 0.0f, 1.0f);
DRW_draw_pass(psl->edit_text_darken_ps);
/* Highlight text within selection boxes. */
UI_GetThemeColor4fv(TH_WIDGET_TEXT_HIGHLIGHT, pd->edit_text.selection_color);
srgb_to_linearrgb_v4(pd->edit_text.selection_color, pd->edit_text.selection_color);
DRW_draw_pass(psl->edit_text_highlight_ps);
/* Cursor (text caret). */
UI_GetThemeColor4fv(TH_WIDGET_TEXT_CURSOR, pd->edit_text.cursor_color);
srgb_to_linearrgb_v4(pd->edit_text.cursor_color, pd->edit_text.cursor_color);
DRW_draw_pass(psl->edit_text_cursor_ps);
}

View File

@ -78,8 +78,9 @@ typedef struct OVERLAY_PassList {
DRWPass *edit_mesh_analysis_ps;
DRWPass *edit_mesh_normals_ps;
DRWPass *edit_particle_ps;
DRWPass *edit_text_overlay_ps;
DRWPass *edit_text_darken_ps;
DRWPass *edit_text_cursor_ps;
DRWPass *edit_text_selection_ps;
DRWPass *edit_text_highlight_ps;
DRWPass *edit_text_wire_ps[2];
DRWPass *edit_uv_edges_ps;
DRWPass *edit_uv_verts_ps;
@ -252,7 +253,8 @@ typedef struct OVERLAY_PrivateData {
DRWShadingGroup *edit_mesh_analysis_grp;
DRWShadingGroup *edit_particle_strand_grp;
DRWShadingGroup *edit_particle_point_grp;
DRWShadingGroup *edit_text_overlay_grp;
DRWShadingGroup *edit_text_cursor_grp;
DRWShadingGroup *edit_text_selection_grp;
DRWShadingGroup *edit_text_wire_grp[2];
DRWShadingGroup *edit_uv_verts_grp;
DRWShadingGroup *edit_uv_edges_grp;
@ -338,7 +340,8 @@ typedef struct OVERLAY_PrivateData {
int handle_display;
} edit_curve;
struct {
float overlay_color[4];
float cursor_color[4];
float selection_color[4];
} edit_text;
struct {
bool do_zbufclip;

View File

@ -291,6 +291,8 @@ typedef enum ThemeColorID {
TH_WIDGET_EMBOSS,
TH_WIDGET_TEXT_CURSOR,
TH_WIDGET_TEXT_SELECTION,
TH_WIDGET_TEXT_HIGHLIGHT,
TH_EDITOR_OUTLINE,
TH_TRANSPARENT_CHECKER_PRIMARY,

View File

@ -895,6 +895,12 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
case TH_WIDGET_TEXT_CURSOR:
cp = btheme->tui.widget_text_cursor;
break;
case TH_WIDGET_TEXT_SELECTION:
cp = btheme->tui.wcol_text.item;
break;
case TH_WIDGET_TEXT_HIGHLIGHT:
cp = btheme->tui.wcol_text.text_sel;
break;
case TH_TRANSPARENT_CHECKER_PRIMARY:
cp = btheme->tui.transparent_checker_primary;