Getting rid of setlinestyle: FCurves drawing.

This commit is contained in:
Bastien Montagne 2017-05-01 17:43:20 +02:00
parent 9c73cead49
commit 2f100c13ee
1 changed files with 121 additions and 79 deletions

View File

@ -85,45 +85,58 @@ static void draw_fcurve_modifier_controls_envelope(FModifier *fcm, View2D *v2d)
const float fac = 0.05f * BLI_rctf_size_x(&v2d->cur);
int i;
unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
const uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
glLineWidth(1.0f);
immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
float viewport_size[4];
glGetFloatv(GL_VIEWPORT, viewport_size);
immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
immUniform1i("num_colors", 0); /* Simple dashes. */
immUniformColor3f(0.0f, 0.0f, 0.0f);
immUniform1f("dash_width", 10.0f);
immUniform1f("dash_factor", 0.5f);
/* draw two black lines showing the standard reference levels */
immUniformColor3f(0.0f, 0.0f, 0.0f);
glLineWidth(1);
setlinestyle(5);
immBegin(PRIM_LINES, 4);
immVertex2f(pos, v2d->cur.xmin, env->midval + env->min);
immVertex2f(pos, v2d->cur.xmax, env->midval + env->min);
immVertex2f(pos, v2d->cur.xmin, env->midval + env->max);
immVertex2f(pos, v2d->cur.xmax, env->midval + env->max);
immEnd();
setlinestyle(0);
/* set size of vertices (non-adjustable for now) */
glPointSize(2.0f);
/* for now, point color is fixed, and is white */
immUniformColor3f(1.0f, 1.0f, 1.0f);
immBeginAtMost(PRIM_POINTS, env->totvert * 2);
for (i = 0, fed = env->data; i < env->totvert; i++, fed++) {
/* only draw if visible
* - min/max here are fixed, not relative
*/
if (IN_RANGE(fed->time, (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) {
immVertex2f(pos, fed->time, fed->min);
immVertex2f(pos, fed->time, fed->max);
}
}
immVertex2f(shdr_pos, v2d->cur.xmin, env->midval + env->min);
immVertex2f(shdr_pos, v2d->cur.xmax, env->midval + env->min);
immVertex2f(shdr_pos, v2d->cur.xmin, env->midval + env->max);
immVertex2f(shdr_pos, v2d->cur.xmax, env->midval + env->max);
immEnd();
immUnbindProgram();
if (env->totvert > 0) {
/* set size of vertices (non-adjustable for now) */
glPointSize(2.0f);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
/* for now, point color is fixed, and is white */
immUniformColor3f(1.0f, 1.0f, 1.0f);
immBeginAtMost(PRIM_POINTS, env->totvert * 2);
for (i = 0, fed = env->data; i < env->totvert; i++, fed++) {
/* only draw if visible
* - min/max here are fixed, not relative
*/
if (IN_RANGE(fed->time, (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) {
immVertex2f(shdr_pos, fed->time, fed->min);
immVertex2f(shdr_pos, fed->time, fed->max);
}
}
immEnd();
immUnbindProgram();
}
}
/* *************************** */
@ -549,7 +562,7 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
}
/* helper func - draw a samples-based F-Curve */
static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, unsigned int pos)
static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, const uint shdr_pos)
{
FPoint *prevfpt = fcu->fpt;
FPoint *fpt = prevfpt + 1;
@ -591,14 +604,14 @@ static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, Vie
v[1] = prevfpt->vec[1] - fac * (prevfpt->vec[1] - fpt->vec[1]);
}
immVertex2fv(pos, v);
immVertex2fv(shdr_pos, v);
}
/* loop over samples, drawing segments */
/* draw curve between first and last keyframe (if there are enough to do so) */
while (b--) {
/* Linear interpolation: just add one point (which should add a new line segment) */
immVertex2fv(pos, prevfpt->vec);
immVertex2fv(shdr_pos, prevfpt->vec);
/* get next pointers */
if (b > 0) {
@ -623,7 +636,7 @@ static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, Vie
v[1] = prevfpt->vec[1] - fac * (prevfpt->vec[1] - fpt->vec[1]);
}
immVertex2fv(pos, v);
immVertex2fv(shdr_pos, v);
}
immEnd();
@ -832,8 +845,14 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
//if ((driver->flag & DRIVER_FLAG_SHOWDEBUG) == 0)
// return;
unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
const uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
float viewport_size[4];
glGetFloatv(GL_VIEWPORT, viewport_size);
immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
immUniform1i("num_colors", 0); /* Simple dashes. */
/* No curve to modify/visualize the result?
* => We still want to show the 1-1 default...
@ -844,7 +863,8 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
/* draw with thin dotted lines in style of what curve would have been */
immUniformColor3fv(fcu->color);
setlinestyle(20);
immUniform1f("dash_width", 40.0f);
immUniform1f("dash_factor", 0.5f);
glLineWidth(2.0f);
/* draw 1-1 line, stretching just past the screen limits
@ -853,15 +873,12 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
immBegin(PRIM_LINES, 2);
t = v2d->cur.xmin;
immVertex2f(pos, t, (t + offset) * unitfac);
immVertex2f(shdr_pos, t, (t + offset) * unitfac);
t = v2d->cur.xmax;
immVertex2f(pos, t, (t + offset) * unitfac);
immVertex2f(shdr_pos, t, (t + offset) * unitfac);
immEnd();
/* cleanup line drawing */
setlinestyle(0);
}
/* draw driver only if actually functional */
@ -876,8 +893,9 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
/* draw dotted lines leading towards this point from both axes ....... */
immUniformColor3f(0.9f, 0.9f, 0.9f);
setlinestyle(5);
immUniform1f("dash_width", 10.0f);
immUniform1f("dash_factor", 0.5f);
immBegin(PRIM_LINES, (y >= v2d->cur.ymin) ? 4 : 2);
/* x-axis lookup */
@ -885,32 +903,35 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
if (y >= v2d->cur.ymin) {
co[1] = v2d->cur.ymin - 1.0f;
immVertex2fv(pos, co);
immVertex2fv(shdr_pos, co);
co[1] = y;
immVertex2fv(pos, co);
immVertex2fv(shdr_pos, co);
}
/* y-axis lookup */
co[1] = y;
co[0] = v2d->cur.xmin - 1.0f;
immVertex2fv(pos, co);
immVertex2fv(shdr_pos, co);
co[0] = x;
immVertex2fv(pos, co);
immVertex2fv(shdr_pos, co);
immEnd();
setlinestyle(0);
immUnbindProgram();
/* PRIM_POINTS do not survive dashed line geometry shader... */
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
/* x marks the spot .................................................... */
/* -> outer frame */
immUniformColor3f(0.9f, 0.9f, 0.9f);
glPointSize(7.0);
immBegin(PRIM_POINTS, 1);
immVertex2f(pos, x, y);
immVertex2f(shdr_pos, x, y);
immEnd();
/* inner frame */
@ -918,7 +939,7 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
glPointSize(3.0);
immBegin(PRIM_POINTS, 1);
immVertex2f(pos, x, y);
immVertex2f(shdr_pos, x, y);
immEnd();
}
}
@ -936,15 +957,25 @@ void graph_draw_ghost_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
FCurve *fcu;
/* draw with thick dotted lines */
setlinestyle(10);
glLineWidth(3.0f);
/* anti-aliased lines for less jagged appearance */
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glEnable(GL_LINE_SMOOTH);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) {
glEnable(GL_LINE_SMOOTH);
}
glEnable(GL_BLEND);
unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
const uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
float viewport_size[4];
glGetFloatv(GL_VIEWPORT, viewport_size);
immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
immUniform1i("num_colors", 0); /* Simple dashes. */
immUniform1f("dash_width", 20.0f);
immUniform1f("dash_factor", 0.5f);
/* the ghost curves are simply sampled F-Curves stored in sipo->ghostCurves */
for (fcu = sipo->ghostCurves.first; fcu; fcu = fcu->next) {
@ -955,15 +986,14 @@ void graph_draw_ghost_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
immUniformColor3fvAlpha(fcu->color, 0.5f);
/* simply draw the stored samples */
draw_fcurve_curve_samples(ac, NULL, fcu, &ar->v2d, pos);
draw_fcurve_curve_samples(ac, NULL, fcu, &ar->v2d, shdr_pos);
}
immUnbindProgram();
/* restore settings */
setlinestyle(0);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glDisable(GL_LINE_SMOOTH);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) {
glDisable(GL_LINE_SMOOTH);
}
glDisable(GL_BLEND);
}
@ -1007,11 +1037,6 @@ void graph_draw_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid
(((fcu->bezt) || (fcu->fpt)) && (fcu->totvert)))
{
/* set color/drawing style for curve itself */
if (BKE_fcurve_is_protected(fcu)) {
/* protected curves (non editable) are drawn with dotted lines */
setlinestyle(2);
}
/* draw active F-Curve thicker than the rest to make it stand out */
if (fcu->flag & FCURVE_ACTIVE) {
glLineWidth(2.0);
@ -1021,11 +1046,29 @@ void graph_draw_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid
}
/* anti-aliased lines for less jagged appearance */
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glEnable(GL_LINE_SMOOTH);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) {
glEnable(GL_LINE_SMOOTH);
}
glEnable(GL_BLEND);
unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
const uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR);
float viewport_size[4];
glGetFloatv(GL_VIEWPORT, viewport_size);
immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
immUniform1i("num_colors", 0); /* Simple dashes. */
if (BKE_fcurve_is_protected(fcu)) {
/* protected curves (non editable) are drawn with dotted lines */
immUniform1f("dash_width", 4.0f);
immUniform1f("dash_factor", 0.5f);
}
else {
immUniform1f("dash_factor", 2.0f); /* solid line */
}
if (((fcu->grp) && (fcu->grp->flag & AGRP_MUTED)) || (fcu->flag & FCURVE_MUTED)) {
/* muted curves are drawn in a grayish hue */
@ -1044,29 +1087,28 @@ void graph_draw_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid
/* draw a curve affected by modifiers or only allowed to have integer values
* by sampling it at various small-intervals over the visible region
*/
draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid, pos);
draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid, shdr_pos);
}
else if (((fcu->bezt) || (fcu->fpt)) && (fcu->totvert)) {
/* just draw curve based on defined data (i.e. no modifiers) */
if (fcu->bezt) {
if (fcurve_can_use_simple_bezt_drawing(fcu)) {
draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d, pos);
draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d, shdr_pos);
}
else {
draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid, pos);
draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid, shdr_pos);
}
}
else if (fcu->fpt) {
draw_fcurve_curve_samples(ac, ale->id, fcu, &ar->v2d, pos);
draw_fcurve_curve_samples(ac, ale->id, fcu, &ar->v2d, shdr_pos);
}
}
immUnbindProgram();
/* restore settings */
setlinestyle(0);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) glDisable(GL_LINE_SMOOTH);
if ((sipo->flag & SIPO_BEAUTYDRAW_OFF) == 0) {
glDisable(GL_LINE_SMOOTH);
}
glDisable(GL_BLEND);
}