[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11930] branches/soc-2007-maike/source/ blender: Added extended material node (not working)

Miguel Torres Lima torreslima at gmail.com
Mon Sep 3 18:51:04 CEST 2007


Revision: 11930
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11930
Author:   maike
Date:     2007-09-03 18:51:04 +0200 (Mon, 03 Sep 2007)

Log Message:
-----------
Added extended material node (not working)
Added structural things for texface implementation as a variable for texture id in GLSL_Material structure

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h
    branches/soc-2007-maike/source/blender/src/glsl_material.c
    branches/soc-2007-maike/source/blender/src/glsl_materialtree.c
    branches/soc-2007-maike/source/blender/src/glsl_node_util.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h	2007-09-03 16:00:12 UTC (rev 11929)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h	2007-09-03 16:51:04 UTC (rev 11930)
@@ -19,6 +19,12 @@
   short specular_shader;
   short texface;
   
+#ifdef __APPLE__
+  unsigned long texf;
+#else
+  unsigned int texf;
+#endif
+
   void (*unlink)(struct GLSL_Material_ * material, struct Material *mat);
   void (*free)(struct GLSL_Material_ * material, struct Material *mat);
 

Modified: branches/soc-2007-maike/source/blender/src/glsl_material.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-09-03 16:00:12 UTC (rev 11929)
+++ branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-09-03 16:51:04 UTC (rev 11930)
@@ -302,6 +302,7 @@
 	break;
       case B_MAT_TEXFACE:
 	printf("\nGLSL Material texface toggle changed.\n");
+	material->redo_prog(material);
 	break;
       case B_MAT_CB_REWR:
 	printf("\nGLSL Colorband changed\n");

Modified: branches/soc-2007-maike/source/blender/src/glsl_materialtree.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_materialtree.c	2007-09-03 16:00:12 UTC (rev 11929)
+++ branches/soc-2007-maike/source/blender/src/glsl_materialtree.c	2007-09-03 16:51:04 UTC (rev 11930)
@@ -85,7 +85,8 @@
 static void glsl_tree_del_mat_child(GLSL_MaterialTree tree, GLSL_Material material, Material *mat)
 {
   BLI_ghash_remove(tree->hash, mat, 0, 0);
-  material->del_parent(material, tree);
+  if(mat && material)
+    material->del_parent(material, tree);
 }
 
 
@@ -269,7 +270,6 @@
   GLSL_MaterialTree tree = (struct GLSL_MaterialTree_ *) BLI_ghash_lookup(treeHash, mat);
 
   if(mat == &defmaterial || !tree || !mat){
-    printf("\n defmaterial prog: %d\n", glsl_defmaterial->shaded_program->program);
     return glsl_defmaterial->shaded_program;
   }
   return((struct GLSL_Program_ *) tree->shaded_program);

Modified: branches/soc-2007-maike/source/blender/src/glsl_node_util.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-09-03 16:00:12 UTC (rev 11929)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-09-03 16:51:04 UTC (rev 11930)
@@ -1044,7 +1044,7 @@
   switch(node->type)
     {
     case SH_NODE_MATERIAL:
-      vars = glsl_generate_node_material_vars(node, name); break;
+      vars = glsl_generate_node_materialext_vars(node, name); break;
     case SH_NODE_RGB:
       vars = glsl_generate_node_rgb_vars(node, name); break;
     case SH_NODE_VALUE:
@@ -1094,7 +1094,7 @@
   switch(node->type)
     {
     case SH_NODE_MATERIAL:
-      var = glsl_node_material_input_vars(name, nr, 0, 0); break;
+      var = glsl_node_materialext_input_vars(name, nr, 0, 0); break;
     case SH_NODE_MIX_RGB:
       var = glsl_node_rgbmix_input_vars(name, nr, 0, 0); break;
     case SH_NODE_VALTORGB:
@@ -1136,7 +1136,7 @@
   switch(node->type)
     {
     case SH_NODE_MATERIAL:
-      var = glsl_node_material_output_vars(name, nr, 0, 0); break;
+      var = glsl_node_materialext_output_vars(name, nr, 0, 0); break;
     case SH_NODE_RGB:
       var = glsl_node_rgb_output_vars(name, nr, 0, 0); break;
     case SH_NODE_VALUE:
@@ -1199,10 +1199,84 @@
 }
 
 
-static char *glsl_generate_material_node_function(bNode *node, char *name)
+static char *glsl_generate_material_node_function(bNode *node, char *name, int num)
 {
   char *code = NULL;
 
+  char *color = glsl_generate_node_out_vars(node, name, 0);
+  char *alpha = glsl_generate_node_out_vars(node, name, 1);
+  char *normal = glsl_generate_node_out_vars(node, name, 2);
+  char *norm = glsl_generate_node_in_vars(node, name, 3);
+  char *diff_color = glsl_generate_node_out_vars(node, name, 3);
+  char *spec_color = glsl_generate_node_out_vars(node, name, 4);
+  char *ao = glsl_generate_node_out_vars(node, name, 5);
+
+  char *diff1 = glsl_generate_node_in_vars(node, name, 2);
+  char *diff2 = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_diff2");
+  char *diff3 = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_diff3");
+  char *spec1 = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_spec1");
+  char *spec2 = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_spec2");
+  char *spec3 = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_spec3");
+
+  char *mirror, *ambcolor, *ambfac, *spectra, *raymir, *transl;
+
+  char *emit = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_emit");
+  char *hard = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_hard");
+  char *tanv = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_tanv");
+  char *shless = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_shless");
+
+  char *assign_diff = glsl_string(4, 0, diff_color, 0, " = ", GFREE, glsl_generate_node_in_vars(node, name, 0), 0, ";\n");
+  char *assign_spec = glsl_string(4, 0, spec_color, 0, " = ", GFREE, glsl_generate_node_in_vars(node, name, 1), 0, ";\n");
+  char *assign_alpha = glsl_string(4, 0, alpha, 0, " = ", GFREE, glsl_generate_node_in_vars(node, name, 9), 0, ";\n");
+  char *assign_normal = glsl_string(2, 0, norm, 0, " = normal;\n");
+
+  if(node->type == SH_NODE_MATERIAL_EXT){
+    mirror = glsl_generate_node_in_vars(node, name, 4);
+    ambcolor = glsl_generate_node_in_vars(node, name, 5);
+    ambfac = glsl_generate_node_in_vars(node, name, 6);
+    spectra = glsl_generate_node_in_vars(node, name, 7);
+    raymir = glsl_generate_node_in_vars(node, name, 8);
+    transl = glsl_generate_node_in_vars(node, name, 10);
+  }
+  else{
+    mirror = "vec4(0.0, 0.0, 0.0, 0.0)";
+    ambcolor = "amb_color";
+    ambfac = glsl_string(3, 0, "u_mat_", GINT, num, 0, "_amb_fac");
+    spectra = "0.0";
+    raymir = "0.0";
+    transl = "0.0";
+  }
+
+  code = glsl_string(53, 
+		     GFREE, assign_diff,
+		     GFREE, assign_spec,
+		     GFREE, assign_alpha,
+		     GFREE, assign_normal,
+		     0, "material_", GINT, num, 0, "(",
+		     GFREE, color, 0, ", ",
+		     GFREE, alpha, 0, ", ",
+		     GFREE, normal, 0, ", ", 
+		     GFREE, norm, 0, ", ",
+		     GFREE, diff_color, 0, ", ", 
+		     GFREE, spec_color, 0, ", ", 
+		     GFREE, ao, 0, ", ", 
+		     GFREE, diff1, 0, ", ", 
+		     GFREE, diff2, 0, ", ",
+		     GFREE, diff3, 0, ", ",
+		     GFREE, spec1, 0, ", ",
+		     GFREE, spec2, 0, ", ",
+		     GFREE, spec3, 0, ", ",
+		     GFREE, mirror, 0, ", ",
+		     GFREE, ambcolor, 0, ", ",
+		     GFREE, ambfac, 0, ", ",
+		     GFREE, spectra, 0, ", ",
+		     GFREE, raymir, 0, ", ",
+		     GFREE, transl, 0, ", ",
+		     GFREE, emit, 0, ", ",
+		     GFREE, hard, 0, ", ",
+		     GFREE, tanv, 0, ", ",
+		     GFREE, shless, 0, ");\n");
+
   return code;
 }
 
@@ -1523,14 +1597,14 @@
 }
 
 
-static char *glsl_generate_node_function(GLSL_MaterialTree tree, bNode *node, char *name)
+static char *glsl_generate_node_function(GLSL_MaterialTree tree, bNode *node, char *name, int num)
 {
   char *code = NULL;
 
   switch(node->type)
     {
     case SH_NODE_MATERIAL:
-      code = glsl_generate_material_node_function(node, name);
+      code = glsl_generate_material_node_function(node, name, num);
       break;
     case SH_NODE_RGB:
       code = glsl_generate_rgb_node_function(node, name);
@@ -1578,7 +1652,7 @@
       code = glsl_generate_squeeze_node_function(node, name);
       break;
     case SH_NODE_MATERIAL_EXT:
-      code = glsl_generate_materialext_node_function(node, name);
+      code = glsl_generate_material_node_function(node, name, num);
       break;
     case SH_NODE_INVERT:
       code = glsl_generate_invert_node_function(node, name);
@@ -1992,7 +2066,7 @@
     " float tanv = u_mat_0_tanv;"
     " float shless = u_mat_0_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);"
+    " material_0(color, alpha, norm, vec3(0.0, 0.0, 0.0), 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 = color;"
     "}\n" 
@@ -2318,6 +2392,7 @@
   char *varsdecl = glsl_generate_node_vars_decl(node, name);
   char *code = NULL;
   int i = 0;
+  int num = BLI_ghash_size(tree->hash);
 
   BLI_ghash_insert(read, node, name);
 
@@ -2413,12 +2488,11 @@
     i++;
   }
 
-  nodecode->main_code = glsl_string(3, GFREE, nodecode->main_code, GFREE, code, GFREE, glsl_generate_node_function(tree, node, name));
+  nodecode->main_code = glsl_string(3, GFREE, nodecode->main_code, GFREE, code, GFREE, glsl_generate_node_function(tree, node, name, num));
   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);





More information about the Bf-blender-cvs mailing list