diff options
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 1546 |
1 files changed, 709 insertions, 837 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 4e9818deb72..65f1f375443 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -87,8 +87,9 @@ #include "BIF_glutil.h" #include "GPU_draw.h" -#include "GPU_extensions.h" #include "GPU_select.h" +#include "GPU_basic_shader.h" +#include "GPU_shader.h" #include "ED_mesh.h" #include "ED_particle.h" @@ -134,7 +135,6 @@ typedef struct drawDMVerts_userData { unsigned char th_vertex_select[4]; unsigned char th_vertex[4]; unsigned char th_skin_root[4]; - float th_vertex_size; /* for skin node drawing */ int cd_vskin_offset; @@ -214,7 +214,7 @@ static void drawcube_size(float size); static void drawcircle_size(float size); static void draw_empty_sphere(float size); static void draw_empty_cone(float size); -static void draw_box(float vec[8][3], bool solid); +static void draw_box(const float vec[8][3], bool solid); static void ob_wire_color_blend_theme_id(const unsigned char ob_wire_col[4], const int theme_id, float fac) { @@ -289,8 +289,6 @@ static bool check_ob_drawface_dot(Scene *sce, View3D *vd, char dt) bool draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, const char dt) { - if (!GPU_glsl_support()) - return false; if (G.f & G_PICKSEL) return false; if (!check_object_draw_texture(scene, v3d, dt)) @@ -403,98 +401,117 @@ static const float cosval[CIRCLE_RESOL] = { 1.00000000 }; -static void draw_xyz_wire(const float c[3], float size, int axis) +/** + * \param viewmat_local_unit is typically the 'rv3d->viewmatob' + * copied into a 3x3 matrix and normalized. + */ +static void draw_xyz_wire(const float viewmat_local_unit[3][3], const float c[3], float size, int axis) { + int line_type; + float buffer[4][3]; + int n = 0; + float v1[3] = {0.0f, 0.0f, 0.0f}, v2[3] = {0.0f, 0.0f, 0.0f}; float dim = size * 0.1f; - float dx[3], dy[3], dz[3]; + float dx[3], dy[3]; dx[0] = dim; dx[1] = 0.0f; dx[2] = 0.0f; dy[0] = 0.0f; dy[1] = dim; dy[2] = 0.0f; - dz[0] = 0.0f; dz[1] = 0.0f; dz[2] = dim; switch (axis) { case 0: /* x axis */ - glBegin(GL_LINES); - + line_type = GL_LINES; + /* bottom left to top right */ - sub_v3_v3v3(v1, c, dx); + negate_v3_v3(v1, dx); sub_v3_v3(v1, dy); - add_v3_v3v3(v2, c, dx); + copy_v3_v3(v2, dx); add_v3_v3(v2, dy); - - glVertex3fv(v1); - glVertex3fv(v2); + + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); /* top left to bottom right */ mul_v3_fl(dy, 2.0f); add_v3_v3(v1, dy); sub_v3_v3(v2, dy); - glVertex3fv(v1); - glVertex3fv(v2); - - glEnd(); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); + break; case 1: /* y axis */ - glBegin(GL_LINES); + line_type = GL_LINES; /* bottom left to top right */ mul_v3_fl(dx, 0.75f); - sub_v3_v3v3(v1, c, dx); + negate_v3_v3(v1, dx); sub_v3_v3(v1, dy); - add_v3_v3v3(v2, c, dx); + copy_v3_v3(v2, dx); add_v3_v3(v2, dy); - glVertex3fv(v1); - glVertex3fv(v2); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); /* top left to center */ mul_v3_fl(dy, 2.0f); add_v3_v3(v1, dy); - copy_v3_v3(v2, c); + zero_v3(v2); - glVertex3fv(v1); - glVertex3fv(v2); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); - glEnd(); break; case 2: /* z axis */ - glBegin(GL_LINE_STRIP); + line_type = GL_LINE_STRIP; /* start at top left */ - sub_v3_v3v3(v1, c, dx); - add_v3_v3v3(v1, c, dz); + negate_v3_v3(v1, dx); + add_v3_v3(v1, dy); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); mul_v3_fl(dx, 2.0f); add_v3_v3(v1, dx); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); - mul_v3_fl(dz, 2.0f); + mul_v3_fl(dy, 2.0f); sub_v3_v3(v1, dx); - sub_v3_v3(v1, dz); + sub_v3_v3(v1, dy); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); add_v3_v3(v1, dx); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); - glEnd(); break; + default: + BLI_assert(0); + return; } + + for (int i = 0; i < n; i++) { + mul_transposed_m3_v3((float (*)[3])viewmat_local_unit, buffer[i]); + add_v3_v3(buffer[i], c); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, buffer); + glDrawArrays(line_type, 0, n); + glDisableClientState(GL_VERTEX_ARRAY); } -void drawaxes(float size, char drawtype) +void drawaxes(const float viewmat_local[4][4], float size, char drawtype) { int axis; float v1[3] = {0.0, 0.0, 0.0}; float v2[3] = {0.0, 0.0, 0.0}; float v3[3] = {0.0, 0.0, 0.0}; - + + glLineWidth(1); + switch (drawtype) { case OB_PLAINAXES: @@ -565,6 +582,11 @@ void drawaxes(float size, char drawtype) case OB_ARROWS: default: { + float viewmat_local_unit[3][3]; + + copy_m3_m4(viewmat_local_unit, (float (*)[4])viewmat_local); + normalize_m3(viewmat_local_unit); + for (axis = 0; axis < 3; axis++) { const int arrow_axis = (axis == 0) ? 1 : 0; @@ -587,7 +609,7 @@ void drawaxes(float size, char drawtype) v2[axis] += size * 0.125f; - draw_xyz_wire(v2, size, axis); + draw_xyz_wire(viewmat_local_unit, v2, size, axis); /* reset v1 & v2 to zero */ @@ -605,13 +627,12 @@ static void draw_empty_image(Object *ob, const short dflag, const unsigned char Image *ima = ob->data; ImBuf *ibuf = BKE_image_acquire_ibuf(ima, ob->iuser, NULL); - float scale, ofs_x, ofs_y, sca_x, sca_y; - int ima_x, ima_y; - if (ibuf && (ibuf->rect == NULL) && (ibuf->rect_float != NULL)) { IMB_rect_from_float(ibuf); } + int ima_x, ima_y; + /* Get the buffer dimensions so we can fallback to fake ones */ if (ibuf && ibuf->rect) { ima_x = ibuf->x; @@ -622,45 +643,38 @@ static void draw_empty_image(Object *ob, const short dflag, const unsigned char ima_y = 1; } + float sca_x = 1.0f; + float sca_y = 1.0f; + /* Get the image aspect even if the buffer is invalid */ if (ima) { if (ima->aspx > ima->aspy) { - sca_x = 1.0f; sca_y = ima->aspy / ima->aspx; } else if (ima->aspx < ima->aspy) { sca_x = ima->aspx / ima->aspy; - sca_y = 1.0f; - } - else { - sca_x = 1.0f; - sca_y = 1.0f; } } - else { - sca_x = 1.0f; - sca_y = 1.0f; - } /* Calculate the scale center based on object's origin */ - ofs_x = ob->ima_ofs[0] * ima_x; - ofs_y = ob->ima_ofs[1] * ima_y; + float ofs_x = ob->ima_ofs[0] * ima_x; + float ofs_y = ob->ima_ofs[1] * ima_y; glMatrixMode(GL_MODELVIEW); glPushMatrix(); /* Calculate Image scale */ - scale = (ob->empty_drawsize / max_ff((float)ima_x * sca_x, (float)ima_y * sca_y)); + float scale = ob->empty_drawsize / max_ff((float)ima_x * sca_x, (float)ima_y * sca_y); /* Set the object scale */ glScalef(scale * sca_x, scale * sca_y, 1.0f); if (ibuf && ibuf->rect) { const bool use_clip = (U.glalphaclip != 1.0f); - int zoomfilter = (U.gameflags & USER_DISABLE_MIPMAP ) ? GL_NEAREST : GL_LINEAR; + int zoomfilter = (U.gameflags & USER_DISABLE_MIPMAP) ? GL_NEAREST : GL_LINEAR; /* Setup GL params */ glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (use_clip) { glEnable(GL_ALPHA_TEST); @@ -672,13 +686,12 @@ static void draw_empty_image(Object *ob, const short dflag, const unsigned char /* Draw the Image on the screen */ glaDrawPixelsTex(ofs_x, ofs_y, ima_x, ima_y, GL_RGBA, GL_UNSIGNED_BYTE, zoomfilter, ibuf->rect); - glPixelTransferf(GL_ALPHA_SCALE, 1.0f); glDisable(GL_BLEND); if (use_clip) { glDisable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.0f); + glAlphaFunc(GL_ALWAYS, 0.0f); } } @@ -694,31 +707,28 @@ static void draw_empty_image(Object *ob, const short dflag, const unsigned char glVertex2f(ofs_x, ofs_y + ima_y); glEnd(); - /* Reset GL settings */ - glMatrixMode(GL_MODELVIEW); glPopMatrix(); BKE_image_release_ibuf(ima, ibuf, NULL); } -static void circball_array_fill(float verts[CIRCLE_RESOL][3], const float cent[3], float rad, float tmat[4][4]) +static void circball_array_fill(float verts[CIRCLE_RESOL][3], const float cent[3], float rad, const float tmat[4][4]) { float vx[3], vy[3]; float *viter = (float *)verts; - unsigned int a; mul_v3_v3fl(vx, tmat[0], rad); mul_v3_v3fl(vy, tmat[1], rad); - for (a = 0; a < CIRCLE_RESOL; a++, viter += 3) { + for (unsigned int a = 0; a < CIRCLE_RESOL; a++, viter += 3) { viter[0] = cent[0] + sinval[a] * vx[0] + cosval[a] * vy[0]; viter[1] = cent[1] + sinval[a] * vx[1] + cosval[a] * vy[1]; viter[2] = cent[2] + sinval[a] * vx[2] + cosval[a] * vy[2]; } } -void drawcircball(int mode, const float cent[3], float rad, float tmat[4][4]) +void drawcircball(int mode, const float cent[3], float rad, const float tmat[4][4]) { float verts[CIRCLE_RESOL][3]; @@ -736,8 +746,8 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], const float size = ED_view3d_pixel_size(rv3d, co) * (float)U.obcenter_dia * 0.5f; float verts[CIRCLE_RESOL][3]; - /* using gldepthfunc guarantees that it does write z values, - * but not checks for it, so centers remain visible independent order of drawing */ + /* using glDepthFunc guarantees that it does write z values, + * but not checks for it, so centers remain visible independent of draw order */ if (v3d->zbuf) glDepthFunc(GL_ALWAYS); /* write to near buffer always */ glDepthRange(0.0, 0.0); @@ -745,7 +755,6 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], if (special_color) { if (selstate == ACTIVE || selstate == SELECT) glColor4ub(0x88, 0xFF, 0xFF, 155); - else glColor4ub(0x55, 0xCC, 0xCC, 155); } else { @@ -764,6 +773,7 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], glDrawArrays(GL_POLYGON, 0, CIRCLE_RESOL); /* 2. draw outline */ + glLineWidth(1); UI_ThemeColorShadeAlpha(TH_WIRE, 0, -30); glDrawArrays(GL_LINE_LOOP, 0, CIRCLE_RESOL); @@ -829,7 +839,7 @@ void view3d_cached_text_draw_add(const float co[3], BLI_LINKS_PREPEND(g_v3d_strings[g_v3d_string_level], vos); copy_v3_v3(vos->vec, co); - copy_v4_v4_char((char *)vos->col.ub, (const char *)col); + copy_v4_v4_uchar(vos->col.ub, col); vos->xoffs = xoffs; vos->flag = flag; vos->str_len = str_len; @@ -883,7 +893,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, bool depth_write, flo glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); - wmOrtho2_region_ui(ar); + wmOrtho2_region_pixelspace(ar); glLoadIdentity(); if (depth_write) { @@ -947,59 +957,24 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, bool depth_write, flo */ static void drawcube_size(float size) { - glBegin(GL_LINE_STRIP); - glVertex3f(-size, -size, -size); glVertex3f(-size, -size, size); - glVertex3f(-size, size, size); glVertex3f(-size, size, -size); - - glVertex3f(-size, -size, -size); glVertex3f(size, -size, -size); - glVertex3f(size, -size, size); glVertex3f(size, size, size); - - glVertex3f(size, size, -size); glVertex3f(size, -size, -size); - glEnd(); - - glBegin(GL_LINE_STRIP); - glVertex3f(-size, -size, size); glVertex3f(size, -size, size); - glEnd(); - - glBegin(GL_LINE_STRIP); - glVertex3f(-size, size, size); glVertex3f(size, size, size); - glEnd(); - - glBegin(GL_LINE_STRIP); - glVertex3f(-size, size, -size); glVertex3f(size, size, -size); - glEnd(); -} - -/* this is an unused (old) cube-drawing function based on a given size */ -#if 0 -static void drawcube_size(const float size[3]) -{ - - glPushMatrix(); - glScale3fv(size); - - - glBegin(GL_LINE_STRIP); - glVertex3fv(cube[0]); glVertex3fv(cube[1]); glVertex3fv(cube[2]); glVertex3fv(cube[3]); - glVertex3fv(cube[0]); glVertex3fv(cube[4]); glVertex3fv(cube[5]); glVertex3fv(cube[6]); - glVertex3fv(cube[7]); glVertex3fv(cube[4]); - glEnd(); + const GLfloat pos[8][3] = { + {-size, -size, -size}, + {-size, -size, size}, + {-size, size, -size}, + {-size, size, size}, + { size, -size, -size}, + { size, -size, size}, + { size, size, -size}, + { size, size, size} + }; - glBegin(GL_LINE_STRIP); - glVertex3fv(cube[1]); glVertex3fv(cube[5]); - glEnd(); + const GLubyte indices[24] = {0,1,1,3,3,2,2,0,0,4,4,5,5,7,7,6,6,4,1,5,3,7,2,6}; - glBegin(GL_LINE_STRIP); - glVertex3fv(cube[2]); glVertex3fv(cube[6]); - glEnd(); - - glBegin(GL_LINE_STRIP); - glVertex3fv(cube[3]); glVertex3fv(cube[7]); - glEnd(); - - glPopMatrix(); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, pos); + glDrawRangeElements(GL_LINES, 0, 7, 24, GL_UNSIGNED_BYTE, indices); + glDisableClientState(GL_VERTEX_ARRAY); } -#endif static void drawshadbuflimits(Lamp *la, float mat[4][4]) { @@ -1011,17 +986,16 @@ static void drawshadbuflimits(Lamp *la, float mat[4][4]) madd_v3_v3v3fl(sta, mat[3], lavec, la->clipsta); madd_v3_v3v3fl(end, mat[3], lavec, la->clipend); - glBegin(GL_LINE_STRIP); + glBegin(GL_LINES); glVertex3fv(sta); glVertex3fv(end); glEnd(); glPointSize(3.0); - bglBegin(GL_POINTS); - bglVertex3fv(sta); - bglVertex3fv(end); - bglEnd(); - glPointSize(1.0); + glBegin(GL_POINTS); + glVertex3fv(sta); + glVertex3fv(end); + glEnd(); } static void spotvolume(float lvec[3], float vvec[3], const float inp) @@ -1085,8 +1059,6 @@ static void spotvolume(float lvec[3], float vvec[3], const float inp) mul_m3_v3(mat2, lvec); mul_m3_m3m3(mat2, mat1, mat4); mul_m3_v3(mat2, vvec); - - return; } static void draw_spot_cone(Lamp *la, float x, float z) @@ -1104,11 +1076,8 @@ static void draw_spot_cone(Lamp *la, float x, float z) glVertex3f(z, z, 0); } else { - float angle; - int a; - - for (a = 0; a < 33; a++) { - angle = a * M_PI * 2 / (33 - 1); + for (int a = 0; a < 33; a++) { + float angle = a * M_PI * 2 / (33 - 1); glVertex3f(z * cosf(angle), z * sinf(angle), 0); } } @@ -1198,7 +1167,7 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, Object *ob = base->object; const float pixsize = ED_view3d_pixel_size(rv3d, ob->obmat[3]); Lamp *la = ob->data; - float vec[3], lvec[3], vvec[3], circrad, x, y, z; + float vec[3], lvec[3], vvec[3], circrad; float lampsize; float imat[4][4]; @@ -1259,6 +1228,8 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, glColor4ubv(curcol); } + glLineWidth(1); + if (lampsize > 0.0f) { if ((dflag & DRAW_CONSTCOLOR) == 0) { @@ -1344,8 +1315,8 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, if (is_view) { /* skip drawing extra info */ } - else if ((la->type == LA_SPOT) || (la->type == LA_YF_PHOTON)) { - + else if (la->type == LA_SPOT) { + float x, y, z, z_abs; copy_v3_fl3(lvec, 0.0f, 0.0f, 1.0f); copy_v3_fl3(vvec, rv3d->persmat[0][2], rv3d->persmat[1][2], rv3d->persmat[2][2]); mul_transposed_mat3_m4_v3(ob->obmat, vvec); @@ -1358,46 +1329,75 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, mul_v3_fl(lvec, x); mul_v3_fl(vvec, x); - /* draw the angled sides of the cone */ - glBegin(GL_LINE_STRIP); - glVertex3fv(vvec); - glVertex3fv(vec); - glVertex3fv(lvec); - glEnd(); - x *= y; - /* draw the circle/square at the end of the cone */ - glTranslatef(0.0, 0.0, x); + z_abs = fabsf(z); + if (la->mode & LA_SQUARE) { - float tvec[3]; - float z_abs = fabsf(z); - - tvec[0] = tvec[1] = z_abs; - tvec[2] = 0.0; - - glBegin(GL_LINE_LOOP); - glVertex3fv(tvec); - tvec[1] = -z_abs; /* neg */ - glVertex3fv(tvec); - tvec[0] = -z_abs; /* neg */ - glVertex3fv(tvec); - tvec[1] = z_abs; /* pos */ - glVertex3fv(tvec); - glEnd(); + /* draw pyramid */ + const float vertices[5][3] = { + /* 5 of vertex coords of pyramid */ + {0.0f, 0.0f, 0.0f}, + {z_abs, z_abs, x}, + {-z_abs, -z_abs, x}, + {z_abs, -z_abs, x}, + {-z_abs, z_abs, x}, + }; + const unsigned char indices[] = { + 0, 1, 3, + 0, 3, 2, + 0, 2, 4, + 0, 1, 4, + }; + + /* Draw call: + * activate and specify pointer to vertex array */ + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, vertices); + /* draw the pyramid */ + glDrawElements(GL_LINE_STRIP, 12, GL_UNSIGNED_BYTE, indices); + + /* deactivate vertex arrays after drawing */ + glDisableClientState(GL_VERTEX_ARRAY); + + glTranslatef(0.0f, 0.0f, x); + + /* draw the square representing spotbl */ + if (la->type == LA_SPOT) { + float blend = z_abs * (1.0f - pow2f(la->spotblend)); + + /* hide line if it is zero size or overlaps with outer border, + * previously it adjusted to always to show it but that seems + * confusing because it doesn't show the actual blend size */ + if (blend != 0.0f && blend != z_abs) { + fdrawbox(blend, -blend, -blend, blend); + } + } } else { - circ(0.0, 0.0, fabsf(z)); - } - /* draw the circle/square representing spotbl */ - if (la->type == LA_SPOT) { - float spotblcirc = fabsf(z) * (1.0f - pow2f(la->spotblend)); - /* hide line if it is zero size or overlaps with outer border, - * previously it adjusted to always to show it but that seems - * confusing because it doesn't show the actual blend size */ - if (spotblcirc != 0 && spotblcirc != fabsf(z)) - circ(0.0, 0.0, spotblcirc); + /* draw the angled sides of the cone */ + glBegin(GL_LINE_STRIP); + glVertex3fv(vvec); + glVertex3fv(vec); + glVertex3fv(lvec); + glEnd(); + + /* draw the circle at the end of the cone */ + glTranslatef(0.0f, 0.0f, x); + circ(0.0f, 0.0f, z_abs); + + /* draw the circle representing spotbl */ + if (la->type == LA_SPOT) { + float blend = z_abs * (1.0f - pow2f(la->spotblend)); + + /* hide line if it is zero size or overlaps with outer border, + * previously it adjusted to always to show it but that seems + * confusing because it doesn't show the actual blend size */ + if (blend != 0.0f && blend != z_abs) { + circ(0.0f, 0.0f, blend); + } + } } if (drawcone) @@ -1405,6 +1405,7 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, /* draw clip start, useful for wide cones where its not obvious where the start is */ glTranslatef(0.0, 0.0, -x); /* reverse translation above */ + glBegin(GL_LINES); if (la->type == LA_SPOT && (la->mode & LA_SHAD_BUF)) { float lvec_clip[3]; float vvec_clip[3]; @@ -1413,23 +1414,20 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, interp_v3_v3v3(lvec_clip, vec, lvec, clipsta_fac); interp_v3_v3v3(vvec_clip, vec, vvec, clipsta_fac); - glBegin(GL_LINE_STRIP); glVertex3fv(lvec_clip); glVertex3fv(vvec_clip); - glEnd(); } /* Else, draw spot direction (using distance as end limit, same as for Area lamp). */ else { - glBegin(GL_LINE_STRIP); glVertex3f(0.0, 0.0, -circrad); glVertex3f(0.0, 0.0, -la->dist); - glEnd(); } + glEnd(); } else if (ELEM(la->type, LA_HEMI, LA_SUN)) { /* draw the line from the circle along the dist */ - glBegin(GL_LINE_STRIP); + glBegin(GL_LINES); vec[2] = -circrad; glVertex3fv(vec); vec[2] = -la->dist; @@ -1489,7 +1487,7 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, else if (la->area_shape == LA_AREA_RECT) fdrawbox(-la->area_size * 0.5f, -la->area_sizey * 0.5f, la->area_size * 0.5f, la->area_sizey * 0.5f); - glBegin(GL_LINE_STRIP); + glBegin(GL_LINES); glVertex3f(0.0, 0.0, -circrad); glVertex3f(0.0, 0.0, -la->dist); glEnd(); @@ -1516,7 +1514,7 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, if (vec[2] > 0) vec[2] -= circrad; else vec[2] += circrad; - glBegin(GL_LINE_STRIP); + glBegin(GL_LINES); glVertex3fv(vec); vec[2] = 0; glVertex3fv(vec); @@ -1526,7 +1524,6 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, glBegin(GL_POINTS); glVertex3fv(vec); glEnd(); - glPointSize(1.0); glDisable(GL_BLEND); @@ -1538,7 +1535,7 @@ static void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, glPopMatrix(); } -static void draw_limit_line(float sta, float end, const short dflag, unsigned int col) +static void draw_limit_line(float sta, float end, const short dflag, const unsigned char col[3]) { glBegin(GL_LINES); glVertex3f(0.0, 0.0, -sta); @@ -1549,12 +1546,11 @@ static void draw_limit_line(float sta, float end, const short dflag, unsigned in glPointSize(3.0); glBegin(GL_POINTS); if ((dflag & DRAW_CONSTCOLOR) == 0) { - cpack(col); + glColor3ubv(col); } glVertex3f(0.0, 0.0, -sta); glVertex3f(0.0, 0.0, -end); glEnd(); - glPointSize(1.0); } } @@ -1601,10 +1597,11 @@ static void draw_bundle_sphere(void) glCallList(displist); } -static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *v3d, - MovieClip *clip, MovieTrackingObject *tracking_object, - const short dflag, const unsigned char ob_wire_col[4], - int *global_track_index, bool draw_selected) +static void draw_viewport_object_reconstruction( + Scene *scene, Base *base, const View3D *v3d, const RegionView3D *rv3d, + MovieClip *clip, MovieTrackingObject *tracking_object, + const short dflag, const unsigned char ob_wire_col[4], + int *global_track_index, bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingTrack *track; @@ -1665,8 +1662,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D v3d->bundle_size / 0.05f / camera_size[2]); if (v3d->drawtype == OB_WIRE) { - glDisable(GL_LIGHTING); - if ((dflag & DRAW_CONSTCOLOR) == 0) { if (selected && (track->flag & TRACK_CUSTOMCOLOR) == 0) { glColor3ubv(ob_wire_col); @@ -1676,9 +1671,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } } - drawaxes(0.05f, v3d->bundle_drawtype); - - glEnable(GL_LIGHTING); + drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype); } else if (v3d->drawtype > OB_WIRE) { if (v3d->bundle_drawtype == OB_EMPTY_SPHERE) { @@ -1689,14 +1682,11 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } glLineWidth(2.0f); - glDisable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); draw_bundle_sphere(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glEnable(GL_LIGHTING); - glLineWidth(1.0f); } if ((dflag & DRAW_CONSTCOLOR) == 0) { @@ -1707,8 +1697,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D draw_bundle_sphere(); } else { - glDisable(GL_LIGHTING); - if ((dflag & DRAW_CONSTCOLOR) == 0) { if (selected) { glColor3ubv(ob_wire_col); @@ -1719,9 +1707,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } } - drawaxes(0.05f, v3d->bundle_drawtype); - - glEnable(GL_LIGHTING); + drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype); } } @@ -1747,20 +1733,15 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D if (reconstruction->camnr) { MovieReconstructedCamera *camera = reconstruction->cameras; - int a = 0; - glDisable(GL_LIGHTING); UI_ThemeColor(TH_CAMERA_PATH); glLineWidth(2.0f); glBegin(GL_LINE_STRIP); - for (a = 0; a < reconstruction->camnr; a++, camera++) { + for (int a = 0; a < reconstruction->camnr; a++, camera++) { glVertex3fv(camera->mat[3]); } glEnd(); - - glLineWidth(1.0f); - glEnable(GL_LIGHTING); } } } @@ -1770,9 +1751,10 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *global_track_index = tracknr; } -static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, - const short dflag, const unsigned char ob_wire_col[4], - const bool draw_selected) +static void draw_viewport_reconstruction( + Scene *scene, Base *base, const View3D *v3d, const RegionView3D *rv3d, MovieClip *clip, + const short dflag, const unsigned char ob_wire_col[4], + const bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingObject *tracking_object; @@ -1784,23 +1766,23 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, if (v3d->flag2 & V3D_RENDER_OVERRIDE) return; - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glEnable(GL_COLOR_MATERIAL); + GPU_basic_shader_colors(NULL, NULL, 0, 1.0f); + GPU_basic_shader_bind(GPU_SHADER_LIGHTING | GPU_SHADER_USE_COLOR); + glShadeModel(GL_SMOOTH); tracking_object = tracking->objects.first; while (tracking_object) { - draw_viewport_object_reconstruction(scene, base, v3d, clip, tracking_object, - dflag, ob_wire_col, &global_track_index, draw_selected); + draw_viewport_object_reconstruction( + scene, base, v3d, rv3d, clip, tracking_object, + dflag, ob_wire_col, &global_track_index, draw_selected); tracking_object = tracking_object->next; } /* restore */ glShadeModel(GL_FLAT); - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_LIGHTING); + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); if ((dflag & DRAW_CONSTCOLOR) == 0) { glColor3ubv(ob_wire_col); @@ -1876,7 +1858,6 @@ static void drawcamera_stereo3d( Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, const Camera *cam, float vec[4][3], float drawsize, const float scale[3]) { - int i, j; float obmat[4][4]; float vec_lr[2][4][3]; const float fac = (cam->stereo.pivot == CAM_S3D_PIVOT_CENTER) ? 2.0f : 1.0f; @@ -1893,7 +1874,7 @@ static void drawcamera_stereo3d( glPushMatrix(); - for (i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { ob = BKE_camera_multiview_render(scene, ob, names[i]); cam_lr[i] = ob->data; @@ -1909,7 +1890,7 @@ static void drawcamera_stereo3d( ((BKE_camera_multiview_shift_x(&scene->r, ob, names[i]) - cam->shiftx) * (drawsize * scale[0] * fac)); - for (j = 0; j < 4; j++) { + for (int j = 0; j < 4; j++) { vec_lr[i][j][0] += shift_x; } } @@ -1927,7 +1908,7 @@ static void drawcamera_stereo3d( /* convergence plane */ if (is_stereo3d_plane || is_stereo3d_volume) { - for (j = 0; j < 4; j++) { + for (int j = 0; j < 4; j++) { mul_m4_v3(obmat, vec_lr[i][j]); } } @@ -1951,7 +1932,7 @@ static void drawcamera_stereo3d( glPopAttrib(); } - /* draw convergence plane*/ + /* draw convergence plane */ if (is_stereo3d_plane) { float axis_center[3], screen_center[3]; float world_plane[4][3]; @@ -1960,7 +1941,7 @@ static void drawcamera_stereo3d( mid_v3_v3v3(axis_center, origin[0], origin[1]); - for (i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { mid_v3_v3v3(world_plane[i], vec_lr[0][i], vec_lr[1][i]); sub_v3_v3v3(local_plane[i], world_plane[i], axis_center); } @@ -1968,7 +1949,7 @@ static void drawcamera_stereo3d( mid_v3_v3v3(screen_center, world_plane[0], world_plane[2]); offset = cam->stereo.convergence_distance / len_v3v3(screen_center, axis_center); - for (i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { mul_v3_fl(local_plane[i], offset); add_v3_v3(local_plane[i], axis_center); } @@ -1991,19 +1972,17 @@ static void drawcamera_stereo3d( } } - /* draw convergence plane*/ + /* draw convergence plane */ if (is_stereo3d_volume) { float screen_center[3]; float near_plane[4][3], far_plane[4][3]; - float offset; - int j; - for (i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { mid_v3_v3v3(screen_center, vec_lr[i][0], vec_lr[i][2]); - offset = len_v3v3(screen_center, origin[i]); + float offset = len_v3v3(screen_center, origin[i]); - for (j = 0; j < 4; j++) { + for (int j = 0; j < 4; j++) { sub_v3_v3v3(near_plane[j], vec_lr[i][j], origin[i]); mul_v3_fl(near_plane[j], cam_lr[i]->clipsta / offset); add_v3_v3(near_plane[j], origin[i]); @@ -2051,11 +2030,10 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base Object *ob = base->object; float tvec[3]; float vec[4][3], asp[2], shift[2], scale[3]; - int i; - float drawsize; MovieClip *clip = BKE_object_movieclip_get(scene, base->object, false); - const bool is_view = (rv3d->persp == RV3D_CAMOB && ob == v3d->camera); + const bool is_active = (ob == v3d->camera); + const bool is_view = (rv3d->persp == RV3D_CAMOB && is_active); const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0; const bool is_stereo3d = drawcamera_is_stereo3d(scene, v3d, ob); const bool is_stereo3d_view = (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D); @@ -2069,8 +2047,8 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base /* draw data for movie clip set as active for scene */ if (clip) { - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, false); - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, true); + draw_viewport_reconstruction(scene, base, v3d, rv3d, clip, dflag, ob_wire_col, false); + draw_viewport_reconstruction(scene, base, v3d, rv3d, clip, dflag, ob_wire_col, true); } #ifdef VIEW3D_CAMERA_BORDER_HACK @@ -2104,11 +2082,12 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base scale[2] = 1.0f / len_v3(ob->obmat[2]); } + float drawsize; BKE_camera_view_frame_ex(scene, cam, cam->drawsize, is_view, scale, asp, shift, &drawsize, vec); - glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); + glLineWidth(1); /* camera frame */ if (!is_stereo3d_cameras) { @@ -2145,9 +2124,9 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base /* draw an outline arrow for inactive cameras and filled * for active cameras. We actually draw both outline+filled * for active cameras so the wire can be seen side-on */ - for (i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { if (i == 0) glBegin(GL_LINE_LOOP); - else if (i == 1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES); + else if (i == 1 && is_active) glBegin(GL_TRIANGLES); else break; tvec[0] = shift[0] + ((-0.7f * drawsize) * scale[0]); @@ -2177,15 +2156,20 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base glMultMatrixf(nobmat); if (cam->flag & CAM_SHOWLIMITS) { - draw_limit_line(cam->clipsta, cam->clipend, dflag, 0x77FFFF); + const unsigned char col[3] = {128, 128, 60}, col_hi[3] = {255, 255, 120}; + + draw_limit_line(cam->clipsta, cam->clipend, dflag, (is_active ? col_hi : col)); /* qdn: was yafray only, now also enabled for Blender to be used with defocus composite node */ draw_focus_cross(BKE_camera_object_dof_distance(ob), cam->drawsize); } if (cam->flag & CAM_SHOWMIST) { World *world = scene->world; + const unsigned char col[3] = {128, 128, 128}, col_hi[3] = {255, 255, 255}; + if (world) { - draw_limit_line(world->miststa, world->miststa + world->mistdist, dflag, 0xFFFFFF); + draw_limit_line(world->miststa, world->miststa + world->mistdist, + dflag, (is_active ? col_hi : col)); } } glPopMatrix(); @@ -2203,15 +2187,15 @@ static void drawspeaker(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D Object *UNUSED(ob), int UNUSED(flag)) { float vec[3]; - int i, j; glEnable(GL_BLEND); + glLineWidth(1); - for (j = 0; j < 3; j++) { + for (int j = 0; j < 3; j++) { vec[2] = 0.25f * j - 0.125f; glBegin(GL_LINE_LOOP); - for (i = 0; i < 16; i++) { + for (int i = 0; i < 16; i++) { vec[0] = cosf((float)M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f); vec[1] = sinf((float)M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f); glVertex3fv(vec); @@ -2219,11 +2203,11 @@ static void drawspeaker(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D glEnd(); } - for (j = 0; j < 4; j++) { + for (int j = 0; j < 4; j++) { vec[0] = (((j + 1) % 2) * (j - 1)) * 0.5f; vec[1] = ((j % 2) * (j - 2)) * 0.5f; glBegin(GL_LINE_STRIP); - for (i = 0; i < 3; i++) { + for (int i = 0; i < 3; i++) { if (i == 1) { vec[0] *= 0.5f; vec[1] *= 0.5f; @@ -2242,30 +2226,29 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, BPoint *actbp, short s { BPoint *bp = lt->def; const float *co = dl ? dl->verts : NULL; - int u, v, w; const int color = sel ? TH_VERTEX_SELECT : TH_VERTEX; UI_ThemeColor(color); glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); - for (w = 0; w < lt->pntsw; w++) { + for (int w = 0; w < lt->pntsw; w++) { int wxt = (w == 0 || w == lt->pntsw - 1); - for (v = 0; v < lt->pntsv; v++) { + for (int v = 0; v < lt->pntsv; v++) { int vxt = (v == 0 || v == lt->pntsv - 1); - for (u = 0; u < lt->pntsu; u++, bp++, co += 3) { + for (int u = 0; u < lt->pntsu; u++, bp++, co += 3) { int uxt = (u == 0 || u == lt->pntsu - 1); if (!(lt->flag & LT_OUTSIDE) || uxt || vxt || wxt) { if (bp->hide == 0) { /* check for active BPoint and ensure selected */ if ((bp == actbp) && (bp->f1 & SELECT)) { UI_ThemeColor(TH_ACTIVE_VERT); - bglVertex3fv(dl ? co : bp->vec); + glVertex3fv(dl ? co : bp->vec); UI_ThemeColor(color); } else if ((bp->f1 & SELECT) == sel) { - bglVertex3fv(dl ? co : bp->vec); + glVertex3fv(dl ? co : bp->vec); } } } @@ -2273,8 +2256,7 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, BPoint *actbp, short s } } - bglEnd(); - glPointSize(1.0); + glEnd(); } static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w, int actdef_wcol) @@ -2362,7 +2344,8 @@ static void drawlattice(View3D *v3d, Object *ob) glShadeModel(GL_SMOOTH); } } - + + glLineWidth(1); glBegin(GL_LINES); for (w = 0; w < lt->pntsw; w++) { int wxt = (w == 0 || w == lt->pntsw - 1); @@ -2406,7 +2389,7 @@ static void drawlattice(View3D *v3d, Object *ob) /* ***************** ******************** */ -/* draw callback */ +/* draw callback */ typedef struct drawDMVertSel_userData { MVert *mvert; @@ -2527,16 +2510,16 @@ static void draw_dm_face_centers__mapFunc(void *userData, int index, const float if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && (BM_elem_flag_test(efa, BM_ELEM_SELECT) == data->select)) { - bglVertex3fv(cent); + glVertex3fv(cent); } } static void draw_dm_face_centers(BMEditMesh *em, DerivedMesh *dm, bool select) { drawBMSelect_userData data = {em->bm, select}; - bglBegin(GL_POINTS); + glBegin(GL_POINTS); dm->foreachMappedFaceCenter(dm, draw_dm_face_centers__mapFunc, &data, DM_FOREACH_NOP); - bglEnd(); + glEnd(); } static void draw_dm_vert_normals__mapFunc(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]) @@ -2597,33 +2580,26 @@ static void draw_dm_verts__mapFunc(void *userData, int index, const float co[3], const MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(eve, data->cd_vskin_offset); if (vs->flag & MVERT_SKIN_ROOT) { float radius = (vs->radius[0] + vs->radius[1]) * 0.5f; - bglEnd(); + glEnd(); glColor4ubv(data->th_skin_root); drawcircball(GL_LINES, co, radius, data->imat); glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); } } - /* draw active larger - need to stop/start point drawing for this :/ */ + /* draw active in a different color - no need to stop/start point drawing for this :D */ if (eve == data->eve_act) { glColor4ubv(data->th_editmesh_active); - - bglEnd(); - - glPointSize(data->th_vertex_size); - bglBegin(GL_POINTS); - bglVertex3fv(co); - bglEnd(); + glVertex3fv(co); + /* back to regular vertex color */ glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex); - glPointSize(data->th_vertex_size); - bglBegin(GL_POINTS); } else { - bglVertex3fv(co); + glVertex3fv(co); } } } @@ -2641,7 +2617,6 @@ static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, const char sel, BMVer UI_GetThemeColor4ubv(TH_VERTEX_SELECT, data.th_vertex_select); UI_GetThemeColor4ubv(TH_VERTEX, data.th_vertex); UI_GetThemeColor4ubv(TH_SKIN_ROOT, data.th_skin_root); - data.th_vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE); /* For skin root drawing */ data.cd_vskin_offset = CustomData_get_offset(&em->bm->vdata, CD_MVERT_SKIN); @@ -2649,9 +2624,10 @@ static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, const char sel, BMVer mul_m4_m4m4(data.imat, rv3d->viewmat, em->ob->obmat); invert_m4(data.imat); - bglBegin(GL_POINTS); + glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); + glBegin(GL_POINTS); dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data, DM_FOREACH_NOP); - bglEnd(); + glEnd(); } /* Draw edges with color set based on selection */ @@ -2686,6 +2662,7 @@ static DMDrawOption draw_dm_edges_sel__setDrawOptions(void *userData, int index) return DM_DRAW_OPTION_SKIP; } } + static void draw_dm_edges_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, BMEdge *eed_act) { @@ -2901,11 +2878,11 @@ static void draw_dm_edges_sharp(BMEditMesh *em, DerivedMesh *dm) #ifdef WITH_FREESTYLE -static int draw_dm_test_freestyle_edge_mark(BMesh *bm, BMEdge *eed) +static bool draw_dm_test_freestyle_edge_mark(BMesh *bm, BMEdge *eed) { FreestyleEdge *fed = CustomData_bmesh_get(&bm->edata, eed->head.data, CD_FREESTYLE_EDGE); if (!fed) - return 0; + return false; return (fed->flag & FREESTYLE_EDGE_MARK) != 0; } @@ -2925,11 +2902,11 @@ static void draw_dm_edges_freestyle(BMEditMesh *em, DerivedMesh *dm) dm->drawMappedEdges(dm, draw_dm_edges_freestyle__setDrawOptions, em->bm); } -static int draw_dm_test_freestyle_face_mark(BMesh *bm, BMFace *efa) +static bool draw_dm_test_freestyle_face_mark(BMesh *bm, BMFace *efa) { FreestyleFace *ffa = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_FREESTYLE_FACE); if (!ffa) - return 0; + return false; return (ffa->flag & FREESTYLE_FACE_MARK) != 0; } @@ -3092,7 +3069,6 @@ static void draw_dm_creases(BMEditMesh *em, DerivedMesh *dm) if (data.cd_layer_offset != -1) { glLineWidth(3.0); dm->drawMappedEdges(dm, draw_dm_creases__setDrawOptions, &data); - glLineWidth(1.0); } } @@ -3122,7 +3098,7 @@ static void draw_dm_bweights__mapFunc(void *userData, int index, const float co[ const float bweight = BM_ELEM_CD_GET_FLOAT(eve, data->cd_layer_offset); if (bweight != 0.0f) { UI_ThemeColorBlend(TH_VERTEX, TH_VERTEX_SELECT, bweight); - bglVertex3fv(co); + glVertex3fv(co); } } } @@ -3138,9 +3114,9 @@ static void draw_dm_bweights(BMEditMesh *em, Scene *scene, DerivedMesh *dm) if (data.cd_layer_offset != -1) { glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE) + 2); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); dm->foreachMappedVert(dm, draw_dm_bweights__mapFunc, &data, DM_FOREACH_NOP); - bglEnd(); + glEnd(); } } else { @@ -3152,7 +3128,6 @@ static void draw_dm_bweights(BMEditMesh *em, Scene *scene, DerivedMesh *dm) if (data.cd_layer_offset != -1) { glLineWidth(3.0); dm->drawMappedEdges(dm, draw_dm_bweights__setDrawOptions, &data); - glLineWidth(1.0); } } } @@ -3164,32 +3139,29 @@ static void draw_dm_bweights(BMEditMesh *em, Scene *scene, DerivedMesh *dm) * specialized to be split out (like drawing creases or measurements). */ -/* EditMesh drawing routines*/ +/* EditMesh drawing routines */ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, BMEditMesh *em, DerivedMesh *cageDM, BMVert *eve_act, RegionView3D *rv3d) { ToolSettings *ts = scene->toolsettings; - int sel; if (v3d->zbuf) glDepthMask(0); /* disable write in zbuffer, zbuf select */ - for (sel = 0; sel < 2; sel++) { + for (int sel = 0; sel < 2; sel++) { unsigned char col[4], fcol[4]; - int pass; UI_GetThemeColor3ubv(sel ? TH_VERTEX_SELECT : TH_VERTEX, col); UI_GetThemeColor3ubv(sel ? TH_FACE_DOT : TH_WIRE_EDIT, fcol); - for (pass = 0; pass < 2; pass++) { + for (int pass = 0; pass < 2; pass++) { float size = UI_GetThemeValuef(TH_VERTEX_SIZE); float fsize = UI_GetThemeValuef(TH_FACEDOT_SIZE); if (pass == 0) { if (v3d->zbuf && !(v3d->flag & V3D_ZBUF_SELECT)) { glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); } else { @@ -3224,7 +3196,6 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, } if (v3d->zbuf) glDepthMask(1); - glPointSize(1.0); } static void draw_em_fancy_edges(BMEditMesh *em, Scene *scene, View3D *v3d, @@ -3232,7 +3203,6 @@ static void draw_em_fancy_edges(BMEditMesh *em, Scene *scene, View3D *v3d, BMEdge *eed_act) { ToolSettings *ts = scene->toolsettings; - int pass; unsigned char wireCol[4], selCol[4], actCol[4]; /* since this function does transparent... */ @@ -3245,7 +3215,7 @@ static void draw_em_fancy_edges(BMEditMesh *em, Scene *scene, View3D *v3d, if (sel_only) wireCol[3] = 0; - for (pass = 0; pass < 2; pass++) { + for (int pass = 0; pass < 2; pass++) { /* show wires in transparent when no zbuf clipping for select */ if (pass == 0) { if (v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT) == 0) { @@ -3323,7 +3293,6 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe /* allow for displaying shape keys and deform mods */ DerivedMesh *dm = EDBM_mesh_deform_dm_get(em); BMIter iter; - int i; /* make the precision of the display value proportionate to the gridsize */ @@ -3368,10 +3337,7 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe copy_v3_v3(v2, eed->v2->co); } - copy_v3_v3(v1_clip, v1); - copy_v3_v3(v2_clip, v2); - - if (clip_segment_v3_plane_n(v1_clip, v2_clip, clip_planes, 4)) { + if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) { if (do_edge_textpair) { interp_v3_v3v3(vmid, v1, v2, edge_texpair_sep); @@ -3435,10 +3401,7 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe copy_v3_v3(v2, eed->v2->co); } - copy_v3_v3(v1_clip, v1); - copy_v3_v3(v2_clip, v2); - - if (clip_segment_v3_plane_n(v1_clip, v2_clip, clip_planes, 4)) { + if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) { float no_a[3], no_b[3]; float angle; @@ -3479,8 +3442,7 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe if (me->drawflag & ME_DRAWEXTRA_FACEAREA) { /* would be nice to use BM_face_calc_area, but that is for 2d faces * so instead add up tessellation triangle areas */ - BMFace *f; - int n; + BMFace *f = NULL; #define DRAW_EM_MEASURE_STATS_FACEAREA() \ if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { \ @@ -3503,11 +3465,10 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe BM_mesh_elem_index_ensure(em->bm, BM_VERT); } - f = NULL; area = 0.0; zero_v3(vmid); - n = 0; - for (i = 0; i < em->tottri; i++) { + int n = 0; + for (int i = 0; i < em->tottri; i++) { BMLoop **l = em->looptris[i]; if (f && l[0]->f != f) { DRAW_EM_MEASURE_STATS_FACEAREA(); @@ -3572,7 +3533,6 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe BM_elem_flag_test(loop->prev->v, BM_ELEM_SELECT) || BM_elem_flag_test(loop->next->v, BM_ELEM_SELECT)))) { - float angle; float v2_local[3]; /* lazy init center calc */ @@ -3613,7 +3573,7 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe mul_mat3_m4_v3(ob->obmat, v3); } - angle = angle_v3v3v3(v1, v2, v3); + float angle = angle_v3v3v3(v1, v2, v3); numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle)); interp_v3_v3v3(fvec, vmid, v2_local, 0.8f); @@ -3631,7 +3591,6 @@ static void draw_em_indices(BMEditMesh *em) BMEdge *e; BMFace *f; BMVert *v; - int i; char numstr[32]; size_t numstr_len; float pos[3]; @@ -3641,7 +3600,7 @@ static void draw_em_indices(BMEditMesh *em) BMesh *bm = em->bm; /* For now, reuse appropriate theme colors from stats text colors */ - i = 0; + int i = 0; if (em->selectmode & SCE_SELECT_VERTEX) { UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col); BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { @@ -3683,12 +3642,11 @@ static void draw_em_indices(BMEditMesh *em) static DMDrawOption draw_em_fancy__setFaceOpts(void *userData, int index) { BMEditMesh *em = userData; - BMFace *efa; if (UNLIKELY(index >= em->bm->totface)) return DM_DRAW_OPTION_NORMAL; - efa = BM_face_at_index(em->bm, index); + BMFace *efa = BM_face_at_index(em->bm, index); if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { return DM_DRAW_OPTION_NORMAL; } @@ -3700,12 +3658,11 @@ static DMDrawOption draw_em_fancy__setFaceOpts(void *userData, int index) static DMDrawOption draw_em_fancy__setGLSLFaceOpts(void *userData, int index) { BMEditMesh *em = userData; - BMFace *efa; if (UNLIKELY(index >= em->bm->totface)) return DM_DRAW_OPTION_NORMAL; - efa = BM_face_at_index(em->bm, index); + BMFace *efa = BM_face_at_index(em->bm, index); if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { return DM_DRAW_OPTION_NORMAL; @@ -3721,27 +3678,10 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, { RegionView3D *rv3d = ar->regiondata; Mesh *me = ob->data; - BMFace *efa_act = BM_mesh_active_face_get(em->bm, false, true); /* annoying but active faces is stored differently */ - BMEdge *eed_act = NULL; - BMVert *eve_act = NULL; - bool use_occlude_wire = (v3d->flag2 & V3D_OCCLUDE_WIRE) && (dt > OB_WIRE); + const bool use_occlude_wire = (dt > OB_WIRE) && (v3d->flag2 & V3D_OCCLUDE_WIRE); + bool use_depth_offset = false; - if (em->bm->selected.last) { - BMEditSelection *ese = em->bm->selected.last; - /* face is handled above */ -#if 0 - if (ese->type == BM_FACE) { - efa_act = (BMFace *)ese->data; - } - else -#endif - if (ese->htype == BM_EDGE) { - eed_act = (BMEdge *)ese->ele; - } - else if (ese->htype == BM_VERT) { - eve_act = (BMVert *)ese->ele; - } - } + glLineWidth(1); BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE | BM_FACE); @@ -3751,6 +3691,7 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, ED_view3d_polygon_offset(rv3d, 1.0); glDepthMask(0); + use_depth_offset = true; } else { glEnable(GL_DEPTH_TEST); @@ -3764,16 +3705,17 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, /* use the cageDM since it always overlaps the editmesh faces */ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); cageDM->drawMappedFaces(cageDM, draw_em_fancy__setFaceOpts, - GPU_enable_material, NULL, me->edit_btmesh, DM_DRAW_SKIP_HIDDEN); + GPU_object_material_bind, NULL, me->edit_btmesh, DM_DRAW_SKIP_HIDDEN | DM_DRAW_NEED_NORMALS); + GPU_object_material_unbind(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else if (check_object_draw_texture(scene, v3d, dt)) { if (draw_glsl_material(scene, ob, v3d, dt)) { glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); - finalDM->drawMappedFacesGLSL(finalDM, GPU_enable_material, + finalDM->drawMappedFacesGLSL(finalDM, GPU_object_material_bind, draw_em_fancy__setGLSLFaceOpts, em); - GPU_disable_material(); + GPU_object_material_unbind(); glFrontFace(GL_CCW); } @@ -3782,17 +3724,12 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, } } else { - /* 3 floats for position, - * 3 for normal and times two because the faces may actually be quads instead of triangles */ - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, (me->flag & ME_TWOSIDED) ? GL_TRUE : GL_FALSE); - - glEnable(GL_LIGHTING); glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); - finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, GPU_enable_material, NULL, me->edit_btmesh, DM_DRAW_SKIP_HIDDEN); + finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, GPU_object_material_bind, NULL, me->edit_btmesh, DM_DRAW_SKIP_HIDDEN | DM_DRAW_NEED_NORMALS); glFrontFace(GL_CCW); - glDisable(GL_LIGHTING); - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + + GPU_object_material_unbind(); } /* Setup for drawing wire over, disable zbuffer @@ -3801,6 +3738,7 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, ED_view3d_polygon_offset(rv3d, 1.0); glDepthMask(0); + use_depth_offset = true; } else { if (cageDM != finalDM) { @@ -3809,150 +3747,175 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d, } } - if ((me->drawflag & ME_DRAWFACES) && (use_occlude_wire == false)) { /* transp faces */ - unsigned char col1[4], col2[4], col3[4]; + if ((dt > OB_WIRE) && (v3d->flag2 & V3D_RENDER_SHADOW)) { + /* pass */ + } + else { + /* annoying but active faces is stored differently */ + BMFace *efa_act = BM_mesh_active_face_get(em->bm, false, true); + BMEdge *eed_act = NULL; + BMVert *eve_act = NULL; + + if (em->bm->selected.last) { + BMEditSelection *ese = em->bm->selected.last; + /* face is handled above */ +#if 0 + if (ese->type == BM_FACE) { + efa_act = (BMFace *)ese->data; + } + else +#endif + if (ese->htype == BM_EDGE) { + eed_act = (BMEdge *)ese->ele; + } + else if (ese->htype == BM_VERT) { + eve_act = (BMVert *)ese->ele; + } + } + + if ((me->drawflag & ME_DRAWFACES) && (use_occlude_wire == false)) { /* transp faces */ + unsigned char col1[4], col2[4], col3[4]; #ifdef WITH_FREESTYLE - unsigned char col4[4]; + unsigned char col4[4]; #endif - UI_GetThemeColor4ubv(TH_FACE, col1); - UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); - UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); + UI_GetThemeColor4ubv(TH_FACE, col1); + UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); + UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); #ifdef WITH_FREESTYLE - UI_GetThemeColor4ubv(TH_FREESTYLE_FACE_MARK, col4); + UI_GetThemeColor4ubv(TH_FREESTYLE_FACE_MARK, col4); #endif - glEnable(GL_BLEND); - glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ + glEnable(GL_BLEND); + glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ - /* don't draw unselected faces, only selected, this is MUCH nicer when texturing */ - if (check_object_draw_texture(scene, v3d, dt)) - col1[3] = 0; + /* don't draw unselected faces, only selected, this is MUCH nicer when texturing */ + if (check_object_draw_texture(scene, v3d, dt)) + col1[3] = 0; #ifdef WITH_FREESTYLE - if (!(me->drawflag & ME_DRAW_FREESTYLE_FACE) || !CustomData_has_layer(&em->bm->pdata, CD_FREESTYLE_FACE)) - col4[3] = 0; + if (!(me->drawflag & ME_DRAW_FREESTYLE_FACE) || !CustomData_has_layer(&em->bm->pdata, CD_FREESTYLE_FACE)) + col4[3] = 0; - draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); + draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); #else - draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); + draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); #endif - glDisable(GL_BLEND); - glDepthMask(1); /* restore write in zbuffer */ - } - else if (efa_act) { - /* even if draw faces is off it would be nice to draw the stipple face - * Make all other faces zero alpha except for the active */ - unsigned char col1[4], col2[4], col3[4]; + glDisable(GL_BLEND); + glDepthMask(1); /* restore write in zbuffer */ + } + else if (efa_act) { + /* even if draw faces is off it would be nice to draw the stipple face + * Make all other faces zero alpha except for the active */ + unsigned char col1[4], col2[4], col3[4]; #ifdef WITH_FREESTYLE - unsigned char col4[4]; - col4[3] = 0; /* don't draw */ + unsigned char col4[4]; + col4[3] = 0; /* don't draw */ #endif - col1[3] = col2[3] = 0; /* don't draw */ + col1[3] = col2[3] = 0; /* don't draw */ - UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); + UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); - glEnable(GL_BLEND); - glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ + glEnable(GL_BLEND); + glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ #ifdef WITH_FREESTYLE - draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); + draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); #else - draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); + draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); #endif - glDisable(GL_BLEND); - glDepthMask(1); /* restore write in zbuffer */ - } + glDisable(GL_BLEND); + glDepthMask(1); /* restore write in zbuffer */ + } - /* here starts all fancy draw-extra over */ - if ((me->drawflag & ME_DRAWEDGES) == 0 && check_object_draw_texture(scene, v3d, dt)) { - /* we are drawing textures and 'ME_DRAWEDGES' is disabled, don't draw any edges */ - - /* only draw selected edges otherwise there is no way of telling if a face is selected */ - draw_em_fancy_edges(em, scene, v3d, me, cageDM, 1, eed_act); - - } - else { - if (me->drawflag & ME_DRAWSEAMS) { - UI_ThemeColor(TH_EDGE_SEAM); - glLineWidth(2); + /* here starts all fancy draw-extra over */ + if ((me->drawflag & ME_DRAWEDGES) == 0 && check_object_draw_texture(scene, v3d, dt)) { + /* we are drawing textures and 'ME_DRAWEDGES' is disabled, don't draw any edges */ - draw_dm_edges_seams(em, cageDM); + /* only draw selected edges otherwise there is no way of telling if a face is selected */ + draw_em_fancy_edges(em, scene, v3d, me, cageDM, 1, eed_act); - glColor3ub(0, 0, 0); - glLineWidth(1); } - - if (me->drawflag & ME_DRAWSHARP) { - UI_ThemeColor(TH_EDGE_SHARP); - glLineWidth(2); + else { + if (me->drawflag & ME_DRAWSEAMS) { + UI_ThemeColor(TH_EDGE_SEAM); + glLineWidth(2); - draw_dm_edges_sharp(em, cageDM); + draw_dm_edges_seams(em, cageDM); - glColor3ub(0, 0, 0); - glLineWidth(1); - } + glColor3ub(0, 0, 0); + } + + if (me->drawflag & ME_DRAWSHARP) { + UI_ThemeColor(TH_EDGE_SHARP); + glLineWidth(2); + + draw_dm_edges_sharp(em, cageDM); + + glColor3ub(0, 0, 0); + } #ifdef WITH_FREESTYLE - if (me->drawflag & ME_DRAW_FREESTYLE_EDGE && CustomData_has_layer(&em->bm->edata, CD_FREESTYLE_EDGE)) { - UI_ThemeColor(TH_FREESTYLE_EDGE_MARK); - glLineWidth(2); - - draw_dm_edges_freestyle(em, cageDM); - - glColor3ub(0, 0, 0); - glLineWidth(1); - } -#endif - - if (me->drawflag & ME_DRAWCREASES) { - draw_dm_creases(em, cageDM); - } - if (me->drawflag & ME_DRAWBWEIGHTS) { - draw_dm_bweights(em, scene, cageDM); - } + if (me->drawflag & ME_DRAW_FREESTYLE_EDGE && CustomData_has_layer(&em->bm->edata, CD_FREESTYLE_EDGE)) { + UI_ThemeColor(TH_FREESTYLE_EDGE_MARK); + glLineWidth(2); - draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act); - } + draw_dm_edges_freestyle(em, cageDM); - { - draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act, rv3d); + glColor3ub(0, 0, 0); + } +#endif - if (me->drawflag & ME_DRAWNORMALS) { - UI_ThemeColor(TH_NORMAL); - draw_dm_face_normals(em, scene, ob, cageDM); - } - if (me->drawflag & ME_DRAW_VNORMALS) { - UI_ThemeColor(TH_VNORMAL); - draw_dm_vert_normals(em, scene, ob, cageDM); - } - if (me->drawflag & ME_DRAW_LNORMALS) { - UI_ThemeColor(TH_LNORMAL); - draw_dm_loop_normals(em, scene, ob, cageDM); - } + if (me->drawflag & ME_DRAWCREASES) { + draw_dm_creases(em, cageDM); + } + if (me->drawflag & ME_DRAWBWEIGHTS) { + draw_dm_bweights(em, scene, cageDM); + } - if ((me->drawflag & (ME_DRAWEXTRA_EDGELEN | - ME_DRAWEXTRA_FACEAREA | - ME_DRAWEXTRA_FACEANG | - ME_DRAWEXTRA_EDGEANG)) && - !(v3d->flag2 & V3D_RENDER_OVERRIDE)) - { - draw_em_measure_stats(ar, v3d, ob, em, &scene->unit); + glLineWidth(1); + draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act); } - if ((G.debug & G_DEBUG) && (me->drawflag & ME_DRAWEXTRA_INDICES) && - !(v3d->flag2 & V3D_RENDER_OVERRIDE)) { - draw_em_indices(em); + draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act, rv3d); + + if (me->drawflag & ME_DRAWNORMALS) { + UI_ThemeColor(TH_NORMAL); + draw_dm_face_normals(em, scene, ob, cageDM); + } + if (me->drawflag & ME_DRAW_VNORMALS) { + UI_ThemeColor(TH_VNORMAL); + draw_dm_vert_normals(em, scene, ob, cageDM); + } + if (me->drawflag & ME_DRAW_LNORMALS) { + UI_ThemeColor(TH_LNORMAL); + draw_dm_loop_normals(em, scene, ob, cageDM); + } + + if ((me->drawflag & (ME_DRAWEXTRA_EDGELEN | + ME_DRAWEXTRA_FACEAREA | + ME_DRAWEXTRA_FACEANG | + ME_DRAWEXTRA_EDGEANG)) && + !(v3d->flag2 & V3D_RENDER_OVERRIDE)) + { + draw_em_measure_stats(ar, v3d, ob, em, &scene->unit); + } + + if ((G.debug & G_DEBUG) && (me->drawflag & ME_DRAWEXTRA_INDICES) && + !(v3d->flag2 & V3D_RENDER_OVERRIDE)) + { + draw_em_indices(em); + } } } - if (dt > OB_WIRE) { + if (use_depth_offset) { glDepthMask(1); ED_view3d_polygon_offset(rv3d, 0.0); - GPU_disable_material(); + GPU_object_material_unbind(); } #if 0 /* currently not needed */ else if (use_occlude_wire) { @@ -3971,19 +3934,18 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm) glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); glDepthMask(0); - /* if transparent, we cannot draw the edges for solid select... edges have no material info. - * drawFacesSolid() doesn't draw the transparent faces */ + /* if transparent, we cannot draw the edges for solid select... edges + * have no material info. GPU_object_material_visible will skip the + * transparent faces */ if (ob->dtx & OB_DRAWTRANSP) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); + dm->drawFacesSolid(dm, NULL, 0, GPU_object_material_visible); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - GPU_disable_material(); } else { dm->drawEdges(dm, 0, 1); } - glLineWidth(1.0); glDepthMask(1); } } @@ -4049,7 +4011,6 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D { glPointSize(1.5); dm->drawVerts(dm); - glPointSize(1.0); } else if ((dt == OB_WIRE) || no_faces) { draw_wire = OBDRAW_WIRE_ON; /* draw wire only, no depth buffer stuff */ @@ -4087,18 +4048,18 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } } - GPU_enable_material(1, &gattribs); + GPU_object_material_bind(1, &gattribs); dm->drawFacesSolid(dm, fpl, fast, NULL); draw_loose = false; } else - dm->drawFacesGLSL(dm, GPU_enable_material); + dm->drawFacesGLSL(dm, GPU_object_material_bind); #if 0 /* XXX */ if (BKE_bproperty_object_get(ob, "Text")) draw_mesh_text(ob, 1); #endif - GPU_disable_material(); + GPU_object_material_unbind(); glFrontFace(GL_CCW); @@ -4114,6 +4075,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D if ((dflag & DRAW_CONSTCOLOR) == 0) { glColor3ubv(ob_wire_col); } + glLineWidth(1.0f); dm->drawLooseEdges(dm); } } @@ -4122,10 +4084,11 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D if (draw_flags & DRAW_MODIFIERS_PREVIEW) { /* for object selection draws no shade */ if (dflag & (DRAW_PICKING | DRAW_CONSTCOLOR)) { - dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); + dm->drawFacesSolid(dm, NULL, 0, GPU_object_material_bind); + GPU_object_material_unbind(); } else { - const float spec[4] = {0.47f, 0.47f, 0.47f, 0.47f}; + const float specular[3] = {0.47f, 0.47f, 0.47f}; /* draw outline */ if ((v3d->flag & V3D_SELECT_OUTLINE) && @@ -4140,21 +4103,13 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D /* materials arent compatible with vertex colors */ GPU_end_object_materials(); - GPU_enable_material(0, NULL); - - /* set default spec */ - glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec); - /* diffuse */ - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glEnable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); + /* set default specular */ + GPU_basic_shader_colors(NULL, specular, 35, 1.0f); + GPU_basic_shader_bind(GPU_SHADER_LIGHTING | GPU_SHADER_USE_COLOR); - dm->drawMappedFaces(dm, NULL, NULL, NULL, NULL, DM_DRAW_USE_COLORS); - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_LIGHTING); + dm->drawMappedFaces(dm, NULL, NULL, NULL, NULL, DM_DRAW_USE_COLORS | DM_DRAW_NEED_NORMALS); - GPU_disable_material(); + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); } } else { @@ -4169,9 +4124,6 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D draw_mesh_object_outline(v3d, ob, dm); } - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, (me->flag & ME_TWOSIDED) ? GL_TRUE : GL_FALSE); - - glEnable(GL_LIGHTING); glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); if (ob->sculpt && (p = BKE_paint_get_active(scene))) { @@ -4187,22 +4139,20 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } } - dm->drawFacesSolid(dm, fpl, fast, GPU_enable_material); + dm->drawFacesSolid(dm, fpl, fast, GPU_object_material_bind); } else - dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); - - GPU_disable_material(); + dm->drawFacesSolid(dm, NULL, 0, GPU_object_material_bind); glFrontFace(GL_CCW); - glDisable(GL_LIGHTING); - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + GPU_object_material_unbind(); if (!ob->sculpt && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { if ((dflag & DRAW_CONSTCOLOR) == 0) { glColor3ubv(ob_wire_col); } + glLineWidth(1.0f); dm->drawLooseEdges(dm); } } @@ -4245,6 +4195,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glDepthMask(0); /* disable write in zbuffer, selected edge wires show better */ } + glLineWidth(1.0f); dm->drawEdges(dm, ((dt == OB_WIRE) || no_faces), (ob->dtx & OB_DRAW_ALL_EDGES) != 0); if (dt != OB_WIRE && (draw_wire == OBDRAW_WIRE_ON_DEPTH)) { @@ -4263,8 +4214,6 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D drawSelectedVertices(dm, ob->data); if (!use_depth) glEnable(GL_DEPTH_TEST); else ED_view3d_polygon_offset(rv3d, 0.0); - - glPointSize(1.0f); } dm->release(dm); } @@ -4277,13 +4226,12 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3 Object *obedit = scene->obedit; Mesh *me = ob->data; BMEditMesh *em = me->edit_btmesh; - int i; bool do_alpha_after = false, drawlinked = false, retval = false; /* If we are drawing shadows and any of the materials don't cast a shadow, * then don't draw the object */ if (v3d->flag2 & V3D_RENDER_SHADOW) { - for (i = 0; i < ob->totcol; ++i) { + for (int i = 0; i < ob->totcol; ++i) { Material *ma = give_current_material(ob, i); if (ma && !(ma->mode2 & MA_CASTSHADOW)) { return true; @@ -4313,22 +4261,28 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3 scene, ob, em, scene->customdata_mask, &finalDM); + const bool use_material = ((me->drawflag & ME_DRAWEIGHT) == 0); + DM_update_materials(finalDM, ob); if (cageDM != finalDM) { DM_update_materials(cageDM, ob); } - if (dt > OB_WIRE) { - const bool glsl = draw_glsl_material(scene, ob, v3d, dt); + if (use_material) { + if (dt > OB_WIRE) { + const bool glsl = draw_glsl_material(scene, ob, v3d, dt); - GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); + GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); + } } draw_em_fancy(scene, ar, v3d, ob, em, cageDM, finalDM, dt); - GPU_end_object_materials(); + if (use_material) { + GPU_end_object_materials(); + } - if (obedit != ob && finalDM) + if (obedit != ob) finalDM->release(finalDM); } else { @@ -4385,16 +4339,12 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3 */ static bool drawDispListwire_ex(ListBase *dlbase, unsigned int dl_type_mask) { - DispList *dl; - int parts, nr; - const float *data; - - if (dlbase == NULL) return 1; + if (dlbase == NULL) return true; glEnableClientState(GL_VERTEX_ARRAY); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - for (dl = dlbase->first; dl; dl = dl->next) { + for (DispList *dl = dlbase->first; dl; dl = dl->next) { if (dl->parts == 0 || dl->nr == 0) { continue; } @@ -4403,7 +4353,8 @@ static bool drawDispListwire_ex(ListBase *dlbase, unsigned int dl_type_mask) continue; } - data = dl->verts; + const float *data = dl->verts; + int parts; switch (dl->type) { case DL_SEGM: @@ -4433,7 +4384,7 @@ static bool drawDispListwire_ex(ListBase *dlbase, unsigned int dl_type_mask) glDrawArrays(GL_LINE_STRIP, parts * dl->nr, dl->nr); } - for (nr = 0; nr < dl->nr; nr++) { + for (int nr = 0; nr < dl->nr; nr++) { int ofs = 3 * dl->nr; data = (dl->verts) + 3 * nr; @@ -4494,31 +4445,31 @@ static bool index3_nors_incr = true; static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, const unsigned char ob_wire_col[4], const bool use_glsl) { - DispList *dl; GPUVertexAttribs gattribs; - const float *data; - const float *ndata; if (lb == NULL) return; - glEnable(GL_LIGHTING); glEnableClientState(GL_VERTEX_ARRAY); if (ob->type == OB_MBALL) { /* mball always smooth shaded */ glShadeModel(GL_SMOOTH); } + + /* track current material, -1 for none (needed for lines) */ + short col = -1; - dl = lb->first; + DispList *dl = lb->first; while (dl) { - data = dl->verts; - ndata = dl->nors; + const float *data = dl->verts; + const float *ndata = dl->nors; switch (dl->type) { case DL_SEGM: if (ob->type == OB_SURF) { - int nr; - - glDisable(GL_LIGHTING); + if (col != -1) { + GPU_object_material_unbind(); + col = -1; + } if ((dflag & DRAW_CONSTCOLOR) == 0) glColor3ubv(ob_wire_col); @@ -4527,35 +4478,35 @@ static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, // glDrawArrays(GL_LINE_STRIP, 0, dl->nr); glBegin(GL_LINE_STRIP); - for (nr = dl->nr; nr; nr--, data += 3) + for (int nr = dl->nr; nr; nr--, data += 3) glVertex3fv(data); glEnd(); - - glEnable(GL_LIGHTING); } break; case DL_POLY: if (ob->type == OB_SURF) { - int nr; - - glDisable(GL_LIGHTING); + if (col != -1) { + GPU_object_material_unbind(); + col = -1; + } /* for some reason glDrawArrays crashes here in half of the platforms (not osx) */ //glVertexPointer(3, GL_FLOAT, 0, dl->verts); //glDrawArrays(GL_LINE_LOOP, 0, dl->nr); glBegin(GL_LINE_LOOP); - for (nr = dl->nr; nr; nr--, data += 3) + for (int nr = dl->nr; nr; nr--, data += 3) glVertex3fv(data); glEnd(); - - glEnable(GL_LIGHTING); } break; case DL_SURF: if (dl->index) { - GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL); + if (col != dl->col) { + GPU_object_material_bind(dl->col + 1, use_glsl ? &gattribs : NULL); + col = dl->col; + } if (dl->rt & CU_SMOOTH) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); @@ -4569,7 +4520,10 @@ static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, break; case DL_INDEX3: - GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL); + if (col != dl->col) { + GPU_object_material_bind(dl->col + 1, use_glsl ? &gattribs : NULL); + col = dl->col; + } glVertexPointer(3, GL_FLOAT, 0, dl->verts); @@ -4589,7 +4543,10 @@ static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, break; case DL_INDEX4: - GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL); + if (col != dl->col) { + GPU_object_material_bind(dl->col + 1, use_glsl ? &gattribs : NULL); + col = dl->col; + } glEnableClientState(GL_NORMAL_ARRAY); glVertexPointer(3, GL_FLOAT, 0, dl->verts); @@ -4604,8 +4561,11 @@ static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, glDisableClientState(GL_VERTEX_ARRAY); glShadeModel(GL_FLAT); - glDisable(GL_LIGHTING); glFrontFace(GL_CCW); + + if (col != -1) { + GPU_object_material_unbind(); + } } static void drawCurveDMWired(Object *ob) @@ -4629,16 +4589,13 @@ static bool drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); if (dt > OB_WIRE && dm->getNumPolys(dm)) { - int glsl = draw_glsl_material(scene, ob, v3d, dt); + bool glsl = draw_glsl_material(scene, ob, v3d, dt); GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); - if (!glsl) { - glEnable(GL_LIGHTING); - dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); - glDisable(GL_LIGHTING); - } + if (!glsl) + dm->drawFacesSolid(dm, NULL, 0, GPU_object_material_bind); else - dm->drawFacesGLSL(dm, GPU_enable_material); + dm->drawFacesGLSL(dm, GPU_object_material_bind); GPU_end_object_materials(); } @@ -4970,7 +4927,6 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix pdd->cd += 12; } - copy_v3_v3(bb->vec, state->co); copy_v3_v3(bb->vel, state->vel); @@ -5066,7 +5022,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv bool select = (ob->flag & SELECT) != 0, create_cdata = false, need_v = false; GLint polygonmode[2]; char numstr[32]; - size_t numstr_len; unsigned char tcol[4] = {0, 0, 0, 255}; /* 1. */ @@ -5108,9 +5063,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv } if (select) { - select = 0; + select = false; if (psys_get_current(ob) == psys) - select = 1; + select = true; } psys->flag |= PSYS_DRAWING; @@ -5152,6 +5107,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv draw_as = PART_DRAW_DOT; /* 3. */ + glLineWidth(1.0f); + switch (draw_as) { case PART_DRAW_DOT: if (part->draw_size) @@ -5471,19 +5428,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glEnableClientState(GL_COLOR_ARRAY); } - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glEnable(GL_COLOR_MATERIAL); - } -#if 0 - else { - glDisableClientState(GL_NORMAL_ARRAY); - - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_LIGHTING); - UI_ThemeColor(TH_WIRE); + // XXX test + GPU_basic_shader_colors(NULL, NULL, 0.0f, 1.0f); + GPU_basic_shader_bind(GPU_SHADER_LIGHTING | GPU_SHADER_USE_COLOR); } -#endif if (totchild && (part->draw & PART_DRAW_PARENT) == 0) totpart = 0; @@ -5514,8 +5462,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if (part->draw & PART_DRAW_GUIDE_HAIRS) { DerivedMesh *hair_dm = psys->hair_out_dm; - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); @@ -5559,8 +5505,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glEnd(); } - glEnable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); glEnableClientState(GL_NORMAL_ARRAY); if ((dflag & DRAW_CONSTCOLOR) == 0) if (part->draw_col == PART_DRAW_COL_MAT) @@ -5570,13 +5514,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if (part->draw & PART_DRAW_HAIR_GRID) { ClothModifierData *clmd = psys->clmd; if (clmd) { - float *a = clmd->hair_grid_min; - float *b = clmd->hair_grid_max; + float *gmin = clmd->hair_grid_min; + float *gmax = clmd->hair_grid_max; int *res = clmd->hair_grid_res; int i; - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); @@ -5585,20 +5527,20 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv else UI_ThemeColor(TH_WIRE); glBegin(GL_LINES); - glVertex3f(a[0], a[1], a[2]); glVertex3f(b[0], a[1], a[2]); - glVertex3f(b[0], a[1], a[2]); glVertex3f(b[0], b[1], a[2]); - glVertex3f(b[0], b[1], a[2]); glVertex3f(a[0], b[1], a[2]); - glVertex3f(a[0], b[1], a[2]); glVertex3f(a[0], a[1], a[2]); + glVertex3f(gmin[0], gmin[1], gmin[2]); glVertex3f(gmax[0], gmin[1], gmin[2]); + glVertex3f(gmax[0], gmin[1], gmin[2]); glVertex3f(gmax[0], gmax[1], gmin[2]); + glVertex3f(gmax[0], gmax[1], gmin[2]); glVertex3f(gmin[0], gmax[1], gmin[2]); + glVertex3f(gmin[0], gmax[1], gmin[2]); glVertex3f(gmin[0], gmin[1], gmin[2]); - glVertex3f(a[0], a[1], b[2]); glVertex3f(b[0], a[1], b[2]); - glVertex3f(b[0], a[1], b[2]); glVertex3f(b[0], b[1], b[2]); - glVertex3f(b[0], b[1], b[2]); glVertex3f(a[0], b[1], b[2]); - glVertex3f(a[0], b[1], b[2]); glVertex3f(a[0], a[1], b[2]); + glVertex3f(gmin[0], gmin[1], gmax[2]); glVertex3f(gmax[0], gmin[1], gmax[2]); + glVertex3f(gmax[0], gmin[1], gmax[2]); glVertex3f(gmax[0], gmax[1], gmax[2]); + glVertex3f(gmax[0], gmax[1], gmax[2]); glVertex3f(gmin[0], gmax[1], gmax[2]); + glVertex3f(gmin[0], gmax[1], gmax[2]); glVertex3f(gmin[0], gmin[1], gmax[2]); - glVertex3f(a[0], a[1], a[2]); glVertex3f(a[0], a[1], b[2]); - glVertex3f(b[0], a[1], a[2]); glVertex3f(b[0], a[1], b[2]); - glVertex3f(a[0], b[1], a[2]); glVertex3f(a[0], b[1], b[2]); - glVertex3f(b[0], b[1], a[2]); glVertex3f(b[0], b[1], b[2]); + glVertex3f(gmin[0], gmin[1], gmin[2]); glVertex3f(gmin[0], gmin[1], gmax[2]); + glVertex3f(gmax[0], gmin[1], gmin[2]); glVertex3f(gmax[0], gmin[1], gmax[2]); + glVertex3f(gmin[0], gmax[1], gmin[2]); glVertex3f(gmin[0], gmax[1], gmax[2]); + glVertex3f(gmax[0], gmax[1], gmin[2]); glVertex3f(gmax[0], gmax[1], gmax[2]); glEnd(); if (select) @@ -5608,31 +5550,29 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glEnable(GL_BLEND); glBegin(GL_LINES); for (i = 1; i < res[0] - 1; ++i) { - float f = interpf(b[0], a[0], (float)i / (float)(res[0] - 1)); - glVertex3f(f, a[1], a[2]); glVertex3f(f, b[1], a[2]); - glVertex3f(f, b[1], a[2]); glVertex3f(f, b[1], b[2]); - glVertex3f(f, b[1], b[2]); glVertex3f(f, a[1], b[2]); - glVertex3f(f, a[1], b[2]); glVertex3f(f, a[1], a[2]); + float f = interpf(gmax[0], gmin[0], (float)i / (float)(res[0] - 1)); + glVertex3f(f, gmin[1], gmin[2]); glVertex3f(f, gmax[1], gmin[2]); + glVertex3f(f, gmax[1], gmin[2]); glVertex3f(f, gmax[1], gmax[2]); + glVertex3f(f, gmax[1], gmax[2]); glVertex3f(f, gmin[1], gmax[2]); + glVertex3f(f, gmin[1], gmax[2]); glVertex3f(f, gmin[1], gmin[2]); } for (i = 1; i < res[1] - 1; ++i) { - float f = interpf(b[1], a[1], (float)i / (float)(res[1] - 1)); - glVertex3f(a[0], f, a[2]); glVertex3f(b[0], f, a[2]); - glVertex3f(b[0], f, a[2]); glVertex3f(b[0], f, b[2]); - glVertex3f(b[0], f, b[2]); glVertex3f(a[0], f, b[2]); - glVertex3f(a[0], f, b[2]); glVertex3f(a[0], f, a[2]); + float f = interpf(gmax[1], gmin[1], (float)i / (float)(res[1] - 1)); + glVertex3f(gmin[0], f, gmin[2]); glVertex3f(gmax[0], f, gmin[2]); + glVertex3f(gmax[0], f, gmin[2]); glVertex3f(gmax[0], f, gmax[2]); + glVertex3f(gmax[0], f, gmax[2]); glVertex3f(gmin[0], f, gmax[2]); + glVertex3f(gmin[0], f, gmax[2]); glVertex3f(gmin[0], f, gmin[2]); } for (i = 1; i < res[2] - 1; ++i) { - float f = interpf(b[2], a[2], (float)i / (float)(res[2] - 1)); - glVertex3f(a[0], a[1], f); glVertex3f(b[0], a[1], f); - glVertex3f(b[0], a[1], f); glVertex3f(b[0], b[1], f); - glVertex3f(b[0], b[1], f); glVertex3f(a[0], b[1], f); - glVertex3f(a[0], b[1], f); glVertex3f(a[0], a[1], f); + float f = interpf(gmax[2], gmin[2], (float)i / (float)(res[2] - 1)); + glVertex3f(gmin[0], gmin[1], f); glVertex3f(gmax[0], gmin[1], f); + glVertex3f(gmax[0], gmin[1], f); glVertex3f(gmax[0], gmax[1], f); + glVertex3f(gmax[0], gmax[1], f); glVertex3f(gmin[0], gmax[1], f); + glVertex3f(gmin[0], gmax[1], f); glVertex3f(gmin[0], gmin[1], f); } glEnd(); glDisable(GL_BLEND); - glEnable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); glEnableClientState(GL_NORMAL_ARRAY); if ((dflag & DRAW_CONSTCOLOR) == 0) if (part->draw_col == PART_DRAW_COL_MAT) @@ -5663,7 +5603,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if (1) { //ob_dt > OB_WIRE) { if (part->draw_col == PART_DRAW_COL_MAT) glDisableClientState(GL_COLOR_ARRAY); - glDisable(GL_COLOR_MATERIAL); + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); } if (cdata2) { @@ -5671,14 +5611,12 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv cdata2 = NULL; } - glLineWidth(1.0f); - if ((part->draw & PART_DRAW_NUM) && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { cache = psys->pathcache; for (a = 0, pa = psys->particles; a < totpart; a++, pa++) { float vec_txt[3]; - numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%i", a); + size_t numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%i", a); /* use worldspace because object matrix is already applied */ mul_v3_m4v3(vec_txt, ob->imat, cache[a]->co); view3d_cached_text_draw_add(vec_txt, numstr, numstr_len, @@ -5724,11 +5662,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if (pdd->ndata && ob_dt > OB_WIRE) { glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, pdd->ndata); - glEnable(GL_LIGHTING); - } - else { - glDisableClientState(GL_NORMAL_ARRAY); - glDisable(GL_LIGHTING); + GPU_basic_shader_colors(NULL, NULL, 0.0f, 1.0f); + GPU_basic_shader_bind(GPU_SHADER_LIGHTING | GPU_SHADER_USE_COLOR); } if ((dflag & DRAW_CONSTCOLOR) == 0) { @@ -5760,7 +5695,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* 7. */ - glDisable(GL_LIGHTING); + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); @@ -5835,14 +5770,10 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glEnable(GL_COLOR_MATERIAL); glShadeModel(GL_SMOOTH); - if (pset->brushtype == PE_BRUSH_WEIGHT) { + if (pset->brushtype == PE_BRUSH_WEIGHT) glLineWidth(2.0f); - glDisable(GL_LIGHTING); - } cache = edit->pathcache; for (i = 0, point = edit->points; i < totpoint; i++, point++) { @@ -5881,16 +5812,16 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit) if (pset->selectmode == SCE_SELECT_POINT) { float *pd = NULL, *pdata = NULL; float *cd = NULL, *cdata = NULL; - int totkeys = 0; + int totkeys_visible = 0; for (i = 0, point = edit->points; i < totpoint; i++, point++) if (!(point->flag & PEP_HIDE)) - totkeys += point->totkey; + totkeys_visible += point->totkey; - if (totkeys) { + if (totkeys_visible) { if (edit->points && !(edit->points->keys->flag & PEK_USE_WCO)) - pd = pdata = MEM_callocN(totkeys * 3 * sizeof(float), "particle edit point data"); - cd = cdata = MEM_callocN(totkeys * (timed ? 4 : 3) * sizeof(float), "particle edit color data"); + pd = pdata = MEM_callocN(totkeys_visible * 3 * sizeof(float), "particle edit point data"); + cd = cdata = MEM_callocN(totkeys_visible * (timed ? 4 : 3) * sizeof(float), "particle edit color data"); } for (i = 0, point = edit->points; i < totpoint; i++, point++) { @@ -5938,46 +5869,39 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit) if (cdata) { MEM_freeN(cdata); cd = cdata = NULL; } } else if (pset->selectmode == SCE_SELECT_END) { + glBegin(GL_POINTS); for (i = 0, point = edit->points; i < totpoint; i++, point++) { if ((point->flag & PEP_HIDE) == 0 && point->totkey) { key = point->keys + point->totkey - 1; - if (key->flag & PEK_SELECT) - glColor3fv(sel_col); - else - glColor3fv(nosel_col); + glColor3fv((key->flag & PEK_SELECT) ? sel_col : nosel_col); /* has to be like this.. otherwise selection won't work, have try glArrayElement later..*/ - glBegin(GL_POINTS); glVertex3fv((key->flag & PEK_USE_WCO) ? key->world_co : key->co); - glEnd(); } } + glEnd(); } } glDisable(GL_BLEND); - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glShadeModel(GL_FLAT); if (v3d->zbuf) glEnable(GL_DEPTH_TEST); - glLineWidth(1.0f); - glPointSize(1.0f); } static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, float ith, float drw_size) { float tr[3][3]; float root[3], tip[3]; - float tw, th; /* take a copy for not spoiling original */ copy_m3_m3(tr, rotscale); - tw = itw * drw_size; - th = ith * drw_size; + float tw = itw * drw_size; + float th = ith * drw_size; - glColor4ub(0x7F, 0x00, 0x00, 155); glBegin(GL_LINES); + + glColor4ub(0x7F, 0x00, 0x00, 155); root[1] = root[2] = 0.0f; root[0] = -drw_size; mul_m3_v3(tr, root); @@ -5988,47 +5912,37 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo mul_m3_v3(tr, tip); add_v3_v3(tip, com); glVertex3fv(tip); - glEnd(); root[1] = 0.0f; root[2] = tw; root[0] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[1] = 0.0f; root[2] = -tw; root[0] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[1] = tw; root[2] = 0.0f; root[0] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[1] = -tw; root[2] = 0.0f; root[0] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); glColor4ub(0x00, 0x7F, 0x00, 155); - glBegin(GL_LINES); root[0] = root[2] = 0.0f; root[1] = -drw_size; mul_m3_v3(tr, root); @@ -6039,46 +5953,36 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo mul_m3_v3(tr, tip); add_v3_v3(tip, com); glVertex3fv(tip); - glEnd(); root[0] = 0.0f; root[2] = tw; root[1] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = 0.0f; root[2] = -tw; root[1] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = tw; root[2] = 0.0f; root[1] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = -tw; root[2] = 0.0f; root[1] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); glColor4ub(0x00, 0x00, 0x7F, 155); - glBegin(GL_LINES); root[0] = root[1] = 0.0f; root[2] = -drw_size; mul_m3_v3(tr, root); @@ -6089,42 +5993,35 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo mul_m3_v3(tr, tip); add_v3_v3(tip, com); glVertex3fv(tip); - glEnd(); root[0] = 0.0f; root[1] = tw; root[2] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = 0.0f; root[1] = -tw; root[2] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = tw; root[1] = 0.0f; root[2] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); - glEnd(); root[0] = -tw; root[1] = 0.0f; root[2] = th; - glBegin(GL_LINES); mul_m3_v3(tr, root); add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); + glEnd(); } @@ -6132,27 +6029,27 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo static void drawhandlesN(Nurb *nu, const char sel, const bool hide_handles) { - BezTriple *bezt; - const float *fp; - int a; - if (nu->hide || hide_handles) return; - glBegin(GL_LINES); - if (nu->type == CU_BEZIER) { + const float *fp; + #define TH_HANDLE_COL_TOT ((TH_HANDLE_SEL_FREE - TH_HANDLE_FREE) + 1) /* use MIN2 when indexing to ensure newer files don't read outside the array */ unsigned char handle_cols[TH_HANDLE_COL_TOT][3]; const int basecol = sel ? TH_HANDLE_SEL_FREE : TH_HANDLE_FREE; - for (a = 0; a < TH_HANDLE_COL_TOT; a++) { + for (int a = 0; a < TH_HANDLE_COL_TOT; a++) { UI_GetThemeColor3ubv(basecol + a, handle_cols[a]); } - bezt = nu->bezt; - a = nu->pntsu; + glLineWidth(1.0f); + + glBegin(GL_LINES); + + BezTriple *bezt = nu->bezt; + int a = nu->pntsu; while (a--) { if (bezt->hide == 0) { if ((bezt->f2 & SELECT) == sel) { @@ -6184,18 +6081,15 @@ static void drawhandlesN(Nurb *nu, const char sel, const bool hide_handles) bezt++; } + glEnd(); + #undef TH_HANDLE_COL_TOT } - glEnd(); } static void drawhandlesN_active(Nurb *nu) { - BezTriple *bezt; - const float *fp; - int a; - if (nu->hide) return; UI_ThemeColor(TH_ACTIVE_SPLINE); @@ -6204,11 +6098,11 @@ static void drawhandlesN_active(Nurb *nu) glBegin(GL_LINES); if (nu->type == CU_BEZIER) { - bezt = nu->bezt; - a = nu->pntsu; + BezTriple *bezt = nu->bezt; + int a = nu->pntsu; while (a--) { if (bezt->hide == 0) { - fp = bezt->vec[0]; + const float *fp = bezt->vec[0]; glVertex3fv(fp); glVertex3fv(fp + 3); @@ -6222,93 +6116,81 @@ static void drawhandlesN_active(Nurb *nu) glEnd(); glColor3ub(0, 0, 0); - glLineWidth(1); } static void drawvertsN(Nurb *nu, const char sel, const bool hide_handles, const void *vert) { - BezTriple *bezt; - BPoint *bp; - float size; - int a, color; - if (nu->hide) return; - if (sel) color = TH_VERTEX_SELECT; - else color = TH_VERTEX; + const int color = sel ? TH_VERTEX_SELECT : TH_VERTEX; UI_ThemeColor(color); - size = UI_GetThemeValuef(TH_VERTEX_SIZE); - glPointSize(size); + glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); if (nu->type == CU_BEZIER) { - bezt = nu->bezt; - a = nu->pntsu; + BezTriple *bezt = nu->bezt; + int a = nu->pntsu; while (a--) { if (bezt->hide == 0) { if (sel == 1 && bezt == vert) { UI_ThemeColor(TH_ACTIVE_VERT); - if (bezt->f2 & SELECT) bglVertex3fv(bezt->vec[1]); + if (bezt->f2 & SELECT) glVertex3fv(bezt->vec[1]); if (!hide_handles) { - if (bezt->f1 & SELECT) bglVertex3fv(bezt->vec[0]); - if (bezt->f3 & SELECT) bglVertex3fv(bezt->vec[2]); + if (bezt->f1 & SELECT) glVertex3fv(bezt->vec[0]); + if (bezt->f3 & SELECT) glVertex3fv(bezt->vec[2]); } UI_ThemeColor(color); } else if (hide_handles) { - if ((bezt->f2 & SELECT) == sel) bglVertex3fv(bezt->vec[1]); + if ((bezt->f2 & SELECT) == sel) glVertex3fv(bezt->vec[1]); } else { - if ((bezt->f1 & SELECT) == sel) bglVertex3fv(bezt->vec[0]); - if ((bezt->f2 & SELECT) == sel) bglVertex3fv(bezt->vec[1]); - if ((bezt->f3 & SELECT) == sel) bglVertex3fv(bezt->vec[2]); + if ((bezt->f1 & SELECT) == sel) glVertex3fv(bezt->vec[0]); + if ((bezt->f2 & SELECT) == sel) glVertex3fv(bezt->vec[1]); + if ((bezt->f3 & SELECT) == sel) glVertex3fv(bezt->vec[2]); } } bezt++; } } else { - bp = nu->bp; - a = nu->pntsu * nu->pntsv; + BPoint *bp = nu->bp; + int a = nu->pntsu * nu->pntsv; while (a--) { if (bp->hide == 0) { if (bp == vert) { UI_ThemeColor(TH_ACTIVE_VERT); - bglVertex3fv(bp->vec); + glVertex3fv(bp->vec); UI_ThemeColor(color); } else { - if ((bp->f1 & SELECT) == sel) bglVertex3fv(bp->vec); + if ((bp->f1 & SELECT) == sel) glVertex3fv(bp->vec); } } bp++; } } - bglEnd(); - glPointSize(1.0); + glEnd(); } static void editnurb_draw_active_poly(Nurb *nu) { - BPoint *bp; - int a, b; - UI_ThemeColor(TH_ACTIVE_SPLINE); glLineWidth(2); - bp = nu->bp; - for (b = 0; b < nu->pntsv; b++) { + BPoint *bp = nu->bp; + for (int b = 0; b < nu->pntsv; b++) { if (nu->flagu & 1) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); - for (a = 0; a < nu->pntsu; a++, bp++) { + for (int a = 0; a < nu->pntsu; a++, bp++) { glVertex3fv(bp->vec); } @@ -6316,24 +6198,20 @@ static void editnurb_draw_active_poly(Nurb *nu) } glColor3ub(0, 0, 0); - glLineWidth(1); } static void editnurb_draw_active_nurbs(Nurb *nu) { - BPoint *bp, *bp1; - int a, b, ofs; - UI_ThemeColor(TH_ACTIVE_SPLINE); glLineWidth(2); glBegin(GL_LINES); - bp = nu->bp; - for (b = 0; b < nu->pntsv; b++) { - bp1 = bp; + BPoint *bp = nu->bp; + for (int b = 0; b < nu->pntsv; b++) { + BPoint *bp1 = bp; bp++; - for (a = nu->pntsu - 1; a > 0; a--, bp++) { + for (int a = nu->pntsu - 1; a > 0; a--, bp++) { if (bp->hide == 0 && bp1->hide == 0) { glVertex3fv(bp->vec); glVertex3fv(bp1->vec); @@ -6344,11 +6222,11 @@ static void editnurb_draw_active_nurbs(Nurb *nu) if (nu->pntsv > 1) { /* surface */ - ofs = nu->pntsu; - for (b = 0; b < nu->pntsu; b++) { - bp1 = nu->bp + b; + int ofs = nu->pntsu; + for (int b = 0; b < nu->pntsu; b++) { + BPoint *bp1 = nu->bp + b; bp = bp1 + ofs; - for (a = nu->pntsv - 1; a > 0; a--, bp += ofs) { + for (int a = nu->pntsv - 1; a > 0; a--, bp += ofs) { if (bp->hide == 0 && bp1->hide == 0) { glVertex3fv(bp->vec); glVertex3fv(bp1->vec); @@ -6361,18 +6239,16 @@ static void editnurb_draw_active_nurbs(Nurb *nu) glEnd(); glColor3ub(0, 0, 0); - glLineWidth(1); } static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) { - Nurb *nu; BPoint *bp, *bp1; - int a, b, ofs, index; + int a, b; Curve *cu = ob->data; - index = 0; - nu = nurb; + int index = 0; + Nurb *nu = nurb; while (nu) { if (nu->hide == 0) { switch (nu->type) { @@ -6382,6 +6258,8 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) editnurb_draw_active_poly(nu); } + glLineWidth(1); + UI_ThemeColor(TH_NURB_ULINE); bp = nu->bp; for (b = 0; b < nu->pntsv; b++) { @@ -6401,6 +6279,10 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) editnurb_draw_active_nurbs(nu); } + glLineWidth(1); + + glBegin(GL_LINES); + bp = nu->bp; for (b = 0; b < nu->pntsv; b++) { bp1 = bp; @@ -6411,10 +6293,8 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) if ((bp->f1 & SELECT) && (bp1->f1 & SELECT)) { UI_ThemeColor(TH_NURB_SEL_ULINE); - glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); glVertex3fv(bp1->vec); - glEnd(); } } else { @@ -6424,19 +6304,17 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) else { UI_ThemeColor(TH_NURB_ULINE); - glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); glVertex3fv(bp1->vec); - glEnd(); } } } bp1 = bp; } } - if (nu->pntsv > 1) { /* surface */ - ofs = nu->pntsu; + if (nu->pntsv > 1) { /* surface */ + int ofs = nu->pntsu; for (b = 0; b < nu->pntsu; b++) { bp1 = nu->bp + b; bp = bp1 + ofs; @@ -6446,10 +6324,8 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) if ((bp->f1 & SELECT) && (bp1->f1 & SELECT)) { UI_ThemeColor(TH_NURB_SEL_VLINE); - glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); glVertex3fv(bp1->vec); - glEnd(); } } else { @@ -6459,18 +6335,17 @@ static void draw_editnurb_splines(Object *ob, Nurb *nurb, const bool sel) else { UI_ThemeColor(TH_NURB_VLINE); - glBegin(GL_LINE_STRIP); glVertex3fv(bp->vec); glVertex3fv(bp1->vec); - glEnd(); } } } bp1 = bp; } } - } + + glEnd(); break; } } @@ -6488,10 +6363,8 @@ static void draw_editnurb( Object *ob = base->object; Curve *cu = ob->data; Nurb *nu; - BevList *bl; const void *vert = BKE_curve_vert_active_get(cu); const bool hide_handles = (cu->drawflag & CU_HIDE_HANDLES) != 0; - int index; unsigned char wire_col[3]; /* DispList */ @@ -6501,14 +6374,13 @@ static void draw_editnurb( drawDispList(scene, v3d, rv3d, base, dt, dflag, ob_wire_col); /* for shadows only show solid faces */ - if (v3d->flag2 & V3D_RENDER_SHADOW) { + if (v3d->flag2 & V3D_RENDER_SHADOW) return; - } if (v3d->zbuf) glDepthFunc(GL_ALWAYS); /* first non-selected and active handles */ - index = 0; + int index = 0; for (nu = nurb; nu; nu = nu->next) { if (nu->type == CU_BEZIER) { if (index == cu->actnu && !hide_handles) @@ -6533,6 +6405,8 @@ static void draw_editnurb( /* direction vectors for 3d curve paths * when at its lowest, don't render normals */ if ((cu->flag & CU_3D) && (ts->normalsize > 0.0015f) && (cu->drawflag & CU_HIDE_NORMALS) == 0) { + BevList *bl; + glLineWidth(1.0f); for (bl = ob->curve_cache->bev.first, nu = nurb; nu && bl; bl = bl->next, nu = nu->next) { BevPoint *bevp = bl->bevpoints; int nr = bl->nr; @@ -6602,7 +6476,7 @@ static void draw_editfont(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *b Curve *cu = ob->data; EditFont *ef = cu->editfont; float vec1[3], vec2[3]; - int i, selstart, selend; + int selstart, selend; draw_editfont_textcurs(rv3d, ef->textcurs); @@ -6625,7 +6499,7 @@ static void draw_editfont(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *b vec1[1] += cu->linedist * cu->fsize; vec2[1] -= cu->lines * cu->linedist * cu->fsize; setlinestyle(3); - glBegin(GL_LINE_STRIP); + glBegin(GL_LINES); glVertex2fv(vec1); glVertex2fv(vec2); glEnd(); @@ -6633,7 +6507,7 @@ static void draw_editfont(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *b } setlinestyle(3); - for (i = 0; i < cu->totbox; i++) { + for (int i = 0; i < cu->totbox; i++) { if (cu->tb[i].w != 0.0f) { UI_ThemeColor(i == (cu->actbox - 1) ? TH_ACTIVE : TH_WIRE); vec1[0] = cu->xof + cu->tb[i].x; @@ -6661,7 +6535,7 @@ static void draw_editfont(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *b cpack(0xffffff); set_inverted_drawing(1); - for (i = 0; i <= seltot; i++) { + for (int i = 0; i <= seltot; i++) { EditFontSelBox *sb = &ef->selboxes[i]; float tvec[3]; @@ -6846,15 +6720,12 @@ static void drawspiral(const float cent[3], float rad, float tmat[4][4], int sta * all required matrices have been set (used for drawing empties) */ static void drawcircle_size(float size) { - float x, y; - short degrees; - glBegin(GL_LINE_LOOP); /* coordinates are: cos(degrees * 11.25) = x, sin(degrees * 11.25) = y, 0.0f = z */ - for (degrees = 0; degrees < CIRCLE_RESOL; degrees++) { - x = cosval[degrees]; - y = sinval[degrees]; + for (short degrees = 0; degrees < CIRCLE_RESOL; degrees++) { + float x = cosval[degrees]; + float y = sinval[degrees]; glVertex3f(x * size, 0.0f, y * size); } @@ -6913,12 +6784,11 @@ static bool drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, const char dt, const short dflag, const unsigned char ob_wire_col[4]) { Object *ob = base->object; - MetaBall *mb; MetaElem *ml; float imat[4][4]; int code = 1; - mb = ob->data; + MetaBall *mb = ob->data; if (mb->editelems) { if ((G.f & G_PICKSEL) == 0) { @@ -6955,6 +6825,8 @@ static bool drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, } } + glLineWidth(1.0f); + while (ml) { /* draw radius */ if (mb->editelems) { @@ -7138,31 +7010,21 @@ static void draw_forcefield(Object *ob, RegionView3D *rv3d, setlinestyle(0); } -static void draw_box(float vec[8][3], bool solid) +static void draw_box(const float vec[8][3], bool solid) { - if (!solid) { - glBegin(GL_LINE_STRIP); - glVertex3fv(vec[0]); glVertex3fv(vec[1]); glVertex3fv(vec[2]); glVertex3fv(vec[3]); - glVertex3fv(vec[0]); glVertex3fv(vec[4]); glVertex3fv(vec[5]); glVertex3fv(vec[6]); - glVertex3fv(vec[7]); glVertex3fv(vec[4]); - glEnd(); - - glBegin(GL_LINES); - glVertex3fv(vec[1]); glVertex3fv(vec[5]); - glVertex3fv(vec[2]); glVertex3fv(vec[6]); - glVertex3fv(vec[3]); glVertex3fv(vec[7]); - glEnd(); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, vec); + + if (solid) { + const GLubyte indices[24] = {0,1,2,3,7,6,5,4,4,5,1,0,3,2,6,7,3,7,4,0,1,5,6,2}; + glDrawRangeElements(GL_QUADS, 0, 7, 24, GL_UNSIGNED_BYTE, indices); } else { - glBegin(GL_QUADS); - glVertex3fv(vec[0]); glVertex3fv(vec[1]); glVertex3fv(vec[2]); glVertex3fv(vec[3]); - glVertex3fv(vec[7]); glVertex3fv(vec[6]); glVertex3fv(vec[5]); glVertex3fv(vec[4]); - glVertex3fv(vec[4]); glVertex3fv(vec[5]); glVertex3fv(vec[1]); glVertex3fv(vec[0]); - glVertex3fv(vec[3]); glVertex3fv(vec[2]); glVertex3fv(vec[6]); glVertex3fv(vec[7]); - glVertex3fv(vec[3]); glVertex3fv(vec[7]); glVertex3fv(vec[4]); glVertex3fv(vec[0]); - glVertex3fv(vec[1]); glVertex3fv(vec[5]); glVertex3fv(vec[6]); glVertex3fv(vec[2]); - glEnd(); + const GLubyte indices[24] = {0,1,1,2,2,3,3,0,0,4,4,5,5,6,6,7,7,4,1,5,2,6,3,7}; + glDrawRangeElements(GL_LINES, 0, 7, 24, GL_UNSIGNED_BYTE, indices); } + + glDisableClientState(GL_VERTEX_ARRAY); } static void draw_bb_quadric(BoundBox *bb, char type, bool around_origin) @@ -7315,18 +7177,16 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base, RegionView3D *rv3d = ar->regiondata; Object *ob = base->object; - glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); glDepthMask(0); if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { - DerivedMesh *dm; bool has_faces = false; #ifdef SEQUENCER_DAG_WORKAROUND ensure_curve_cache(scene, ob); #endif - dm = ob->derivedFinal; + DerivedMesh *dm = ob->derivedFinal; if (dm) { DM_update_materials(dm, ob); } @@ -7339,27 +7199,31 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base, } if (has_faces && ED_view3d_boundbox_clip(rv3d, ob->bb)) { + glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); if (dm) { draw_mesh_object_outline(v3d, ob, dm); } else { - drawDispListwire(&ob->curve_cache->disp, ob->type); + /* only draw 'solid' parts of the display list as wire. */ + drawDispListwire_ex(&ob->curve_cache->disp, (DL_INDEX3 | DL_INDEX4 | DL_SURF)); } } } else if (ob->type == OB_MBALL) { if (BKE_mball_is_basis(ob)) { if ((base->flag & OB_FROMDUPLI) == 0) { + glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); drawDispListwire(&ob->curve_cache->disp, ob->type); } } } else if (ob->type == OB_ARMATURE) { - if (!(ob->mode & OB_MODE_POSE && base == scene->basact)) + if (!(ob->mode & OB_MODE_POSE && base == scene->basact)) { + glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); draw_armature(scene, v3d, ar, base, OB_WIRE, 0, ob_wire_col, true); + } } - glLineWidth(1.0); glDepthMask(1); } @@ -7376,6 +7240,7 @@ static void draw_wire_extra(Scene *scene, RegionView3D *rv3d, Object *ob, const ED_view3d_polygon_offset(rv3d, 1.0); glDepthMask(0); /* disable write in zbuffer, selected edge wires show better */ + glLineWidth(1); if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { if (ED_view3d_boundbox_clip(rv3d, ob->bb)) { @@ -7402,12 +7267,10 @@ static void draw_wire_extra(Scene *scene, RegionView3D *rv3d, Object *ob, const /* should be called in view space */ static void draw_hooks(Object *ob) { - ModifierData *md; - float vec[3]; - - for (md = ob->modifiers.first; md; md = md->next) { + for (ModifierData *md = ob->modifiers.first; md; md = md->next) { if (md->type == eModifierType_Hook) { HookModifierData *hmd = (HookModifierData *) md; + float vec[3]; mul_v3_m4v3(vec, ob->obmat, hmd->cent); @@ -7421,10 +7284,9 @@ static void draw_hooks(Object *ob) } glPointSize(3.0); - bglBegin(GL_POINTS); - bglVertex3fv(vec); - bglEnd(); - glPointSize(1.0); + glBegin(GL_POINTS); + glVertex3fv(vec); + glEnd(); } } } @@ -7433,13 +7295,12 @@ static void draw_rigid_body_pivot(bRigidBodyJointConstraint *data, const short dflag, const unsigned char ob_wire_col[4]) { const char *axis_str[3] = {"px", "py", "pz"}; - int axis; float mat[4][4]; eul_to_mat4(mat, &data->axX); glLineWidth(4.0f); setlinestyle(2); - for (axis = 0; axis < 3; axis++) { + for (int axis = 0; axis < 3; axis++) { float dir[3] = {0, 0, 0}; float v[3]; @@ -7459,7 +7320,7 @@ static void draw_rigid_body_pivot(bRigidBodyJointConstraint *data, view3d_cached_text_draw_add(v, axis_str[axis], 2, 0, V3D_CACHE_TEXT_ASCII, ob_wire_col); } } - glLineWidth(1.0f); + setlinestyle(0); } @@ -7610,8 +7471,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short unsigned int col = 0; unsigned char _ob_wire_col[4]; /* dont initialize this */ const unsigned char *ob_wire_col = NULL; /* dont initialize this, use NULL crashes as a way to find invalid use */ - short dtx; - char dt; bool zbufoff = false, is_paint = false, empty_object = false; const bool is_obact = (ob == OBACT); const bool render_override = (v3d->flag2 & V3D_RENDER_OVERRIDE) != 0; @@ -7653,7 +7512,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short } } - if ((md = modifiers_findByType(ob, eModifierType_Smoke)) && (modifier_isEnabled(scene, md, eModifierMode_Realtime))) { + if (((base->flag & OB_FROMDUPLI) == 0) && + (md = modifiers_findByType(ob, eModifierType_Smoke)) && + (modifier_isEnabled(scene, md, eModifierMode_Realtime))) + { smd = (SmokeModifierData *)md; if (smd->domain) { @@ -7699,6 +7561,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short /* only once set now, will be removed too, should become a global standard */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + /* reset here to avoid having to call all over */ + glLineWidth(1.0f); view3d_cached_text_draw_begin(); @@ -7732,11 +7596,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short } /* maximum drawtype */ - dt = v3d->drawtype; + char dt = v3d->drawtype; if (dt == OB_RENDER) dt = OB_SOLID; dt = MIN2(dt, ob->dt); if (v3d->zbuf == 0 && dt > OB_WIRE) dt = OB_WIRE; - dtx = 0; + short dtx = 0; /* faceselect exception: also draw solid when (dt == wire), except in editmode */ @@ -7857,7 +7721,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short draw_empty_image(ob, dflag, ob_wire_col); } else { - drawaxes(ob->empty_drawsize, ob->empty_drawtype); + drawaxes(rv3d->viewmatob, ob->empty_drawsize, ob->empty_drawtype); } } break; @@ -7902,17 +7766,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short draw_bounding_volume(ob, ob->boundtype); } else { - if (dt > OB_WIRE) - GPU_enable_material(0, NULL); /* we use default material */ + glLineWidth(1.0f); empty_object = draw_armature(scene, v3d, ar, base, dt, dflag, ob_wire_col, false); - if (dt > OB_WIRE) - GPU_disable_material(); } } break; default: if (!render_override) { - drawaxes(1.0, OB_ARROWS); + drawaxes(rv3d->viewmatob, 1.0, OB_ARROWS); } break; } @@ -8011,15 +7872,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short // glPointSize(3.0); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); for (i = 0; i < scs->numpoints; i++) { - bglVertex3fv(&scs->points[3 * i]); + glVertex3fv(&scs->points[3 * i]); } - bglEnd(); - glPointSize(1.0); + glEnd(); glMultMatrixf(ob->obmat); glDisable(GL_BLEND); @@ -8037,25 +7897,42 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short glLoadMatrixf(rv3d->viewmat); glMultMatrixf(ob->obmat); - /* draw adaptive domain bounds */ - if ((sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN) && !render_override) { - float p0[3], p1[3]; + if (!render_override) { BoundBox bb; - /* draw domain max bounds */ - VECSUBFAC(p0, sds->p0, sds->cell_size, sds->adapt_res); - VECADDFAC(p1, sds->p1, sds->cell_size, sds->adapt_res); - BKE_boundbox_init_from_minmax(&bb, p0, p1); - draw_box(bb.vec, false); + float p0[3], p1[3]; + + /* draw adaptive domain bounds */ + if ((sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN)) { + /* draw domain max bounds */ + VECSUBFAC(p0, sds->p0, sds->cell_size, sds->adapt_res); + VECADDFAC(p1, sds->p1, sds->cell_size, sds->adapt_res); + BKE_boundbox_init_from_minmax(&bb, p0, p1); + draw_box(bb.vec, false); + } #if 0 /* draw base resolution bounds */ BKE_boundbox_init_from_minmax(&bb, sds->p0, sds->p1); draw_box(bb.vec); #endif + + + /* draw a single voxel to hint the user about the resolution of the fluid */ + copy_v3_v3(p0, sds->p0); + + if (sds->flags & MOD_SMOKE_HIGHRES) { + madd_v3_v3v3fl(p1, p0, sds->cell_size, 1.0f / (sds->amplify + 1)); + } + else { + add_v3_v3v3(p1, p0, sds->cell_size); + } + + BKE_boundbox_init_from_minmax(&bb, p0, p1); + draw_box(bb.vec, false); } /* don't show smoke before simulation starts, this could be made an option in the future */ - if (smd->domain->fluid && CFRA >= smd->domain->point_cache[0]->startframe) { + if (sds->fluid && CFRA >= sds->point_cache[0]->startframe) { float p0[3], p1[3]; /* get view vector */ @@ -8074,21 +7951,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short p1[2] = (sds->p0[2] + sds->cell_size[2] * sds->res_max[2] + sds->obj_shift_f[2]) * fabsf(ob->size[2]); if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) { - smd->domain->tex = NULL; + sds->tex = NULL; GPU_create_smoke(smd, 0); - draw_smoke_volume(sds, ob, sds->tex, - p0, p1, - sds->res, sds->dx, sds->scale * sds->maxres, - viewnormal, sds->tex_shadow, sds->tex_flame); + draw_smoke_volume(sds, ob, p0, p1, viewnormal); GPU_free_smoke(smd); } else if (sds->wt && (sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) { sds->tex = NULL; GPU_create_smoke(smd, 1); - draw_smoke_volume(sds, ob, sds->tex, - p0, p1, - sds->res_wt, sds->dx, sds->scale * sds->maxres, - viewnormal, sds->tex_shadow, sds->tex_flame); + draw_smoke_volume(sds, ob, p0, p1, viewnormal); GPU_free_smoke(smd); } @@ -8129,7 +8000,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short if (dtx && (G.f & G_RENDER_OGL) == 0) { if (dtx & OB_AXIS) { - drawaxes(1.0f, OB_ARROWS); + drawaxes(rv3d->viewmatob, 1.0f, OB_ARROWS); } if (dtx & OB_DRAWBOUNDOX) { draw_bounding_volume(ob, ob->boundtype); @@ -8213,13 +8084,21 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short if (do_draw_center != -1) { if (dflag & DRAW_PICKING) { /* draw a single point for opengl selection */ - glBegin(GL_POINTS); - glVertex3fv(ob->obmat[3]); - glEnd(); + if ((base->sx != IS_CLIPPED) && + (U.obcenter_dia != 0.0)) + { + glPointSize(U.obcenter_dia); + glBegin(GL_POINTS); + glVertex3fv(ob->obmat[3]); + glEnd(); + } } else if ((dflag & DRAW_CONSTCOLOR) == 0) { /* we don't draw centers for duplicators and sets */ - if (U.obcenter_dia > 0 && !(G.f & G_RENDER_OGL)) { + if ((base->sx != IS_CLIPPED) && + (U.obcenter_dia != 0.0) && + !(G.f & G_RENDER_OGL)) + { /* check > 0 otherwise grease pencil can draw into the circle select which is annoying. */ drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us > 1); } @@ -8351,7 +8230,7 @@ static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, const floa if (!(mv->flag & ME_HIDE)) { WM_framebuffer_index_set(data->offset + index); - bglVertex3fv(co); + glVertex3fv(co); } } @@ -8363,10 +8242,9 @@ static void bbs_obmode_mesh_verts(Object *ob, DerivedMesh *dm, int offset) data.mvert = mvert; data.offset = offset; glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); dm->foreachMappedVert(dm, bbs_obmode_mesh_verts__mapFunc, &data, DM_FOREACH_NOP); - bglEnd(); - glPointSize(1.0); + glEnd(); } static void bbs_mesh_verts__mapFunc(void *userData, int index, const float co[3], @@ -8377,17 +8255,16 @@ static void bbs_mesh_verts__mapFunc(void *userData, int index, const float co[3] if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { WM_framebuffer_index_set(data->offset + index); - bglVertex3fv(co); + glVertex3fv(co); } } static void bbs_mesh_verts(BMEditMesh *em, DerivedMesh *dm, int offset) { drawBMOffset_userData data = {em->bm, offset}; glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); dm->foreachMappedVert(dm, bbs_mesh_verts__mapFunc, &data, DM_FOREACH_NOP); - bglEnd(); - glPointSize(1.0); + glEnd(); } static DMDrawOption bbs_mesh_wire__setDrawOptions(void *userData, int index) @@ -8444,7 +8321,7 @@ static void bbs_mesh_solid__drawCenter(void *userData, int index, const float ce if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { WM_framebuffer_index_set(index + 1); - bglVertex3fv(cent); + glVertex3fv(cent); } } @@ -8460,9 +8337,9 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d, if (check_ob_drawface_dot(scene, v3d, ob->dt)) { glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE)); - bglBegin(GL_POINTS); + glBegin(GL_POINTS); dm->foreachMappedFaceCenter(dm, bbs_mesh_solid__drawCenter, em->bm, DM_FOREACH_NOP); - bglEnd(); + glEnd(); } } @@ -8511,7 +8388,9 @@ static void bbs_mesh_solid_verts(Scene *scene, Object *ob) DM_update_materials(dm, ob); - dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, GPU_enable_material, NULL, me, DM_DRAW_SKIP_HIDDEN); + dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, GPU_object_material_bind, NULL, me, DM_DRAW_SKIP_HIDDEN); + + GPU_object_material_unbind(); bbs_obmode_mesh_verts(ob, dm, 1); bm_vertoffs = me->totvert + 1; @@ -8612,7 +8491,6 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r { Mesh *me = ob->data; DerivedMesh *dm = NULL, *edm = NULL; - int glsl; if (ob->mode & OB_MODE_EDIT) { edm = editbmesh_get_derived_base(ob, me->edit_btmesh); @@ -8634,26 +8512,20 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r draw_mesh_object_outline(v3d, ob, dm ? dm : edm); if (dm) { - glsl = draw_glsl_material(scene, ob, v3d, dt); + bool glsl = draw_glsl_material(scene, ob, v3d, dt); GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); } - else { - glEnable(GL_COLOR_MATERIAL); - UI_ThemeColor(TH_BONE_SOLID); - glDisable(GL_COLOR_MATERIAL); - } glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); - glEnable(GL_LIGHTING); if (dm) { - dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); + dm->drawFacesSolid(dm, NULL, 0, GPU_object_material_bind); GPU_end_object_materials(); } else if (edm) - edm->drawMappedFaces(edm, NULL, GPU_enable_material, NULL, NULL, 0); - - glDisable(GL_LIGHTING); + edm->drawMappedFaces(edm, NULL, GPU_object_material_bind, NULL, NULL, DM_DRAW_NEED_NORMALS); + + GPU_object_material_unbind(); } if (edm) edm->release(edm); @@ -8675,7 +8547,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object draw_empty_image(ob, DRAW_CONSTCOLOR, NULL); } else { - drawaxes(ob->empty_drawsize, ob->empty_drawtype); + drawaxes(rv3d->viewmatob, ob->empty_drawsize, ob->empty_drawtype); } break; } |