[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15576] branches/apricot/source: Apricot: GLSL

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jul 15 01:26:38 CEST 2008


Revision: 15576
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15576
Author:   blendix
Date:     2008-07-15 01:26:38 +0200 (Tue, 15 Jul 2008)

Log Message:
-----------
Apricot: GLSL
=============

* Added options to disable lights, shaders, shadows, ramps,
  nodes and textures other than col/alpha for GLSL, in the
  Game menu.
* These have python access too to switch them in game, but
  it doesn't work correct yet with display lists enabled.
* Fix issue with light lagging behind, debug stats drawing in
  wrong color, and a number of other small fixes.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_global.h
    branches/apricot/source/blender/gpu/GPU_material.h
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_codegen.h
    branches/apricot/source/blender/gpu/intern/gpu_extensions.c
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
    branches/apricot/source/blender/python/SConscript
    branches/apricot/source/blender/python/api2_2x/Blender.c
    branches/apricot/source/blender/src/drawobject.c
    branches/apricot/source/blender/src/header_info.c
    branches/apricot/source/blender/src/space.c
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/apricot/source/gameengine/Ketsji/KX_Light.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Light.h
    branches/apricot/source/gameengine/Ketsji/KX_Scene.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp

Modified: branches/apricot/source/blender/blenkernel/BKE_global.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_global.h	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/blenkernel/BKE_global.h	2008-07-14 23:26:38 UTC (rev 15576)
@@ -218,9 +218,15 @@
 #define G_FILE_NO_UI			 (1 << 10)
 #define G_FILE_GAME_TO_IPO		 (1 << 11)
 #define G_FILE_GAME_MAT			 (1 << 12)
-#define G_FILE_DIAPLAY_LISTS	 (1 << 13)
+#define G_FILE_DISPLAY_LISTS	 (1 << 13)
 #define G_FILE_SHOW_PHYSICS		 (1 << 14)
 #define G_FILE_GAME_MAT_GLSL	 (1 << 15)
+#define G_FILE_GLSL_NO_LIGHTS	 (1 << 16)
+#define G_FILE_GLSL_NO_SHADERS	 (1 << 17)
+#define G_FILE_GLSL_NO_SHADOWS	 (1 << 18)
+#define G_FILE_GLSL_NO_RAMPS	 (1 << 19)
+#define G_FILE_GLSL_NO_NODES	 (1 << 20)
+#define G_FILE_GLSL_NO_EXTRA_TEX (1 << 21)
 
 /* G.windowstate */
 #define G_WINDOWSTATE_USERDEF		0

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/gpu/GPU_material.h	2008-07-14 23:26:38 UTC (rev 15576)
@@ -44,6 +44,7 @@
 struct Lamp;
 struct bNode;
 struct LinkNode;
+struct Scene;
 struct GPUVertexAttribs;
 struct GPUNode;
 struct GPUNodeLink;
@@ -108,9 +109,11 @@
 
 /* High level functions to create and use GPU materials */
 
-int GPU_material_from_blender(struct Material *ma);
+int GPU_material_from_blender(struct Scene *scene, struct Material *ma);
 void GPU_material_free(GPUMaterial *material);
 
+void GPU_materials_free();
+
 void GPU_material_bind(GPUMaterial *material, int lay);
 void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4]);
 void GPU_material_unbind(GPUMaterial *material);

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-14 23:26:38 UTC (rev 15576)
@@ -803,22 +803,34 @@
 	if (!shader)
 		return;
 
-	/* create textures first, otherwise messes up multitexture state for
-	 * following textures*/
-	for (input=inputs->first; input; input=input->next)
+	GPU_shader_bind(shader);
+
+	/* now bind the textures */
+	for (input=inputs->first; input; input=input->next) {
 		if (input->ima)
 			input->tex = GPU_texture_from_blender(input->ima, input->iuser);
 
-	GPU_shader_bind(shader);
-
-	/* pass dynamic inputs to opengl, others were already done */
-	for (input=inputs->first; input; input=input->next) {
 		if(input->ima || input->tex) {
 			if(input->tex) {
 				GPU_texture_bind(input->tex, input->texid);
 				GPU_shader_uniform_texture(shader, input->shadername, input->tex);
 			}
 		}
+	}
+}
+
+void GPU_pass_update_uniforms(GPUPass *pass)
+{
+	GPUInput *input;
+	GPUShader *shader = pass->shader;
+	ListBase *inputs = &pass->inputs;
+
+	if (!shader)
+		return;
+
+	/* pass dynamic inputs to opengl, others were already done */
+	for (input=inputs->first; input; input=input->next) {
+		if(input->ima || input->tex);
 		else if (input->arraysize) {
 			GPU_shader_uniform_vector(shader, input->shadername, input->type,
 				input->arraysize, input->dynamicvec);
@@ -1380,6 +1392,8 @@
 
 	/* failed? */
 	if (!shader) {
+		memset(attribs, 0, sizeof(*attribs));
+		memset(builtins, 0, sizeof(*builtins));
 		GPU_nodes_free(nodes);
 		return NULL;
 	}

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-07-14 23:26:38 UTC (rev 15576)
@@ -72,6 +72,7 @@
 struct GPUShader *GPU_pass_shader(GPUPass *pass);
 
 void GPU_pass_bind(GPUPass *pass);
+void GPU_pass_update_uniforms(GPUPass *pass);
 void GPU_pass_unbind(GPUPass *pass);
 
 void GPU_pass_free(GPUPass *pass);

Modified: branches/apricot/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-07-14 23:26:38 UTC (rev 15576)
@@ -89,7 +89,7 @@
 	/* glewIsSupported("GL_VERSION_2_0") */
 
 	if (GLEW_ARB_multitexture)
-		glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &GG.maxtextures);
+		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
 	if (GLEW_ATI_texture_float || GLEW_ARB_texture_float) {
 		GG.halfformat = (GLEW_ATI_texture_float)? GL_RGBA_FLOAT16_ATI: GL_RGBA16F_ARB;
 	}
@@ -425,16 +425,20 @@
 GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser)
 {
 	GPUTexture *tex;
-	GLint w, h, border;
-
+	GLint w, h, border, lastbindcode;
+		
 	if(ima->gputexture)
 		return ima->gputexture;
+
+	glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
 	
 	if(!ima->bindcode)
 		gpu_blender_texture_create(ima, iuser);
 
-	if(!ima->bindcode)
+	if(!ima->bindcode) {
+		glBindTexture(GL_TEXTURE_2D, lastbindcode);
 		return NULL;
+	}
 
 	tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
 	tex->bindcode = ima->bindcode;
@@ -454,18 +458,17 @@
 		tex->h = tex->realh = 64;
 	}
 	else {
-		GPU_print_error("Blender Texture");
+		glBindTexture(GL_TEXTURE_2D, tex->bindcode);
+		glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
+		glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
+		glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_BORDER, &border);
 
-		glBindTexture(tex->target, tex->bindcode);
-		glGetTexLevelParameteriv(tex->target, 0, GL_TEXTURE_WIDTH, &w);
-		glGetTexLevelParameteriv(tex->target, 0, GL_TEXTURE_HEIGHT, &h);
-		glGetTexLevelParameteriv(tex->target, 0, GL_TEXTURE_BORDER, &border);
-		glBindTexture(tex->target, 0);
-
 		tex->w = tex->realw = w - border;
 		tex->h = tex->realh = h - border;
 	}
 
+	glBindTexture(GL_TEXTURE_2D, lastbindcode);
+
 	return tex;
 }
 
@@ -501,10 +504,19 @@
 
 void GPU_texture_bind(GPUTexture *tex, int number)
 {
-	GLenum arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + number);
+	GLenum arbnumber;
 
+	if (number >= GG.maxtextures) {
+		GPU_print_error("Not enough texture slots.");
+		return;
+	}
+
+	if(number == -1)
+		return;
+
 	GPU_print_error("Pre Texture Bind");
 
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + number);
 	if (number != 0) glActiveTextureARB(arbnumber);
 	glBindTexture(tex->target, tex->bindcode);
 	glEnable(tex->target);
@@ -517,13 +529,19 @@
 
 void GPU_texture_unbind(GPUTexture *tex)
 {
-	GLenum arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
+	GLenum arbnumber;
 
+	if (tex->number >= GG.maxtextures) {
+		GPU_print_error("Not enough texture slots.");
+		return;
+	}
+
 	if(tex->number == -1)
 		return;
-
+	
 	GPU_print_error("Pre Texture Unbind");
 
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
 	if (tex->number != 0) glActiveTextureARB(arbnumber);
 	glBindTexture(tex->target, 0);
 	glDisable(tex->target);
@@ -804,16 +822,18 @@
 
 	fprintf(stderr, "GPUShader: %s error:\n", task);
 
-	c = code;
-	while ((c < end) && (pos = strchr(c, '\n'))) {
-		fprintf(stderr, "%2d  ", line);
-		fwrite(c, (pos+1)-c, 1, stderr);
-		c = pos+1;
-		line++;
+	if(G.f & G_DEBUG) {
+		c = code;
+		while ((c < end) && (pos = strchr(c, '\n'))) {
+			fprintf(stderr, "%2d  ", line);
+			fwrite(c, (pos+1)-c, 1, stderr);
+			c = pos+1;
+			line++;
+		}
+
+		fprintf(stderr, "%s", c);
 	}
 
-	fprintf(stderr, "%s", c);
-
 	fprintf(stderr, "%s\n", log);
 }
 
@@ -958,6 +978,7 @@
 	MEM_freeN(shader);
 }
 
+
 void GPU_shader_uniform_vector(GPUShader *shader, char *name, int length, int arraysize, float *value)
 {
 	GLint location = glGetUniformLocationARB(shader->object, name);
@@ -967,14 +988,12 @@
 
 	GPU_print_error("Pre Uniform Vector");
 
-#if 0
-	if (length == 1) printf("%s %f\n", name, value[0]);
+	/*if (length == 1) printf("%s %f\n", name, value[0]);
 	else if (length == 2) printf("%s %f %f\n", name, value[0], value[1]);
 	else if (length == 3) { printf("%s ", name); printvecf("", value); }
 	else if (length == 4) { printf("%s ", name); printquat("", value); }
 	else if (length == 9) { printf("%s ", name); printmatrix3("", (float(*)[3])value); }
-	else if (length == 16) { printf("%s ", name); printmatrix4("", (float(*)[4])value); }
-#endif
+	else if (length == 16) { printf("%s ", name); printmatrix4("", (float(*)[4])value); }*/
 
 	if (length == 1) glUniform1fvARB(location, arraysize, value);
 	else if (length == 2) glUniform2fvARB(location, arraysize, value);
@@ -988,11 +1007,22 @@
 
 void GPU_shader_uniform_texture(GPUShader *shader, char *name, GPUTexture *tex)
 {
-	GLint location = glGetUniformLocationARB(shader->object, name);
-	GLenum arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
+	GLint location;
+	GLenum arbnumber;
 
+	if (tex->number >= GG.maxtextures) {
+		GPU_print_error("Not enough texture slots.");
+		return;
+	}
+		
+	if(tex->number == -1)
+		return;
+
 	GPU_print_error("Pre Uniform Texture");
 
+	location = glGetUniformLocationARB(shader->object, name);
+	arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
+
 	if (tex->number != 0) glActiveTextureARB(arbnumber);
 	glBindTexture(tex->target, tex->bindcode);
 	glUniform1iARB(location, tex->number);

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-14 22:23:39 UTC (rev 15575)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-14 23:26:38 UTC (rev 15576)
@@ -46,6 +46,7 @@
 #include "BKE_colortools.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
+#include "BKE_main.h"
 #include "BKE_node.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
@@ -64,6 +65,7 @@
 /* Structs */
 
 struct GPUMaterial {
+	Scene *scene;
 	Material *ma;
 
 	/* for creating the material */
@@ -213,6 +215,7 @@
 		}
 
 		GPU_pass_bind(material->pass);
+		//GPU_pass_update_uniforms(material->pass);
 
 		/* handle alpha */
 		if(material->alpha) {
@@ -260,6 +263,8 @@
 			Mat4MulMat4(lamp->dynimat, viewinv, lamp->imat);
 			Mat4MulMat4(lamp->dynpersmat, viewinv, lamp->persmat);
 		}
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list