home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Photo CD Demo 1
/
Demo.bin
/
gems
/
gemsiii
/
zdepth.c
< prev
Wrap
C/C++ Source or Header
|
1992-03-19
|
4KB
|
135 lines
/*
* Name (person to blame): Andrew Woo
* Gem: Article 7.1, "The Shadow Depth Map Revisited"
* Affiliation: Alias Research, Style! Division
*/
/***********************************************
Reeves' SampleShadow code using BIAS
************************************************/
#define REEVES_APPROACH { \
inshadow = 0; \
for (i = 0, s = smin; i < ns; i++, s += ds) { \
for (j = 0, t = tmin; j < nt; j++, t += dt) { \
iu = s + Rand()*js; /* jitter s, t */ \
iv = t + Rand()*jt; \
\
bias = Rand() * (Bias1 - Bias0) + Bias0; /* pick bias */ \
if (iu >= bbox->r_umin && iu <= bbox->r_umax && \
iv >= bbox->r_vmin && iv <= bbox->r_vmax) \
if (z > depthMap[iu][iv] + bias) inshadow++; \
} \
} \
}
/***********************************************
New SampleShadow code with no BIAS and doing
integer comparisons for depth values first.
************************************************/
#define NEW_APPROACH { \
register int integerZ = (int) z, intDepth; \
register float depthValue; \
inshadow = 0; \
\
for (i = 0, s = smin; i < ns; i++, s += ds) { \
for (j = 0, t = tmin; j < nt; j++, t += dt) { \
iu = s + Rand()*js; \
iv = t + Rand()*jt; \
if (iu >= bbox->r_umin && iu <= bbox->r_umax && \
iv >= bbox->r_vmin && iv <= bbox->r_vmax) { \
/* do integer comparison first */ \
depthValue = depthMap[iu][iv]; \
intDepth = (int) depthValue; \
if ((integerZ > intDepth) || \
(integerZ == intDepth && z > depthValue)) \
inshadow++; \
} else { \
/* boundary case error */ \
inshadow++; \
} \
} \
} \
}
/* Start of Reeves' code in Siggraph 87 paper */
float ResFactor = 3;
float MinSize = 0;
float Bias0 = 0.3;
float Bias1 = 0.4;
int NumSamples = 16;
int MinSamples = 1;
#define MAPRES 256 /* I tested the code at 256x256 */
float depthMap[MAPRES][MAPRES];
#define CLAMP(a,min,max) (a<min?min:(a>max?max:a))
float Rand();
float ceil();
float floor();
typedef struct {
int r_umin, r_umax;
int r_vmin, r_vmax;
} TextureRect;
float SampleShadow (s, t, z, sres, tres, bbox)
float s, t, z, sres, tres;
TextureRect *bbox;
{
int i, j, inshadow, iu, iv, ns, nt, lu, hu, lv, hv;
float bias, smin, tmin, ds, dt, js, jt;
/* convert to coordinates of depth map */
sres = MAPRES * sres * ResFactor;
tres = MAPRES * tres * ResFactor;
if (sres < MinSize) sres = MinSize;
if (tres < MinSize) tres = MinSize;
s *= MAPRES; t *= MAPRES;
/* cull if outside bounding box */
lu = floor (s-sres); hu = ceil (s+sres);
lv = floor (t-tres); hv = ceil (t+tres);
if (lu > bbox->r_umax || hu < bbox->r_umin ||
lv > bbox->r_vmax || hv < bbox->r_vmin)
return (1.0); /* error in Reeves' code at boundary cases */
/* calculate number of samples */
if (sres*tres*4 < NumSamples) {
ns = sres + sres + 0.5;
ns = CLAMP(ns, MinSamples, NumSamples);
nt = tres + tres + 0.5;
nt = CLAMP(nt, MinSamples, NumSamples);
}
else {
nt = sqrt(tres*NumSamples/sres) + 0.5;
nt = CLAMP(nt, MinSamples, NumSamples);
ns = ((float)NumSamples)/nt + 0.5;
ns = CLAMP(ns, MinSamples, NumSamples);
}
/* setup jitter variables */
ds = 2*sres/ns; dt = 2*tres/nt;
js = ds*.5; jt = dt*.5;
smin = s - sres + js; tmin = t - tres + jt;
/* decide which version you want... */
#ifdef OLD_WAY
REEVES_APPROACH;
#else
NEW_APPROACH;
#endif
return (((float) inshadow) / (ns*nt));
}