[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20557] branches/bb_dev/source/blender: Added a little helper button in the material panel so visualize the GLSL blender shader .

Benoit Bolsee benoit.bolsee at online.be
Mon Jun 1 16:57:47 CEST 2009


Revision: 20557
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20557
Author:   ben2610
Date:     2009-06-01 16:57:45 +0200 (Mon, 01 Jun 2009)

Log Message:
-----------
Added a little helper button in the material panel so visualize the GLSL blender shader. The fragment shader will be exported as <material_name>.fg and the vertex shader as <material_name>.vx

Modified Paths:
--------------
    branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c
    branches/bb_dev/source/blender/gpu/intern/gpu_codegen.h
    branches/bb_dev/source/blender/gpu/intern/gpu_material.c
    branches/bb_dev/source/blender/include/butspace.h
    branches/bb_dev/source/blender/makesdna/DNA_material_types.h
    branches/bb_dev/source/blender/src/buttons_shading.c

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c	2009-06-01 14:57:45 UTC (rev 20557)
@@ -1391,7 +1391,7 @@
 	}
 }
 
-GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins, const char *name)
+GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins, const char *name, char **fragshader, char **vertexshader)
 {
 	GPUShader *shader;
 	GPUPass *pass;
@@ -1409,17 +1409,19 @@
 	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);*/
-	MEM_freeN(fragmentcode);
-	MEM_freeN(vertexcode);
+	*fragshader = code_generate_fragment(nodes, outlink->output, name);
+	*vertexshader = code_generate_vertex(nodes);
+	shader = GPU_shader_create(*vertexshader, *fragshader, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
 
 	/* failed? */
 	if (!shader) {
 		memset(attribs, 0, sizeof(*attribs));
 		memset(builtins, 0, sizeof(*builtins));
 		GPU_nodes_free(nodes);
+		MEM_freeN(*fragshader);
+		MEM_freeN(*vertexshader);
+		*fragshader = NULL;
+		*vertexshader = NULL;
 		return NULL;
 	}
 	

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_codegen.h	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_codegen.h	2009-06-01 14:57:45 UTC (rev 20557)
@@ -67,7 +67,7 @@
 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 **fragshader, char **vertexshader);
 
 struct GPUShader *GPU_pass_shader(GPUPass *pass);
 

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_material.c	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_material.c	2009-06-01 14:57:45 UTC (rev 20557)
@@ -43,6 +43,7 @@
 #include "DNA_texture_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_world_types.h"
+#include "DNA_text_types.h"
 
 #include "BKE_anim.h"
 #include "BKE_colortools.h"
@@ -53,9 +54,12 @@
 #include "BKE_scene.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
+#include "BKE_text.h"
 
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
+/* for test_scriptpoin_but() */
+#include "butspace.h"
 
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -64,6 +68,12 @@
 
 #include <string.h>
 
+#ifdef WIN32
+#ifndef snprintf
+#define snprintf _snprintf
+#endif
+#endif
+
 /* Structs */
 
 typedef enum DynMatProperty {
@@ -193,14 +203,45 @@
 	if (material->outlink) {
 		GPUNodeLink *outlink;
 		GPUShader *shader;
+		char *fragshader, *vertexshader;
 
 		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, &fragshader, &vertexshader);
 
 		if(!material->pass)
 			return 0;
 
+		if (material->ma->shade_flag & MA_EXPORT) {
+			Text *text;
+			char name[24];
+
+			if (fragshader) {
+				snprintf(name, 24, "%s.fg", material->ma->id.name+2);
+				test_scriptpoin_but(name, (ID **)&text);
+				if (!text)
+					text = add_empty_text(name);
+				if (text) {
+					txt_sel_all(text);
+					txt_insert_buf(text, fragshader);
+				}
+			}
+			if (vertexshader) {
+				snprintf(name, 24, "%s.vx", material->ma->id.name+2);
+				test_scriptpoin_but(name, (ID **)&text);
+				if (!text)
+					text = add_empty_text(name);
+				if (text) {
+					txt_sel_all(text);
+					txt_insert_buf(text, vertexshader);
+				}
+			}
+			/* export only once */
+			material->ma->shade_flag &= ~MA_EXPORT;
+		}
+		MEM_freeN(fragshader);
+		MEM_freeN(vertexshader);
+
 		gpu_material_set_attrib_id(material);
 		
 		shader = GPU_pass_shader(material->pass);

Modified: branches/bb_dev/source/blender/include/butspace.h
===================================================================
--- branches/bb_dev/source/blender/include/butspace.h	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/include/butspace.h	2009-06-01 14:57:45 UTC (rev 20557)
@@ -230,6 +230,8 @@
 #define B_MTEXMOVEUP		1226
 #define B_MTEXMOVEDOWN		1227
 
+#define B_EXPORTSHADER		1228
+
 /* *********************** */
 #define B_TEXBUTS		1400
 

Modified: branches/bb_dev/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/bb_dev/source/blender/makesdna/DNA_material_types.h	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/makesdna/DNA_material_types.h	2009-06-01 14:57:45 UTC (rev 20557)
@@ -206,6 +206,7 @@
 /* shade_flag */
 #define MA_CUBIC			1
 #define MA_OBCOLOR			2
+#define MA_EXPORT			4
 
 /* diff_shader */
 #define MA_DIFF_LAMBERT		0

Modified: branches/bb_dev/source/blender/src/buttons_shading.c
===================================================================
--- branches/bb_dev/source/blender/src/buttons_shading.c	2009-06-01 14:08:19 UTC (rev 20556)
+++ branches/bb_dev/source/blender/src/buttons_shading.c	2009-06-01 14:57:45 UTC (rev 20557)
@@ -3081,8 +3081,9 @@
 
 
 /* ****************** MATERIAL ***************** */
+/* borrow from drawtext.c */
+void redraw_alltext(void);
 
-
 void do_matbuts(unsigned short event)
 {
 	static short mtexcopied=0;
@@ -3167,6 +3168,11 @@
 		allqueue(REDRAWOOPS, 0);
 		// BIF_previewdraw();  push/pop!
 		break;
+	case B_EXPORTSHADER:
+		redraw_alltext();
+		if (ma)
+			ma->shade_flag |= MA_EXPORT;
+		// walk through!
 	case B_MATPRV:
 		if(ma) end_render_material(ma);	/// temporal... 3d preview
 		BIF_preview_changed(ID_MA);
@@ -4187,7 +4193,6 @@
 	return block;
 }
 
-
 static void material_panel_material(Material *ma)
 {
 	uiBlock *block;
@@ -4226,6 +4231,11 @@
 			uiDefButBitI(block, TOG, MA_ENV, B_MATPRV,	"Env",			82,146,74,20, &(ma->mode), 0, 0, 0, 0, "Causes faces to render with alpha zero: allows sky/backdrop to show through (only for solid faces)");
 			uiDefButBitS(block, TOG, MA_OBCOLOR, B_MATPRV, "ObColor",		156,146,60,20, &(ma->shade_flag), 0, 0, 0, 0, "Modulate the result with a per object color");
 			uiDefButF(block, NUM, B_NOP, "Shad A ",					216,146,87,20, &ma->shad_alpha, 0.001, 1.0f, 10, 2, "Shadow casting alpha, only in use for Irregular Shadowbuffer");
+			if (draw_glsl_material(NULL, G.vd->drawtype)) {
+				// only display option if we are likely to use GLSL shaders
+				uiBlockSetCol(block, TH_AUTO);
+				uiDefBut(block, BUT, B_EXPORTSHADER,	"Export GLSL shader",	8,126,148,20, NULL, 0, 0, 0, 0, "Export GLSL shader in text file called <material>.fg and <material>.vx");
+			}
 		}
 		uiBlockSetCol(block, TH_AUTO);
 		uiBlockBeginAlign(block);





More information about the Bf-blender-cvs mailing list