[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15250] branches/apricot/source/blender: Apricot Branch: GLSL
Brecht Van Lommel
brechtvanlommel at pandora.be
Tue Jun 17 16:21:41 CEST 2008
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. @@
More information about the Bf-blender-cvs
mailing list