[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15479] branches/apricot/source/blender/ gpu/intern: Apricot Branch: GLSL
Brecht Van Lommel
brechtvanlommel at pandora.be
Mon Jul 7 23:25:10 CEST 2008
Revision: 15479
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15479
Author: blendix
Date: 2008-07-07 23:25:10 +0200 (Mon, 07 Jul 2008)
Log Message:
-----------
Apricot Branch: GLSL
====================
* Second attemp at solving exp/log incompatibility, some compilers
don't seem to properly support preprocessor defines?
* Some simple optimizations to skip diffuse/specular/emit if they
are set to zero.
Modified Paths:
--------------
branches/apricot/source/blender/gpu/intern/gpu_codegen.c
branches/apricot/source/blender/gpu/intern/gpu_codegen.h
branches/apricot/source/blender/gpu/intern/gpu_material.c
branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-07-07 21:25:10 UTC (rev 15479)
@@ -894,6 +894,20 @@
static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
{
GPUInput *input;
+ GPUNode *outnode;
+ char *name;
+
+ if(link->output) {
+ outnode = link->output->node;
+ name = outnode->name;
+
+ if(strcmp(name, "set_value")==0 || strcmp(name, "set_rgb")==0) {
+ input = MEM_dupallocN(outnode->inputs.first);
+ input->type = type;
+ BLI_addtail(&node->inputs, input);
+ return;
+ }
+ }
input = MEM_callocN(sizeof(GPUInput), "GPUInput");
input->node = node;
@@ -1280,6 +1294,27 @@
return 1;
}
+int GPU_link_changed(GPUNodeLink *link)
+{
+ GPUNode *node;
+ GPUInput *input;
+ char *name;
+
+ if(link->output) {
+ node = link->output->node;
+ name = node->name;
+
+ if(strcmp(name, "set_value")==0 || strcmp(name, "set_rgb")==0) {
+ input = node->inputs.first;
+ return (input->link != NULL);
+ }
+
+ return 1;
+ }
+ else
+ return 0;
+}
+
/* Pass create/free */
void gpu_nodes_tag(GPUNodeLink *link)
Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.h 2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.h 2008-07-07 21:25:10 UTC (rev 15479)
@@ -80,6 +80,7 @@
char *GPU_builtin_name(GPUBuiltin builtin);
void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node);
+int GPU_link_changed(struct GPUNodeLink *link);
#endif
Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-07-07 21:25:10 UTC (rev 15479)
@@ -579,13 +579,16 @@
else
GPU_link(mat, "set_value", GPU_uniform(&one), &shadfac);
- if(!(lamp->mode & LA_NO_DIFF)) {
- GPUNodeLink *rgb;
- GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
- add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
+ if(GPU_link_changed(shi->refl) || ma->ref != 0.0f) {
+ if(!(lamp->mode & LA_NO_DIFF)) {
+ GPUNodeLink *rgb;
+ GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
+ add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
+ }
}
- if(!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW)) {
+ if(!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW) &&
+ (GPU_link_changed(shi->spec) || ma->spec != 0.0f)) {
if(lamp->type == LA_HEMI) {
GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, visifac, &t);
GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
@@ -955,12 +958,16 @@
shr->alpha = shi->alpha;
}
else {
- if((ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL) {
- GPU_link(mat, "shade_add", shi->emit, shi->vcol, &emit);
- GPU_link(mat, "shade_mul", emit, shi->rgb, &shr->diff);
+ if(GPU_link_changed(shi->emit) || ma->emit != 0.0f) {
+ if((ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL) {
+ GPU_link(mat, "shade_add", shi->emit, shi->vcol, &emit);
+ GPU_link(mat, "shade_mul", emit, shi->rgb, &shr->diff);
+ }
+ else
+ GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);
}
else
- GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);
+ GPU_link(mat, "set_rgb_zero", &shr->diff);
GPU_link(mat, "set_rgb_zero", &shr->spec);
@@ -972,10 +979,12 @@
if(ma->mode & MA_RAMP_COL) ramp_diffuse_result(shi, &shr->combined);
if(ma->mode & MA_RAMP_SPEC) ramp_spec_result(shi, &shr->spec);
- GPU_link(mat, "shade_add", shr->combined, shr->spec, &shr->combined);
+ if(GPU_link_changed(shi->spec) || ma->spec != 0.0f)
+ GPU_link(mat, "shade_add", shr->combined, shr->spec, &shr->combined);
}
- GPU_link(mat, "mtex_alpha_to_col", shr->combined, shr->alpha, &shr->combined);
+ if(mat->alpha)
+ GPU_link(mat, "mtex_alpha_to_col", shr->combined, shr->alpha, &shr->combined);
}
GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl 2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl 2008-07-07 21:25:10 UTC (rev 15479)
@@ -1,18 +1,9 @@
-#if __VERSION__ < 110
-
-float exp(float f)
+float exp_blender(float f)
{
return pow(2.71828182846, f);
}
-float log(float f)
-{
- return log2(f)/log2(2.71828182846);
-}
-
-#endif
-
void rgb_to_hsv(vec4 rgb, out vec4 outcol)
{
float cmax, cmin, h, s, v, cdelta;
@@ -197,7 +188,7 @@
void math_log(float val1, float val2, out float outval)
{
if(val1 > 0.0 && val2 > 0.0)
- outval= log(val1) / log(val2);
+ outval= log2(val1) / log2(val2);
else
outval= 0.0;
}
@@ -1429,7 +1420,7 @@
float f = (((p-vh)*(p-vh))/((p+vh)*(p+vh)))*(1.0+((((vh*(p+vh))-1.0)*((vh*(p+vh))-1.0))/(((vh*(p-vh))+1.0)*((vh*(p-vh))+1.0))));
float ang = acos(nh);
- specfac = max(f*g*exp((-(ang*ang)/(2.0*spec_power*spec_power))), 0.0);
+ specfac = max(f*g*exp_blender((-(ang*ang)/(2.0*spec_power*spec_power))), 0.0);
}
}
}
@@ -1444,7 +1435,7 @@
float angle = tan(acos(nh));
float alpha = max(rms, 0.001);
- specfac= nl * (1.0/(4.0*M_PI*alpha*alpha))*(exp(-(angle*angle)/(alpha*alpha))/(sqrt(nv*nl)));
+ specfac= nl * (1.0/(4.0*M_PI*alpha*alpha))*(exp_blender(-(angle*angle)/(alpha*alpha))/(sqrt(nv*nl)));
}
void shade_toon_spec(vec3 n, vec3 l, vec3 v, float size, float tsmooth, out float specfac)
Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c 2008-07-07 21:18:30 UTC (rev 15478)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c 2008-07-07 21:25:10 UTC (rev 15479)
@@ -1,12 +1,10 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 33564;
+int datatoc_gpu_shader_material_glsl_size= 32712;
char datatoc_gpu_shader_material_glsl[]= {
- 10, 35,105,102, 32, 95, 95, 86, 69, 82, 83, 73, 79, 78, 95, 95, 32, 60, 32, 49, 49, 48, 10, 10,102,108,111, 97,
-116, 32,101,120,112, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,111,103, 40,102,108,111,
- 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,108,111,103, 50, 40,102, 41, 47,108,111,103, 50, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 41, 59, 10,125, 10, 10, 35,101,110,100,105,102, 10, 10,118,111,105,100, 32,114,103, 98,
+ 10,102,108,111, 97,116, 32,101,
+120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,
+119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,
95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44,
32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,
@@ -116,910 +114,886 @@
59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,
108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,
-111,117,116,118, 97,108, 61, 32,108,111,103, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 40,118, 97,108, 50, 41, 59, 10, 9,
-101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
- 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118,
- 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111,
- 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108,
- 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,
-108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,
-115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118,
- 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
-118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,
-116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list