Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r--source/blender/editors/space_view3d/drawobject.c1546
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;
}