[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57891] trunk/blender/source/blender: fix [#35911] Show weights not working with a weight edit modifier in edit mode

Campbell Barton ideasman42 at gmail.com
Mon Jul 1 02:42:45 CEST 2013


Revision: 57891
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57891
Author:   campbellbarton
Date:     2013-07-01 00:42:44 +0000 (Mon, 01 Jul 2013)
Log Message:
-----------
fix [#35911] Show weights not working with a weight edit modifier in edit mode

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/editors/space_view3d/drawmesh.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-06-30 23:50:17 UTC (rev 57890)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-07-01 00:42:44 UTC (rev 57891)
@@ -1946,9 +1946,9 @@
                                      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 @@
 	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,8 +1973,19 @@
 	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) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);

Modified: trunk/blender/source/blender/editors/space_view3d/drawmesh.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawmesh.c	2013-06-30 23:50:17 UTC (rev 57890)
+++ trunk/blender/source/blender/editors/space_view3d/drawmesh.c	2013-07-01 00:42:44 UTC (rev 57891)
@@ -1004,45 +1004,81 @@
 }
 
 /* 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 @@
 	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);
 	}
 }
 

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2013-06-30 23:50:17 UTC (rev 57890)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2013-07-01 00:42:44 UTC (rev 57891)
@@ -179,7 +179,7 @@
 }
 
 /* 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 @@
 	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 @@
 	
 	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);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2013-06-30 23:50:17 UTC (rev 57890)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2013-07-01 00:42:44 UTC (rev 57891)
@@ -150,6 +150,8 @@
 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);
 




More information about the Bf-blender-cvs mailing list