[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55350] branches/ge_harmony/source/blender /gpu/intern/gpu_extensions.c: Fixing a bug that caused normal maps to cause viewport problems.

Daniel Stokes kupomail at gmail.com
Sun Mar 17 06:53:51 CET 2013


Revision: 55350
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55350
Author:   kupoman
Date:     2013-03-17 05:53:51 +0000 (Sun, 17 Mar 2013)
Log Message:
-----------
Fixing a bug that caused normal maps to cause viewport problems. Also making sure that any unused textures are set as disabled for the shader when binding the material struct.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-03-17 03:45:15 UTC (rev 55349)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-03-17 05:53:51 UTC (rev 55350)
@@ -89,6 +89,7 @@
 
 static struct GPUGlobal {
 	GLint maxtextures;
+	long enabledtextures; /*bit field*/
 	GLuint currentfb;
 	int glslsupport;
 	int extdisabled;
@@ -133,6 +134,8 @@
 	if (GLEW_ARB_multitexture)
 		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
 
+	GG.enabledtextures = 0;
+
 	GG.glslsupport = 1;
 	if (!GLEW_ARB_multitexture) GG.glslsupport = 0;
 	if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0;
@@ -703,6 +706,9 @@
 	if (number == -1)
 		return;
 
+	
+	GG.enabledtextures |= 1 << number;
+
 	GPU_print_error("Pre Texture Bind");
 
 	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + number);
@@ -728,6 +734,8 @@
 	if (tex->number == -1)
 		return;
 	
+	GG.enabledtextures &= ~(1 << tex->number);
+
 	GPU_print_error("Pre Texture Unbind");
 
 	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
@@ -1421,8 +1429,8 @@
 
 	{
 		int slot = 0, i;
+		int f = 0, t = 1;
 		for (i = 0; i < MAX_MTEX; i++) {
-			int f = 0, t = 1;
 
 			mtex = mat->mtex[i];
 			if (!mtex) continue;
@@ -1434,7 +1442,6 @@
 				sprintf(name, "bgl_Textures[%d].data", slot);
 				bind = GPU_shader_get_uniform(shader, name);
 				gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, time, 1);
-				GPU_texture_bind(gpu_tex, slot);
 				GPU_shader_uniform_texture(shader, bind, gpu_tex);
 			}
 			else
@@ -1446,6 +1453,11 @@
 
 			slot++;
 		}
+		for (; slot < MAX_MTEX; slot++) {
+			sprintf(name, "bgl_Textures[%d].enabled", slot);
+			bind = GPU_shader_get_uniform(shader, name);
+			GPU_shader_uniform_ivector(shader, bind, 1, 1, &f);
+		}
 	}
 }
 
@@ -1505,13 +1517,26 @@
 		GPU_print_error("Not enough texture slots.");
 		return;
 	}
-		
-	if (tex->number == -1)
-		return;
 
 	if (location == -1)
 		return;
 
+	/* If the number is invalid, try to find an open slot */
+	if (tex->number == -1) {
+		int i = 0;
+		for (; i < GG.maxtextures && i < sizeof(GG.enabledtextures); i++) {
+			if (GG.enabledtextures & (1 << i))
+				continue;
+			tex->number = i;
+			break;
+		}
+		if (tex->number == -1)
+			return;
+	}
+	
+	GG.enabledtextures |= 1 << tex->number;
+
+	GPU_print_error("Pre Texture Bind");
 	GPU_print_error("Pre Uniform Texture");
 
 	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);




More information about the Bf-blender-cvs mailing list