OpenGL: convert legacy calls in transform.c

Took pieces from D2316 and D2359, changed a few more things.

- use new immediate mode
- use new matrix stack
- remove state push/pop

Part of T49043 and T49450
This commit is contained in:
2017-01-19 00:46:01 -05:00
parent 3216831c76
commit 8aa8165e85

View File

@@ -64,9 +64,11 @@
#include "BKE_mask.h"
#include "BKE_report.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
#include "ED_image.h"
#include "ED_keyframing.h"
#include "ED_screen.h"
@@ -1598,8 +1600,16 @@ typedef enum {
LEFT,
RIGHT
} ArrowDirection;
#define POS_INDEX 0
/* NOTE: this --^ is a bit hackish, but simplifies VertexFormat usage among functions
* private to this file - merwin
*/
static void drawArrow(ArrowDirection d, short offset, short length, short size)
{
immBegin(PRIM_LINES, 6);
switch (d) {
case LEFT:
offset = -offset;
@@ -1607,14 +1617,12 @@ static void drawArrow(ArrowDirection d, short offset, short length, short size)
size = -size;
/* fall-through */
case RIGHT:
glBegin(GL_LINES);
glVertex2s(offset, 0);
glVertex2s(offset + length, 0);
glVertex2s(offset + length, 0);
glVertex2s(offset + length - size, -size);
glVertex2s(offset + length, 0);
glVertex2s(offset + length - size, size);
glEnd();
immVertex2f(POS_INDEX, offset, 0);
immVertex2f(POS_INDEX, offset + length, 0);
immVertex2f(POS_INDEX, offset + length, 0);
immVertex2f(POS_INDEX, offset + length - size, -size);
immVertex2f(POS_INDEX, offset + length, 0);
immVertex2f(POS_INDEX, offset + length - size, size);
break;
case DOWN:
@@ -1623,45 +1631,45 @@ static void drawArrow(ArrowDirection d, short offset, short length, short size)
size = -size;
/* fall-through */
case UP:
glBegin(GL_LINES);
glVertex2s(0, offset);
glVertex2s(0, offset + length);
glVertex2s(0, offset + length);
glVertex2s(-size, offset + length - size);
glVertex2s(0, offset + length);
glVertex2s(size, offset + length - size);
glEnd();
immVertex2f(POS_INDEX, 0, offset);
immVertex2f(POS_INDEX, 0, offset + length);
immVertex2f(POS_INDEX, 0, offset + length);
immVertex2f(POS_INDEX, -size, offset + length - size);
immVertex2f(POS_INDEX, 0, offset + length);
immVertex2f(POS_INDEX, size, offset + length - size);
break;
}
immEnd();
}
static void drawArrowHead(ArrowDirection d, short size)
{
immBegin(PRIM_LINES, 4);
switch (d) {
case LEFT:
size = -size;
/* fall-through */
case RIGHT:
glBegin(GL_LINES);
glVertex2s(0, 0);
glVertex2s(-size, -size);
glVertex2s(0, 0);
glVertex2s(-size, size);
glEnd();
immVertex2f(POS_INDEX, 0, 0);
immVertex2f(POS_INDEX, -size, -size);
immVertex2f(POS_INDEX, 0, 0);
immVertex2f(POS_INDEX, -size, size);
break;
case DOWN:
size = -size;
/* fall-through */
case UP:
glBegin(GL_LINES);
glVertex2s(0, 0);
glVertex2s(-size, -size);
glVertex2s(0, 0);
glVertex2s(size, -size);
glEnd();
immVertex2f(POS_INDEX, 0, 0);
immVertex2f(POS_INDEX, -size, -size);
immVertex2f(POS_INDEX, 0, 0);
immVertex2f(POS_INDEX, size, -size);
break;
}
immEnd();
}
static void drawArc(float size, float angle_start, float angle_end, int segments)
@@ -1670,14 +1678,14 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
float angle;
int a;
glBegin(GL_LINE_STRIP);
immBegin(PRIM_LINE_STRIP, segments + 1);
for (angle = angle_start, a = 0; a < segments; angle += delta, a++) {
glVertex2f(cosf(angle) * size, sinf(angle) * size);
immVertex2f(POS_INDEX, cosf(angle) * size, sinf(angle) * size);
}
glVertex2f(cosf(angle_end) * size, sinf(angle_end) * size);
immVertex2f(POS_INDEX, cosf(angle_end) * size, sinf(angle_end) * size);
glEnd();
immEnd();
}
static int helpline_poll(bContext *C)
@@ -1695,10 +1703,7 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
if (t->helpline != HLP_NONE && !(t->flag & T_USES_MANIPULATOR)) {
float vecrot[3], cent[2];
int mval[2];
mval[0] = x;
mval[1] = y;
float mval[3] = { x, y, 0.0f };
copy_v3_v3(vecrot, t->center);
if (t->flag & T_EDIT) {
@@ -1712,42 +1717,45 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
projectFloatViewEx(t, vecrot, cent, V3D_PROJ_TEST_CLIP_ZERO);
glPushMatrix();
gpuMatrixBegin3D_legacy(); /* TODO(merwin): finish the 2D matrix API & use here */
unsigned pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT);
BLI_assert(pos == POS_INDEX);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
switch (t->helpline) {
case HLP_SPRING:
UI_ThemeColor(TH_VIEW_OVERLAY);
immUniformThemeColor(TH_VIEW_OVERLAY);
setlinestyle(3);
glLineWidth(1);
glBegin(GL_LINES);
glVertex2iv(t->mval);
glVertex2fv(cent);
glEnd();
glLineWidth(1.0f);
glTranslate2iv(mval);
glRotatef(-RAD2DEGF(atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1])), 0, 0, 1);
immBegin(PRIM_LINES, 2);
immVertex2f(POS_INDEX, (float)t->mval[0], (float)t->mval[1]);
immVertex2fv(POS_INDEX, cent);
immEnd();
gpuTranslate3fv(mval);
gpuRotateAxis(-RAD2DEGF(atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1])), 'Z');
setlinestyle(0);
glLineWidth(3.0);
glLineWidth(3.0f);
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
break;
case HLP_HARROW:
UI_ThemeColor(TH_VIEW_OVERLAY);
immUniformThemeColor(TH_VIEW_OVERLAY);
gpuTranslate3fv(mval);
glTranslate2iv(mval);
glLineWidth(3.0);
glLineWidth(3.0f);
drawArrow(RIGHT, 5, 10, 5);
drawArrow(LEFT, 5, 10, 5);
break;
case HLP_VARROW:
UI_ThemeColor(TH_VIEW_OVERLAY);
immUniformThemeColor(TH_VIEW_OVERLAY);
glTranslate2iv(mval);
gpuTranslate3fv(mval);
glLineWidth(3.0);
glLineWidth(3.0f);
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
break;
@@ -1758,33 +1766,35 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
float dist = hypotf(dx, dy);
float delta_angle = min_ff(15.0f / dist, (float)M_PI / 4.0f);
float spacing_angle = min_ff(5.0f / dist, (float)M_PI / 12.0f);
UI_ThemeColor(TH_VIEW_OVERLAY);
immUniformThemeColor(TH_VIEW_OVERLAY);
setlinestyle(3);
glLineWidth(1);
glBegin(GL_LINES);
glVertex2iv(t->mval);
glVertex2fv(cent);
glEnd();
glLineWidth(1.0f);
glTranslatef(cent[0] - t->mval[0] + mval[0], cent[1] - t->mval[1] + mval[1], 0);
immBegin(PRIM_LINES, 2);
immVertex2f(POS_INDEX, (float)t->mval[0], (float)t->mval[1]);
immVertex2fv(POS_INDEX, cent);
immEnd();
gpuTranslate3f(cent[0] - t->mval[0] + mval[0], cent[1] - t->mval[1] + mval[1], 0);
setlinestyle(0);
glLineWidth(3.0);
glLineWidth(3.0f);
drawArc(dist, angle - delta_angle, angle - spacing_angle, 10);
drawArc(dist, angle + spacing_angle, angle + delta_angle, 10);
glPushMatrix();
gpuPushMatrix();
glTranslatef(cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
glRotatef(RAD2DEGF(angle - delta_angle), 0, 0, 1);
gpuTranslate3f(cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
gpuRotateAxis(RAD2DEGF(angle - delta_angle), 'Z');
drawArrowHead(DOWN, 5);
glPopMatrix();
gpuPopMatrix();
glTranslatef(cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
glRotatef(RAD2DEGF(angle + delta_angle), 0, 0, 1);
gpuTranslate3f(cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
gpuRotateAxis(RAD2DEGF(angle + delta_angle), 'Z');
drawArrowHead(UP, 5);
break;
@@ -1794,18 +1804,18 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
unsigned char col[3], col2[3];
UI_GetThemeColor3ubv(TH_GRID, col);
glTranslate2iv(mval);
gpuTranslate3fv(mval);
glLineWidth(3.0);
glLineWidth(3.0f);
UI_make_axis_color(col, col2, 'X');
glColor3ubv((GLubyte *)col2);
immUniformColor3ubv((GLubyte *)col2);
drawArrow(RIGHT, 5, 10, 5);
drawArrow(LEFT, 5, 10, 5);
UI_make_axis_color(col, col2, 'Y');
glColor3ubv((GLubyte *)col2);
immUniformColor3ubv((GLubyte *)col2);
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
@@ -1813,7 +1823,8 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
}
}
glPopMatrix();
immUnbindProgram();
gpuMatrixEnd();
}
}
@@ -1821,7 +1832,7 @@ static void drawTransformView(const struct bContext *C, ARegion *UNUSED(ar), voi
{
TransInfo *t = arg;
glLineWidth(1.0);
glLineWidth(1.0f);
drawConstraint(t);
drawPropCircle(C, t);
@@ -6831,10 +6842,13 @@ static void drawEdgeSlide(TransInfo *t)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT | GL_POINT_BIT);
glPushMatrix();
gpuMatrixBegin3D_legacy();
glMultMatrixf(t->obedit->obmat);
gpuMultMatrix3D(t->obedit->obmat);
unsigned pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
if (sld->use_even == true) {
float co_a[3], co_b[3], co_mark[3];
@@ -6848,39 +6862,35 @@ static void drawEdgeSlide(TransInfo *t)
add_v3_v3v3(co_b, curr_sv->v_co_orig, curr_sv->dir_side[1]);
glLineWidth(line_size);
UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
glBegin(GL_LINES);
immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
immBeginAtMost(PRIM_LINES, 4);
if (curr_sv->v_side[0]) {
glVertex3fv(curr_sv->v_side[0]->co);
glVertex3fv(curr_sv->v_co_orig);
immVertex3fv(pos, curr_sv->v_side[0]->co);
immVertex3fv(pos, curr_sv->v_co_orig);
}
if (curr_sv->v_side[1]) {
glVertex3fv(curr_sv->v_side[1]->co);
glVertex3fv(curr_sv->v_co_orig);
immVertex3fv(pos, curr_sv->v_side[1]->co);
immVertex3fv(pos, curr_sv->v_co_orig);
}
glEnd();
immEnd();
UI_ThemeColorShadeAlpha(TH_SELECT, -30, alpha_shade);
immUniformThemeColorShadeAlpha(TH_SELECT, -30, alpha_shade);
glPointSize(ctrl_size);
glBegin(GL_POINTS);
immBegin(PRIM_POINTS, 1);
if (sld->flipped) {
if (curr_sv->v_side[1]) glVertex3fv(curr_sv->v_side[1]->co);
if (curr_sv->v_side[1]) immVertex3fv(pos, curr_sv->v_side[1]->co);
}
else {
if (curr_sv->v_side[0]) glVertex3fv(curr_sv->v_side[0]->co);
if (curr_sv->v_side[0]) immVertex3fv(pos, curr_sv->v_side[0]->co);
}
glEnd();
immEnd();
UI_ThemeColorShadeAlpha(TH_SELECT, 255, alpha_shade);
immUniformThemeColorShadeAlpha(TH_SELECT, 255, alpha_shade);
glPointSize(guide_size);
glBegin(GL_POINTS);
#if 0
interp_v3_v3v3(co_mark, co_b, co_a, fac);
glVertex3fv(co_mark);
#endif
immBegin(PRIM_POINTS, 1);
interp_line_v3_v3v3v3(co_mark, co_b, curr_sv->v_co_orig, co_a, fac);
glVertex3fv(co_mark);
glEnd();
immVertex3fv(pos, co_mark);
immEnd();
}
else {
if (is_clamp == false) {
@@ -6890,8 +6900,8 @@ static void drawEdgeSlide(TransInfo *t)
const int alpha_shade = -160;
glLineWidth(line_size);
UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
glBegin(GL_LINES);
immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
immBegin(PRIM_LINES, sld->totsv * 2);
sv = sld->sv;
for (i = 0; i < sld->totsv; i++, sv++) {
@@ -6909,18 +6919,19 @@ static void drawEdgeSlide(TransInfo *t)
add_v3_v3(a, sv->v_co_orig);
add_v3_v3(b, sv->v_co_orig);
glVertex3fv(a);
glVertex3fv(b);
immVertex3fv(pos, a);
immVertex3fv(pos, b);
}
glEnd();
immEnd();
}
else {
BLI_assert(0);
}
}
glPopMatrix();
glPopAttrib();
immUnbindProgram();
gpuMatrixEnd();
glDisable(GL_BLEND);
@@ -7444,19 +7455,23 @@ static void drawVertSlide(TransInfo *t)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT | GL_POINT_BIT);
glPushMatrix();
gpuMatrixBegin3D_legacy();
glMultMatrixf(t->obedit->obmat);
gpuMultMatrix3D(t->obedit->obmat);
glLineWidth(line_size);
UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
glBegin(GL_LINES);
unsigned pos = add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
immBegin(PRIM_LINES, sld->totsv * 2);
if (is_clamp) {
sv = sld->sv;
for (i = 0; i < sld->totsv; i++, sv++) {
glVertex3fv(sv->co_orig_3d);
glVertex3fv(sv->co_link_orig_3d[sv->co_link_curr]);
immVertex3fv(pos, sv->co_orig_3d);
immVertex3fv(pos, sv->co_link_orig_3d[sv->co_link_curr]);
}
}
else {
@@ -7469,19 +7484,19 @@ static void drawVertSlide(TransInfo *t)
add_v3_v3(a, sv->co_orig_3d);
add_v3_v3(b, sv->co_orig_3d);
glVertex3fv(a);
glVertex3fv(b);
immVertex3fv(pos, a);
immVertex3fv(pos, b);
}
}
glEnd();
immEnd();
glPointSize(ctrl_size);
glBegin(GL_POINTS);
glVertex3fv((sld->flipped && sld->use_even) ?
immBegin(PRIM_POINTS, 1);
immVertex3fv(pos, (sld->flipped && sld->use_even) ?
curr_sv->co_link_orig_3d[curr_sv->co_link_curr] :
curr_sv->co_orig_3d);
glEnd();
immEnd();
glDisable(GL_BLEND);
@@ -7507,19 +7522,20 @@ static void drawVertSlide(TransInfo *t)
add_v3_v3(co_dest_3d, curr_sv->co_orig_3d);
glLineWidth(1);
glLineWidth(1.0f);
setlinestyle(1);
cpack(0xffffff);
glBegin(GL_LINES);
glVertex3fv(curr_sv->co_orig_3d);
glVertex3fv(co_dest_3d);
imm_cpack(0xffffff);
glEnd();
immBegin(PRIM_LINES, 2);
immVertex3fv(pos, curr_sv->co_orig_3d);
immVertex3fv(pos, co_dest_3d);
immEnd();
}
glPopMatrix();
glPopAttrib();
immUnbindProgram();
gpuMatrixEnd();
if (v3d && v3d->zbuf)
glEnable(GL_DEPTH_TEST);