[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