[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28681] branches/soc-2010-moguri: Getting a start on my gsoc project:

Mitchell Stokes mogurijin at gmail.com
Sun May 9 04:44:11 CEST 2010


Revision: 28681
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28681
Author:   moguri
Date:     2010-05-09 04:44:10 +0200 (Sun, 09 May 2010)

Log Message:
-----------
Getting a start on my gsoc project:
  * bf_gpu can now use custom shaders
  * filenames for the shaders are currently being stored on the material
  * RNA has access to the filenames of the custom shaders
  * I've added a quick ui to the custom shaders for experimenting, it can be found in the material panel
  * I've added stuff for geometry shaders as well, but they currently aren't working right. 

Modified Paths:
--------------
    branches/soc-2010-moguri/release/scripts/ui/properties_material.py
    branches/soc-2010-moguri/source/blender/gpu/GPU_extensions.h
    branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.c
    branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.h
    branches/soc-2010-moguri/source/blender/gpu/intern/gpu_extensions.c
    branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c
    branches/soc-2010-moguri/source/blender/makesdna/DNA_material_types.h
    branches/soc-2010-moguri/source/blender/makesrna/intern/rna_material.c

Modified: branches/soc-2010-moguri/release/scripts/ui/properties_material.py
===================================================================
--- branches/soc-2010-moguri/release/scripts/ui/properties_material.py	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/release/scripts/ui/properties_material.py	2010-05-09 02:44:10 UTC (rev 28681)
@@ -774,7 +774,25 @@
         col.prop(halo, "flares_sub", text="Subflares")
         col.prop(halo, "flare_subsize", text="Subsize")
 
+class MATERIAL_PT_shaders(MaterialButtonsPanel):
+    bl_label = "Custom Shaders"
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
 
+    def poll(self, context):
+        mat = context.material
+        engine = context.scene.render.engine
+        return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in self.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+        col = layout.column()
+		
+        mat = active_node_mat(context.material)
+
+        col.prop(mat, "vertex_shader", text="Vertex Shader")
+        col.prop(mat, "geometry_shader", text="Geometry Shader")
+        col.prop(mat, "fragment_shader", text="Fragment Shader")
+
 class VolumeButtonsPanel(bpy.types.Panel):
     bl_space_type = 'PROPERTIES'
     bl_region_type = 'WINDOW'
@@ -955,6 +973,7 @@
     MATERIAL_PT_options,
     MATERIAL_PT_shadow,
     MATERIAL_PT_transp_game,
+	MATERIAL_PT_shaders,
 
     MATERIAL_MT_sss_presets,
     MATERIAL_MT_specials,

Modified: branches/soc-2010-moguri/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/GPU_extensions.h	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/gpu/GPU_extensions.h	2010-05-09 02:44:10 UTC (rev 28681)
@@ -151,7 +151,7 @@
    - only for fragment shaders now
    - must call texture bind before setting a texture as uniform! */
 
-GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *libcode); /*GPUShader *lib);*/
+GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geomcode, const char *libcode); /*GPUShader *lib);*/
 /*GPUShader *GPU_shader_create_lib(const char *code);*/
 void GPU_shader_free(GPUShader *shader);
 

Modified: branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.c	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.c	2010-05-09 02:44:10 UTC (rev 28681)
@@ -1392,11 +1392,37 @@
 	}
 }
 
-GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins, const char *name)
+char *load_shader(char *filename)
 {
+	FILE *fp;
+	int len;
+	char *shader = NULL;
+
+	fp = fopen(filename, "r");
+
+	if (fp)
+	{
+		// Find the size
+		fseek(fp, 0, SEEK_END);
+		len = ftell(fp);
+		rewind(fp);
+
+		// Initialize the string and read the files
+		shader = MEM_callocN(len, "shader_text");
+		fread(shader, 1, len, fp);
+
+		// Close the file
+		fclose(fp);
+	}
+	
+	return shader;
+}
+
+GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins, const char *name, char* vert, char* frag, char* geom)
+{
 	GPUShader *shader;
 	GPUPass *pass;
-	char *vertexcode, *fragmentcode;
+	char *vertexcode, *fragmentcode, *geometrycode, *libcode=NULL;
 
 	/*if(!FUNCTION_LIB) {
 		GPU_nodes_free(nodes);
@@ -1410,11 +1436,51 @@
 	gpu_nodes_get_builtin_flag(nodes, builtins);
 
 	/* generate code and compile with opengl */
-	fragmentcode = code_generate_fragment(nodes, outlink->output, name);
-	vertexcode = code_generate_vertex(nodes);
-	shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
+	if (frag)
+	{
+		fragmentcode = load_shader(frag);
+		if (fragmentcode == NULL)
+		{
+			printf("Error opening fragment shader\n");
+			fragmentcode = code_generate_fragment(nodes, outlink->output, name);
+			libcode = datatoc_gpu_shader_material_glsl;
+		}
+	}
+	else
+	{
+		fragmentcode = code_generate_fragment(nodes, outlink->output, name);
+		libcode = datatoc_gpu_shader_material_glsl;
+	}
+	
+	if (vert)
+	{
+		vertexcode = load_shader(vert);
+		if (vertexcode == NULL)
+		{
+			printf("Error opening vertex shader\n");
+			vertexcode = code_generate_vertex(nodes);
+		}
+	}
+	else
+		vertexcode = code_generate_vertex(nodes);
+
+	if (geom)
+	{
+		geometrycode = load_shader(geom);
+		if (geometrycode == NULL)
+		{
+			printf("Error opening geometry shader\n");
+			geometrycode = NULL;
+		}
+	}
+	else
+		geometrycode = NULL;
+
+	shader = GPU_shader_create(vertexcode, fragmentcode, geometrycode, libcode);
 	MEM_freeN(fragmentcode);
 	MEM_freeN(vertexcode);
+	if (geometrycode)
+		MEM_freeN(geometrycode);
 
 	/* failed? */
 	if (!shader) {

Modified: branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.h	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/gpu/intern/gpu_codegen.h	2010-05-09 02:44:10 UTC (rev 28681)
@@ -67,7 +67,8 @@
 typedef struct GPUPass GPUPass;
 
 GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink,
-	struct GPUVertexAttribs *attribs, int *builtin, const char *name);
+	struct GPUVertexAttribs *attribs, int *builtin, const char *name,
+		char* vert, char* frag, char* geom);
 
 struct GPUShader *GPU_pass_shader(GPUPass *pass);
 

Modified: branches/soc-2010-moguri/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/intern/gpu_extensions.c	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/gpu/intern/gpu_extensions.c	2010-05-09 02:44:10 UTC (rev 28681)
@@ -888,6 +888,7 @@
 	GLhandleARB object;		/* handle for full shader */
 	GLhandleARB vertex;		/* handle for vertex shader */
 	GLhandleARB fragment;	/* handle for fragment shader */
+	GLhandleARB geometry;	/* handle for geometry shader */
 	GLhandleARB lib;		/* handle for libment shader */
 	int totattrib;			/* total number of attributes */
 };
@@ -914,7 +915,7 @@
 	fprintf(stderr, "%s\n", log);
 }
 
-GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPUShader *lib,*/ const char *libcode)
+GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geomcode, /*GPUShader *lib,*/ const char *libcode)
 {
 	GLint status;
 	GLcharARB log[5000];
@@ -932,6 +933,11 @@
 		shader->vertex = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
 	if(fragcode)
 		shader->fragment = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
+	if(geomcode)
+		if(!GL_EXT_geometry_shader4)
+			printf("Geometry shaders not supported, ignoring...\n");
+		else
+			shader->geometry = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_EXT);
 	shader->object = glCreateProgramObjectARB();
 
 	if (!shader->object ||
@@ -978,6 +984,21 @@
 		}
 	}
 
+	if(geomcode && shader->geometry) {
+		glAttachObjectARB(shader->object, shader->geometry);
+		glShaderSourceARB(shader->geometry, 1, (const char**)&geomcode, NULL);
+
+		glCompileShaderARB(shader->geometry);
+		glGetObjectParameterivARB(shader->geometry, GL_OBJECT_COMPILE_STATUS_ARB, &status);
+
+		if (!status) {
+			glGetInfoLogARB(shader->geometry, sizeof(log), &length, log);
+			shader_print_errors("compile", log, geomcode);
+
+			GPU_shader_free(shader);
+			return NULL;
+		}
+	}
 	/*if(lib && lib->lib)
 		glAttachObjectARB(shader->object, lib->lib);*/
 
@@ -988,6 +1009,7 @@
 		if (fragcode) shader_print_errors("linking", log, fragcode);
 		else if (vertexcode) shader_print_errors("linking", log, vertexcode);
 		else if (libcode) shader_print_errors("linking", log, libcode);
+		else if (geomcode) shader_print_errors("linking", log, geomcode);
 
 		GPU_shader_free(shader);
 		return NULL;

Modified: branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c	2010-05-09 02:44:10 UTC (rev 28681)
@@ -191,7 +191,8 @@
 
 		outlink = material->outlink;
 		material->pass = GPU_generate_pass(&material->nodes, outlink,
-			&material->attribs, &material->builtins, material->ma->id.name);
+			&material->attribs, &material->builtins, material->ma->id.name,
+			material->ma->vertex_shader, material->ma->fragment_shader, material->ma->geometry_shader);
 
 		if(!material->pass)
 			return 0;

Modified: branches/soc-2010-moguri/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/soc-2010-moguri/source/blender/makesdna/DNA_material_types.h	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/makesdna/DNA_material_types.h	2010-05-09 02:44:10 UTC (rev 28681)
@@ -130,6 +130,9 @@
 	float rms;
 	float darkness;
 	short texco, mapto;
+	char* vertex_shader;
+	char* fragment_shader;
+	char* geometry_shader;
 	
 	/* ramp colors */
 	struct ColorBand *ramp_col;

Modified: branches/soc-2010-moguri/source/blender/makesrna/intern/rna_material.c
===================================================================
--- branches/soc-2010-moguri/source/blender/makesrna/intern/rna_material.c	2010-05-09 00:37:12 UTC (rev 28680)
+++ branches/soc-2010-moguri/source/blender/makesrna/intern/rna_material.c	2010-05-09 02:44:10 UTC (rev 28681)
@@ -122,6 +122,93 @@
 	ma->material_type= value;
 }
 
+static void rna_Material_fragment_get(PointerRNA *ptr, char *value)
+{
+	Material *ma= (Material*)ptr->data;
+
+	if(ma->fragment_shader)
+		strcpy(value, ma->fragment_shader);
+	else
+		strcpy(value, "");
+}
+
+static int rna_Material_fragment_length(PointerRNA *ptr)
+{
+	Material *ma= (Material*)ptr->data;
+	return (ma->fragment_shader)? strlen(ma->fragment_shader): 0;
+}
+
+static void rna_Material_fragment_set(PointerRNA *ptr, const char *value)
+{
+	Material *ma= (Material*)ptr->data;
+
+	if(ma->fragment_shader)
+		MEM_freeN(ma->fragment_shader);
+
+	if(strlen(value))
+		ma->fragment_shader= BLI_strdup(value);
+	else
+		ma->fragment_shader= NULL;
+}
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list