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) );