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);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to