[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