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.
This commit is contained in:
Ton Roosendaal 2003-12-18 21:34:48 +00:00
parent d1122ae917
commit cb20f1cdb4
9 changed files with 239 additions and 120 deletions

@ -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;
}

@ -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;
}

@ -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

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

@ -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) */

@ -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; j<R.osa; j++) {
if(mask & 1<<j) {
isec.start[0]= R.co[0] + (jit[j][0]-0.5)*O.dxco[0] + (jit[j][1]-0.5)*O.dyco[0] ;
isec.start[1]= R.co[1] + (jit[j][0]-0.5)*O.dxco[1] + (jit[j][1]-0.5)*O.dyco[1] ;
isec.start[2]= R.co[2] + (jit[j][0]-0.5)*O.dxco[2] + (jit[j][1]-0.5)*O.dyco[2] ;
VECCOPY(isec.end, lampco);
if( d3dda(&isec) ) fac+= 1.0;
if(isec.mode==DDA_SHADOW_TRA) {
isec.col[0]= isec.col[1]= isec.col[2]= 1.0;
isec.col[3]= 0.0; //alpha
ray_trace_shadow_tra(&isec, DEPTH_SHADOW_TRA);
accum[0]+= isec.col[0]; accum[1]+= isec.col[1];
accum[2]+= isec.col[2]; accum[3]+= isec.col[3];
}
else if( d3dda(&isec) ) fac+= 1.0;
div+= 1.0;
}
}
return fac/div;
if(isec.mode==DDA_SHADOW_TRA) {
// alpha to 'light'
accum[3]/= div;
shadfac[3]= 1.0-accum[3];
shadfac[0]= shadfac[3]+accum[0]*accum[3]/div;
shadfac[1]= shadfac[3]+accum[1]*accum[3]/div;
shadfac[2]= shadfac[3]+accum[2]*accum[3]/div;
}
else shadfac[3]= 1.0-fac/div;
}
else {
VECCOPY(isec.start, R.co);
VECCOPY(isec.end, lampco);
if( d3dda(&isec)) return 1.0;
if(isec.mode==DDA_SHADOW_TRA) {
isec.col[0]= isec.col[1]= isec.col[2]= 1.0;
isec.col[3]= 0.0; //alpha
ray_trace_shadow_tra(&isec, DEPTH_SHADOW_TRA);
VECCOPY(shadfac, isec.col);
// alpha to 'light'
shadfac[3]= 1.0-isec.col[3];
shadfac[0]= shadfac[3]+shadfac[0]*isec.col[3];
shadfac[1]= shadfac[3]+shadfac[1]*isec.col[3];
shadfac[2]= shadfac[3]+shadfac[2]*isec.col[3];
}
else if( d3dda(&isec)) shadfac[3]= 0.0;
}
}
else {
@ -1881,8 +1989,7 @@ float ray_shadow(LampRen *lar, int mask)
}
jitlamp+= 3;
}
return fac/div;
shadfac[3]= 1.0-fac/div;
}
return 0.0;
}

@ -1552,14 +1552,55 @@ void RE_calc_R_ref()
}
float fresnel_fac(float *view, float *vn, float fresnel, float falloff)
float fresnel_fac(float *view, float *vn, float ior)
{
float fac= fabs(view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]);
float t1, t2;
if(ior==1.0) return 1.0;
if(falloff>0.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; a<R.totlamp; a++) {
lar= R.la[a];
@ -1607,17 +1648,17 @@ void shade_lamp_loop(int mask, ShadeResult *shr)
i= t*i+(1.0-t);
}
shadfac+= i;
shadfac[3]+= i;
ir+= 1.0;
}
else {
shadfac+= 1.0;
shadfac[3]+= 1.0;
ir+= 1.0;
}
}
}
if(ir>0.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) {

@ -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");
}

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