Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpu/intern/gpu_material.c')
-rw-r--r--source/blender/gpu/intern/gpu_material.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 675c73da960..4155b7a8ac0 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_material.c
+ * \ingroup gpu
+ */
+
+
#include <math.h>
#include <string.h>
@@ -104,8 +109,8 @@ struct GPULamp {
int type, mode, lay, hide;
- float dynpower, dyncol[3];
- float power, col[3];
+ float dynenergy, dyncol[3];
+ float energy, col[3];
float co[3], vec[3];
float dynco[3], dynvec[3];
@@ -114,7 +119,7 @@ struct GPULamp {
float dynimat[4][4];
float spotsi, spotbl, k;
- float dist;
+ float dist, att1, att2;
float bias, d, clipend;
int size;
@@ -256,11 +261,11 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
lamp= nlink->data;
if(!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
- lamp->dynpower = lamp->power;
+ lamp->dynenergy = lamp->energy;
VECCOPY(lamp->dyncol, lamp->col);
}
else {
- lamp->dynpower = 0.0f;
+ lamp->dynenergy = 0.0f;
lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f;
}
}
@@ -395,6 +400,9 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
case LA_FALLOFF_INVSQUARE:
GPU_link(mat, "lamp_falloff_invsquare", GPU_uniform(&lamp->dist), *dist, &visifac);
break;
+ case LA_FALLOFF_SLIDERS:
+ GPU_link(mat, "lamp_falloff_sliders", GPU_uniform(&lamp->dist), GPU_uniform(&lamp->att1), GPU_uniform(&lamp->att2), *dist, &visifac);
+ break;
case LA_FALLOFF_CURVE:
{
float *array;
@@ -521,6 +529,9 @@ static void add_to_diffuse(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, G
else {
/* input */
switch(ma->rampin_col) {
+ case MA_RAMP_IN_ENERGY:
+ GPU_link(mat, "ramp_rgbtobw", rgb, &fac);
+ break;
case MA_RAMP_IN_SHADER:
fac= is;
break;
@@ -571,6 +582,9 @@ static void do_specular_ramp(GPUShadeInput *shi, GPUNodeLink *is, GPUNodeLink *t
/* input */
switch(ma->rampin_spec) {
+ case MA_RAMP_IN_ENERGY:
+ fac = t;
+ break;
case MA_RAMP_IN_SHADER:
fac = is;
break;
@@ -670,7 +684,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(lamp->mode & LA_ONLYSHADOW) {
GPU_link(mat, "shade_only_shadow", i, shadfac,
- GPU_dynamic_uniform(&lamp->dynpower), &shadfac);
+ GPU_dynamic_uniform(&lamp->dynenergy), &shadfac);
if(!(lamp->mode & LA_NO_DIFF))
GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb,
@@ -909,7 +923,7 @@ static void do_material_tex(GPUShadeInput *shi)
mtex= ma->mtex[tex_nr];
tex= mtex->tex;
- if(tex==0) continue;
+ if(tex == NULL) continue;
/* which coords */
if(mtex->texco==TEXCO_ORCO)
@@ -1046,7 +1060,7 @@ static void do_material_tex(GPUShadeInput *shi)
else
newnor = tnor;
- norfac = MIN2(fabsf(mtex->norfac), 1.0);
+ norfac = MIN2(fabsf(mtex->norfac), 1.0f);
if(norfac == 1.0f && !GPU_link_changed(stencil)) {
shi->vn = newnor;
@@ -1250,10 +1264,10 @@ void GPU_shadeinput_set(GPUMaterial *mat, Material *ma, GPUShadeInput *shi)
void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
{
GPUMaterial *mat= shi->gpumat;
- GPUNodeLink *emit, *mistfac;
+ GPUNodeLink *emit, *ulinfac, *ulogfac, *mistfac;
Material *ma= shi->mat;
World *world= mat->scene->world;
- float misttype;
+ float linfac, logfac, misttype;
memset(shr, 0, sizeof(*shr));
@@ -1291,6 +1305,20 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
shr->alpha = shi->alpha;
if(world) {
+ /* exposure correction */
+ if(world->exp!=0.0f || world->range!=1.0f) {
+ linfac= 1.0 + pow((2.0*world->exp + 0.5), -10);
+ logfac= log((linfac-1.0f)/linfac)/world->range;
+
+ GPU_link(mat, "set_value", GPU_uniform(&linfac), &ulinfac);
+ GPU_link(mat, "set_value", GPU_uniform(&logfac), &ulogfac);
+
+ GPU_link(mat, "shade_exposure_correct", shr->combined,
+ ulinfac, ulogfac, &shr->combined);
+ GPU_link(mat, "shade_exposure_correct", shr->spec,
+ ulinfac, ulogfac, &shr->spec);
+ }
+
/* ambient color */
if(world->ambr!=0.0f || world->ambg!=0.0f || world->ambb!=0.0f) {
if(GPU_link_changed(shi->amb) || ma->amb != 0.0f)
@@ -1419,14 +1447,14 @@ void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4])
invert_m4_m4(lamp->imat, mat);
}
-void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float power)
+void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy)
{
- lamp->power = power;
- if(lamp->mode & LA_NEG) lamp->power= -lamp->power;
+ lamp->energy = energy;
+ if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy;
- lamp->col[0]= r* lamp->power;
- lamp->col[1]= g* lamp->power;
- lamp->col[2]= b* lamp->power;
+ lamp->col[0]= r* lamp->energy;
+ lamp->col[1]= g* lamp->energy;
+ lamp->col[2]= b* lamp->energy;
}
static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *la, GPULamp *lamp)
@@ -1442,25 +1470,27 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
lamp->mode = la->mode;
lamp->type = la->type;
- lamp->power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->energy*M_PI; //XXX la->power;
- if(lamp->mode & LA_NEG) lamp->power= -lamp->power;
+ lamp->energy = la->energy;
+ if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy;
- lamp->col[0]= la->r*lamp->power;
- lamp->col[1]= la->g*lamp->power;
- lamp->col[2]= la->b*lamp->power;
+ lamp->col[0]= la->r*lamp->energy;
+ lamp->col[1]= la->g*lamp->energy;
+ lamp->col[2]= la->b*lamp->energy;
GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), ob->obmat);
lamp->spotsi= la->spotsize;
if(lamp->mode & LA_HALO)
- if(lamp->spotsi > 170.0)
- lamp->spotsi = 170.0;
+ if(lamp->spotsi > 170.0f)
+ lamp->spotsi = 170.0f;
lamp->spotsi= cos(M_PI*lamp->spotsi/360.0);
- lamp->spotbl= (1.0 - lamp->spotsi)*la->spotblend;
+ lamp->spotbl= (1.0f - lamp->spotsi)*la->spotblend;
lamp->k= la->k;
lamp->dist= la->dist;
lamp->falloff_type= la->falloff_type;
+ lamp->att1= la->att1;
+ lamp->att2= la->att2;
lamp->curfalloff= la->curfalloff;
/* initshadowbuf */
@@ -1523,13 +1553,13 @@ GPULamp *GPU_lamp_from_blender(Scene *scene, Object *ob, Object *par)
return lamp;
}
- lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size);
+ lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size, NULL);
if(!lamp->tex) {
gpu_lamp_shadow_free(lamp);
return lamp;
}
- if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex)) {
+ if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex, NULL)) {
gpu_lamp_shadow_free(lamp);
return lamp;
}