fix [#35911] Show weights not working with a weight edit modifier in edit mode
This commit is contained in:
@@ -1946,9 +1946,9 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
|
||||
DerivedMesh **final_r,
|
||||
CustomDataMask dataMask)
|
||||
{
|
||||
ModifierData *md;
|
||||
ModifierData *md, *previewmd = NULL;
|
||||
float (*deformedVerts)[3] = NULL;
|
||||
CustomDataMask mask;
|
||||
CustomDataMask mask, previewmask = 0;
|
||||
DerivedMesh *dm, *orcodm = NULL;
|
||||
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
|
||||
CDMaskLink *datamasks, *curr;
|
||||
@@ -1962,6 +1962,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
|
||||
const int do_final_wmcol = FALSE;
|
||||
int do_init_wmcol = ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) && !do_final_wmcol);
|
||||
int do_init_statvis = ((((Mesh *)ob->data)->drawflag & ME_DRAW_STATVIS) && !do_init_wmcol);
|
||||
const int do_mod_wmcol = do_init_wmcol;
|
||||
|
||||
modifiers_clearErrors(ob);
|
||||
|
||||
@@ -1972,7 +1973,18 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
|
||||
dm = NULL;
|
||||
md = modifiers_getVirtualModifierList(ob);
|
||||
|
||||
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, NULL, 0);
|
||||
/* copied from mesh_calc_modifiers */
|
||||
if (do_mod_wmcol) {
|
||||
previewmd = modifiers_getLastPreview(scene, md, required_mode);
|
||||
/* even if the modifier doesn't need the data, to make a preview it may */
|
||||
if (previewmd) {
|
||||
if (do_mod_wmcol) {
|
||||
previewmask = CD_MASK_MDEFORMVERT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask);
|
||||
|
||||
curr = datamasks;
|
||||
for (i = 0; md; i++, md = md->next, curr = curr->next) {
|
||||
|
||||
@@ -1004,45 +1004,81 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d,
|
||||
}
|
||||
|
||||
/* Vertex Paint and Weight Paint */
|
||||
void draw_mesh_paint_weight_faces(Mesh *me, DerivedMesh *dm, void *facemask, const bool use_light)
|
||||
{
|
||||
if (use_light) {
|
||||
const float spec[4] = {0.47f, 0.47f, 0.47f, 0.47f};
|
||||
|
||||
/* but 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);
|
||||
}
|
||||
|
||||
dm->drawMappedFaces(dm, (DMSetDrawOptions)facemask, GPU_enable_material, NULL, me,
|
||||
DM_DRAW_USE_COLORS | DM_DRAW_ALWAYS_SMOOTH);
|
||||
|
||||
if (use_light) {
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
glDisable(GL_LIGHTING);
|
||||
|
||||
GPU_disable_material();
|
||||
}
|
||||
}
|
||||
|
||||
void draw_mesh_paint_weight_edges(RegionView3D *rv3d, DerivedMesh *dm, const bool use_depth)
|
||||
{
|
||||
/* weight paint in solid mode, special case. focus on making the weights clear
|
||||
* rather than the shading, this is also forced in wire view */
|
||||
|
||||
if (use_depth) {
|
||||
bglPolygonOffset(rv3d->dist, 1.0);
|
||||
glDepthMask(0); /* disable write in zbuffer, selected edge wires show better */
|
||||
}
|
||||
else {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glColor4ub(255, 255, 255, 96);
|
||||
glEnable(GL_LINE_STIPPLE);
|
||||
glLineStipple(1, 0xAAAA);
|
||||
|
||||
dm->drawEdges(dm, 1, 1);
|
||||
|
||||
if (use_depth) {
|
||||
bglPolygonOffset(rv3d->dist, 0.0);
|
||||
glDepthMask(1);
|
||||
}
|
||||
else {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
glDisable(GL_LINE_STIPPLE);
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
|
||||
Object *ob, DerivedMesh *dm, const int draw_flags)
|
||||
{
|
||||
DMSetDrawOptions facemask = NULL;
|
||||
Mesh *me = ob->data;
|
||||
const bool do_light = (v3d->drawtype >= OB_SOLID);
|
||||
const bool use_light = (v3d->drawtype >= OB_SOLID);
|
||||
|
||||
/* hide faces in face select mode */
|
||||
if (me->editflag & (ME_EDIT_PAINT_VERT_SEL | ME_EDIT_PAINT_FACE_SEL))
|
||||
facemask = wpaint__setSolidDrawOptions_facemask;
|
||||
|
||||
if (ob->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
|
||||
if (do_light) {
|
||||
const float spec[4] = {0.47f, 0.47f, 0.47f, 0.47f};
|
||||
|
||||
/* enforce default material settings */
|
||||
if (use_light) {
|
||||
GPU_enable_material(0, NULL);
|
||||
|
||||
/* but 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);
|
||||
}
|
||||
|
||||
dm->drawMappedFaces(dm, facemask, GPU_enable_material, NULL, me,
|
||||
DM_DRAW_USE_COLORS | DM_DRAW_ALWAYS_SMOOTH);
|
||||
|
||||
if (do_light) {
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
glDisable(GL_LIGHTING);
|
||||
|
||||
GPU_disable_material();
|
||||
}
|
||||
draw_mesh_paint_weight_faces(me, dm, facemask, use_light);
|
||||
}
|
||||
else if (ob->mode & OB_MODE_VERTEX_PAINT) {
|
||||
if (me->mloopcol) {
|
||||
@@ -1060,37 +1096,9 @@ void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
|
||||
if (draw_flags & DRAW_FACE_SELECT) {
|
||||
draw_mesh_face_select(rv3d, me, dm);
|
||||
}
|
||||
else if ((do_light == false) || (ob->dtx & OB_DRAWWIRE)) {
|
||||
const int use_depth = (v3d->flag & V3D_ZBUF_SELECT) || !(ob->mode & OB_MODE_WEIGHT_PAINT);
|
||||
|
||||
/* weight paint in solid mode, special case. focus on making the weights clear
|
||||
* rather than the shading, this is also forced in wire view */
|
||||
|
||||
if (use_depth) {
|
||||
bglPolygonOffset(rv3d->dist, 1.0);
|
||||
glDepthMask(0); /* disable write in zbuffer, selected edge wires show better */
|
||||
}
|
||||
else {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glColor4ub(255, 255, 255, 96);
|
||||
glEnable(GL_LINE_STIPPLE);
|
||||
glLineStipple(1, 0xAAAA);
|
||||
|
||||
dm->drawEdges(dm, 1, 1);
|
||||
|
||||
if (use_depth) {
|
||||
bglPolygonOffset(rv3d->dist, 0.0);
|
||||
glDepthMask(1);
|
||||
}
|
||||
else {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
glDisable(GL_LINE_STIPPLE);
|
||||
glDisable(GL_BLEND);
|
||||
else if ((use_light == false) || (ob->dtx & OB_DRAWWIRE)) {
|
||||
const bool use_depth = (v3d->flag & V3D_ZBUF_SELECT) || !(ob->mode & OB_MODE_WEIGHT_PAINT);
|
||||
draw_mesh_paint_weight_edges(rv3d, dm, use_depth);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@ static void ob_wire_color_blend_theme_id(const unsigned char ob_wire_col[4], con
|
||||
}
|
||||
|
||||
/* this condition has been made more complex since editmode can draw textures */
|
||||
static bool check_object_draw_texture(Scene *scene, View3D *v3d, int drawtype)
|
||||
static bool check_object_draw_texture(Scene *scene, View3D *v3d, const char drawtype)
|
||||
{
|
||||
/* texture and material draw modes */
|
||||
if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID) {
|
||||
@@ -201,6 +201,18 @@ static bool check_object_draw_texture(Scene *scene, View3D *v3d, int drawtype)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool check_object_draw_editweight(Mesh *me, DerivedMesh *finalDM)
|
||||
{
|
||||
if (me->drawflag & ME_DRAWEIGHT) {
|
||||
/* editmesh handles its own weight drawing */
|
||||
if (finalDM->type != DM_TYPE_EDITBMESH) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool check_ob_drawface_dot(Scene *sce, View3D *vd, char dt)
|
||||
{
|
||||
if ((sce->toolsettings->selectmode & SCE_SELECT_FACE) == 0)
|
||||
@@ -3030,7 +3042,21 @@ static void draw_em_fancy(Scene *scene, ARegion *ar, View3D *v3d,
|
||||
|
||||
EDBM_index_arrays_ensure(em, BM_VERT | BM_EDGE | BM_FACE);
|
||||
|
||||
if (dt > OB_WIRE) {
|
||||
if (check_object_draw_editweight(me, finalDM)) {
|
||||
if (dt > OB_WIRE) {
|
||||
draw_mesh_paint_weight_faces(me, finalDM, NULL, true);
|
||||
|
||||
bglPolygonOffset(rv3d->dist, 1.0);
|
||||
glDepthMask(0);
|
||||
}
|
||||
else {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
draw_mesh_paint_weight_faces(me, finalDM, NULL, false);
|
||||
draw_mesh_paint_weight_edges(rv3d, finalDM, true);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
}
|
||||
else if (dt > OB_WIRE) {
|
||||
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);
|
||||
|
||||
@@ -150,6 +150,8 @@ bool draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
|
||||
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d,
|
||||
struct Object *ob, struct DerivedMesh *dm, const int draw_flags);
|
||||
void draw_mesh_face_select(struct RegionView3D *rv3d, struct Mesh *me, struct DerivedMesh *dm);
|
||||
void draw_mesh_paint_weight_faces(struct Mesh *me, struct DerivedMesh *dm, void *facemask, const bool do_light);
|
||||
void draw_mesh_paint_weight_edges(RegionView3D *rv3d, struct DerivedMesh *dm, const bool use_depth);
|
||||
void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
|
||||
struct Object *ob, struct DerivedMesh *dm, const int draw_flags);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user