[Bf-blender-cvs] [2e8ba17] master: Fix T42653, solidify modifier not displaying correctly under edit mode.

Antony Riakiotakis noreply at git.blender.org
Thu Nov 27 19:20:17 CET 2014


Commit: 2e8ba179f71131779899df5a916252922f029e43
Author: Antony Riakiotakis
Date:   Thu Nov 27 19:12:48 2014 +0100
Branches: master
https://developer.blender.org/rB2e8ba179f71131779899df5a916252922f029e43

Fix T42653, solidify modifier not displaying correctly under edit mode.

Basically, our drawing code assumed we always use the edit mesh
materials, which can be different from the derived mesh
materials in modifiers doing overrides. We usually we want to use the
derived mesh when it is available instead.

There are two fixes here for both solid and textured mode. Unfortunately
the fixes do not help to make the display code less labyrinthian but I
expect this "should work" (tm and famous last words)

Solid mode fix is 95% from Bastien, thanks!

===================================================================

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/editderivedmesh.c
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/editors/space_view3d/drawmesh.c
M	source/blender/editors/space_view3d/drawobject.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 229d2fc..99164b8 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -147,6 +147,7 @@ typedef int (*DMSetMaterial)(int mat_nr, void *attribs);
 typedef int (*DMCompareDrawOptions)(void *userData, int cur_index, int next_index);
 typedef void (*DMSetDrawInterpOptions)(void *userData, int index, float t);
 typedef DMDrawOption (*DMSetDrawOptions)(void *userData, int index);
+typedef DMDrawOption (*DMSetDrawOptionsMappedTex)(void *userData, int origindex, int index);
 typedef DMDrawOption (*DMSetDrawOptionsTex)(struct MTFace *tface, const bool has_vcol, int matnr);
 
 typedef enum DMDrawFlag {
@@ -423,7 +424,7 @@ struct DerivedMesh {
 	 * - Drawing options too complicated to enumerate, look at code.
 	 */
 	void (*drawMappedFacesTex)(DerivedMesh *dm,
-	                           DMSetDrawOptions setDrawOptions,
+	                           DMSetDrawOptionsMappedTex setDrawOptions,
 	                           DMCompareDrawOptions compareDrawOptions,
 	                           void *userData, DMDrawFlag uvflag);
 
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index bfc70c9..5226171 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -667,7 +667,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
 
 static void cdDM_drawFacesTex_common(DerivedMesh *dm,
                                      DMSetDrawOptionsTex drawParams,
-                                     DMSetDrawOptions drawParamsMapped,
+                                     DMSetDrawOptionsMappedTex drawParamsMapped,
                                      DMCompareDrawOptions compareDrawOptions,
                                      void *userData, DMDrawFlag uvflag)
 {
@@ -759,7 +759,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
 						draw_option = DM_DRAW_OPTION_NORMAL;
 					}
 					else if (drawParamsMapped) {
-						draw_option = drawParamsMapped(userData, orig);
+						draw_option = drawParamsMapped(userData, orig, i);
 					}
 					else {
 						if (nors) {
@@ -769,7 +769,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
 					}
 				}
 				else if (drawParamsMapped) {
-					draw_option = drawParamsMapped(userData, i);
+					draw_option = drawParamsMapped(userData, i, i);
 				}
 				else {
 					if (nors) {
@@ -880,11 +880,11 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
 							draw_option = DM_DRAW_OPTION_NORMAL;
 						}
 						else if (drawParamsMapped) {
-							draw_option = drawParamsMapped(userData, orig);
+							draw_option = drawParamsMapped(userData, orig, actualFace);
 						}
 					}
 					else if (drawParamsMapped) {
-						draw_option = drawParamsMapped(userData, actualFace);
+						draw_option = drawParamsMapped(userData, actualFace, actualFace);
 					}
 				}
 
@@ -1089,6 +1089,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
 			else {
 				/* we need to check if the next material changes */
 				int next_actualFace = dm->drawObject->triangle_to_mface[0];
+				int prev_mat_nr = -1;
 				
 				for (i = 0; i < tottri; i++) {
 					//int actualFace = dm->drawObject->triangle_to_mface[i];
@@ -1103,9 +1104,14 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
 
 					orig = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, actualFace) : actualFace;
 
-					if (orig == ORIGINDEX_NONE)
-						draw_option = setMaterial(mface->mat_nr + 1, NULL);
-					else if (setDrawOptions != NULL)
+					if (mface->mat_nr != prev_mat_nr) {
+						if (setMaterial)
+							draw_option = setMaterial(mface->mat_nr + 1, NULL);
+
+						prev_mat_nr = mface->mat_nr;
+					}
+					
+					if (setDrawOptions != NULL && (orig != ORIGINDEX_NONE))
 						draw_option = setDrawOptions(userData, orig);
 
 					if (draw_option == DM_DRAW_OPTION_STIPPLE) {
@@ -1150,7 +1156,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
 }
 
 static void cdDM_drawMappedFacesTex(DerivedMesh *dm,
-                                    DMSetDrawOptions setDrawOptions,
+                                    DMSetDrawOptionsMappedTex setDrawOptions,
                                     DMCompareDrawOptions compareDrawOptions,
                                     void *userData, DMDrawFlag flag)
 {
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 7d64892..aa82ab5 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -717,7 +717,7 @@ static void bmdm_get_tri_colpreview(BMLoop *ls[3], MLoopCol *lcol[3], unsigned c
 
 static void emDM_drawFacesTex_common(DerivedMesh *dm,
                                      DMSetDrawOptionsTex drawParams,
-                                     DMSetDrawOptions drawParamsMapped,
+                                     DMSetDrawOptionsMappedTex drawParamsMapped,
                                      DMCompareDrawOptions compareDrawOptions,
                                      void *userData)
 {
@@ -785,7 +785,7 @@ static void emDM_drawFacesTex_common(DerivedMesh *dm,
 			if (drawParams)
 				draw_option = drawParams(&mtf, has_vcol, efa->mat_nr);
 			else if (drawParamsMapped)
-				draw_option = drawParamsMapped(userData, BM_elem_index_get(efa));
+				draw_option = drawParamsMapped(userData, BM_elem_index_get(efa), BM_elem_index_get(efa));
 			else
 				draw_option = DM_DRAW_OPTION_NORMAL;
 
@@ -854,7 +854,7 @@ static void emDM_drawFacesTex_common(DerivedMesh *dm,
 			if (drawParams)
 				draw_option = drawParams(&mtf, has_vcol, efa->mat_nr);
 			else if (drawParamsMapped)
-				draw_option = drawParamsMapped(userData, BM_elem_index_get(efa));
+				draw_option = drawParamsMapped(userData, BM_elem_index_get(efa), BM_elem_index_get(efa));
 			else
 				draw_option = DM_DRAW_OPTION_NORMAL;
 
@@ -916,7 +916,7 @@ static void emDM_drawFacesTex(DerivedMesh *dm,
 }
 
 static void emDM_drawMappedFacesTex(DerivedMesh *dm,
-                                    DMSetDrawOptions setDrawOptions,
+                                    DMSetDrawOptionsMappedTex setDrawOptions,
                                     DMCompareDrawOptions compareDrawOptions,
                                     void *userData, DMDrawFlag UNUSED(flag))
 {
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index f03e2ea..482c046 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2289,7 +2289,7 @@ static void ccgDM_drawMappedFacesMat(DerivedMesh *dm,
 
 static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
                                       DMSetDrawOptionsTex drawParams,
-                                      DMSetDrawOptions drawParamsMapped,
+                                      DMSetDrawOptionsMappedTex drawParamsMapped,
                                       DMCompareDrawOptions compareDrawOptions,
                                       void *userData, DMDrawFlag flag)
 {
@@ -2361,7 +2361,7 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 		if (drawParams)
 			draw_option = drawParams(tf, (mcol != NULL), mat_nr);
 		else if (index != ORIGINDEX_NONE)
-			draw_option = (drawParamsMapped) ? drawParamsMapped(userData, index) : DM_DRAW_OPTION_NORMAL;
+			draw_option = (drawParamsMapped) ? drawParamsMapped(userData, index, i) : DM_DRAW_OPTION_NORMAL;
 		else
 			draw_option = GPU_enable_material(mat_nr, NULL) ? DM_DRAW_OPTION_NORMAL : DM_DRAW_OPTION_SKIP;
 
@@ -2530,7 +2530,7 @@ static void ccgDM_drawFacesTex(DerivedMesh *dm,
 }
 
 static void ccgDM_drawMappedFacesTex(DerivedMesh *dm,
-                                     DMSetDrawOptions setDrawOptions,
+                                     DMSetDrawOptionsMappedTex setDrawOptions,
                                      DMCompareDrawOptions compareDrawOptions,
                                      void *userData, DMDrawFlag flag)
 {
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 7334afe..a09dd84 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -668,48 +668,48 @@ static void update_tface_color_layer(DerivedMesh *dm)
 	}
 }
 
-static DMDrawOption draw_tface_mapped__set_draw(void *userData, int index)
+static DMDrawOption draw_tface_mapped__set_draw(void *userData, int origindex, int UNUSED(index))
 {
 	Mesh *me = ((drawTFace_userData *)userData)->me;
 
 	/* array checked for NULL before calling */
-	MPoly *mpoly = &me->mpoly[index];
+	MPoly *mpoly = &me->mpoly[origindex];
 
-	BLI_assert(index >= 0 && index < me->totpoly);
+	BLI_assert(origindex >= 0 && origindex < me->totpoly);
 
 	if (mpoly->flag & ME_HIDE) {
 		return DM_DRAW_OPTION_SKIP;
 	}
 	else {
-		MTexPoly *tpoly = (me->mtpoly) ? &me->mtpoly[index] : NULL;
+		MTexPoly *tpoly = (me->mtpoly) ? &me->mtpoly[origindex] : NULL;
 		MTFace mtf = {{{0}}};
 		int matnr = mpoly->mat_nr;
 
 		if (tpoly) {
 			ME_MTEXFACE_CPY(&mtf, tpoly);
 		}
-
+		
 		return draw_tface__set_draw(&mtf, (me->mloopcol != NULL), matnr);
 	}
 }
 
-static DMDrawOption draw_em_tf_mapped__set_draw(void *userData, int index)
+static DMDrawOption draw_em_tf_mapped__set_draw(void *userData, int origindex, int index)
 {
 	drawEMTFMapped_userData *data = userData;
 	BMEditMesh *em = data->em;
 	BMFace *efa;
 
-	if (UNLIKELY(index >= em->bm->totface))
+	if (UNLIKELY(origindex >= em->bm->totface))
 		return DM_DRAW_OPTION_NORMAL;
 
-	efa = BM_face_at_index(em->bm, index);
+	efa = BM_face_at_index(em->bm, origindex);
 
 	if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
 		return DM_DRAW_OPTION_SKIP;
 	}
 	else {
 		MTFace mtf = {{{0}}};
-		int matnr = efa->mat_nr;
+		int matnr = (data->mf) ? data->mf[index].mat_nr : efa->mat_nr;
 
 		if (data->has_mtface) {
 			MTexPoly *tpoly = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
diff --git a/source/blender/editors/space_view3d/drawobj

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list