Refactor markers drawing

This will make it easier to move the markers area somewhere
else (to the top) in a separate step.

There should be no functional changes, only minor UI changes.

Reviewers: brecht

Differential Revision: https://developer.blender.org/D4745
This commit is contained in:
Jacques Lucke 2019-04-30 14:17:53 +02:00
parent 7f0b122b66
commit 34944a2035
1 changed files with 117 additions and 118 deletions

View File

@ -361,45 +361,38 @@ void debug_markers_print_list(ListBase *markers)
/* ************* Marker Drawing ************ */
static void draw_marker_name(const uiFontStyle *fstyle,
TimeMarker *marker,
const char *name,
int cfra,
const float xpos,
const float ypixels)
static void marker_color_get(TimeMarker *marker, unsigned char *color)
{
unsigned char text_col[4];
float x, y;
/* minimal y coordinate which wouldn't be occluded by scroll */
int min_y = 17.0f * UI_DPI_FAC;
if (marker->flag & SELECT) {
UI_GetThemeColor4ubv(TH_TEXT_HI, text_col);
x = xpos + 4.0f * UI_DPI_FAC;
y = (ypixels <= 39.0f * UI_DPI_FAC) ? (ypixels - 10.0f * UI_DPI_FAC) : 29.0f * UI_DPI_FAC;
y = max_ii(y, min_y);
UI_GetThemeColor4ubv(TH_TEXT_HI, color);
}
else {
UI_GetThemeColor4ubv(TH_TEXT, text_col);
if ((marker->frame <= cfra) && (marker->frame + 5 > cfra)) {
x = xpos + 8.0f * UI_DPI_FAC;
y = (ypixels <= 39.0f * UI_DPI_FAC) ? (ypixels - 10.0f * UI_DPI_FAC) : 29.0f * UI_DPI_FAC;
y = max_ii(y, min_y);
}
else {
x = xpos + 8.0f * UI_DPI_FAC;
y = 17.0f * UI_DPI_FAC;
}
UI_GetThemeColor4ubv(TH_TEXT, color);
}
}
static void draw_marker_name(const uiFontStyle *fstyle,
TimeMarker *marker,
float marker_x,
float text_y)
{
unsigned char text_color[4];
marker_color_get(marker, text_color);
const char *name = marker->name;
#ifdef DURIAN_CAMERA_SWITCH
if (marker->camera && (marker->camera->restrictflag & OB_RESTRICT_RENDER)) {
text_col[3] = 100;
if (marker->camera) {
Object *camera = marker->camera;
name = camera->id.name + 2;
if (camera->restrictflag & OB_RESTRICT_RENDER) {
text_color[3] = 100;
}
}
#endif
UI_fontstyle_draw_simple(fstyle, x, y, name, text_col);
int name_x = marker_x + UI_DPI_ICON_SIZE * 0.6;
UI_fontstyle_draw_simple(fstyle, name_x, text_y, name, text_color);
}
static void draw_marker_line(const float color[4], float x, float ymin, float ymax)
@ -426,29 +419,24 @@ static void draw_marker_line(const float color[4], float x, float ymin, float ym
immUnbindProgram();
}
/* function to draw markers */
static void draw_marker(const uiFontStyle *fstyle,
TimeMarker *marker,
int cfra,
int flag,
/* avoid re-calculating each time */
const float ypixels,
const float xscale,
int height)
static int marker_get_icon_id(TimeMarker *marker, int flag)
{
const float xpos = marker->frame * xscale;
if (flag & DRAW_MARKERS_LOCAL) {
return (marker->flag & ACTIVE) ? ICON_PMARKER_ACT :
(marker->flag & SELECT) ? ICON_PMARKER_SEL : ICON_PMARKER;
}
#ifdef DURIAN_CAMERA_SWITCH
const float yoffs = (marker->camera) ? 0.2f * UI_DPI_ICON_SIZE : 0.0f;
#else
const float yoffs = 0.0f;
else if (marker->camera) {
return (marker->flag & SELECT) ? ICON_OUTLINER_OB_CAMERA : ICON_CAMERA_DATA;
}
#endif
int icon_id;
else {
return (marker->flag & SELECT) ? ICON_MARKER_HLT : ICON_MARKER;
}
}
GPU_blend(true);
GPU_blend_set_func_separate(
GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
/* vertical line - dotted */
static void draw_marker_line_if_necessary(TimeMarker *marker, int flag, int xpos, int height)
{
#ifdef DURIAN_CAMERA_SWITCH
if ((marker->camera) || (flag & DRAW_MARKERS_LINES))
#else
@ -463,103 +451,114 @@ static void draw_marker(const uiFontStyle *fstyle,
copy_v4_fl4(color, 0.0f, 0.0f, 0.0f, 0.38f);
}
draw_marker_line(color, xpos, yoffs + 1.5f * UI_DPI_ICON_SIZE, height);
draw_marker_line(color, xpos, UI_DPI_FAC * 20, height);
}
}
/* 5 px to offset icon to align properly, space / pixels corrects for zoom */
if (flag & DRAW_MARKERS_LOCAL) {
icon_id = (marker->flag & ACTIVE) ? ICON_PMARKER_ACT :
(marker->flag & SELECT) ? ICON_PMARKER_SEL : ICON_PMARKER;
}
#ifdef DURIAN_CAMERA_SWITCH
else if (marker->camera) {
icon_id = (marker->flag & SELECT) ? ICON_OUTLINER_OB_CAMERA : ICON_CAMERA_DATA;
}
#endif
else {
icon_id = (marker->flag & SELECT) ? ICON_MARKER_HLT : ICON_MARKER;
}
static void draw_marker(
const uiFontStyle *fstyle, TimeMarker *marker, int xpos, int flag, int region_height)
{
GPU_blend(true);
GPU_blend_set_func_separate(
GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
UI_icon_draw(xpos - 0.55f * UI_DPI_ICON_SIZE, yoffs + UI_DPI_ICON_SIZE, icon_id);
draw_marker_line_if_necessary(marker, flag, xpos, region_height);
int icon_id = marker_get_icon_id(marker, flag);
UI_icon_draw(xpos - 0.55f * UI_DPI_ICON_SIZE, UI_DPI_FAC * 18, icon_id);
GPU_blend(false);
/* and the marker name too, shifted slightly to the top-right */
#ifdef DURIAN_CAMERA_SWITCH
if (marker->camera) {
draw_marker_name(fstyle, marker, marker->camera->id.name + 2, cfra, xpos, ypixels);
float name_y = UI_DPI_FAC * 18;
if (marker->flag & SELECT) {
name_y += UI_DPI_FAC * 10;
}
else if (marker->name[0]) {
draw_marker_name(fstyle, marker, marker->name, cfra, xpos, ypixels);
draw_marker_name(fstyle, marker, xpos, name_y);
}
static void draw_markers_background(rctf *rect)
{
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
const unsigned char shade[4] = {0, 0, 0, 16};
immUniformColor4ubv(shade);
GPU_blend(true);
GPU_blend_set_func_separate(
GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
GPU_blend(false);
immUnbindProgram();
}
static bool marker_is_in_frame_range(TimeMarker *marker, int frame_range[2])
{
if (marker->frame < frame_range[0]) {
return false;
}
#else
if (marker->name[0]) {
draw_marker_name(fstyle, marker, marker->name, cfra, xpos, ypixels);
if (marker->frame > frame_range[1]) {
return false;
}
#endif
return true;
}
static void get_marker_region_rect(View2D *v2d, rctf *rect)
{
rect->xmin = v2d->cur.xmin;
rect->xmax = v2d->cur.xmax;
rect->ymin = 0;
rect->ymax = UI_MARKER_MARGIN_Y;
}
static void get_marker_clip_frame_range(View2D *v2d, float xscale, int r_range[2])
{
float font_width_max = (10 * UI_DPI_FAC) / xscale;
r_range[0] = v2d->cur.xmin - sizeof(((TimeMarker *)NULL)->name) * font_width_max;
r_range[1] = v2d->cur.xmax + font_width_max;
}
/* Draw Scene-Markers in time window */
void ED_markers_draw(const bContext *C, int flag)
{
const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
ListBase *markers = ED_context_get_markers(C);
View2D *v2d;
TimeMarker *marker;
Scene *scene;
int select_pass;
int v2d_clip_range_x[2];
float font_width_max;
/* cache values */
float ypixels, xscale, yscale;
if (markers == NULL || BLI_listbase_is_empty(markers)) {
return;
}
scene = CTX_data_scene(C);
v2d = UI_view2d_fromcontext(C);
int height = v2d->mask.ymax - v2d->mask.ymin;
ARegion *ar = CTX_wm_region(C);
View2D *v2d = UI_view2d_fromcontext(C);
if (flag & DRAW_MARKERS_MARGIN) {
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
rctf markers_region_rect;
get_marker_region_rect(v2d, &markers_region_rect);
const unsigned char shade[4] = {0, 0, 0, 16};
immUniformColor4ubv(shade);
GPU_blend(true);
GPU_blend_set_func_separate(
GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
immRectf(pos, v2d->cur.xmin, 0, v2d->cur.xmax, UI_MARKER_MARGIN_Y);
GPU_blend(false);
immUnbindProgram();
}
draw_markers_background(&markers_region_rect);
/* no time correction for framelen! space is drawn with old values */
ypixels = BLI_rcti_size_y(&v2d->mask);
UI_view2d_scale_get(v2d, &xscale, &yscale);
float xscale, dummy;
UI_view2d_scale_get(v2d, &xscale, &dummy);
GPU_matrix_push();
GPU_matrix_scale_2f(1.0f / xscale, 1.0f);
/* x-bounds with offset for text (adjust for long string, avoid checking string width) */
font_width_max = (10 * UI_DPI_FAC) / xscale;
v2d_clip_range_x[0] = v2d->cur.xmin - (sizeof(marker->name) * font_width_max);
v2d_clip_range_x[1] = v2d->cur.xmax + font_width_max;
int clip_frame_range[2];
get_marker_clip_frame_range(v2d, xscale, clip_frame_range);
/* loop [unselected, selected] */
for (select_pass = 0; select_pass <= SELECT; select_pass += SELECT) {
/* unselected markers are drawn at the first time */
for (marker = markers->first; marker; marker = marker->next) {
if ((marker->flag & SELECT) == select_pass) {
/* bounds check */
if ((marker->frame >= v2d_clip_range_x[0]) && (marker->frame <= v2d_clip_range_x[1])) {
draw_marker(fstyle, marker, scene->r.cfra, flag, ypixels, xscale, height);
}
const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
for (TimeMarker *marker = markers->first; marker; marker = marker->next) {
if ((marker->flag & SELECT) == 0) {
if (marker_is_in_frame_range(marker, clip_frame_range)) {
draw_marker(fstyle, marker, marker->frame * xscale, flag, ar->winy);
}
}
}
for (TimeMarker *marker = markers->first; marker; marker = marker->next) {
if (marker->flag & SELECT) {
if (marker_is_in_frame_range(marker, clip_frame_range)) {
draw_marker(fstyle, marker, marker->frame * xscale, flag, ar->winy);
}
}
}