[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11906] branches/soc-2007-maike/source/ blender: Added glsl code generation for material nodes and extended material nodes, still needs the main function code generation for these nodes and to control the materials in a materialtree

Miguel Torres Lima torreslima at gmail.com
Fri Aug 31 19:02:17 CEST 2007


Revision: 11906
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11906
Author:   maike
Date:     2007-08-31 19:02:16 +0200 (Fri, 31 Aug 2007)

Log Message:
-----------
Added glsl code generation for material nodes and extended material nodes, still needs the main function code generation for these nodes and to control the materials in a materialtree
Added a new string pointer to GLSL_NodeCode because material type nodes need to have uniforms, function code, main variables declaration and a function call to its function in the main function

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h
    branches/soc-2007-maike/source/blender/src/glsl_material_node.c
    branches/soc-2007-maike/source/blender/src/glsl_node_util.c
    branches/soc-2007-maike/source/blender/src/glsl_uniforms.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h	2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h	2007-08-31 17:02:16 UTC (rev 11906)
@@ -57,6 +57,7 @@
   char *main_code;
   char *uniform_code;
   char *node_code;
+  char *var_code;
 };
 
 /* -------------------------------------------------------- */

Modified: branches/soc-2007-maike/source/blender/src/glsl_material_node.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material_node.c	2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_material_node.c	2007-08-31 17:02:16 UTC (rev 11906)
@@ -108,7 +108,7 @@
 		       0, "\n#define MATERIAL_ID ", GINT, num, 0, "\n",
 		       0, "\n#define MATERIAL_FUNC material_", GINT, num, 0, "\n",
 		       GFREE, func_init,
-		       0, "\nreturn(diff_color + vert_color);\n}\n",
+		       0, "\ncolor = vec4(diff_color + vert_color, 1.0);\n}\n",
 		       0, "#undef MATERIAL_ID\n#undef MATERIAL_FUNC\n");
 
     return code;
@@ -119,7 +119,7 @@
 		       0, "\n#define MATERIAL_ID ", GINT, num, 0, "\n",
 		       0, "\n#define MATERIAL_FUNC material_", GINT, num, 0, "\n",
 		       GFREE, func_init,
-		       0, "\nreturn(0.0, 0.0, 0.0);\n}\n",
+		       0, "\ncolor = vec4(0.0,0.0,0.0,1.0);\n}\n",
 		       0, "#undef MATERIAL_ID\n#undef MATERIAL_FUNC\n");
 
     return code;

Modified: branches/soc-2007-maike/source/blender/src/glsl_node_util.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-08-31 17:02:16 UTC (rev 11906)
@@ -1338,15 +1338,17 @@
   bNodeSocket *sock;
   int i = 0;
 
-  for(sock = node->outputs.first; sock; sock = sock->next){
-    char *var = glsl_node_geometry_output_vars(name, i, 0, 0);
+  code = glsl_string(16,
+		     GFREE, glsl_generate_node_out_vars(node, name, 0), 0, " = vec3(0.0,0.0,0.0);\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 1), 0, " = pos;\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 2), 0, " = normalize(pos);\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 3), 0, " = vec3(0.0,0.0,0.0);\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 4), 0, " = vec3(0.0,0.0,0.0);\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 5), 0, " = normal;\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 6), 0, " = vec4(0.0,0.0,0.0,0.0);\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 7), 0, " = 1.0;\n"
+		     );
 
-    
-    code = glsl_string(2, GFREE, code, GFREE, glsl_assign_var_value(var, stack, sock->type));
-
-    i++;
-  }
-
   return code;
 }
 
@@ -1398,10 +1400,7 @@
 static char *glsl_generate_camera_node_function(bNode *node, char *name)
 {
   char *code = NULL;
-  bNodeStack *stack;
-  bNodeSocket *sock;
-  int i = 0;
-
+ 
   code = glsl_string(6,
 		     GFREE, glsl_generate_node_out_vars(node, name, 0), 0, " = normalize(pos);\n",
 		     GFREE, glsl_generate_node_out_vars(node, name, 1), 0, " = abs(pos.z);\n",
@@ -1974,9 +1973,11 @@
 
   char *main_func = { 
     "void main(void){ "
+    " vec4 color = vec4(0.0, 0.0, 0.0, 0.0);"
+    " vec4 ao = vec4(0.0, 0.0, 0.0, 0.0);"
     " vec3 norm = normal;"
-    " vec3 diff_color = realcolor.xyz;"
-    " vec3 spec_color = u_mat_0_spec_color;"
+    " vec4 diff_color = realcolor;"
+    " vec4 spec_color = vec4(u_mat_0_spec_color, 1.0);"
 
     " float alpha = realcolor.a;"
     " float diff1 = u_mat_0_diff1;"
@@ -1991,9 +1992,9 @@
     " float tanv = u_mat_0_tanv;"
     " float shless = u_mat_0_shless;"
 
-    " vec3 result = material_0(diff_color, spec_color, norm, alpha, diff1, diff2, diff3, spec1, spec2, spec3, amb_fac, emit, hard, tanv, shless);"
+    " material_0(color, alpha, norm, diff_color, spec_color, ao, diff1, diff2, diff3, spec1, spec2, spec3, vec4(0.0, 0.0, 0.0, 0.0), amb_color, amb_fac, 0.0, 0.0, 0.0, emit, hard, tanv, shless);"
  
-    " gl_FragColor = vec4(result, alpha);"
+    " gl_FragColor = color;"
     "}\n" 
   };
 
@@ -2137,11 +2138,9 @@
 
   glsl_exec_nodetree(tree, nodetree, node, nodecode);
 
-  nodecode->main_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, nodecode->main_code);
-  
-  MEM_freeN(nodecode->uniform_code);
-  nodecode->uniform_code = NULL;
+  nodecode->main_code = glsl_string(2, GFREE, nodecode->var_code, GFREE, nodecode->main_code);
 
+
   switch(node->type)
     {
     case SH_NODE_OUTPUT:
@@ -2158,7 +2157,7 @@
     }
 
   if(!(rgbmix_funcs = glsl_rgbmix_funcs(files->mix))){
-    MEM_freeN(nodecode->uniform_code);
+    MEM_freeN(nodecode->var_code);
     MEM_freeN(nodecode->node_code);
     MEM_freeN(nodecode);
     return NULL;
@@ -2170,7 +2169,7 @@
   }
 
   if(!(cb_blend_funcs = glsl_colorband_blend_funcs(files->ramp_blend))){
-    MEM_freeN(nodecode->uniform_code);
+    MEM_freeN(nodecode->var_code);
     MEM_freeN(nodecode->node_code);
     MEM_freeN(nodecode);
     return NULL;
@@ -2183,7 +2182,7 @@
 
   if(files->rgbtobw){
     if(!(rgbtobw_funcs = glsl_get_func("node_rgbtobw.gsl"))){
-      MEM_freeN(nodecode->uniform_code);
+      MEM_freeN(nodecode->var_code);
       MEM_freeN(nodecode->node_code);
       MEM_freeN(nodecode);
       return NULL;
@@ -2194,7 +2193,7 @@
   
   if(files->normal){
     if(!(normal_funcs = glsl_get_func("node_normal.gsl"))){
-      MEM_freeN(nodecode->uniform_code);
+      MEM_freeN(nodecode->var_code);
       MEM_freeN(nodecode->node_code);
       MEM_freeN(nodecode);
       return NULL;
@@ -2205,7 +2204,7 @@
   
   if(files->mapping){
     if(!(mapping_funcs = glsl_get_func("node_mapping.gsl"))){
-      MEM_freeN(nodecode->uniform_code);
+      MEM_freeN(nodecode->var_code);
       MEM_freeN(nodecode->node_code);
       MEM_freeN(nodecode);
       return NULL;
@@ -2216,7 +2215,7 @@
 
 
   if(!(math_funcs = glsl_math_funcs(files->math))){
-    MEM_freeN(nodecode->uniform_code);
+    MEM_freeN(nodecode->var_code);
     MEM_freeN(nodecode->node_code);
     MEM_freeN(nodecode);
     return NULL;
@@ -2228,7 +2227,7 @@
   }
 
   if(!(vectmath_funcs = glsl_vectmath_funcs(files->vectmath))){
-    MEM_freeN(nodecode->uniform_code);
+    MEM_freeN(nodecode->var_code);
     MEM_freeN(nodecode->node_code);
     MEM_freeN(nodecode);
     return NULL;
@@ -2241,7 +2240,7 @@
   
   if(files->squeeze){
     if(!(squeeze_funcs = glsl_get_func("node_squeeze.gsl"))){
-      MEM_freeN(nodecode->uniform_code);
+      MEM_freeN(nodecode->var_code);
       MEM_freeN(nodecode->node_code);
       MEM_freeN(nodecode);
       return NULL;
@@ -2252,7 +2251,7 @@
 
   if(files->invert){
     if(!(invert_funcs = glsl_get_func("node_invert.gsl"))){
-      MEM_freeN(nodecode->uniform_code);
+      MEM_freeN(nodecode->var_code);
       MEM_freeN(nodecode->node_code);
       MEM_freeN(nodecode);
       return NULL;
@@ -2261,7 +2260,50 @@
       nodecode->node_code = glsl_string(2, GFREE, invert_funcs, GFREE, nodecode->node_code);
   }
 
+  if(files->diffuse || files->specular || files->visibility){
+    if(!(light_funcs = glsl_write_light_funcs(files->diffuse, files->specular, files->visibility))){
+      MEM_freeN(nodecode->var_code);
+      MEM_freeN(nodecode->node_code);
+      MEM_freeN(nodecode);
+      return NULL;
+    }
+    else
+      nodecode->node_code = glsl_string(2, GFREE, light_funcs, GFREE, nodecode->node_code);
+  }
 
+  if(files->tex_type){
+    if(!(tex_funcs = glsl_texture_funcs(files->tex_type))){
+      MEM_freeN(nodecode->var_code);
+      MEM_freeN(nodecode->node_code);
+      MEM_freeN(nodecode);
+      return NULL;
+    }
+    else
+      nodecode->node_code = glsl_string(2, GFREE, tex_funcs, GFREE, nodecode->node_code);
+  }
+
+  if(files->tex_blend){
+    if(!(tex_blend_funcs = glsl_texture_blend_funcs(files->tex_blend))){
+      MEM_freeN(nodecode->var_code);
+      MEM_freeN(nodecode->node_code);
+      MEM_freeN(nodecode);
+      return NULL;
+    }
+    else
+      nodecode->node_code = glsl_string(2, GFREE, tex_blend_funcs, GFREE, nodecode->node_code);
+  }
+
+  if(files->tex_blend_val){
+    if(!(tex_blendval_funcs = glsl_texture_blendval_funcs(files->tex_blend_val))){
+      MEM_freeN(nodecode->var_code);
+      MEM_freeN(nodecode->node_code);
+      MEM_freeN(nodecode);
+      return NULL;
+    }
+    else
+      nodecode->node_code = glsl_string(2, GFREE, tex_blendval_funcs, GFREE, nodecode->node_code);
+  }
+
   glsl_free_node_hash();
   glsl_free_nodefiles();
 
@@ -2372,8 +2414,22 @@
   }
 
   nodecode->main_code = glsl_string(3, GFREE, nodecode->main_code, GFREE, code, GFREE, glsl_generate_node_function(tree, node, name));
-  nodecode->uniform_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, varsdecl);
+  nodecode->var_code = glsl_string(2, GFREE, nodecode->var_code, GFREE, varsdecl);
+  
 
+  if((node->type == SH_NODE_MATERIAL || node->type == SH_NODE_MATERIAL_EXT) && node->id){
+    int num = BLI_ghash_size(tree->hash);
+    GLSL_NodeCode material_code = NULL;
+
+    BLI_ghash_insert(tree->hash, (Material *) node->id, tree);
+    material_code = glsl_material_node((Material *) node->id, &files->diffuse, &files->specular, &files->visibility, &files->ramp_blend, &files->tex_type, &files->tex_blend, &files->tex_blend_val, num);
+    nodecode->node_code = glsl_string(2, GFREE, nodecode->node_code, GFREE, material_code->node_code);
+    nodecode->uniform_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, material_code->uniform_code);
+
+    MEM_freeN(material_code);
+  }
+
+
   BLI_ghash_insert(done, node, name);
 
   MEM_freeN(name);
@@ -2388,6 +2444,7 @@
   material_node->main_code = NULL;
   material_node->uniform_code = NULL;
   material_node->node_code = NULL;
+  material_node->var_code = NULL;
   
   return material_node;
 }

Modified: branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-31 17:02:16 UTC (rev 11906)
@@ -398,7 +398,7 @@
     diff_fac = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 0, 0, "_fac");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list