OpenGL immediate mode: editmesh_knife.c

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

Part of T49043
This commit is contained in:
Luca Rood 2017-01-25 22:14:13 -02:00
parent fd089843b3
commit 13399d471e
1 changed files with 75 additions and 53 deletions

View File

@ -57,6 +57,8 @@
#include "BIF_gl.h"
#include "BIF_glutil.h" /* for paint cursor */
#include "GPU_immediate.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_view3d.h"
@ -1002,12 +1004,18 @@ static void knifetool_draw_angle_snapping(const KnifeTool_OpData *kcd)
copy_v3_v3(v2, ray_hit_best[1]);
}
UI_ThemeColor(TH_TRANSFORM);
unsigned pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformThemeColor(TH_TRANSFORM);
glLineWidth(2.0);
glBegin(GL_LINES);
glVertex3fv(v1);
glVertex3fv(v2);
glEnd();
immBegin(GL_LINES, 2);
immVertex3fv(pos, v1);
immVertex3fv(pos, v2);
immEnd();
immUnbindProgram();
}
static void knife_init_colors(KnifeColors *colors)
@ -1038,63 +1046,66 @@ static void knifetool_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
glPushMatrix();
glMultMatrixf(kcd->ob->obmat);
unsigned pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 3, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
if (kcd->mode == MODE_DRAGGING) {
if (kcd->is_angle_snapping)
knifetool_draw_angle_snapping(kcd);
glColor3ubv(kcd->colors.line);
immUniformColor3ubv(kcd->colors.line);
glLineWidth(2.0);
glBegin(GL_LINES);
glVertex3fv(kcd->prev.cage);
glVertex3fv(kcd->curr.cage);
glEnd();
immBegin(GL_LINES, 2);
immVertex3fv(pos, kcd->prev.cage);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
if (kcd->prev.vert) {
glColor3ubv(kcd->colors.point);
immUniformColor3ubv(kcd->colors.point);
glPointSize(11);
glBegin(GL_POINTS);
glVertex3fv(kcd->prev.cage);
glEnd();
immBegin(GL_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->prev.bmface) {
glColor3ubv(kcd->colors.curpoint);
immUniformColor3ubv(kcd->colors.curpoint);
glPointSize(9);
glBegin(GL_POINTS);
glVertex3fv(kcd->prev.cage);
glEnd();
immBegin(GL_POINTS, 1);
immVertex3fv(pos, kcd->prev.cage);
immEnd();
}
if (kcd->curr.edge) {
glColor3ubv(kcd->colors.edge);
immUniformColor3ubv(kcd->colors.edge);
glLineWidth(2.0);
glBegin(GL_LINES);
glVertex3fv(kcd->curr.edge->v1->cageco);
glVertex3fv(kcd->curr.edge->v2->cageco);
glEnd();
immBegin(GL_LINES, 2);
immVertex3fv(pos, kcd->curr.edge->v1->cageco);
immVertex3fv(pos, kcd->curr.edge->v2->cageco);
immEnd();
}
else if (kcd->curr.vert) {
glColor3ubv(kcd->colors.point);
immUniformColor3ubv(kcd->colors.point);
glPointSize(11);
glBegin(GL_POINTS);
glVertex3fv(kcd->curr.cage);
glEnd();
immBegin(GL_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
if (kcd->curr.bmface) {
glColor3ubv(kcd->colors.curpoint);
immUniformColor3ubv(kcd->colors.curpoint);
glPointSize(9);
glBegin(GL_POINTS);
glVertex3fv(kcd->curr.cage);
glEnd();
immBegin(GL_POINTS, 1);
immVertex3fv(pos, kcd->curr.cage);
immEnd();
}
if (kcd->totlinehit > 0) {
@ -1105,26 +1116,35 @@ static void knifetool_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* draw any snapped verts first */
glColor4ubv(kcd->colors.point_a);
immUniformColor4ubv(kcd->colors.point_a);
glPointSize(11);
glBegin(GL_POINTS);
immBeginAtMost(GL_POINTS, kcd->totlinehit);
lh = kcd->linehits;
for (i = 0; i < kcd->totlinehit; i++, lh++) {
if (lh->v)
glVertex3fv(lh->cagehit);
if (lh->v) {
immVertex3fv(pos, lh->cagehit);
}
}
glEnd();
immEnd();
/* now draw the rest */
glColor4ubv(kcd->colors.curpoint_a);
immUniformColor4ubv(kcd->colors.curpoint_a);
glPointSize(7);
glBegin(GL_POINTS);
immBeginAtMost(GL_POINTS, kcd->totlinehit);
lh = kcd->linehits;
for (i = 0; i < kcd->totlinehit; i++, lh++) {
if (!lh->v)
glVertex3fv(lh->cagehit);
if (!lh->v) {
immVertex3fv(pos, lh->cagehit);
}
}
glEnd();
immEnd();
glDisable(GL_BLEND);
}
@ -1132,43 +1152,45 @@ static void knifetool_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
BLI_mempool_iter iter;
KnifeEdge *kfe;
immUniformColor3ubv(kcd->colors.line);
glLineWidth(1.0);
glBegin(GL_LINES);
immBeginAtMost(GL_LINES, BLI_mempool_count(kcd->kedges) * 2);
BLI_mempool_iternew(kcd->kedges, &iter);
for (kfe = BLI_mempool_iterstep(&iter); kfe; kfe = BLI_mempool_iterstep(&iter)) {
if (!kfe->is_cut)
continue;
glColor3ubv(kcd->colors.line);
glVertex3fv(kfe->v1->cageco);
glVertex3fv(kfe->v2->cageco);
immVertex3fv(pos, kfe->v1->cageco);
immVertex3fv(pos, kfe->v2->cageco);
}
glEnd();
immEnd();
}
if (kcd->totkvert > 0) {
BLI_mempool_iter iter;
KnifeVert *kfv;
immUniformColor3ubv(kcd->colors.point);
glPointSize(5.0);
glBegin(GL_POINTS);
immBeginAtMost(GL_POINTS, BLI_mempool_count(kcd->kverts));
BLI_mempool_iternew(kcd->kverts, &iter);
for (kfv = BLI_mempool_iterstep(&iter); kfv; kfv = BLI_mempool_iterstep(&iter)) {
if (!kfv->is_cut)
continue;
glColor3ubv(kcd->colors.point);
glVertex3fv(kfv->cageco);
immVertex3fv(pos, kfv->cageco);
}
glEnd();
immEnd();
}
immUnbindProgram();
glPopMatrix();
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);