From cb20f1cdb421ab4d5159dfb5b1549950752a7bf8 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 18 Dec 2003 21:34:48 +0000 Subject: [PATCH] another trace commit - implemented tracing of transparency for shadows. This is a material option, in the new RayTrace panel. it only traces color and alpha, not shading. So the results of some transparant colored unlit faces can look odd. I will look onto that. - changed fresnel formula (got hint from eeshlo!). this simplifies the UI, now only one button needed. The fresnel value "should" be identical as the refraction index, but that is booooring! So i added a special fresnel refraction slider for both mirroring and transparency. By setting all 3 sliders equal, you get 'realism'. - fresnel for transparancy works for Ztra rendering too. Same for transpa- rent shadow. But then you need to set 'ray' on in F10 menu. - uploaded new monkey_glass blend in download.blender.org/demo/test/ Next stage: killing the globals from render, and implement "translucency" which is effectively allowing faces being lit from behind, as paper or cloth. --- source/blender/blenkernel/intern/material.c | 4 +- source/blender/blenloader/intern/readfile.c | 9 +- source/blender/makesdna/DNA_material_types.h | 7 +- .../render/intern/include/rendercore.h | 3 +- .../render/intern/source/pixelblending.c | 47 ------- source/blender/render/intern/source/ray.c | 133 ++++++++++++++++-- .../blender/render/intern/source/rendercore.c | 119 +++++++++++----- source/blender/src/buttons_shading.c | 24 ++-- source/blender/src/previewrender.c | 13 +- 9 files changed, 239 insertions(+), 120 deletions(-) diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 16ed3f00355..b3b13583e98 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -108,8 +108,8 @@ void init_material(Material *ma) ma->ang= 1.0; ma->ray_depth= 2; ma->ray_depth_tra= 2; - ma->falloff_mir= 1.0; - ma->falloff_tra= 1.0; + ma->fresnel_mir= 1.0; + ma->fresnel_tra= 1.0; ma->mode= MA_TRACEBLE+MA_SHADOW+MA_RADIO; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index a94c8e79dd6..068fca17726 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3936,8 +3936,13 @@ static void do_versions(Main *main) ma->ang= 1.0; ma->ray_depth= 2; ma->ray_depth_tra= 2; - ma->falloff_mir= 1.0; - ma->falloff_tra= 1.0; + ma->fresnel_tra= 1.0; + ma->fresnel_mir= 1.0; + } + else if(ma->ang<1.0) { // temporal, because of IOR & fresnel change + ma-> ang= 1.0/ma->ang; + ma->fresnel_tra= ma->ang; + ma->fresnel_mir= ma->ang; } ma= ma->id.next; } diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 9162499ed48..cac008afa56 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -56,9 +56,9 @@ typedef struct Material { float amb, emit, ang, spectra, ray_mirror; float alpha, ref, spec, zoffs, add; - float kfac; /* for transparent solids */ - float fresnel_mir, falloff_mir; - float fresnel_tra, falloff_tra; + float translucency; + float fresnel_mir; + float fresnel_tra; short ray_depth, ray_depth_tra; short har; char seed1, seed2; @@ -128,6 +128,7 @@ typedef struct Material { #define MA_RADIO 0x10000 #define MA_RAYTRANSP 0x20000 #define MA_RAYMIRROR 0x40000 +#define MA_SHADOW_TRA 0x80000 /* diff_shader */ #define MA_DIFF_LAMBERT 0 diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h index 3e915b34b7c..6872ef3ed50 100644 --- a/source/blender/render/intern/include/rendercore.h +++ b/source/blender/render/intern/include/rendercore.h @@ -51,8 +51,9 @@ float mistfactor(float *co); /* dist en hoogte, return alpha */ void renderspothalo(unsigned short *col); void render_lighting_halo(struct HaloRen *har, float *colf); unsigned int calchalo_z(struct HaloRen *har, unsigned int zz); +void shade_color(ShadeResult *shr); void shade_lamp_loop(int mask, ShadeResult *shr); -float fresnel_fac(float *view, float *vn, float fresnel, float falloff); +float fresnel_fac(float *view, float *vn, float fresnel); float spec(float inp, int hard); diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c index c1bd67c7479..463abf34fa7 100644 --- a/source/blender/render/intern/source/pixelblending.c +++ b/source/blender/render/intern/source/pixelblending.c @@ -243,45 +243,18 @@ void addAlphaOverFloat(float *dest, float *source) float c; float mul; - /* I may want to disable this clipping */ -#ifdef RE_FLOAT_COLOUR_CLIPPING - if( (source[3] > RE_FULL_COLOUR_FLOAT) ) { - dest[0] = source[0]; - dest[1] = source[1]; - dest[2] = source[2]; - dest[3] = source[3]; - return; - } -#endif - mul= 1.0 - source[3]; c= (mul*dest[0]) + source[0]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[0] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[0]= c; c= (mul*dest[1]) + source[1]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[1] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[1]= c; c= (mul*dest[2]) + source[2]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[2] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[2]= c; c= (mul*dest[3]) + source[3]; -#ifdef RE_ALPHA_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[3] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[3]= c; } /* end of void addAlphaOverFloat(float *doel, float *bron) */ @@ -295,10 +268,6 @@ void addAlphaUnderFloat(float *dest, float *source) float c; float mul; - /* I may want to disable this clipping */ -#ifdef RE_FLOAT_COLOUR_CLIPPING - if( dest[3] >= RE_FULL_COLOUR_FLOAT) return; -#endif if( (-RE_EMPTY_COLOUR_FLOAT < dest[3]) && (dest[3] < RE_EMPTY_COLOUR_FLOAT) ) { dest[0] = source[0]; @@ -311,31 +280,15 @@ void addAlphaUnderFloat(float *dest, float *source) mul= 1.0 - dest[3]; c= (mul*source[0]) + dest[0]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[0] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[0]= c; c= (mul*source[1]) + dest[1]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[1] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[1]= c; c= (mul*source[2]) + dest[2]; -#ifdef RE_FLOAT_COLOUR_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[2] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[2]= c; c= (mul*source[3]) + dest[3]; -#ifdef RE_ALPHA_CLIPPING - if(c >= RE_FULL_COLOUR_FLOAT) dest[3] = RE_UNITY_COLOUR_FLOAT; - else -#endif dest[3]= c; } /* end of void addAlphaUnderFloat(float *doel, float *bron) */ diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c index 5120c81d9e5..2b2c5b1b50f 100644 --- a/source/blender/render/intern/source/ray.c +++ b/source/blender/render/intern/source/ray.c @@ -47,11 +47,16 @@ #include "render.h" #include "render_intern.h" #include "rendercore.h" +#include "pixelblending.h" #include "jitter.h" #define OCRES 64 + #define DDA_SHADOW 0 #define DDA_MIRROR 1 +#define DDA_SHADOW_TRA 2 + +#define DEPTH_SHADOW_TRA 10 /* ********** structs *************** */ @@ -70,8 +75,9 @@ typedef struct Isect { float start[3], end[3]; float labda, u, v; struct VlakRen *vlr, *vlrcontr; - short isect, mode; /* mode: DDA_SHADOW or DDA_MIRROR */ + short isect, mode; /* mode: DDA_SHADOW or DDA_MIRROR or DDA_SHADOW_TRA */ float ddalabda; + float col[4]; /* RGBA for shadow_tra */ } Isect; typedef struct Branch @@ -1340,7 +1346,8 @@ static void shade_ray(Isect *is, int mask, ShadeResult *shr) VECCOPY(R.vn, R.vlr->n); } - shade_lamp_loop(mask, shr); + if(is->mode==DDA_SHADOW_TRA) shade_color(shr); + else shade_lamp_loop(mask, shr); if(flip) { R.vlr->n[0]= -R.vlr->n[0]; @@ -1355,8 +1362,8 @@ static void refraction(float *refract, float *n, float *view, float index) float dot, fac; VECCOPY(refract, view); - if(index==0.0) return; - + index= 1.0/index; + dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2]; if(dot>0.0) { @@ -1483,7 +1490,7 @@ static void traceray(short depth, float *start, float *vec, float *col, int mask if(R.mat->mode & MA_RAYMIRROR) { f= R.mat->ray_mirror; - if(f!=0.0) f*= fresnel_fac(R.view, R.vn, R.mat->fresnel_mir, R.mat->falloff_mir); + if(f!=0.0) f*= fresnel_fac(R.view, R.vn, R.mat->fresnel_mir); } else f= 0.0; @@ -1781,7 +1788,7 @@ void ray_trace(int mask, ShadeResult *shr) if(do_mir) { - i= R.mat->ray_mirror*fresnel_fac(R.view, R.vn, R.mat->fresnel_mir, R.mat->falloff_mir); + i= R.mat->ray_mirror*fresnel_fac(R.view, R.vn, R.mat->fresnel_mir); if(i!=0.0) { fr= R.mat->mirr; fg= R.mat->mirg; @@ -1807,13 +1814,81 @@ void ray_trace(int mask, ShadeResult *shr) } } +/* no premul here! */ +static void addAlphaLight(float *old, float *over) +{ + float div= old[3]+over[3]; + + if(div > 0.0001) { + old[0]= (over[3]*over[0] + old[3]*old[0])/div; + old[1]= (over[3]*over[1] + old[3]*old[1])/div; + old[2]= (over[3]*over[2] + old[3]*old[2])/div; + } + old[3]= over[3] + (1-over[3])*old[3]; + +} + +static int ray_trace_shadow_tra(Isect *isec, int depth) +{ + /* ray to lamp, find first face that intersects, check alpha properties, + if it has alpha<1 continue. exit when alpha is full */ + ShadeResult shr; + + if( d3dda(isec)) { + VlakRen *vlr=NULL; + float col[4], rvn[3], view[3], rco[3], ref[3]; + /* we got a face */ + + /* store variables which change during tracing */ + if(depth==DEPTH_SHADOW_TRA) { + vlr= R.vlr; + VECCOPY(view, R.view); + VECCOPY(rco, R.co); + VECCOPY(rvn, R.vn); + VECCOPY(ref, R.ref); + } + + /* set up view vector */ + VecSubf(R.view, isec->end, isec->start); + Normalise(R.view); + + shade_ray(isec, 0, &shr); + + /* add color */ + VECCOPY(col, shr.diff); + col[3]= shr.alpha; + addAlphaLight(isec->col, col); + + if(depth>0 && isec->col[3]<1.0) { + VECCOPY(isec->start, R.co); + ray_trace_shadow_tra(isec, depth-1); + } + else if(isec->col[3]>1.0) isec->col[3]= 1.0; + + /* restore variables which change during tracing */ + if(depth==DEPTH_SHADOW_TRA) { + VECCOPY(R.view, view); + VECCOPY(R.co, rco); + VECCOPY(R.ref, ref); + VECCOPY(R.vn, rvn); + R.vlr= vlr; + R.mat= vlr->mat; + R.matren= R.mat->ren; + } + } + return 0; +} + /* extern call from shade_lamp_loop */ -float ray_shadow(LampRen *lar, int mask) +void ray_shadow(LampRen *lar, float *shadfac, int mask) { Isect isec; float fac, div=0.0, lampco[3]; - isec.mode= DDA_SHADOW; + if(R.mat->mode & MA_SHADOW_TRA) isec.mode= DDA_SHADOW_TRA; + else isec.mode= DDA_SHADOW; + + shadfac[3]= 1.0; // 1=full light if(lar->type==LA_SUN || lar->type==LA_HEMI) { lampco[0]= R.co[0] - g_oc.ocsize*lar->vec[0]; @@ -1826,24 +1901,57 @@ float ray_shadow(LampRen *lar, int mask) if(lar->ray_samp<2) { if(R.r.mode & R_OSA) { + float accum[4]={0.0, 0.0, 0.0, 0.0}; int j; + fac= 0.0; + for(j=0; j0.0) fac= pow(fac, falloff); else fac= 1.0; - if(fac>1.0) fac= 1.0; - - return (1.0 - fresnel*fac); + t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]); + if(t1>0.0) t1= 1.0+t1; + else t1 = 1.0-t1; + + t2 = t1*t1; + + t2= ior + (1.0-ior)*t2*t2*t1; + + if(t2<0.0) return 0.0; + else if(t2>1.0) return 1.0; + return t2; +} + +void shade_color(ShadeResult *shr) +{ + Material *ma= R.matren; + + if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) { + ma->r= R.vcol[0]; + ma->g= R.vcol[1]; + ma->b= R.vcol[2]; + } + + ma->alpha= R.mat->alpha; // copy to render material, for fresnel and spectra + + if(ma->texco) { + if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) { + R.mat->r= R.vcol[0]; + R.mat->g= R.vcol[1]; + R.mat->b= R.vcol[2]; + } + do_material_tex(); + } + + if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) { + if(ma->fresnel_tra!=1.0) + ma->alpha*= fresnel_fac(R.view, R.vn, ma->fresnel_tra); + } + + shr->diff[0]= ma->r; + shr->diff[1]= ma->g; + shr->diff[2]= ma->b; + shr->alpha= ma->alpha; } /* mask is used to define the amount of rays/samples */ @@ -1568,7 +1609,7 @@ void shade_lamp_loop(int mask, ShadeResult *shr) LampRen *lar; Material *ma; float i, inp, inpr, t, lv[3], lampdist, ld = 0; - float lvrot[3], *vn, *view, shadfac, soft; + float lvrot[3], *vn, *view, shadfac[4], soft; // shadfac = rgba int a; vn= R.vn; @@ -1581,7 +1622,7 @@ void shade_lamp_loop(int mask, ShadeResult *shr) if(ma->mode & MA_ONLYSHADOW) { float ir; - shadfac= ir= 0.0; + shadfac[3]= ir= 0.0; for(a=0; a0.0) shadfac/= ir; - shr->alpha= (R.mat->alpha)*(1.0-shadfac); + if(ir>0.0) shadfac[3]/= ir; + shr->alpha= (R.mat->alpha)*(1.0-shadfac[3]); return; } @@ -1701,6 +1742,10 @@ void shade_lamp_loop(int mask, ShadeResult *shr) if(lar->mode & LA_TEXTURE) do_lamp_tex(lar, lv); + /* init transp shadow */ + shadfac[3]= 1.0; + if(ma->mode & MA_SHADOW_TRA) shadfac[0]= shadfac[1]= shadfac[2]= 1.0; + if(lar->type==LA_SPOT) { if(lar->mode & LA_SQUARE) { @@ -1741,12 +1786,12 @@ void shade_lamp_loop(int mask, ShadeResult *shr) inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2]; if(inp>0.0) { /* testshadowbuf==0.0 : 100% shadow */ - shadfac = 1.0 - testshadowbuf(lar->shb, inp); - if(shadfac>0.0) { - shadfac*= inp*soft*lar->energy; - shr->diff[0] -= shadfac; - shr->diff[1] -= shadfac; - shr->diff[2] -= shadfac; + shadfac[3] = 1.0 - testshadowbuf(lar->shb, inp); + if(shadfac[3]>0.0) { + shadfac[3]*= inp*soft*lar->energy; + shr->diff[0] -= shadfac[3]; + shr->diff[1] -= shadfac[3]; + shr->diff[2] -= shadfac[3]; continue; } @@ -1793,22 +1838,23 @@ void shade_lamp_loop(int mask, ShadeResult *shr) /* shadow and spec */ if(inp> -0.41) { /* heuristic value */ - shadfac= 1.0; + if(i>0.0 && (R.r.mode & R_SHADOW)) { if(ma->mode & MA_SHADOW) { if(lar->shb) { - shadfac = testshadowbuf(lar->shb, inp); - if(shadfac==0.0) continue; - i*= shadfac; + shadfac[3] = testshadowbuf(lar->shb, inp); + if(shadfac[3]==0.0) continue; + i*= shadfac[3]; } else if(lar->mode & LA_SHAD_RAY) { if(R.r.mode & R_RAYTRACE) { - extern float ray_shadow(LampRen *, int); + extern void ray_shadow(LampRen *, float *, int); /* hurms, single sided? */ if( R.vlr->n[0]*lv[0] + R.vlr->n[1]*lv[1] + R.vlr->n[2]*lv[2] > -0.01) { - shadfac= (1.0-ray_shadow(lar, mask)); - i*= shadfac; + ray_shadow(lar, shadfac, mask); + if(shadfac[3]==0.0) continue; + i*= shadfac[3]; } } } @@ -1816,7 +1862,7 @@ void shade_lamp_loop(int mask, ShadeResult *shr) } /* specularity */ - if(shadfac>0.0 && ma->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) { + if(shadfac[3]>0.0 && ma->spec!=0.0 && !(lar->mode & LA_NO_SPEC)) { if(lar->type==LA_HEMI) { /* hemi uses no spec shaders (yet) */ @@ -1833,7 +1879,7 @@ void shade_lamp_loop(int mask, ShadeResult *shr) t= 0.5*t+0.5; } - t= ma->spec*spec(t, ma->har); + t= shadfac[3]*ma->spec*spec(t, ma->har); shr->spec[0]+= t*(lar->r * ma->specr); shr->spec[1]+= t*(lar->g * ma->specg); shr->spec[2]+= t*(lar->b * ma->specb); @@ -1851,7 +1897,7 @@ void shade_lamp_loop(int mask, ShadeResult *shr) else specfac= Toon_Spec(vn, lv, view, ma->param[2], ma->param[3]); - t= shadfac*ma->spec*lampdist*specfac; + t= shadfac[3]*ma->spec*lampdist*specfac; shr->spec[0]+= t*(lar->r * ma->specr); shr->spec[1]+= t*(lar->g * ma->specg); @@ -1862,15 +1908,22 @@ void shade_lamp_loop(int mask, ShadeResult *shr) /* in case 'no diffuse' we still do most calculus, spec can be in shadow */ if(i>0.0 && !(lar->mode & LA_NO_DIFF)) { - shr->diff[0]+= i*lar->r; - shr->diff[1]+= i*lar->g; - shr->diff[2]+= i*lar->b; + if(ma->mode & MA_SHADOW_TRA) { + shr->diff[0]+= i*shadfac[0]*lar->r; + shr->diff[1]+= i*shadfac[1]*lar->g; + shr->diff[2]+= i*shadfac[2]*lar->b; + } + else { + shr->diff[0]+= i*lar->r; + shr->diff[1]+= i*lar->g; + shr->diff[2]+= i*lar->b; + } } } if(ma->mode & (MA_ZTRA|MA_RAYTRANSP)) { - if(ma->fresnel_tra!=0.0) - ma->alpha*= fresnel_fac(R.view, R.vn, ma->fresnel_tra, ma->falloff_tra); + if(ma->fresnel_tra!=1.0) + ma->alpha*= fresnel_fac(R.view, R.vn, ma->fresnel_tra); if(ma->spectra!=0.0) { diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 452c5b4ccab..21674fa5cc6 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -2025,7 +2025,9 @@ void do_matbuts(unsigned short event) case B_MATRAYTRANSP: ma= G.buts->lockpoin; if(ma) { - ma->mode &= ~MA_ZTRA; + // set ztra when you disable ray-tra, is nicer + if(ma->mode & MA_RAYTRANSP) ma->mode &= ~MA_ZTRA; + else ma->mode |= MA_ZTRA; allqueue(REDRAWBUTSSHADING, 0); BIF_preview_changed(G.buts); } @@ -2250,21 +2252,19 @@ static void material_panel_raytrace(Material *ma) if(uiNewPanel(curarea, block, "Raytrace", "Material", 640, 0, 318, 204)==0) return; uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "RayMir ", 10,160,200,19, &(ma->ray_mirror), 0.0, 1.0, 0, 2, "Sets the amount mirror reflection for raytrace"); - uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,160,100,19, &(ma->ray_depth), 0.0, 6.0, 0, 0, "Amount of inter-reflections calculated maximal "); - uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,140,200,19, &(ma->fresnel_mir), 0.0, 1.0, 0, 2, "Sets Fresnel falloff for mirror reflection"); - uiDefButF(block, NUM, B_MATPRV, "Falloff ", 210,140,100,19, &(ma->falloff_mir), 0.0, 5.0, 0, 2, "Sets the falloff strength of Fresnel"); + uiDefButF(block, NUMSLI, B_MATPRV, "RayMir ", 10,160,200,19, &(ma->ray_mirror), 0.0, 1.0, 100, 2, "Sets the amount mirror reflection for raytrace"); + uiDefButI(block, TOG|BIT|18, B_MATPRV,"Ray Mirror",210,160,100,19, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering"); + uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,140,200,19, &(ma->fresnel_mir), 1.0, 1.5, 10, 2, "Amount of Fresnel for mirror reflection"); + uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,140,100,19, &(ma->ray_depth), 0.0, 10.0, 100, 0, "Amount of inter-reflections calculated maximal "); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "Ang Index ",10,80,200,19, &(ma->ang), 0.0, 1.0, 0, 2, "Sets the angular index of refraction for raytrace"); - uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,80,100,19, &(ma->ray_depth_tra), 0.0, 6.0, 0, 0, "Amount of refractions calculated maximal "); - uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,60,200,19, &(ma->fresnel_tra), 0.0, 1.0, 0, 2, "Sets Fresnel falloff for transparency"); - uiDefButF(block, NUM, B_MATPRV, "Falloff ", 210,60,100,19, &(ma->falloff_tra), 0.0, 5.0, 0, 2, "Sets the falloff strength of Fresnel"); + uiDefButF(block, NUMSLI, B_MATPRV, "IOR ", 10,100,200,19, &(ma->ang), 1.0, 3.0, 100, 2, "Sets the angular index of refraction for raytrace"); + uiDefButI(block, TOG|BIT|17, B_MATRAYTRANSP,"Ray Transp",210,100,100,19, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for transparency rendering"); + uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,80,200,19, &(ma->fresnel_tra), 1.0, 1.5, 10, 2, "Amount of Fresnel for transparency"); + uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,80,100,19, &(ma->ray_depth_tra), 0.0, 10.0, 100, 0, "Amount of refractions calculated maximal "); uiBlockEndAlign(block); - uiBlockSetCol(block, TH_BUT_SETTING1); - uiDefButI(block, TOG|BIT|18, B_MATPRV, "Ray Mirror", 160,185,150,19, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering"); - uiDefButI(block, TOG|BIT|17, B_MATRAYTRANSP,"Ray Transp",160,105,150,19, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for transparency rendering"); + uiDefButI(block, TOG|BIT|19, B_MATRAYTRANSP,"Transp Shadow",160,40,150,19, &(ma->mode), 0, 0, 0, 0, "Enables transparent shadows based at material color and alpha"); } diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 0b302a40602..6bce6da18bf 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -679,9 +679,8 @@ static void refraction_prv(int *x, int *y, float *n, float index) { float dot, fac, view[3], len; - - if(index==0.0) return; - + index= 1.0/index; + view[0]= index*(float)*x; view[1]= ((float)*y)/index; view[2]= 20.0; @@ -708,7 +707,7 @@ static void refraction_prv(int *x, int *y, float *n, float index) static void shade_preview_pixel(float *vec, int x, int y,char *rect, int smooth) { - extern float fresnel_fac(float *view, float *vn, float fresnel, float falloff); + extern float fresnel_fac(float *view, float *vn, float fresnel); Material *mat; float v1,inp, inprspec=0, isr=0.0, isb=0.0, isg=0.0; float ir=0.0, ib=0.0, ig=0.0; @@ -863,7 +862,7 @@ static void shade_preview_pixel(float *vec, int x, int y,char *rect, int smooth) /* scale */ div= (0.85*R.ref[1]); - R.refcol[0]= mat->ray_mirror*fresnel_fac(view, R.vn, mat->fresnel_mir, mat->falloff_mir);; + R.refcol[0]= mat->ray_mirror*fresnel_fac(view, R.vn, mat->fresnel_mir); if(div<0.0) { /* minus 0.5 prevents too many small tiles in distance */ @@ -910,7 +909,7 @@ static void shade_preview_pixel(float *vec, int x, int y,char *rect, int smooth) if(mat->mode & (MA_ZTRA|MA_RAYTRANSP)) if(mat->fresnel_tra!=0.0) - alpha*= fresnel_fac(view, R.vn, mat->fresnel_tra, mat->falloff_tra); + alpha*= fresnel_fac(view, R.vn, mat->fresnel_tra); /* ztra shade */ if(mat->spectra!=0.0) { @@ -1123,7 +1122,7 @@ void BIF_previewrender(SpaceButs *sbuts) xsq= x*x; if(mat->pr_type==MA_SPHERE) { - if(xsq+ysq < radsq) { + if(xsq+ysq <= radsq) { R.vn[0]= x; R.vn[1]= y; R.vn[2]= sqrt( (float)(radsq-xsq-ysq) );