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

Miguel Torres Lima torreslima at gmail.com
Sat Aug 25 18:49:10 CEST 2007


Revision: 11826
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11826
Author:   maike
Date:     2007-08-25 18:49:10 +0200 (Sat, 25 Aug 2007)

Log Message:
-----------
Added Vector Math node

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

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-25 16:48:41 UTC (rev 11825)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.h	2007-08-25 16:49:10 UTC (rev 11826)
@@ -19,6 +19,13 @@
 #define GLSL_NODEMATH_RND     16384
 
 
+#define GLSL_NODEVMATH_ADD        1
+#define GLSL_NODEVMATH_SUB        2
+#define GLSL_NODEVMATH_AVG        4
+#define GLSL_NODEVMATH_DOT        8
+#define GLSL_NODEVMATH_CROSS     16
+#define GLSL_NODEVMATH_NORM      32
+
 struct GLSL_MaterialTree_;
 struct GLSL_Program_;
 struct GLSL_NodeCode_;

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-25 16:48:41 UTC (rev 11825)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-08-25 16:49:10 UTC (rev 11826)
@@ -1420,7 +1420,7 @@
     bNodeStack *stack = &sock->ns;
     bNodeStack *stack2 = &sock2->ns;
     
-    if(!stack->hasinput || stack2->hasinput) in_nr = 1;
+    if(!stack->hasinput && stack2->hasinput) in_nr = 1;
 
     code = glsl_string(7, 0, "node_math_", 0, funcs[node->custom1],
 		       0, "(", GFREE, glsl_generate_node_in_vars(node, name, in_nr),
@@ -1435,8 +1435,36 @@
 
 static char *glsl_generate_vectmath_node_function(bNode *node, char *name)
 {
+  char *funcs[6] = { "add", "sub", "avg", "dot", "cross", "norm" };
   char *code = NULL;
+  int blend_type = pow(2, node->custom1);
 
+  files->vectmath |= blend_type;
+
+  if(node->custom1 < 5){
+    code = glsl_string(11, 0, "node_vectmath_", 0, funcs[node->custom1],
+		       0, "(", GFREE, glsl_generate_node_in_vars(node, name, 0),
+		       0, ", ", GFREE, glsl_generate_node_in_vars(node, name, 1),
+		       0, ", ", GFREE, glsl_generate_node_out_vars(node, name, 0),
+		       0, ", ", GFREE, glsl_generate_node_out_vars(node, name, 1),
+		       0, ");\n");
+  }
+  else{
+    int in_nr = 0;
+    bNodeSocket *sock = node->inputs.first;
+    bNodeSocket *sock2 = sock->next;
+    bNodeStack *stack = &sock->ns;
+    bNodeStack *stack2 = &sock2->ns;
+    
+    if(!stack->hasinput && stack2->hasinput) in_nr = 1;
+
+    code = glsl_string(9, 0, "node_vectmath_", 0, funcs[node->custom1],
+		       0, "(", GFREE, glsl_generate_node_in_vars(node, name, in_nr),
+		       0, ", ", GFREE, glsl_generate_node_out_vars(node, name, 0),
+		       0, ", ", GFREE, glsl_generate_node_out_vars(node, name, 1),
+		       0, ");\n");
+  }
+
   return code;
 }
 
@@ -1736,6 +1764,38 @@
   return code;
 }
 
+
+static char *glsl_vectmath_funcs(int func)
+{
+  char *code = NULL;
+
+  if(func & GLSL_NODEVMATH_ADD){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_add.gsl"));
+  }
+  if(func & GLSL_NODEVMATH_SUB){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_sub.gsl"));
+  }
+  if(func & GLSL_NODEVMATH_AVG){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_avg.gsl"));
+  }
+  if(func & GLSL_NODEVMATH_DOT){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_dot.gsl"));
+  }
+  if(func & GLSL_NODEVMATH_CROSS){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_cross.gsl"));
+  }
+  if(func & GLSL_NODEVMATH_NORM){
+    code = glsl_string(2, GFREE, code, GFREE, glsl_get_func("node_vectmath_norm.gsl"));
+  }
+
+
+  if(!code)
+    return "";
+
+  return code;
+}
+
+
 int glsl_shader_code(GLSL_MaterialTree tree, GLSL_Program program)
 {
   printf("\nGLSL Shader code writing...\n");
@@ -2015,6 +2075,7 @@
   char *normal_funcs = NULL;
   char *mapping_funcs = NULL;
   char *math_funcs = NULL;
+  char *vectmath_funcs = NULL;
   char *tex_funcs = NULL;
   char *tex_blend_funcs = NULL;
   char *tex_blendval_funcs = NULL;
@@ -2130,6 +2191,17 @@
 					  GFREE, nodecode->node_code);
   }
 
+  if(!(vectmath_funcs = glsl_vectmath_funcs(files->vectmath))){
+    MEM_freeN(nodecode->uniform_code);
+    MEM_freeN(nodecode->node_code);
+    MEM_freeN(nodecode);
+    return NULL;
+  }
+  else if(strcmp(vectmath_funcs, "") != 0) {
+    nodecode->node_code = glsl_string(2,
+					  GFREE, vectmath_funcs,
+					  GFREE, nodecode->node_code);
+  }
 
   glsl_free_node_hash();
   glsl_free_nodefiles();





More information about the Bf-blender-cvs mailing list