[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18666] branches/soc-2008-unclezeiv/source /blender/render/intern/source/lightcuts.c: Meshlights: added support for textured materials.
Davide Vercelli
davide.vercelli at gmail.com
Sun Jan 25 15:40:29 CET 2009
Revision: 18666
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18666
Author: unclezeiv
Date: 2009-01-25 15:40:27 +0100 (Sun, 25 Jan 2009)
Log Message:
-----------
Meshlights: added support for textured materials.
Modified Paths:
--------------
branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 2009-01-25 11:45:40 UTC (rev 18665)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c 2009-01-25 14:40:27 UTC (rev 18666)
@@ -1522,14 +1522,16 @@
/* hack: increase current color/energy in order to avoid too dark results */
/* XXX: how does this interact with color ramps? */
- energy= lar->energy;
- savecol[0]= lar->r;
- savecol[1]= lar->g;
- savecol[2]= lar->b;
- lar->r /= lar->energy;
- lar->g /= lar->energy;
- lar->b /= lar->energy;
- lar->energy= 1.0f;
+ if (lar) {
+ energy= lar->energy;
+ savecol[0]= lar->r;
+ savecol[1]= lar->g;
+ savecol[2]= lar->b;
+ lar->r /= lar->energy;
+ lar->g /= lar->energy;
+ lar->b /= lar->energy;
+ lar->energy= 1.0f;
+ }
/* don't do normal flipping in this phase, as the query is not camera aligned */
old_vlr_flag= vla->flag;
@@ -1556,7 +1558,7 @@
shi->light_override= &light_override; // rl->light_override;
/* simplified code from shade_samples_fill_with_ps */
- shi->obi= &R.objectinstance[obi];
+ shi->obi= RAY_OBJECT_GET(&R, obi);
shi->obr= shi->obi->obr;
shi->facenr= vla->index; // (facenr-1) & RE_QUAD_MASK;
if (isect==2)
@@ -1601,7 +1603,8 @@
}
#else
VECCOPY(shi->co, co);
- VECSUB(shi->view, co, lar->co);
+ if (lar)
+ VECSUB(shi->view, co, lar->co);
Normalize(shi->view);
#endif
@@ -1631,10 +1634,12 @@
VECCOPY(col, shr.col);
/* restore lar colors */
- lar->energy= energy;
- lar->r= savecol[0];
- lar->g= savecol[1];
- lar->b= savecol[2];
+ if (lar) {
+ lar->energy= energy;
+ lar->r= savecol[0];
+ lar->g= savecol[1];
+ lar->b= savecol[2];
+ }
/* restore VlakRen flags */
vla->flag= old_vlr_flag;
@@ -1646,10 +1651,13 @@
return 0.0f;
}
- /* code to avoid zero division and riduce numerical problems */
- max_idx= max_col==shr.col[0] ? 0 : max_col==shr.col[1] ? 1 : 2;
-
- return shr.diff[max_idx] / shr.col[max_idx];
+ if (lar) {
+ /* code to avoid zero division and riduce numerical problems */
+ max_idx= max_col==shr.col[0] ? 0 : max_col==shr.col[1] ? 1 : 2;
+
+ return shr.diff[max_idx] / shr.col[max_idx];
+ }
+ return 1.0f;
}
static void add_virtual_point_light(Render * re, LightcutsData *lcd, LampRen *orig, float *col, short lev, float weight)
@@ -1909,17 +1917,27 @@
VECADDFAC(res, res, dir2, r2);
}
-void add_meshlight(Render *re, LightcutsData *lcd, ObjectRen *obr, VlakRen *vla, float *co, float weight)
+void add_meshlight(Render *re, LightcutsData *lcd, ObjectInstanceRen *obi, VlakRen *vla, float *co, float weight, short type)
{
LampRen *lar;
int i;
- float col[3];
+ float col[3], fac;
+ fac = get_bounce_color(lcd, RAY_OBJECT_SET(re, obi), vla, co, NULL, col, type);
+
+ if (fac == -1.0f)
+ return;
+
+ if (fac <= 0.0f) {
+ lcd->stat_discard_black++;
+ return;
+ }
+
lar= MEM_callocN(sizeof(LampRen), "lampren");
lamp_init(re, lar);
lar->dist= lcd->indir_dist;
lar->distkw= lar->dist * lar->dist;
- lar->lay= obr->lay;
+ lar->lay= obi->obr->lay;
/* TODO: how to decide specular */
// lar->mode |= LA_NO_SPEC;
@@ -1936,10 +1954,6 @@
lar->ray_samp_method= LA_SAMP_CONSTANT;
lar->energy= vla->mat->emit * weight;
-
- col[0]= vla->mat->r;
- col[1]= vla->mat->g;
- col[2]= vla->mat->b;
lar->r= lar->energy * col[0];
lar->g= lar->energy * col[1];
@@ -1962,13 +1976,15 @@
void add_lights_from_mesh(LightcutsData *lcd, Render *re)
{
+ ObjectInstanceRen *obi;
ObjectRen *obr;
float *v1, *v2, *v3, *v4, area, co[3], budget;
float density= lcd->meshlights_density;
float weight= 1.0f / density;
int a, n, i;
- for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(obi=re->instancetable.first; obi; obi=obi->next) {
+ obr= obi->obr;
for(a=0; a<obr->totvlak; a++) {
VlakRen *vlr= RE_findOrAddVlak(obr, a);
@@ -1989,7 +2005,7 @@
for (i= 0; i < n; i++) {
get_random_point_on_triangle(v1, v2, v3, co);
- add_meshlight(re, lcd, obr, vlr, co, weight);
+ add_meshlight(re, lcd, obi, vlr, co, weight, 1);
}
if (vlr->v4) {
@@ -2002,7 +2018,7 @@
for (i= 0; i < n; i++) {
get_random_point_on_triangle(v1, v3, v4, co);
- add_meshlight(re, lcd, obr, vlr, co, weight);
+ add_meshlight(re, lcd, obi, vlr, co, weight, 2);
}
}
}
@@ -2056,15 +2072,6 @@
break;
}
- /* XXX: terrible hack currently needed by get_bounce_color */
- if (lcd->do_indir > 0) {
- R= *re;
- R.r.mode&= ~R_LIGHTCUTS;
- }
- /* other hack to make shadeSkyView work... */
- else if (lcd->options & LC_OPT_ENV_LIGHT && re->r.lightcuts_env_map > 0)
- R= *re;
-
if (lcd->do_indir > 0 && lcd->options & LC_OPT_INDIR_MESH) {
int n_orig= 0;
int n_area= 0;
@@ -2127,6 +2134,15 @@
lcd->meshlights_density= re->r.lightcuts_meshlights / lcd->meshlights_density;
/* lcd->dbg_vis_vpl= MEM_callocN(sizeof(float) * 3 * re->r.lightcuts_meshlights, "lc_vpl_visualization"); */
}
+
+ /* XXX: terrible hack currently needed by get_bounce_color */
+ if (lcd->do_indir > 0 || lcd->meshlights_density > 0.0f) {
+ R= *re;
+ R.r.mode&= ~R_LIGHTCUTS;
+ }
+ /* other hack to make shadeSkyView work... */
+ else if ((lcd->options & LC_OPT_ENV_LIGHT && re->r.lightcuts_env_map > 0))
+ R= *re;
/* light conversion */
More information about the Bf-blender-cvs
mailing list