Fix Text Boxes not drawing
I'm using a different shading group for the active text box and the others. This way I can assign different colors to them. The alternative would be to create a new `shgroup_dynlines_dashed_flat_color`, but I find this overkill for such a simple use case.
This commit is contained in:
parent
d7c58cd8f7
commit
6c87958dac
|
@ -58,6 +58,7 @@ typedef struct EDIT_TEXT_PassList {
|
|||
struct DRWPass *wire_pass;
|
||||
struct DRWPass *overlay_select_pass;
|
||||
struct DRWPass *overlay_cursor_pass;
|
||||
struct DRWPass *text_box_pass;
|
||||
} EDIT_TEXT_PassList;
|
||||
|
||||
typedef struct EDIT_TEXT_FramebufferList {
|
||||
|
@ -110,6 +111,8 @@ typedef struct EDIT_TEXT_PrivateData {
|
|||
DRWShadingGroup *wire_shgrp;
|
||||
DRWShadingGroup *overlay_select_shgrp;
|
||||
DRWShadingGroup *overlay_cursor_shgrp;
|
||||
DRWShadingGroup *box_shgrp;
|
||||
DRWShadingGroup *box_active_shgrp;
|
||||
} EDIT_TEXT_PrivateData; /* Transient data */
|
||||
|
||||
/* *********** FUNCTIONS *********** */
|
||||
|
@ -181,6 +184,67 @@ static void EDIT_TEXT_cache_init(void *vedata)
|
|||
"Font Cursor",
|
||||
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH);
|
||||
stl->g_data->overlay_cursor_shgrp = DRW_shgroup_create(e_data.overlay_cursor_sh, psl->overlay_cursor_pass);
|
||||
|
||||
psl->text_box_pass = DRW_pass_create(
|
||||
"Font Text Boxes",
|
||||
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH);
|
||||
stl->g_data->box_shgrp = shgroup_dynlines_dashed_uniform_color(psl->text_box_pass, ts.colorWire);
|
||||
stl->g_data->box_active_shgrp = shgroup_dynlines_dashed_uniform_color(psl->text_box_pass, ts.colorActive);
|
||||
}
|
||||
}
|
||||
|
||||
static void edit_text_cache_populate_boxes(void *vedata, Object *ob)
|
||||
{
|
||||
EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl;
|
||||
const Curve *cu = ob->data;
|
||||
|
||||
DRWShadingGroup *shading_groups[] = {
|
||||
stl->g_data->box_active_shgrp,
|
||||
stl->g_data->box_shgrp,
|
||||
};
|
||||
|
||||
float vec[3], vec1[3], vec2[3];
|
||||
for (int i = 0; i < cu->totbox; i++) {
|
||||
TextBox *tb = &cu->tb[i];
|
||||
|
||||
if ((tb->w == 0.0f) && (tb->h == 0.0f)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const bool is_active = i == (cu->actbox - 1);
|
||||
DRWShadingGroup *shading_group = shading_groups[is_active ? 0 : 1];
|
||||
|
||||
vec[0] = cu->xof + tb->x;
|
||||
vec[1] = cu->yof + tb->y + cu->fsize;
|
||||
vec[2] = 0.001;
|
||||
|
||||
mul_v3_m4v3(vec1, ob->obmat, vec);
|
||||
vec[0] += tb->w;
|
||||
mul_v3_m4v3(vec2, ob->obmat, vec);
|
||||
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec1);
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec2);
|
||||
|
||||
vec[1] -= tb->h;
|
||||
copy_v3_v3(vec1, vec2);
|
||||
mul_v3_m4v3(vec2, ob->obmat, vec);
|
||||
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec1);
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec2);
|
||||
|
||||
vec[0] -= tb->w;
|
||||
copy_v3_v3(vec1, vec2);
|
||||
mul_v3_m4v3(vec2, ob->obmat, vec);
|
||||
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec1);
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec2);
|
||||
|
||||
vec[1] += tb->h;
|
||||
copy_v3_v3(vec1, vec2);
|
||||
mul_v3_m4v3(vec2, ob->obmat, vec);
|
||||
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec1);
|
||||
DRW_shgroup_call_dynamic_add(shading_group, vec2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -218,6 +282,8 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob)
|
|||
if (geom) {
|
||||
DRW_shgroup_call_add(stl->g_data->overlay_cursor_shgrp, geom, ob->obmat);
|
||||
}
|
||||
|
||||
edit_text_cache_populate_boxes(vedata, ob);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -255,6 +321,10 @@ static void EDIT_TEXT_draw_scene(void *vedata)
|
|||
|
||||
DRW_draw_pass(psl->wire_pass);
|
||||
|
||||
if (!DRW_pass_is_empty(psl->text_box_pass)) {
|
||||
DRW_draw_pass(psl->text_box_pass);
|
||||
}
|
||||
|
||||
set_inverted_drawing(1);
|
||||
DRW_draw_pass(psl->overlay_select_pass);
|
||||
DRW_draw_pass(psl->overlay_cursor_pass);
|
||||
|
|
Loading…
Reference in New Issue