Revision: 15250
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15250
Author:   blendix
Date:     2008-06-17 16:21:33 +0200 (Tue, 17 Jun 2008)

Log Message:
-----------
Apricot Branch: GLSL
====================

* Added support for the ColorRamp node.
* Added less than / greather than in the Math node.
* Added support for all blend modes of the Mix node and
  all blend modes in the texture stack.
* Added more Map To support, now available:
  Col, Nor, Csp, Ref, Spec, Amb, Hard, Alpha, Emit.

* Possible fix for a GLEW / opengl include conflict on
  Mac OS X in playanim.c

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_texture.h
    branches/apricot/source/blender/blenkernel/intern/texture.c
    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/gpu/intern/material_shaders.glsl.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_math.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
    branches/apricot/source/blender/src/playanim.c

Modified: branches/apricot/source/blender/blenkernel/BKE_texture.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_texture.h    2008-06-17 
10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/blenkernel/BKE_texture.h    2008-06-17 
14:21:33 UTC (rev 15250)
@@ -53,6 +53,7 @@
 void init_colorband(struct ColorBand *coba, int rangetype);
 struct ColorBand *add_colorband(int rangetype);
 int do_colorband(struct ColorBand *coba, float in, float out[4]);
+void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
 
 void default_tex(struct Tex *tex);
 struct Tex *add_texture(char *name);

Modified: branches/apricot/source/blender/blenkernel/intern/texture.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/texture.c 2008-06-17 
10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/blenkernel/intern/texture.c 2008-06-17 
14:21:33 UTC (rev 15250)
@@ -53,6 +53,7 @@
 #include "DNA_world_types.h"
 #include "DNA_brush_types.h"
 #include "DNA_node_types.h"
+#include "DNA_color_types.h"
 
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
@@ -389,6 +390,17 @@
        return 1;       /* OK */
 }
 
+void colorband_table_RGBA(ColorBand *coba, float **array, int *size)
+{
+       int a;
+       
+       *size = CM_TABLE+1;
+       *array = MEM_callocN(sizeof(float)*(*size)*4, "ColorBand");
+
+       for(a=0; a<*size; a++)
+               do_colorband(coba, (float)a/(float)CM_TABLE, &(*array)[a*4]);
+}
+
 /* ******************* TEX ************************ */
 
 void free_texture(Tex *tex)

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-06-17 
10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-06-17 
14:21:33 UTC (rev 15250)
@@ -146,6 +146,7 @@
        struct GPUPass *next, *prev;
 
        ListBase nodes;
+       int firstbind;
        struct GPUOutput *output;
        struct GPUShader *shader;
 };
@@ -677,21 +678,28 @@
 
                        if (input->tex) {
                                if (input->bindtex) {
+                                       if(pass->firstbind);
                                        GPU_texture_bind(input->tex, 
input->texid);
                                        GPU_shader_uniform_texture(shader, 
name, input->tex);
                                }
                        }
-                       else if (input->arraysize)
-                               GPU_shader_uniform_vector(shader, name, 
input->type,
-                                       input->arraysize,
-                                       (input->dynamicvec)? input->dynamicvec: 
input->vec);
-                       else
-                               GPU_shader_uniform_vector(shader, name, 
input->type, 1,
-                                       (input->dynamicvec)? input->dynamicvec: 
input->vec);
+                       else if (input->arraysize) {
+                               if(pass->firstbind || input->dynamicvec)
+                                       GPU_shader_uniform_vector(shader, name, 
input->type,
+                                               input->arraysize,
+                                               (input->dynamicvec)? 
input->dynamicvec: input->vec);
+                       }
+                       else {
+                               if(pass->firstbind || input->dynamicvec)
+                                       GPU_shader_uniform_vector(shader, name, 
input->type, 1,
+                                               (input->dynamicvec)? 
input->dynamicvec: input->vec);
+                       }
 
                        MEM_freeN(name);
                }
        }
+
+       pass->firstbind = 0;
 }
 
 void GPU_pass_unbind(GPUPass *pass)
@@ -744,6 +752,7 @@
        pass->nodes = *nodes;
        pass->output = outlink->source;
        pass->shader = shader;
+       pass->firstbind = 1;
 
        /* take ownership over nodes */
        memset(nodes, 0, sizeof(*nodes));

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-06-17 
10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-06-17 
14:21:33 UTC (rev 15250)
@@ -211,6 +211,11 @@
 
 /* Code generation */
 
+typedef struct GPUShadeInput {
+       GPUNodeLink *rgb, *specrgb, *vn;
+       GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb;
+} GPUShadeInput;
+
 static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, Object *lampob, Lamp 
*la, GPUNodeLink **lv, GPUNodeLink **dist)
 {
        GPUNodeLink *visifac, *inpr;
@@ -318,11 +323,11 @@
 }
 #endif
 
-static void shade_one_light(GPUMaterial *mat, Object *lampob, Lamp *la, 
Material *ma, GPUNodeLink *col, GPUNodeLink  *specrgb, GPUNodeLink *nor, 
GPUNodeLink **out)
+static void shade_one_light(GPUMaterial *mat, Object *lampob, Lamp *la, 
Material *ma, GPUShadeInput *shi, GPUNodeLink **out)
 {
        GPUNodeLink *lv, *dist, *visifac, *is, *inp, *i, *vn, *view;
        GPUNodeLink *outcol, *specfac, *result, *t;
-       float hard, energy, lampcol[3], zero[3] = {0.0f, 0.0f, 0.0f};
+       float energy, lampcol[3], zero[3] = {0.0f, 0.0f, 0.0f};
        float *lampvec, *lampco;
 
        if((la->mode & LA_ONLYSHADOW) && !(ma->mode & MA_SHADOW))
@@ -331,7 +336,7 @@
        lampvec= lampob->obmat[2];
        lampco= lampob->obmat[3];
 
-       vn= nor;
+       vn= shi->vn;
        GPU_link(mat, "shade_view", &view);
        GPU_link(mat, "setrgb", GPU_uniform(zero), &result);
 
@@ -381,32 +386,30 @@
                GPU_link(mat, "shade_cubic", is, &is);
        
        i = is;
-       GPU_link(mat, "shade_visifac", i, visifac, GPU_uniform(&ma->ref), &i);
+       GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i);
 
-       vn = nor;
+       vn = shi->vn;
        /*if(ma->mode & MA_TANGENT_VN)
                GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, 
""), &vn);*/
        
        if(!(la->mode & LA_NO_DIFF)) {
-               GPU_link(mat, "shade_add_to_diffuse", i, GPU_uniform(lampcol), 
col, &outcol);
+               GPU_link(mat, "shade_add_to_diffuse", i, GPU_uniform(lampcol), 
shi->rgb, &outcol);
                GPU_link(mat, "shade_add", result, outcol, &result);
        }
 
        if(!(la->mode & LA_NO_SPEC) && !(la->mode & LA_ONLYSHADOW)) {
-               hard= ma->har;
-
                if(la->type == LA_HEMI) {
-                       GPU_link(mat, "shade_hemi_spec", vn, lv, view, 
GPU_uniform(&ma->spec), GPU_uniform(&hard), &t);
-                       GPU_link(mat, "shade_add_spec", t, 
GPU_uniform(lampcol), specrgb, visifac, &outcol);
+                       GPU_link(mat, "shade_hemi_spec", vn, lv, view, 
GPU_uniform(&ma->spec), shi->har, &t);
+                       GPU_link(mat, "shade_add_spec", t, 
GPU_uniform(lampcol), shi->specrgb, visifac, &outcol);
                        GPU_link(mat, "shade_add", result, outcol, &result);
                }
                else {
                        if(ma->spec_shader==MA_SPEC_PHONG)
-                               GPU_link(mat, "shade_phong_spec", vn, lv, view, 
GPU_uniform(&hard), &specfac);
+                               GPU_link(mat, "shade_phong_spec", vn, lv, view, 
shi->har, &specfac);
                        else if(ma->spec_shader==MA_SPEC_COOKTORR)
-                               GPU_link(mat, "shade_cooktorr_spec", vn, lv, 
view, GPU_uniform(&hard), &specfac);
+                               GPU_link(mat, "shade_cooktorr_spec", vn, lv, 
view, shi->har, &specfac);
                        else if(ma->spec_shader==MA_SPEC_BLINN)
-                               GPU_link(mat, "shade_blinn_spec", vn, lv, view, 
GPU_uniform(&ma->refrac), GPU_uniform(&hard), &specfac);
+                               GPU_link(mat, "shade_blinn_spec", vn, lv, view, 
GPU_uniform(&ma->refrac), shi->har, &specfac);
                        else if(ma->spec_shader==MA_SPEC_WARDISO)
                                GPU_link(mat, "shade_wardiso_spec", vn, lv, 
view, GPU_uniform(&ma->rms), &specfac);
                        else
@@ -415,7 +418,7 @@
                        if(la->type==LA_AREA)
                                GPU_link(mat, "shade_spec_area_inp", specfac, 
inp, &specfac);
 
-                       GPU_link(mat, "shade_spec_t", GPU_uniform(&ma->spec), 
visifac, specfac, &t);
+                       GPU_link(mat, "shade_spec_t", shi->spec, visifac, 
specfac, &t);
 
                        /*if(ma->mode & MA_RAMP_SPEC) {
                                float spec[3];
@@ -425,7 +428,7 @@
                                shr->spec[2]+= t*(lacol[2] * spec[2]);
                        }
                        else {*/
-                               GPU_link(mat, "shade_add_spec", t, 
GPU_uniform(lampcol), specrgb, visifac, &outcol);
+                               GPU_link(mat, "shade_add_spec", t, 
GPU_uniform(lampcol), shi->specrgb, visifac, &outcol);
                                GPU_link(mat, "shade_add", result, outcol, 
&result);
                        /*}*/
                }
@@ -434,7 +437,7 @@
        GPU_link(mat, "shade_add", *out, result, out);
 }
 
-static void material_lights(GPUMaterial *mat, Material *ma, GPUNodeLink *col, 
GPUNodeLink *spec, GPUNodeLink *nor, GPUNodeLink **out)
+static void material_lights(GPUMaterial *mat, Material *ma, GPUShadeInput 
*shi, GPUNodeLink **out)
 {
        Base *base;
        Object *lampob;
@@ -446,7 +449,7 @@
                                lampob= base->object;
                                la= lampob->data;
 
-                               shade_one_light(mat, lampob, la, ma, col, spec, 
nor, out);
+                               shade_one_light(mat, lampob, la, ma, shi, out);
                        }
                }
        }
@@ -454,22 +457,103 @@
 
 static void texture_rgb_blend(GPUMaterial *mat, GPUNodeLink *tex, GPUNodeLink 
*out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, GPUNodeLink **in)
 {
-       GPU_link(mat, "mtex_rgb_blend", out, tex, fact, facg, in);
+       float inval[3] = {0.0f, 0.0f, 0.0f};
+
+       switch(blendtype) {
+       case MTEX_BLEND:
+               GPU_link(mat, "mtex_rgb_blend", out, tex, fact, facg, in);
+               break;
+       case MTEX_MUL:
+               GPU_link(mat, "mtex_rgb_mul", out, tex, fact, facg, in);
+               break;
+       case MTEX_SCREEN:
+               GPU_link(mat, "mtex_rgb_screen", out, tex, fact, facg, in);
+               break;
+       case MTEX_OVERLAY:
+               GPU_link(mat, "mtex_rgb_overlay", out, tex, fact, facg, in);
+               break;
+       case MTEX_SUB:
+               GPU_link(mat, "mtex_rgb_sub", out, tex, fact, facg, in);
+               break;
+       case MTEX_ADD:
+               GPU_link(mat, "mtex_rgb_add", out, tex, fact, facg, in);
+               break;
+       case MTEX_DIV:
+               GPU_link(mat, "mtex_rgb_div", out, tex, fact, facg, in);
+               break;
+       case MTEX_DIFF:
+               GPU_link(mat, "mtex_rgb_diff", out, tex, fact, facg, in);
+               break;
+       case MTEX_DARK:
+               GPU_link(mat, "mtex_rgb_dark", out, tex, fact, facg, in);
+               break;
+       case MTEX_LIGHT:
+               GPU_link(mat, "mtex_rgb_light", out, tex, fact, facg, in);
+               break;
+       case MTEX_BLEND_HUE:
+               GPU_link(mat, "mtex_rgb_hue", out, tex, fact, facg, in);
+               break;
+       case MTEX_BLEND_SAT:
+               GPU_link(mat, "mtex_rgb_sat", out, tex, fact, facg, in);
+               break;
+       case MTEX_BLEND_VAL:
+               GPU_link(mat, "mtex_rgb_val", out, tex, fact, facg, in);
+               break;
+       case MTEX_BLEND_COLOR:
+               GPU_link(mat, "mtex_rgb_color", out, tex, fact, facg, in);
+               break;
+       default:
+               GPU_link(mat, "setvalue", GPU_uniform(inval), &in);
+               break;
+       }
 }
 
-static void texture_value_blend(GPUMaterial *mat, GPUNodeLink *tex, 
GPUNodeLink *out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, 
GPUNodeLink **in)
+static void texture_value_blend(GPUMaterial *mat, GPUNodeLink *tex, 
GPUNodeLink *out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, int 
flip, GPUNodeLink **in)
 {
-       GPU_link(mat, "mtex_value_blend", out, tex, fact, facg, in);
+       float inf = 0.0f;
+       float flipf = (flip)? 1.0f: 0.0;
+
+       switch(blendtype) {
+       case MTEX_BLEND:
+               GPU_link(mat, "mtex_value_blend", out, tex, fact, facg, 
GPU_uniform(&flipf), in);
+               break;
+       case MTEX_MUL:
+               GPU_link(mat, "mtex_value_mul", out, tex, fact, facg, 
GPU_uniform(&flipf), in);
+               break;
+       case MTEX_SCREEN:
+               GPU_link(mat, "mtex_value_screen", out, tex, fact, facg, 
GPU_uniform(&flipf), in);
+               break;

@@ 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