diff options
author | Ton Roosendaal <ton@blender.org> | 2005-12-05 20:06:58 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-12-05 20:06:58 +0300 |
commit | 863234481e751ae94dd77b18d65ea76df65ec4b1 (patch) | |
tree | c4d47fca8e763b5f13bdf0ad47885be37ada4778 /source/blender/render | |
parent | dd1f6c649a42258c71a2234eeede0b16b3ef245f (diff) |
"Make Local" menu (Lkey) now has as first option to make only Objects
local, keeping all Data stuff (Mesh, Materials) from Library.
The animation stuff on Object becomes local though;
- Ipo
- Action
- NLA
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/ray.c | 41 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 17 |
2 files changed, 58 insertions, 0 deletions
diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c index 761f4e7fe0b..30973b0891b 100644 --- a/source/blender/render/intern/source/ray.c +++ b/source/blender/render/intern/source/ray.c @@ -2272,3 +2272,44 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac) } +/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */ +void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co) +{ + Isect isec; + float lampco[3]; + + /* setup isec */ + isec.mode= DDA_SHADOW_TRA; + + if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1; + + if(lar->type==LA_SUN || lar->type==LA_HEMI) { + lampco[0]= shi->co[0] - g_oc.ocsize*lar->vec[0]; + lampco[1]= shi->co[1] - g_oc.ocsize*lar->vec[1]; + lampco[2]= shi->co[2] - g_oc.ocsize*lar->vec[2]; + } + else { + VECCOPY(lampco, lar->co); + } + + isec.vlrorig= shi->vlr; + + /* set up isec vec */ + VECCOPY(isec.start, shi->co); + VECCOPY(isec.end, lampco); + + if( d3dda(&isec)) { + /* we got a face */ + + /* render co */ + co[0]= isec.start[0]+isec.labda*(isec.vec[0]); + co[1]= isec.start[1]+isec.labda*(isec.vec[1]); + co[2]= isec.start[2]+isec.labda*(isec.vec[2]); + + *distfac= VecLength(isec.vec); + } + else + *distfac= 0.0f; +} + + diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 8b6c4118786..4d29ffe3b43 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -1704,6 +1704,22 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) } } } + + if(R.r.mode & R_RAYTRACE) { + extern void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co); + float co[3], distfac; + + ray_translucent(shi, lar, &distfac, co); + + if(distfac<0.01f*G.rt) { + // printf("distfac %f\n", distfac); + distfac= 1.0f - distfac/(0.01f*G.rt); + shr->diff[0]+= distfac; + shr->diff[1]+= distfac; + shr->diff[2]+= distfac; + } + } + /* specularity */ if(shadfac[3]>0.0 && shi->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) { @@ -2385,6 +2401,7 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col, floa VecMulf(shi.vn, -1.0); VecMulf(shi.facenor, -1.0); shade_lamp_loop(&shi, &shr_t); + shr.diff[0]+= shi.translucency*shr_t.diff[0]; shr.diff[1]+= shi.translucency*shr_t.diff[1]; shr.diff[2]+= shi.translucency*shr_t.diff[2]; |