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

Reply via email to