light: make DirtTrace take dir / dist instead of endpoint to reduce VectorNormalize calls

This commit is contained in:
Eric Wasylishen 2016-06-19 15:38:09 -06:00
parent 7bef255ad5
commit 1d3774a9e0
4 changed files with 28 additions and 32 deletions

View File

@ -42,12 +42,12 @@ extern "C" {
*/
qboolean TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self);
qboolean TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self);
qboolean DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
qboolean DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
void Embree_TraceInit(const bsp2_t *bsp);
qboolean Embree_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self);
qboolean Embree_TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self);
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
int
SampleTexture(const bsp2_dface_t *face, const bsp2_t *bsp, const vec3_t point);

View File

@ -607,7 +607,15 @@ CheckObstructed(const lightsurf_t *surf, const vec3_t offset, const vec_t us, co
const dmodel_t *selfshadow = (surf->modelinfo->shadowself) ? surf->modelinfo->model : NULL;
if (DirtTrace(surf->midpoint, testpoint, selfshadow, hitpoint, &hitplane, NULL)) {
vec3_t dirn;
VectorSubtract(testpoint, surf->midpoint, dirn);
vec_t dist = VectorNormalize(dirn);
if (dist == 0.0f) {
continue; // testpoint == surf->midpoint
}
// trace from surf->midpoint to testpoint
if (DirtTrace(surf->midpoint, dirn, dist, selfshadow, hitpoint, &hitplane, NULL)) {
// make a corrected point
vec3_t tracedir;
@ -1824,7 +1832,7 @@ DirtForSample(const dmodel_t *model, const vec3_t origin, const vec3_t normal){
int i;
float gatherDirt, angle, elevation, ooDepth;
vec3_t worldUp, myUp, myRt, temp, direction, displacement;
vec3_t traceEnd, traceHitpoint;
vec3_t traceHitpoint;
/* dummy check */
if ( !dirty.value ) {
@ -1868,11 +1876,8 @@ DirtForSample(const dmodel_t *model, const vec3_t origin, const vec3_t normal){
direction[ 1 ] = myRt[ 1 ] * temp[ 0 ] + myUp[ 1 ] * temp[ 1 ] + normal[ 1 ] * temp[ 2 ];
direction[ 2 ] = myRt[ 2 ] * temp[ 0 ] + myUp[ 2 ] * temp[ 1 ] + normal[ 2 ] * temp[ 2 ];
/* set endpoint */
VectorMA( origin, dirtDepth.value, direction, traceEnd );
/* trace */
if (DirtTrace(origin, traceEnd, model, traceHitpoint, NULL, NULL)) {
if (DirtTrace(origin, direction, dirtDepth.value, model, traceHitpoint, NULL, NULL)) {
VectorSubtract( traceHitpoint, origin, displacement );
gatherDirt += 1.0f - ooDepth * VectorLength( displacement );
}
@ -1885,22 +1890,16 @@ DirtForSample(const dmodel_t *model, const vec3_t origin, const vec3_t normal){
direction[ 1 ] = myRt[ 1 ] * dirtVectors[ i ][ 0 ] + myUp[ 1 ] * dirtVectors[ i ][ 1 ] + normal[ 1 ] * dirtVectors[ i ][ 2 ];
direction[ 2 ] = myRt[ 2 ] * dirtVectors[ i ][ 0 ] + myUp[ 2 ] * dirtVectors[ i ][ 1 ] + normal[ 2 ] * dirtVectors[ i ][ 2 ];
/* set endpoint */
VectorMA( origin, dirtDepth.value, direction, traceEnd );
/* trace */
if (DirtTrace(origin, traceEnd, model, traceHitpoint, NULL, NULL)) {
if (DirtTrace(origin, direction, dirtDepth.value, model, traceHitpoint, NULL, NULL)) {
VectorSubtract( traceHitpoint, origin, displacement );
gatherDirt += 1.0f - ooDepth * VectorLength( displacement );
}
}
}
/* direct ray */
VectorMA( origin, dirtDepth.value, normal, traceEnd );
/* trace */
if (DirtTrace(origin, traceEnd, model, traceHitpoint, NULL, NULL)) {
if (DirtTrace(origin, direction, dirtDepth.value, model, traceHitpoint, NULL, NULL)) {
VectorSubtract( traceHitpoint, origin, displacement );
gatherDirt += 1.0f - ooDepth * VectorLength( displacement );
}

View File

@ -659,13 +659,13 @@ BSP_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self)
* ============
*/
qboolean
BSP_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
BSP_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{
const modelinfo_t *const *model;
vec3_t stop;
VectorMA(start, dist, dirn, stop);
traceinfo_t ti = {0};
VectorSubtract(stop, start, ti.dir);
VectorNormalize(ti.dir);
VectorCopy(dirn, ti.dir);
if (self) {
if (TraceFaces (&ti, self->headnode[0], start, stop)) {
@ -681,6 +681,7 @@ BSP_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_
}
/* Check against the list of global shadow casters */
const modelinfo_t *const *model;
for (model = tracelist; *model; model++) {
if ((*model)->model == self)
continue;
@ -814,15 +815,15 @@ qboolean TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self)
}
qboolean DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
qboolean DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{
#ifdef HAVE_EMBREE
if (rtbackend == backend_embree) {
return Embree_DirtTrace(start, stop, self, hitpoint_out, hitplane_out, face_out);
return Embree_DirtTrace(start, dirn, dist, self, hitpoint_out, hitplane_out, face_out);
}
#endif
if (rtbackend == backend_bsp) {
return BSP_DirtTrace(start, stop, self, hitpoint_out, hitplane_out, face_out);
return BSP_DirtTrace(start, dirn, dist, self, hitpoint_out, hitplane_out, face_out);
}
Error("no backend available");
}

View File

@ -289,13 +289,9 @@ qboolean Embree_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *s
}
//public
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec3_t hitpoint_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{
vec3_t dir;
VectorSubtract(stop, start, dir);
const vec_t dist = VectorNormalize(dir);
RTCRay ray = SetupRay(start, dir, dist, self);
RTCRay ray = SetupRay(start, dirn, dist, self);
rtcIntersect(scene, ray);
if (ray.geomID == RTC_INVALID_GEOMETRY_ID
@ -304,7 +300,7 @@ qboolean Embree_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t
// compute hitpoint_out
if (hitpoint_out) {
VectorMA(start, ray.tfar, dir, hitpoint_out);
VectorMA(start, ray.tfar, dirn, hitpoint_out);
}
if (hitplane_out) {
for (int i=0; i<3; i++) {
@ -313,7 +309,7 @@ qboolean Embree_DirtTrace(const vec3_t start, const vec3_t stop, const dmodel_t
VectorNormalize(hitplane_out->normal);
vec3_t hitpoint;
VectorMA(start, ray.tfar, dir, hitpoint);
VectorMA(start, ray.tfar, dirn, hitpoint);
hitplane_out->dist = DotProduct(hitplane_out->normal, hitpoint);
}