[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11800] branches/soc-2007-maike/source/ blender: Some more node code generation

Miguel Torres Lima torreslima at gmail.com
Thu Aug 23 20:22:53 CEST 2007


Revision: 11800
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11800
Author:   maike
Date:     2007-08-23 20:22:52 +0200 (Thu, 23 Aug 2007)

Log Message:
-----------
Some more node code generation
Node input and output variables declaration code is generated
Output variables values assignment and conversion to input variables code is generated

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-23 18:20:45 UTC (rev 11799)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_node_util.h	2007-08-23 18:22:52 UTC (rev 11800)
@@ -28,11 +28,6 @@
 
 void glsl_exec_nodetree(struct bNodeTree *nodetree, struct bNode *node, struct GLSL_NodeCode_ *nodecode);
 
-
-struct bNode *glsl_find_node_output(struct bNode *node);
-struct bNode *glsl_find_node_material(struct bNode *node);
-struct bNode *glsl_find_node_materialext(struct bNode *node);
-
 char *glsl_get_shader_func(char *name);
 char *glsl_get_func(char *file);
 

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-23 18:20:45 UTC (rev 11799)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c	2007-08-23 18:22:52 UTC (rev 11800)
@@ -102,7 +102,7 @@
 
 static char *glsl_construct_var_decl(char *name, short vartype)
 {
-  char *type[3] = { "float ", "vec3 ", "vec3 " };
+  char *type[3] = { "float ", "vec3 ", "vec4 " };
 
   return glsl_string(3, 0, type[vartype], GFREE, name, 0, ";\n");
 }
@@ -1114,10 +1114,94 @@
 }
 
 
+static bNode *glsl_find_node_output(bNode *node)
+{
+  while(node){
+    if(node->type == SH_NODE_OUTPUT)
+      return node;
 
+    node = node->next;
+  }
 
+  return NULL;
+}
 
 
+static bNode *glsl_find_node_material(bNode *node)
+{
+  while(node){
+    if(node->type == SH_NODE_MATERIAL)
+      return node;
+
+    node = node->prev;
+  }
+
+  return NULL;
+}
+
+
+static bNode *glsl_find_node_materialext(bNode *node)
+{
+  while(node){
+    if(node->type == SH_NODE_MATERIAL_EXT)
+      return node;
+
+    node = node->prev;
+  }
+  
+  return NULL;
+}
+
+
+static int glsl_find_output_sock_nr(bNode *node, bNodeSocket *fromsock)
+{
+  bNodeSocket *sock;
+  int i = 0;
+
+  for(sock = node->outputs.first; sock; sock = sock->next){
+    if(sock == fromsock)
+      return i;
+
+    i++;
+  }
+
+  return -1;
+}
+
+
+static char *glsl_convert_socket_type(char *code, short intype, short outtype, char *tovar, char *fromvar)
+{
+  char *rslt = NULL;
+
+  if(intype == outtype){
+    rslt = glsl_string(5, GFREE, code, GFREE, tovar, 0, " = ", GFREE, fromvar, 0, ";\n");
+  }
+  else{
+    if(intype == SOCK_VALUE){
+      rslt = glsl_string(9, GFREE, code, GFREE, tovar, 0, " = 0.333333 * (", 0, fromvar, 0, ".x + ", 0, fromvar, 0, ".y + ", GFREE, fromvar, 0, ".z);\n");
+    }
+    else if(intype == SOCK_VECTOR){
+      if(outtype == SOCK_VALUE){
+	rslt = glsl_string(9, GFREE, code, GFREE, tovar, 0, " = vec3(", 0, fromvar, 0, ", ", 0, fromvar, 0, ", ", GFREE, fromvar, 0, ");\n");
+      }
+      else{
+	rslt = glsl_string(5, GFREE, code, GFREE, tovar, 0, " = vec3(", GFREE, fromvar, 0, ".xyz);\n");
+      }
+    }
+    else{
+      if(outtype == SOCK_VALUE){
+	rslt = glsl_string(9, GFREE, code, GFREE, tovar, 0, " = vec4(", 0, fromvar, 0, ", ", 0, fromvar, 0, ", ", GFREE, fromvar, 0, ", 1.0);\n");
+      }
+      else{
+	rslt = glsl_string(5, GFREE, code, GFREE, tovar, 0, " = vec4(", GFREE, fromvar, 0, ", 1.0);\n");
+      }
+    }
+  }
+
+  return rslt;
+}
+
+
 int glsl_shader_code(GLSL_MaterialTree tree, GLSL_Program program)
 {
   printf("\nGLSL Shader code writing...\n");
@@ -1431,6 +1515,8 @@
 
   glsl_exec_nodetree(nodetree, node, nodecode);
 
+  printf("\n%s\n%s\n", nodecode->uniform_code, nodecode->main_code);
+
   glsl_free_node_hash();
 
   return NULL;
@@ -1443,21 +1529,39 @@
   char *name = glsl_generate_node_name(node);
   char *varsdecl = glsl_generate_node_vars_decl(node, name);
   char *code = NULL;
-  bNode *fromnode = NULL;
   int i = 0;
 
   BLI_ghash_insert(read, node, name);
 
   for(sock = node->inputs.first; sock; sock = sock->next){
-    bNodeLink *link;
-    bNodeStack *stack;
+    bNodeLink *link = NULL;
+    bNodeStack *stack = NULL;
+    bNodeSocket *fromsock = NULL;
+    bNode *fromnode = NULL;
 
     if(sock->link){
+      char *fromname = NULL;
+      char *tovar = NULL;
+      char *fromvar = NULL;
+      int socknr;
+
       link = sock->link;
+      stack = &sock->ns;
+
       fromnode = link->fromnode;
+      fromsock = link->fromsock;
+
+      socknr = glsl_find_output_sock_nr(fromnode, fromsock);
+      fromname = glsl_generate_node_name(fromnode);
+      tovar = glsl_generate_node_in_vars(node, name, i);
+      fromvar = glsl_generate_node_out_vars(fromnode, fromname, socknr);
       
+
       if(BLI_ghash_lookup(read, fromnode)){
 	if(BLI_ghash_lookup(done, fromnode)){
+
+	  code = glsl_convert_socket_type(code, sock->type, fromsock->type, tovar, fromvar);
+	  
 	  /* assign node.input = linked_node.output */
 	  /* convert values if needed */
 	}
@@ -1475,22 +1579,30 @@
 	  else{
 	    stack = &sock->ns;
 	    
-	    switch(stack->sockettype)
+	    switch(sock->type)
 	      {
 	      case SOCK_VALUE:
 		code = glsl_string(5, GFREE, code, GFREE, glsl_generate_node_in_vars(node, name, i), 0, " = ", GFLOAT, stack->vec[0], 0, ";\n");
 		break;
-	      default:
+	      case SOCK_VECTOR:
 		code = glsl_string(9, GFREE, code, GFREE, glsl_generate_node_in_vars(node, name, i), 
 				   0, " = vec3(", GFLOAT, stack->vec[0], 0, ",", GFLOAT, stack->vec[1], 0, ",", GFLOAT, stack->vec[2], 0, ");\n");
 		break;
+	      default:
+		code = glsl_string(11, GFREE, code, GFREE, glsl_generate_node_in_vars(node, name, i), 
+				   0, " = vec4(", GFLOAT, stack->vec[0], 0, ",", GFLOAT, stack->vec[1], 0, ",", GFLOAT, stack->vec[2], GFLOAT, stack->vec[3], 0, ");\n");
+		break;
 	      }
 	  }
 	}
       }
       else{  /* call this function for linked node */
+	int socknr = glsl_find_output_sock_nr(fromnode, fromsock);
+	char *fromname = glsl_generate_node_name(fromnode);
+
 	glsl_exec_nodetree(nodetree, fromnode, nodecode);
 
+	code = glsl_convert_socket_type(code, sock->type, fromsock->type, tovar, fromvar);
 	/* assign node.input = linked_node.output */
 	/* convert values if needed */
       }
@@ -1520,52 +1632,14 @@
 
   /* concatenate the generated code */
 
+  nodecode->main_code = glsl_string(2, GFREE, nodecode->main_code, GFREE, code);
+  nodecode->uniform_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, varsdecl);
+
   BLI_ghash_insert(done, node, name);
 }
 
 
 
-
-
-bNode *glsl_find_node_output(bNode *node)
-{
-  while(node){
-    if(node->type == SH_NODE_OUTPUT)
-      return node;
-
-    node = node->next;
-  }
-
-  return NULL;
-}
-
-
-bNode *glsl_find_node_material(bNode *node)
-{
-  while(node){
-    if(node->type == SH_NODE_MATERIAL)
-      return node;
-
-    node = node->prev;
-  }
-
-  return NULL;
-}
-
-
-bNode *glsl_find_node_materialext(bNode *node)
-{
-  while(node){
-    if(node->type == SH_NODE_MATERIAL_EXT)
-      return node;
-
-    node = node->prev;
-  }
-  
-  return NULL;
-}
-
-
 GLSL_NodeCode glsl_init_nodecode(void)
 {
   GLSL_NodeCode material_node = MEM_mallocN(sizeof(struct GLSL_NodeCode_), "GLSL Node Code");





More information about the Bf-blender-cvs mailing list