[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11884] branches/soc-2007-maike/source/ blender: Added colorband node

Miguel Torres Lima torreslima at gmail.com
Wed Aug 29 18:42:08 CEST 2007


Revision: 11884
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11884
Author:   maike
Date:     2007-08-29 18:42:08 +0200 (Wed, 29 Aug 2007)

Log Message:
-----------
Added colorband node
Altered some functions to be able to pass the tree between them in order to add colorband nodes to tree->cbs hash table
Colorband update not done as none of the nodes events.

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_materialtree.h
    branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.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
    branches/soc-2007-maike/source/blender/src/glsl_uniforms.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_materialtree.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_materialtree.h	2007-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_materialtree.h	2007-08-29 16:42:08 UTC (rev 11884)
@@ -4,6 +4,7 @@
 #define GLSL_MAT     0
 #define GLSL_NODES   1
 
+
 /* ------------------------------------------------ */
 
 struct Object;
@@ -21,6 +22,8 @@
   struct GLSL_Program_ *shaded_program;     /* pointer to GLSL_Program structure for shaded mode */
   
   struct GHash *hash;
+  struct GHash *cbs;
+  struct GHash *textures;
   struct Material *mat;
   
   void (*add_material)(struct GLSL_MaterialTree_ * tree, struct Material *mat);
@@ -37,6 +40,7 @@
   void (*free)(struct GLSL_MaterialTree_ * tree);
   
   short type;
+  short flag;
   short exec;
 };
 

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.h	2007-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.h	2007-08-29 16:42:08 UTC (rev 11884)
@@ -50,7 +50,7 @@
 struct GLSL_NodeCode_ *glsl_generate_shader_code(struct GLSL_MaterialTree_ *tree);
 struct GLSL_NodeCode_ *glsl_generate_shader_node_code(struct GLSL_MaterialTree_ *tree);
 
-void glsl_exec_nodetree(struct bNodeTree *nodetree, struct bNode *node, struct GLSL_NodeCode_ *nodecode);
+void glsl_exec_nodetree(struct GLSL_MaterialTree_ *tree, struct bNodeTree *nodetree, struct bNode *node, struct GLSL_NodeCode_ *nodecode);
 
 char *glsl_get_shader_func(char *name);
 char *glsl_get_func(char *file);

Modified: branches/soc-2007-maike/source/blender/src/glsl_material.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-08-29 16:42:08 UTC (rev 11884)
@@ -158,7 +158,8 @@
 {
   GLSL_ColorBand colorband = material->diff_ramp;
 
-  colorband->add_tex(colorband, colorband->index);
+  if(colorband)
+    colorband->add_tex(colorband, colorband->index);
 }
 
 
@@ -166,7 +167,8 @@
 {
   GLSL_ColorBand colorband = material->spec_ramp;
 
-  colorband->add_tex(colorband, colorband->index);
+  if(colorband)
+    colorband->add_tex(colorband, colorband->index);
 }
 
 
@@ -321,9 +323,15 @@
   GHashIterator *iter = BLI_ghashIterator_new(treeHash);
   int i;
 
+  if(glsl_defmaterial){
+    glsl_defmaterial->free(glsl_defmaterial);
+    glsl_defmaterial = NULL;
+  }
+
   for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iter)){
     GLSL_MaterialTree tree = BLI_ghashIterator_getValue(iter);
-    
+    Material *mat = BLI_ghashIterator_getKey(iter);
+
     if(tree)
       tree->free(tree);
   }

Modified: branches/soc-2007-maike/source/blender/src/glsl_materialtree.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_materialtree.c	2007-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/src/glsl_materialtree.c	2007-08-29 16:42:08 UTC (rev 11884)
@@ -57,7 +57,8 @@
     
     BLI_ghash_insert(matHash, mat, material);
 
-    material->init_cb(material, mat);
+    if(tree != glsl_defmaterial)
+      material->init_cb(material, mat);
   }
   
   tree->add_mat_child(tree, material, mat);
@@ -103,7 +104,7 @@
 static int glsl_tree_program(GLSL_MaterialTree tree)
 {
   tree->shaded_program = glsl_init_program(tree);
-
+  
   if(tree->shaded_program != NULL){
     glsl_update_all_light_uniforms(tree);
     return 1;
@@ -143,8 +144,23 @@
   BLI_ghashIterator_free(iter);
   BLI_ghash_free(tree->hash, NULL, NULL);
 
+
+  iter = BLI_ghashIterator_new(tree->cbs);
+
+  for(i = 0; i < BLI_ghash_size(tree->cbs); i++, BLI_ghashIterator_step(iter)){
+    GLSL_ColorBand colorband = BLI_ghashIterator_getKey(iter);
+    
+    colorband->free(colorband);
+  }
+
+  BLI_ghashIterator_free(iter);
+  BLI_ghash_free(tree->cbs, NULL, NULL);
+
+  BLI_ghash_free(tree->textures, NULL, NULL);
+
+
   iter = BLI_ghashIterator_new(treeHash);
-  
+
   for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iter)){
     if(BLI_ghashIterator_getValue(iter) == tree){
       material = BLI_ghashIterator_getKey(iter);
@@ -154,6 +170,8 @@
 
   BLI_ghashIterator_free(iter);
 
+  BLI_ghash_remove(treeHash, material, 0, 0);
+
   if(tree->shaded_program)
     tree->shaded_program->free(tree->shaded_program);
 
@@ -180,7 +198,9 @@
   tree->type = type;
   tree->mat = mat;
   tree->hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
-  
+  tree->cbs = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+  tree->textures = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
   tree->add_material = glsl_tree_add_mat;
   tree->del_material = glsl_tree_del_mat;
 
@@ -200,6 +220,9 @@
 
   printf("\n GLSL MaterialTree created.\n");
 
+  if(mat == &defmaterial)
+    glsl_defmaterial = tree;
+
   if(!(tree->create_programs(tree))){
     G.vd->drawtype = OB_SHADED;
     glsl_change_state();
@@ -210,9 +233,6 @@
   glsl_update_tree_world_uniforms(tree);
   glsl_update_tree_texture_uniforms(tree);
   glsl_update_all_light_uniforms(tree);
-
-  if(mat == &defmaterial)
-    glsl_defmaterial = tree;
 }
 
 
@@ -248,9 +268,10 @@
 {
   GLSL_MaterialTree tree = (struct GLSL_MaterialTree_ *) BLI_ghash_lookup(treeHash, mat);
 
-  if(mat == &defmaterial || !tree || !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-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-08-29 16:42:08 UTC (rev 11884)
@@ -20,6 +20,7 @@
 #include "BIF_glsl_shader_util.h"
 #include "BIF_glsl_material_node.h"
 #include "BIF_glsl_node_util.h"
+#include "BIF_glsl_colorband.h"
 #include "BIF_glsl_colorband_node.h"
 #include "BIF_glsl_texture_node.h"
 #include "BIF_glsl_texture.h"
@@ -1266,11 +1267,27 @@
 }
 
 
-static char *glsl_generate_colorband_node_function(bNode *node, char *name)
+static char *glsl_generate_colorband_node_function(GLSL_MaterialTree tree, bNode *node, char *name)
 {
   char *code = NULL;
   
+  GLSL_ColorBand colorband = glsl_init_colorband(NULL, node->storage);
 
+  colorband->add_tex(colorband, colorband->index);
+
+  BLI_ghash_insert(tree->cbs, colorband, tree);
+
+  code = glsl_string(10, GFREE, glsl_generate_node_out_vars(node, name, 0), 
+		     0, " = texture2D(colorband_tex, vec2(clamp(", 
+		     GFREE, glsl_generate_node_in_vars(node, name, 0), 
+		     0, ", 0.000, 0.999),", 
+		     GINT, colorband->index, 
+		     0, ".0));\n",
+		     GFREE, glsl_generate_node_out_vars(node, name, 1), 
+		     0, " = ", 
+		     GFREE, glsl_generate_node_out_vars(node, name, 0), 
+		     0, ".a;\n");
+
   return code;
 }
 
@@ -1511,7 +1528,7 @@
 }
 
 
-static char *glsl_generate_node_function(bNode *node, char *name)
+static char *glsl_generate_node_function(GLSL_MaterialTree tree, bNode *node, char *name)
 {
   char *code = NULL;
 
@@ -1530,7 +1547,7 @@
       code = glsl_generate_rgbmix_node_function(node, name);
       break;
     case SH_NODE_VALTORGB:
-      code = glsl_generate_colorband_node_function(node, name);
+      code = glsl_generate_colorband_node_function(tree, node, name);
       break;
     case SH_NODE_RGBTOBW:
       code = glsl_generate_rgbtobw_node_function(node, name);
@@ -2122,7 +2139,7 @@
     }
   }
 
-  glsl_exec_nodetree(nodetree, node, nodecode);
+  glsl_exec_nodetree(tree, nodetree, node, nodecode);
 
   nodecode->main_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, nodecode->main_code);
   
@@ -2256,7 +2273,7 @@
 }
 
 
-void  glsl_exec_nodetree(bNodeTree *nodetree, bNode *node, GLSL_NodeCode nodecode)
+void  glsl_exec_nodetree(GLSL_MaterialTree tree, bNodeTree *nodetree, bNode *node, GLSL_NodeCode nodecode)
 {
   bNodeSocket *sock;
   char *name = glsl_generate_node_name(node);
@@ -2329,7 +2346,7 @@
 	int socknr = glsl_find_output_sock_nr(fromnode, fromsock);
 	char *fromname = glsl_generate_node_name(fromnode);
 
-	glsl_exec_nodetree(nodetree, fromnode, nodecode);
+	glsl_exec_nodetree(tree, nodetree, fromnode, nodecode);
 
 	code = glsl_convert_socket_type(node, code, sock->type, fromsock->type, tovar, fromvar);
       }
@@ -2358,7 +2375,7 @@
     i++;
   }
 
-  nodecode->main_code = glsl_string(3, GFREE, nodecode->main_code, GFREE, code, GFREE, glsl_generate_node_function(node, name));
+  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);
 
   BLI_ghash_insert(done, node, name);

Modified: branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-29 16:39:46 UTC (rev 11883)
+++ branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-29 16:42:08 UTC (rev 11884)
@@ -428,10 +428,11 @@
   char *colorband_tex = "colorband_tex";
 
   GLSL_Material material = BLI_ghash_lookup(matHash, mat);
+  GLSL_MaterialTree tree = BLI_ghash_lookup(treeHash, mat);
 
   if(!material) return;
 
-  if(mat->mode & MA_RAMP_COL || mat->mode & MA_RAMP_SPEC){
+  if(mat->mode & MA_RAMP_COL || mat->mode & MA_RAMP_SPEC || (tree && BLI_ghash_size(tree->cbs) > 0)){
     glActiveTexture(GL_TEXTURE1);
     glBindTexture(GL_TEXTURE_1D, glsl_get_colorband_tex_id());
     glUniform1i(glsl_uniform_location(program, colorband_tex), 1);





More information about the Bf-blender-cvs mailing list