[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11906] branches/soc-2007-maike/source/ blender: Added glsl code generation for material nodes and extended material nodes, still needs the main function code generation for these nodes and to control the materials in a materialtree
Miguel Torres Lima
torreslima at gmail.com
Fri Aug 31 19:02:17 CEST 2007
Revision: 11906
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11906
Author: maike
Date: 2007-08-31 19:02:16 +0200 (Fri, 31 Aug 2007)
Log Message:
-----------
Added glsl code generation for material nodes and extended material nodes, still needs the main function code generation for these nodes and to control the materials in a materialtree
Added a new string pointer to GLSL_NodeCode because material type nodes need to have uniforms, function code, main variables declaration and a function call to its function in the main function
Modified Paths:
--------------
branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h
branches/soc-2007-maike/source/blender/src/glsl_material_node.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_program.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h 2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h 2007-08-31 17:02:16 UTC (rev 11906)
@@ -57,6 +57,7 @@
char *main_code;
char *uniform_code;
char *node_code;
+ char *var_code;
};
/* -------------------------------------------------------- */
Modified: branches/soc-2007-maike/source/blender/src/glsl_material_node.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material_node.c 2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_material_node.c 2007-08-31 17:02:16 UTC (rev 11906)
@@ -108,7 +108,7 @@
0, "\n#define MATERIAL_ID ", GINT, num, 0, "\n",
0, "\n#define MATERIAL_FUNC material_", GINT, num, 0, "\n",
GFREE, func_init,
- 0, "\nreturn(diff_color + vert_color);\n}\n",
+ 0, "\ncolor = vec4(diff_color + vert_color, 1.0);\n}\n",
0, "#undef MATERIAL_ID\n#undef MATERIAL_FUNC\n");
return code;
@@ -119,7 +119,7 @@
0, "\n#define MATERIAL_ID ", GINT, num, 0, "\n",
0, "\n#define MATERIAL_FUNC material_", GINT, num, 0, "\n",
GFREE, func_init,
- 0, "\nreturn(0.0, 0.0, 0.0);\n}\n",
+ 0, "\ncolor = vec4(0.0,0.0,0.0,1.0);\n}\n",
0, "#undef MATERIAL_ID\n#undef MATERIAL_FUNC\n");
return code;
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-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_node_util.c 2007-08-31 17:02:16 UTC (rev 11906)
@@ -1338,15 +1338,17 @@
bNodeSocket *sock;
int i = 0;
- for(sock = node->outputs.first; sock; sock = sock->next){
- char *var = glsl_node_geometry_output_vars(name, i, 0, 0);
+ code = glsl_string(16,
+ GFREE, glsl_generate_node_out_vars(node, name, 0), 0, " = vec3(0.0,0.0,0.0);\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 1), 0, " = pos;\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 2), 0, " = normalize(pos);\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 3), 0, " = vec3(0.0,0.0,0.0);\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 4), 0, " = vec3(0.0,0.0,0.0);\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 5), 0, " = normal;\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 6), 0, " = vec4(0.0,0.0,0.0,0.0);\n",
+ GFREE, glsl_generate_node_out_vars(node, name, 7), 0, " = 1.0;\n"
+ );
-
- code = glsl_string(2, GFREE, code, GFREE, glsl_assign_var_value(var, stack, sock->type));
-
- i++;
- }
-
return code;
}
@@ -1398,10 +1400,7 @@
static char *glsl_generate_camera_node_function(bNode *node, char *name)
{
char *code = NULL;
- bNodeStack *stack;
- bNodeSocket *sock;
- int i = 0;
-
+
code = glsl_string(6,
GFREE, glsl_generate_node_out_vars(node, name, 0), 0, " = normalize(pos);\n",
GFREE, glsl_generate_node_out_vars(node, name, 1), 0, " = abs(pos.z);\n",
@@ -1974,9 +1973,11 @@
char *main_func = {
"void main(void){ "
+ " vec4 color = vec4(0.0, 0.0, 0.0, 0.0);"
+ " vec4 ao = vec4(0.0, 0.0, 0.0, 0.0);"
" vec3 norm = normal;"
- " vec3 diff_color = realcolor.xyz;"
- " vec3 spec_color = u_mat_0_spec_color;"
+ " vec4 diff_color = realcolor;"
+ " vec4 spec_color = vec4(u_mat_0_spec_color, 1.0);"
" float alpha = realcolor.a;"
" float diff1 = u_mat_0_diff1;"
@@ -1991,9 +1992,9 @@
" float tanv = u_mat_0_tanv;"
" float shless = u_mat_0_shless;"
- " vec3 result = material_0(diff_color, spec_color, norm, alpha, diff1, diff2, diff3, spec1, spec2, spec3, amb_fac, emit, hard, tanv, 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);"
- " gl_FragColor = vec4(result, alpha);"
+ " gl_FragColor = color;"
"}\n"
};
@@ -2137,11 +2138,9 @@
glsl_exec_nodetree(tree, nodetree, node, nodecode);
- nodecode->main_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, nodecode->main_code);
-
- MEM_freeN(nodecode->uniform_code);
- nodecode->uniform_code = NULL;
+ nodecode->main_code = glsl_string(2, GFREE, nodecode->var_code, GFREE, nodecode->main_code);
+
switch(node->type)
{
case SH_NODE_OUTPUT:
@@ -2158,7 +2157,7 @@
}
if(!(rgbmix_funcs = glsl_rgbmix_funcs(files->mix))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2170,7 +2169,7 @@
}
if(!(cb_blend_funcs = glsl_colorband_blend_funcs(files->ramp_blend))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2183,7 +2182,7 @@
if(files->rgbtobw){
if(!(rgbtobw_funcs = glsl_get_func("node_rgbtobw.gsl"))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2194,7 +2193,7 @@
if(files->normal){
if(!(normal_funcs = glsl_get_func("node_normal.gsl"))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2205,7 +2204,7 @@
if(files->mapping){
if(!(mapping_funcs = glsl_get_func("node_mapping.gsl"))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2216,7 +2215,7 @@
if(!(math_funcs = glsl_math_funcs(files->math))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2228,7 +2227,7 @@
}
if(!(vectmath_funcs = glsl_vectmath_funcs(files->vectmath))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2241,7 +2240,7 @@
if(files->squeeze){
if(!(squeeze_funcs = glsl_get_func("node_squeeze.gsl"))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2252,7 +2251,7 @@
if(files->invert){
if(!(invert_funcs = glsl_get_func("node_invert.gsl"))){
- MEM_freeN(nodecode->uniform_code);
+ MEM_freeN(nodecode->var_code);
MEM_freeN(nodecode->node_code);
MEM_freeN(nodecode);
return NULL;
@@ -2261,7 +2260,50 @@
nodecode->node_code = glsl_string(2, GFREE, invert_funcs, GFREE, nodecode->node_code);
}
+ if(files->diffuse || files->specular || files->visibility){
+ if(!(light_funcs = glsl_write_light_funcs(files->diffuse, files->specular, files->visibility))){
+ MEM_freeN(nodecode->var_code);
+ MEM_freeN(nodecode->node_code);
+ MEM_freeN(nodecode);
+ return NULL;
+ }
+ else
+ nodecode->node_code = glsl_string(2, GFREE, light_funcs, GFREE, nodecode->node_code);
+ }
+ if(files->tex_type){
+ if(!(tex_funcs = glsl_texture_funcs(files->tex_type))){
+ MEM_freeN(nodecode->var_code);
+ MEM_freeN(nodecode->node_code);
+ MEM_freeN(nodecode);
+ return NULL;
+ }
+ else
+ nodecode->node_code = glsl_string(2, GFREE, tex_funcs, GFREE, nodecode->node_code);
+ }
+
+ if(files->tex_blend){
+ if(!(tex_blend_funcs = glsl_texture_blend_funcs(files->tex_blend))){
+ MEM_freeN(nodecode->var_code);
+ MEM_freeN(nodecode->node_code);
+ MEM_freeN(nodecode);
+ return NULL;
+ }
+ else
+ nodecode->node_code = glsl_string(2, GFREE, tex_blend_funcs, GFREE, nodecode->node_code);
+ }
+
+ if(files->tex_blend_val){
+ if(!(tex_blendval_funcs = glsl_texture_blendval_funcs(files->tex_blend_val))){
+ MEM_freeN(nodecode->var_code);
+ MEM_freeN(nodecode->node_code);
+ MEM_freeN(nodecode);
+ return NULL;
+ }
+ else
+ nodecode->node_code = glsl_string(2, GFREE, tex_blendval_funcs, GFREE, nodecode->node_code);
+ }
+
glsl_free_node_hash();
glsl_free_nodefiles();
@@ -2372,8 +2414,22 @@
}
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);
+ 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);
+ material_code = glsl_material_node((Material *) node->id, &files->diffuse, &files->specular, &files->visibility, &files->ramp_blend, &files->tex_type, &files->tex_blend, &files->tex_blend_val, num);
+ nodecode->node_code = glsl_string(2, GFREE, nodecode->node_code, GFREE, material_code->node_code);
+ nodecode->uniform_code = glsl_string(2, GFREE, nodecode->uniform_code, GFREE, material_code->uniform_code);
+
+ MEM_freeN(material_code);
+ }
+
+
BLI_ghash_insert(done, node, name);
MEM_freeN(name);
@@ -2388,6 +2444,7 @@
material_node->main_code = NULL;
material_node->uniform_code = NULL;
material_node->node_code = NULL;
+ material_node->var_code = NULL;
return material_node;
}
Modified: branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_uniforms.c 2007-08-31 16:54:42 UTC (rev 11905)
+++ branches/soc-2007-maike/source/blender/src/glsl_uniforms.c 2007-08-31 17:02:16 UTC (rev 11906)
@@ -398,7 +398,7 @@
diff_fac = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 0, 0, "_fac");
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list