[Bf-blender-cvs] [9128242] soc-2013-paint: Fix irritating issue with cursor display.

Antony Riakiotakis noreply at git.blender.org
Tue Apr 29 20:48:04 CEST 2014


Commit: 91282428597204696319e9ebadf192937f089450
Author: Antony Riakiotakis
Date:   Tue Apr 29 21:47:39 2014 +0300
https://developer.blender.org/rB91282428597204696319e9ebadf192937f089450

Fix irritating issue with cursor display.

It seems tpage reset was not occuring because new display code did not
update those data at all. Now force OpenGL update properly and
also add a forced way to clear the tpage.

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

M	source/blender/editors/space_view3d/drawmesh.c
M	source/blender/gpu/GPU_draw.h
M	source/blender/gpu/intern/gpu_draw.c

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

diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 8348b05..7294040 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -242,7 +242,8 @@ static bool set_draw_settings_cached(int clearcache, MTFace *texface, Material *
 	int lit = 0;
 	int has_texface = texface != NULL;
 	bool need_set_tpage = false;
-	bool texpaint = false;
+	bool texpaint = ((gtexdraw.ob->mode & OB_MODE_TEXTURE_PAINT) != 0);
+
 	Image *ima = NULL;
 
 	if (clearcache) {
@@ -251,29 +252,9 @@ static bool set_draw_settings_cached(int clearcache, MTFace *texface, Material *
 		c_badtex = false;
 		c_has_texface = -1;
 		c_ma = NULL;
-
-		/* load the stencil texture here */
-		if ((Gtexdraw.ob->mode & OB_MODE_TEXTURE_PAINT) && (Gtexdraw.stencil != NULL)) {
-			glActiveTexture(GL_TEXTURE1);
-			if (GPU_verify_image(Gtexdraw.stencil, NULL, 0, 1, 0, false)) {
-				glEnable(GL_TEXTURE_2D);
-				glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-				glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
-				glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
-				glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTURE);
-				glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
-				glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
-				glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, Gtexdraw.stencil_col);
-				if (!Gtexdraw.stencil_invert) {
-					glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_COLOR);
-				}
-			}
-			glActiveTexture(GL_TEXTURE0);
-		}
 	}
 	else {
 		textured = gtexdraw.is_tex;
-		texpaint = ((gtexdraw.ob->mode & OB_MODE_TEXTURE_PAINT) != 0);
 	}
 
 	/* convert number of lights into boolean */
@@ -321,7 +302,9 @@ static bool set_draw_settings_cached(int clearcache, MTFace *texface, Material *
 					glEnable(GL_TEXTURE_2D);
 				}
 				else {
-					GPU_set_tpage(NULL, 0, 0);
+					c_badtex = true;
+					GPU_clear_tpage(true);
+					glDisable(GL_TEXTURE_2D);
 					glBindTexture(GL_TEXTURE_2D, 0);
 				}
 			}
@@ -407,6 +390,25 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
 	copy_v3_v3(Gtexdraw.stencil_col, imapaint->stencil_col);
 	Gtexdraw.is_tex = is_tex;
 
+	/* load the stencil texture here */
+	if ((ob->mode == OB_MODE_TEXTURE_PAINT) && (Gtexdraw.stencil != NULL)) {
+		glActiveTexture(GL_TEXTURE1);
+		if (GPU_verify_image(Gtexdraw.stencil, NULL, 0, 1, 0, false)) {
+			glEnable(GL_TEXTURE_2D);
+			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
+			glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+			glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTURE);
+			glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
+			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+			glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, Gtexdraw.stencil_col);
+			if (!Gtexdraw.stencil_invert) {
+				glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_COLOR);
+			}
+		}
+		glActiveTexture(GL_TEXTURE0);
+	}
+
 	Gtexdraw.color_profile = BKE_scene_check_color_management_enabled(scene);
 	Gtexdraw.use_game_mat = (RE_engines_find(scene->r.engine)->flag & RE_GAME) != 0;
 	Gtexdraw.use_backface_culling = (v3d->flag2 & V3D_BACKFACE_CULLING) != 0;
@@ -420,16 +422,23 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
 
 static void draw_textured_end(void)
 {
-	/* switch off textures */
-	GPU_set_tpage(NULL, 0, 0);
-
-	if((Gtexdraw.ob->mode & OB_MODE_TEXTURE_PAINT) && (Gtexdraw.stencil != NULL)) {
-		glActiveTexture(GL_TEXTURE1);
-		GPU_set_tpage(NULL, 0, 0);
-		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
-		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+	if (Gtexdraw.ob->mode & OB_MODE_TEXTURE_PAINT) {
+		if (Gtexdraw.stencil != NULL) {
+			glActiveTexture(GL_TEXTURE1);
+			glDisable(GL_TEXTURE_2D);
+			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
+			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+			glBindTexture(GL_TEXTURE_2D, 0);
+			glActiveTexture(GL_TEXTURE0);
+		}
+		/* manual reset, since we don't use tpage */
 		glBindTexture(GL_TEXTURE_2D, 0);
-		glActiveTexture(GL_TEXTURE0);
+		/* force switch off textures */
+		GPU_clear_tpage(true);
+	}
+	else {
+		/* switch off textures */
+		GPU_set_tpage(NULL, 0, 0);
 	}
 
 	glShadeModel(GL_FLAT);
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index ee1eabc..da390af 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -87,7 +87,7 @@ int GPU_get_material_alpha_blend(void);
  * - passing NULL clears the state again */
 
 int GPU_set_tpage(struct MTFace *tface, int mipmap, int transp);
-
+void GPU_clear_tpage(bool force);
 /* Lights
  * - returns how many lights were enabled
  * - this affects fixed functions materials and texface, not glsl */
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 1845de1..1f6e6ee 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -368,9 +368,9 @@ static void gpu_make_repbind(Image *ima)
 	BKE_image_release_ibuf(ima, ibuf, NULL);
 }
 
-static void gpu_clear_tpage(void)
+void GPU_clear_tpage(bool force)
 {
-	if (GTS.lasttface==NULL)
+	if (GTS.lasttface==NULL && !force)
 		return;
 	
 	GTS.lasttface= NULL;
@@ -864,7 +864,7 @@ int GPU_set_tpage(MTFace *tface, int mipmap, int alphablend)
 	
 	/* check if we need to clear the state */
 	if (tface==NULL) {
-		gpu_clear_tpage();
+		GPU_clear_tpage(false);
 		return 0;
 	}




More information about the Bf-blender-cvs mailing list