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