[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29929] trunk/blender/source/blender: Fix #21894: backface selection wasn't working correct with < 24 bits colors,

Brecht Van Lommel brecht at blender.org
Sun Jul 4 14:24:20 CEST 2010


Revision: 29929
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29929
Author:   blendix
Date:     2010-07-04 14:24:19 +0200 (Sun, 04 Jul 2010)

Log Message:
-----------
Fix #21894: backface selection wasn't working correct with < 24 bits colors,
e.g. thousands of colors on OS X, due to use of uninitialized value. Problem
tracked down and patch provided by Shane Ambler, thanks!

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_extensions.h
    trunk/blender/source/blender/gpu/intern/gpu_extensions.c
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c
    trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c

Modified: trunk/blender/source/blender/gpu/GPU_extensions.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_extensions.h	2010-07-04 12:16:01 UTC (rev 29928)
+++ trunk/blender/source/blender/gpu/GPU_extensions.h	2010-07-04 12:24:19 UTC (rev 29929)
@@ -61,7 +61,7 @@
 
 int GPU_glsl_support(void);
 int GPU_non_power_of_two_support(void);
-int GPU_24bit_color_support(void);
+int GPU_color_depth(void);
 
 /* GPU Types */
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2010-07-04 12:16:01 UTC (rev 29928)
+++ trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2010-07-04 12:24:19 UTC (rev 29929)
@@ -71,7 +71,7 @@
 	GLuint currentfb;
 	int glslsupport;
 	int extdisabled;
-	int color24bit;
+	int colordepth;
 	GPUDeviceType device;
 	GPUOSType os;
 	GPUDriverType driver;
@@ -93,7 +93,7 @@
 
 void GPU_extensions_init()
 {
-	GLint bits;
+	GLint r, g, b;
 	const char *vendor, *renderer;
 
 	glewInit();
@@ -108,9 +108,11 @@
 	if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0;
 	if (!GLEW_ARB_fragment_shader) GG.glslsupport = 0;
 
-	glGetIntegerv(GL_RED_BITS, &bits);
-	GG.color24bit = (bits >= 8);
-
+	glGetIntegerv(GL_RED_BITS, &r);
+	glGetIntegerv(GL_GREEN_BITS, &g);
+	glGetIntegerv(GL_BLUE_BITS, &b);
+    GG.colordepth = r+g+b; /* assumes same depth for RGB */
+    
 	vendor = (const char*)glGetString(GL_VENDOR);
 	renderer = (const char*)glGetString(GL_RENDERER);
 
@@ -178,9 +180,9 @@
 	return GLEW_ARB_texture_non_power_of_two;
 }
 
-int GPU_24bit_color_support()
+int GPU_color_depth()
 {
-	return GG.color24bit;
+    return GG.colordepth;
 }
 
 int GPU_print_error(char *str)

Modified: trunk/blender/source/blender/windowmanager/intern/wm_draw.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-07-04 12:16:01 UTC (rev 29928)
+++ trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-07-04 12:24:19 UTC (rev 29929)
@@ -682,7 +682,7 @@
 		/* Windows software driver darkens color on each redraw */
 		else if(GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_WIN, GPU_DRIVER_SOFTWARE))
 			return USER_DRAW_OVERLAP_FLIP;
-		else if(!GPU_24bit_color_support())
+		else if(GPU_color_depth() < 24)
 			return USER_DRAW_OVERLAP;
 		else
 			return USER_DRAW_TRIPLE;

Modified: trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c	2010-07-04 12:16:01 UTC (rev 29928)
+++ trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c	2010-07-04 12:24:19 UTC (rev 29929)
@@ -45,6 +45,8 @@
 
 #include "BIF_gl.h"
 
+#include "GPU_extensions.h"
+
 #include "WM_api.h"
 #include "wm_subwindow.h"
 #include "wm_window.h"
@@ -301,28 +303,6 @@
 
 /* *************************** Framebuffer color depth, for selection codes ********************** */
 
-static int wm_get_colordepth(void)
-{
-	static int mainwin_color_depth= 0;	
-	
-	if(mainwin_color_depth==0) {
-		GLint r, g, b;
-		
-		glGetIntegerv(GL_RED_BITS, &r);
-		glGetIntegerv(GL_GREEN_BITS, &g);
-		glGetIntegerv(GL_BLUE_BITS, &b);
-		
-		mainwin_color_depth= r + g + b;
-		if(G.f & G_DEBUG) {
-			printf("Color depth r %d g %d b %d\n", (int)r, (int)g, (int)b);
-			glGetIntegerv(GL_AUX_BUFFERS, &r);
-			printf("Aux buffers: %d\n", (int)r);
-		}
-	}
-	return mainwin_color_depth;
-}
-
-
 #ifdef __APPLE__
 
 /* apple seems to round colors to below and up on some configs */
@@ -331,7 +311,7 @@
 {
 	unsigned int i= index;
 
-	switch(wm_get_colordepth()) {
+	switch(GPU_color_depth()) {
 	case 12:
 		i= ((i & 0xF00)<<12) + ((i & 0xF0)<<8) + ((i & 0xF)<<4);
 		/* sometimes dithering subtracts! */
@@ -361,7 +341,7 @@
 {
 	unsigned int i= index;
 	
-	switch(wm_get_colordepth()) {
+	switch(GPU_color_depth()) {
 		case 8:
 			i= ((i & 48)<<18) + ((i & 12)<<12) + ((i & 3)<<6);
 			i |= 0x3F3F3F;
@@ -398,7 +378,7 @@
 {
 	if (col==0) return 0;
 
-	switch(wm_get_colordepth()) {
+	switch(GPU_color_depth()) {
 	case 8:
 		return ((col & 0xC00000)>>18) + ((col & 0xC000)>>12) + ((col & 0xC0)>>6);
 	case 12:





More information about the Bf-blender-cvs mailing list