Revision: 15257 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15257 Author: blendix Date: 2008-06-17 23:23:51 +0200 (Tue, 17 Jun 2008)
Log Message: ----------- Apricot Branch: GLSL ==================== * Added support for the Material and Extended Material nodes. * Added support for node groups. * All nodes except Dynamic are now supported. Modified Paths: -------------- branches/apricot/source/blender/blenkernel/BKE_node.h branches/apricot/source/blender/blenkernel/intern/node.c branches/apricot/source/blender/gpu/GPU_material.h branches/apricot/source/blender/gpu/intern/gpu_codegen.c branches/apricot/source/blender/gpu/intern/gpu_material.c branches/apricot/source/blender/gpu/intern/material_shaders.glsl branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_camera.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_curves.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_geom.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_invert.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_material.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_math.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_normal.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_output.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_texture.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_value.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c Modified: branches/apricot/source/blender/blenkernel/BKE_node.h =================================================================== --- branches/apricot/source/blender/blenkernel/BKE_node.h 2008-06-17 21:17:11 UTC (rev 15256) +++ branches/apricot/source/blender/blenkernel/BKE_node.h 2008-06-17 21:23:51 UTC (rev 15257) @@ -95,7 +95,7 @@ void *pydict; /* holds pointer to python script dictionary (scope)*/ /* gpu */ - struct GPUNode *(*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out); + int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out); } bNodeType; Modified: branches/apricot/source/blender/blenkernel/intern/node.c =================================================================== --- branches/apricot/source/blender/blenkernel/intern/node.c 2008-06-17 21:17:11 UTC (rev 15256) +++ branches/apricot/source/blender/blenkernel/intern/node.c 2008-06-17 21:23:51 UTC (rev 15257) @@ -2379,6 +2379,8 @@ gs[i].name = ""; gs[i].hasinput= ns[i]->hasinput; + gs[i].hasoutput= ns[i]->hasinput; + gs[i].sockettype= ns[i]->sockettype; } gs[i].type= GPU_NONE; @@ -2389,10 +2391,52 @@ bNodeSocket *sock; int i; - for (sock=sockets->first, i=0; sock; sock=sock->next, i++) + for (sock=sockets->first, i=0; sock; sock=sock->next, i++) { ns[i]->data= gs[i].link; + ns[i]->hasinput= gs[i].hasinput; + ns[i]->hasoutput= gs[i].hasoutput; + ns[i]->sockettype= gs[i].sockettype; + } } +static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in, bNodeStack **out) +{ + bNode *node; + bNodeTree *ntree= (bNodeTree *)gnode->id; + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1]; + int doit = 0; + + if(ntree==NULL) return; + + stack+= gnode->stack_index; + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->gpufunc) { + group_node_get_stack(node, stack, nsin, nsout, in, out); + + doit = 0; + + /* for groups, only execute outputs for edited group */ + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + if(gnode->flag & NODE_GROUP_EDIT) + if(node->flag & NODE_DO_OUTPUT) + doit = 1; + } + else + doit = 1; + + if(doit) { + gpu_from_node_stack(&node->inputs, nsin, gpuin); + gpu_from_node_stack(&node->outputs, nsout, gpuout); + if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) + data_from_gpu_stack(&node->outputs, nsout, gpuout); + } + } + } +} + void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat) { bNode *node; @@ -2414,7 +2458,10 @@ if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) data_from_gpu_stack(&node->outputs, nsout, gpuout); } - /* groups not supported yet .. */ + else if(node->type==NODE_GROUP && node->id) { + node_get_stack(node, stack, nsin, nsout); + gpu_node_group_execute(stack, mat, node, nsin, nsout); + } } ntreeEndExecTree(ntree); Modified: branches/apricot/source/blender/gpu/GPU_material.h =================================================================== --- branches/apricot/source/blender/gpu/GPU_material.h 2008-06-17 21:17:11 UTC (rev 15256) +++ branches/apricot/source/blender/gpu/GPU_material.h 2008-06-17 21:23:51 UTC (rev 15257) @@ -41,6 +41,7 @@ struct ImageUser; struct Material; struct Object; +struct bNode; struct GPUVertexAttribs; struct GPUNode; struct GPUNodeLink; @@ -71,7 +72,9 @@ char *name; float vec[4]; struct GPUNodeLink *link; - int hasinput; + short hasinput; + short hasoutput; + short sockettype; } GPUNodeStack; GPUNodeLink *GPU_attribute(int type, char *name); @@ -81,8 +84,8 @@ GPUNodeLink *GPU_texture(int size, float *pixels); GPUNodeLink *GPU_socket(GPUNodeStack *sock); -GPUNode *GPU_link(GPUMaterial *mat, char *name, ...); -GPUNode *GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...); +int GPU_link(GPUMaterial *mat, char *name, ...); +int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...); void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link); void GPU_material_enable_alpha(GPUMaterial *material); @@ -102,6 +105,23 @@ void GPU_material_vertex_attributes(GPUMaterial *material, struct GPUVertexAttribs *attrib); +/* Exported shading */ + +typedef struct GPUShadeInput { + GPUMaterial *gpumat; + struct Material *mat; + + GPUNodeLink *rgb, *specrgb, *vn, *view; + GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb; +} GPUShadeInput; + +typedef struct GPUShadeResult { + GPUNodeLink *diff, *spec, *combined, *alpha; +} GPUShadeResult; + +void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi); +void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr); + #ifdef __cplusplus } #endif Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-06-17 21:17:11 UTC (rev 15256) +++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-06-17 21:23:51 UTC (rev 15257) @@ -1085,7 +1085,7 @@ GPU_node_input(node, function->paramtype[i], "", NULL, link, link->dynamic); } -GPUNode *GPU_link(GPUMaterial *mat, char *name, ...) +int GPU_link(GPUMaterial *mat, char *name, ...) { GPUNode *node; GPUFunction *function; @@ -1096,7 +1096,7 @@ function = GPU_lookup_function(name); if(!function) { fprintf(stderr, "GPU failed to find function %s\n", name); - return NULL; + return 0; } node = GPU_node_begin(name); @@ -1118,10 +1118,10 @@ gpu_material_add_node(mat, node); - return node; + return 1; } -GPUNode *GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...) +int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...) { GPUNode *node; GPUFunction *function; @@ -1132,7 +1132,7 @@ function = GPU_lookup_function(name); if(!function) { fprintf(stderr, "GPU failed to find function %s\n", name); - return NULL; + return 0; } node = GPU_node_begin(name); @@ -1178,7 +1178,7 @@ gpu_material_add_node(mat, node); - return node; + return 1; } /* Pass create/free */ Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-06-17 21:17:11 UTC (rev 15256) +++ branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-06-17 21:23:51 UTC (rev 15257) @@ -61,6 +61,7 @@ #include <string.h> struct GPUMaterial { + Material *ma; int profile; /* for creating the material */ @@ -75,10 +76,11 @@ /* Functions */ -GPUMaterial *GPU_material_construct_begin(int profile) +static GPUMaterial *GPU_material_construct_begin(Material *ma, int profile) { GPUMaterial *material = MEM_callocN(sizeof(GPUMaterial), "GPUMaterial"); + material->ma= ma; material->profile = profile; return material; @@ -127,7 +129,7 @@ attribs->totlayer = b; } -int GPU_material_construct_end(GPUMaterial *material) +static int GPU_material_construct_end(GPUMaterial *material) { if (material->outlink) { GPUNodeLink *outlink; @@ -212,18 +214,6 @@ /* Code generation */ -typedef struct GPUShadeInput { - GPUMaterial *gpumat; - Material *mat; - - GPUNodeLink *rgb, *specrgb, *vn, *view; - GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb; -} GPUShadeInput; - -typedef struct GPUShadeResult { - GPUNodeLink *diff, *spec, *combined, *alpha; -} GPUShadeResult; - static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, Object *lampob, Lamp *la, GPUNodeLink **lv, GPUNodeLink **dist) { GPUNodeLink *visifac, *inpr; @@ -686,22 +676,10 @@ Tex *tex; GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL; GPUNodeLink *colfac, *newnor, *varfac, *orn; - float one = 1.0f, hard = ma->har; + float one = 1.0f; int tex_nr, rgbnor, talpha; - /* set default values */ - GPU_link(mat, "set_rgb", GPU_uniform(&ma->r), &shi->rgb); - GPU_link(mat, "set_rgb", GPU_uniform(&ma->specr), &shi->specrgb); GPU_link(mat, "texco_norm", &orn); - GPU_link(mat, "shade_norm", &shi->vn); - GPU_link(mat, "set_value", GPU_uniform(&ma->alpha), &shi->alpha); - GPU_link(mat, "set_value", GPU_uniform(&ma->ref), &shi->refl); - GPU_link(mat, "set_value", GPU_uniform(&ma->spec), &shi->spec); - GPU_link(mat, "set_value", GPU_uniform(&ma->emit), &shi->emit); - GPU_link(mat, "set_value", GPU_uniform(&hard), &shi->har); - GPU_link(mat, "set_value", GPU_uniform(&ma->amb), &shi->amb); - GPU_link(mat, "shade_view", &shi->view); - GPU_link(mat, "set_value", GPU_uniform(&one), &stencil); /* go over texture slots */ @@ -845,43 +823,69 @@ } } -GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma) +void GPU_shadeinput_set(GPUMaterial *mat, Material *ma, GPUShadeInput *shi) { - GPUShadeInput shi; - GPUShadeResult shr; + float hard = ma->har; - memset(&shi, 0, sizeof(shi)); - memset(&shr, 0, sizeof(shr)); + memset(shi, 0, sizeof(*shi)); - shi.gpumat = mat; - shi.mat = ma; + shi->gpumat = mat; + shi->mat = ma; - do_material_tex(&shi); + GPU_link(mat, "set_rgb", GPU_uniform(&ma->r), &shi->rgb); + GPU_link(mat, "set_rgb", GPU_uniform(&ma->specr), &shi->specrgb); + GPU_link(mat, "shade_norm", &shi->vn); + GPU_link(mat, "set_value", GPU_uniform(&ma->alpha), &shi->alpha); + GPU_link(mat, "set_value", GPU_uniform(&ma->ref), &shi->refl); + GPU_link(mat, "set_value", GPU_uniform(&ma->spec), &shi->spec); + GPU_link(mat, "set_value", GPU_uniform(&ma->emit), &shi->emit); + GPU_link(mat, "set_value", GPU_uniform(&hard), &shi->har); + GPU_link(mat, "set_value", GPU_uniform(&ma->amb), &shi->amb); + GPU_link(mat, "shade_view", &shi->view); +} +void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) +{ + Material *ma= shi->mat; + GPUMaterial *mat= shi->gpumat; + + memset(shr, 0, sizeof(*shr)); + + do_material_tex(shi); + if(ma->alpha < 1.0f) GPU_material_enable_alpha(mat); if(ma->mode & MA_SHLESS) { - shr.combined = shi.rgb; - shr.alpha = shi.alpha; + shr->combined = shi->rgb; + shr->alpha = shi->alpha; } else { - GPU_link(mat, "shade_mul_value", shi.emit, shi.rgb, &shr.diff); - GPU_link(mat, "set_rgb_zero", &shr.spec); + GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff); @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs