forked from bartvdbraak/blender
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:
parent
d1122ae917
commit
cb20f1cdb4
@ -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) );
|
||||
|
Loading…
Reference in New Issue
Block a user