fix for fix, own fix for [#31368] didnt work right, now move shadeless & wire paint drawing into draw_mesh_paint().

This commit is contained in:
Campbell Barton 2012-05-10 06:32:24 +00:00
parent 10d1cde0ad
commit caba2601ea
3 changed files with 55 additions and 50 deletions

@ -926,14 +926,14 @@ static int tex_mat_set_face_editmesh_cb(void *userData, int index)
return !BM_elem_flag_test(efa, BM_ELEM_HIDDEN); return !BM_elem_flag_test(efa, BM_ELEM_HIDDEN);
} }
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags) void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, const int draw_flags)
{ {
if ((!BKE_scene_use_new_shading_nodes(scene)) || (draw_flags & DRAW_MODIFIERS_PREVIEW)) { if ((!BKE_scene_use_new_shading_nodes(scene)) || (draw_flags & DRAW_MODIFIERS_PREVIEW)) {
draw_mesh_textured_old(scene, v3d, rv3d, ob, dm, draw_flags); draw_mesh_textured_old(scene, v3d, rv3d, ob, dm, draw_flags);
return; return;
} }
else if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) { else if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) {
draw_mesh_paint(rv3d, ob, dm, draw_flags); draw_mesh_paint(v3d, rv3d, ob, dm, draw_flags);
return; return;
} }
@ -1002,16 +1002,19 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* Vertex Paint and Weight Paint */ /* Vertex Paint and Weight Paint */
void draw_mesh_paint(RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags) void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags)
{ {
DMSetDrawOptions facemask = NULL; DMSetDrawOptions facemask = NULL;
Mesh *me = ob->data; Mesh *me = ob->data;
const short do_light = (v3d->drawtype >= OB_SOLID);
/* hide faces in face select mode */ /* hide faces in face select mode */
if (draw_flags & DRAW_FACE_SELECT) if (draw_flags & DRAW_FACE_SELECT)
facemask = wpaint__setSolidDrawOptions_facemask; facemask = wpaint__setSolidDrawOptions_facemask;
if (ob && ob->mode & OB_MODE_WEIGHT_PAINT) { if (ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
if (do_light) {
/* enforce default material settings */ /* enforce default material settings */
GPU_enable_material(0, NULL); GPU_enable_material(0, NULL);
@ -1025,15 +1028,18 @@ void draw_mesh_paint(RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_f
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
}
dm->drawMappedFaces(dm, facemask, GPU_enable_material, NULL, me, dm->drawMappedFaces(dm, facemask, GPU_enable_material, NULL, me,
DM_DRAW_USE_COLORS | DM_DRAW_ALWAYS_SMOOTH); DM_DRAW_USE_COLORS | DM_DRAW_ALWAYS_SMOOTH);
if (do_light) {
glDisable(GL_COLOR_MATERIAL); glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
GPU_disable_material(); GPU_disable_material();
} }
}
else if (ob->mode & OB_MODE_VERTEX_PAINT) { else if (ob->mode & OB_MODE_VERTEX_PAINT) {
if (me->mloopcol) { if (me->mloopcol) {
dm->drawMappedFaces(dm, facemask, GPU_enable_material, NULL, me, dm->drawMappedFaces(dm, facemask, GPU_enable_material, NULL, me,
@ -1047,7 +1053,28 @@ void draw_mesh_paint(RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_f
} }
/* draw face selection on top */ /* draw face selection on top */
if (draw_flags & DRAW_FACE_SELECT) if (draw_flags & DRAW_FACE_SELECT) {
draw_mesh_face_select(rv3d, me, dm); draw_mesh_face_select(rv3d, me, dm);
}
else if ((do_light == FALSE) || (ob->dtx & OB_DRAWWIRE)) {
/* weight paint in solid mode, special case. focus on making the weights clear
* rather than the shading, this is also forced in wire view */
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
glEnable(GL_BLEND);
glColor4ub(255, 255, 255, 96);
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0xAAAA);
dm->drawEdges(dm, 1, 1);
bglPolygonOffset(rv3d->dist, 0.0);
glDepthMask(1);
glDisable(GL_LINE_STIPPLE);
glDisable(GL_BLEND);
}
} }

@ -3367,34 +3367,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
} }
} }
else if (dt == OB_SOLID) { else if (dt == OB_SOLID) {
if (is_obact && ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) { if (draw_flags & DRAW_MODIFIERS_PREVIEW) {
/* weight paint in solid mode, special case. focus on making the weights clear
* rather than the shading, this is also forced in wire view */
GPU_enable_material(0, NULL);
dm->drawMappedFaces(dm, NULL, GPU_enable_material, NULL, me->mpoly,
DM_DRAW_USE_COLORS | DM_DRAW_ALWAYS_SMOOTH);
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
glEnable(GL_BLEND);
glColor4ub(255, 255, 255, 96);
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0xAAAA);
dm->drawEdges(dm, 1, 1);
bglPolygonOffset(rv3d->dist, 0.0);
glDepthMask(1);
glDisable(GL_LINE_STIPPLE);
glDisable(GL_BLEND);
GPU_disable_material();
/* since we already draw wire as wp guide, don't draw over the top */
draw_wire = OBDRAW_WIRE_OFF;
}
else if (draw_flags & DRAW_MODIFIERS_PREVIEW) {
/* for object selection draws no shade */ /* for object selection draws no shade */
if (flag & (DRAW_PICKING | DRAW_CONSTCOLOR)) { if (flag & (DRAW_PICKING | DRAW_CONSTCOLOR)) {
dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material); dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material);
@ -3485,7 +3458,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
} }
} }
else if (dt == OB_PAINT) { else if (dt == OB_PAINT) {
draw_mesh_paint(rv3d, ob, dm, draw_flags); draw_mesh_paint(v3d, rv3d, ob, dm, draw_flags);
/* since we already draw wire as wp guide, don't draw over the top */
draw_wire = OBDRAW_WIRE_OFF;
} }
/* set default draw color back for wire or for draw-extra later on */ /* set default draw color back for wire or for draw-extra later on */

@ -131,8 +131,10 @@ void view3d_cached_text_draw_end(View3D * v3d, ARegion * ar, int depth_write, fl
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag, const short is_outline); int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag, const short is_outline);
/* drawmesh.c */ /* drawmesh.c */
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, struct DerivedMesh *dm, int faceselect); void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d,
void draw_mesh_paint(RegionView3D *rv3d, struct Object *ob, struct DerivedMesh *dm, int faceselect); struct Object *ob, struct DerivedMesh *dm, const int draw_flags);
void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
struct Object *ob, struct DerivedMesh *dm, const int draw_flags);
/* view3d_draw.c */ /* view3d_draw.c */
void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar); void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);