- fix for speedup raytracing, which gave errors in very simple scenes
(1 lamp, shadow). The 'coherence' check gets reset now for each new pixel rendered, which remains efficient for oversampling. - small cleanups in code, prototype added, less globals.
This commit is contained in:
@@ -59,7 +59,9 @@ typedef struct ShadeInput
|
||||
float co[3];
|
||||
float lo[3], gl[3], uv[3], ref[3], orn[3], winco[3], sticky[3], vcol[3], rad[3];
|
||||
float vn[3], view[3], refcol[4], displace[3];
|
||||
float xs, ys; /* pixel to be rendered */
|
||||
short osatex;
|
||||
|
||||
} ShadeInput;
|
||||
|
||||
/* here only stuff to initalize the render itself */
|
||||
|
||||
@@ -71,6 +71,10 @@ float fresnel_fac(float *view, float *vn, float fresnel, float fac);
|
||||
void calc_R_ref(struct ShadeInput *shi);
|
||||
float spec(float inp, int hard);
|
||||
|
||||
/* -------- ray.c ------- */
|
||||
|
||||
extern void ray_shadow(ShadeInput *, LampRen *, float *, int);
|
||||
extern void ray_trace(ShadeInput *, ShadeResult *, int);
|
||||
|
||||
/**
|
||||
* Apply the background (sky). Depending on the active alphamode and
|
||||
|
||||
@@ -102,6 +102,7 @@ typedef struct Node
|
||||
/* ******** globals ***************** */
|
||||
|
||||
static Octree g_oc; /* can be scene pointer or so later... */
|
||||
static int coh_test=0; /* coherence optimize */
|
||||
|
||||
/* just for statistics */
|
||||
static int raycount, branchcount, nodecount;
|
||||
@@ -1060,7 +1061,6 @@ static int d3dda(Isect *is)
|
||||
}
|
||||
else {
|
||||
static int coh_ocx1,coh_ocx2,coh_ocy1, coh_ocy2,coh_ocz1,coh_ocz2;
|
||||
static int coh_test=0;
|
||||
float dox, doy, doz;
|
||||
int coherent=1, nodecount=0;
|
||||
|
||||
@@ -1502,11 +1502,10 @@ static float jit_cube4[4*4*4*3]={0.0};
|
||||
static float jit_cube5[5*5*5*3]={0.0};
|
||||
|
||||
/* table around origin, -.5 to 0.5 */
|
||||
static float *jitter_plane(LampRen *lar)
|
||||
static float *jitter_plane(LampRen *lar, int xs, int ys)
|
||||
{
|
||||
extern float hashvectf[];
|
||||
extern char hash[];
|
||||
extern int temp_x, temp_y;
|
||||
//extern char hash[];
|
||||
float dsizex, dsizey, *fp, *hv;
|
||||
int dit, x, y, resolx, resoly;
|
||||
|
||||
@@ -1551,7 +1550,7 @@ static float *jitter_plane(LampRen *lar)
|
||||
}
|
||||
|
||||
if(lar->ray_samp_type & LA_SAMP_DITHER)
|
||||
return lar->jitter + 3*resolx*resoly*((temp_x & 1)+2*(temp_y & 1));
|
||||
return lar->jitter + 3*resolx*resoly*((xs & 1)+2*(ys & 1));
|
||||
|
||||
return lar->jitter;
|
||||
}
|
||||
@@ -1847,6 +1846,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac, int mask)
|
||||
else isec.mode= DDA_SHADOW;
|
||||
|
||||
shadfac[3]= 1.0; // 1=full light
|
||||
coh_test= 0; // reset coherence optimize
|
||||
|
||||
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
|
||||
lampco[0]= shi->co[0] - g_oc.ocsize*lar->vec[0];
|
||||
@@ -1928,7 +1928,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac, int mask)
|
||||
isec.vlrorig= shi->vlr;
|
||||
|
||||
fac= 0.0;
|
||||
jitlamp= jitter_plane(lar);
|
||||
jitlamp= jitter_plane(lar, floor(shi->xs), floor(shi->ys));
|
||||
|
||||
a= lar->ray_totsamp;
|
||||
|
||||
|
||||
@@ -1907,7 +1907,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr, int mask)
|
||||
}
|
||||
else if(lar->mode & LA_SHAD_RAY) {
|
||||
if(R.r.mode & R_RAYTRACE) {
|
||||
extern void ray_shadow(ShadeInput *, LampRen *, float *, int);
|
||||
|
||||
/* hurms, single sided? */
|
||||
if( shi->vlr->n[0]*lv[0] + shi->vlr->n[1]*lv[1] + shi->vlr->n[2]*lv[2] > -0.01) {
|
||||
ray_shadow(shi, lar, shadfac, mask);
|
||||
@@ -2306,8 +2306,6 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i
|
||||
}
|
||||
}
|
||||
|
||||
int temp_x, temp_y;
|
||||
|
||||
/* x,y: window coordinate from 0 to rectx,y */
|
||||
/* return pointer to rendered face */
|
||||
void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
|
||||
@@ -2319,8 +2317,9 @@ void *shadepixel(float x, float y, int vlaknr, int mask, float *col)
|
||||
if(vlaknr< 0) { /* error */
|
||||
return NULL;
|
||||
}
|
||||
temp_x= floor(x);
|
||||
temp_y= floor(y);
|
||||
/* currently in use for dithering soft shadow */
|
||||
shi.xs= x;
|
||||
shi.ys= y;
|
||||
|
||||
if(vlaknr==0) { /* sky */
|
||||
col[0]= 0.0; col[1]= 0.0; col[2]= 0.0; col[3]= 0.0;
|
||||
@@ -2474,8 +2473,6 @@ temp_y= floor(y);
|
||||
|
||||
if(R.r.mode & R_RAYTRACE) {
|
||||
if(shi.matren->ray_mirror!=0.0 || (shi.mat->mode & MA_RAYTRANSP && shr.alpha!=1.0)) {
|
||||
extern void ray_trace(ShadeInput *shi, ShadeResult *shr, int mask);
|
||||
|
||||
ray_trace(&shi, &shr, mask);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user