light: make DirtTrace return a hittype_t

This commit is contained in:
Eric Wasylishen 2016-07-27 13:07:50 -06:00
parent 197c898976
commit f4a363b416
4 changed files with 25 additions and 16 deletions

View File

@ -39,6 +39,12 @@
#define ON_EPSILON 0.1 #define ON_EPSILON 0.1
#define ANGLE_EPSILON 0.001 #define ANGLE_EPSILON 0.001
enum class hittype_t {
NONE,
SOLID,
SKY
};
/* /*
* Convenience functions TestLight and TestSky will test against all shadow * Convenience functions TestLight and TestSky will test against all shadow
* casting bmodels and self-shadow the model 'self' if self != NULL. Returns * casting bmodels and self-shadow the model 'self' if self != NULL. Returns
@ -46,12 +52,12 @@
*/ */
qboolean TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self); 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 TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self);
qboolean DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out); hittype_t DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
void Embree_TraceInit(const bsp2_t *bsp); void Embree_TraceInit(const bsp2_t *bsp);
qboolean Embree_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self); 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_TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self);
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out); hittype_t Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out);
int int
SampleTexture(const bsp2_dface_t *face, const bsp2_t *bsp, const vec3_t point); SampleTexture(const bsp2_dface_t *face, const bsp2_t *bsp, const vec3_t point);

View File

@ -604,7 +604,7 @@ CheckObstructed(const lightsurf_t *surf, const vec3_t offset, const vec_t us, co
// trace from surf->midpoint to testpoint // trace from surf->midpoint to testpoint
vec_t hitdist = 0; vec_t hitdist = 0;
if (DirtTrace(surf->midpoint, dirn, dist, selfshadow, &hitdist, &hitplane, NULL)) { if (hittype_t::SOLID == DirtTrace(surf->midpoint, dirn, dist, selfshadow, &hitdist, &hitplane, NULL)) {
// make a corrected point // make a corrected point
VectorMA(surf->midpoint, qmax(0.0f, hitdist - 0.25f), dirn, corrected); VectorMA(surf->midpoint, qmax(0.0f, hitdist - 0.25f), dirn, corrected);
return true; return true;
@ -1897,7 +1897,7 @@ DirtForSample(const dmodel_t *model, const vec3_t origin, const vec3_t normal){
direction[ 2 ] = myRt[ 2 ] * temp[ 0 ] + myUp[ 2 ] * temp[ 1 ] + normal[ 2 ] * temp[ 2 ]; direction[ 2 ] = myRt[ 2 ] * temp[ 0 ] + myUp[ 2 ] * temp[ 1 ] + normal[ 2 ] * temp[ 2 ];
/* trace */ /* trace */
if (DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) { if (hittype_t::SOLID == DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) {
gatherDirt += 1.0f - ooDepth * traceHitdist; gatherDirt += 1.0f - ooDepth * traceHitdist;
} }
} }
@ -1910,14 +1910,14 @@ DirtForSample(const dmodel_t *model, const vec3_t origin, const vec3_t normal){
direction[ 2 ] = myRt[ 2 ] * dirtVectors[ i ][ 0 ] + myUp[ 2 ] * dirtVectors[ i ][ 1 ] + normal[ 2 ] * dirtVectors[ i ][ 2 ]; direction[ 2 ] = myRt[ 2 ] * dirtVectors[ i ][ 0 ] + myUp[ 2 ] * dirtVectors[ i ][ 1 ] + normal[ 2 ] * dirtVectors[ i ][ 2 ];
/* trace */ /* trace */
if (DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) { if (hittype_t::SOLID == DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) {
gatherDirt += 1.0f - ooDepth * traceHitdist; gatherDirt += 1.0f - ooDepth * traceHitdist;
} }
} }
} }
/* trace */ /* trace */
if (DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) { if (hittype_t::SOLID == DirtTrace(origin, direction, dirtDepth.floatValue(), model, &traceHitdist, NULL, NULL)) {
gatherDirt += 1.0f - ooDepth * traceHitdist; gatherDirt += 1.0f - ooDepth * traceHitdist;
} }

View File

@ -644,7 +644,7 @@ BSP_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *self)
* or if it started in the void. * or if it started in the void.
* ============ * ============
*/ */
qboolean hittype_t
BSP_DirtTrace(const vec3_t start, const vec3_t dirn, const vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out) BSP_DirtTrace(const vec3_t start, const vec3_t dirn, const vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{ {
vec3_t stop; vec3_t stop;
@ -666,7 +666,7 @@ BSP_DirtTrace(const vec3_t start, const vec3_t dirn, const vec_t dist, const dmo
if (face_out) { if (face_out) {
*face_out = ti.face; *face_out = ti.face;
} }
return !ti.hitsky; return ti.hitsky ? hittype_t::SKY : hittype_t::SOLID;
} }
} }
@ -687,11 +687,11 @@ BSP_DirtTrace(const vec3_t start, const vec3_t dirn, const vec_t dist, const dmo
if (face_out) { if (face_out) {
*face_out = ti.face; *face_out = ti.face;
} }
return !ti.hitsky; return ti.hitsky ? hittype_t::SKY : hittype_t::SOLID;
} }
} }
return false; return hittype_t::NONE;
} }
@ -809,7 +809,7 @@ qboolean TestLight(const vec3_t start, const vec3_t stop, const dmodel_t *self)
} }
qboolean DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out) hittype_t DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{ {
#ifdef HAVE_EMBREE #ifdef HAVE_EMBREE
if (rtbackend == backend_embree) { if (rtbackend == backend_embree) {

View File

@ -291,14 +291,13 @@ qboolean Embree_TestSky(const vec3_t start, const vec3_t dirn, const dmodel_t *s
} }
//public //public
qboolean Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out) hittype_t Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, const dmodel_t *self, vec_t *hitdist_out, plane_t *hitplane_out, const bsp2_dface_t **face_out)
{ {
RTCRay ray = SetupRay(start, dirn, dist, self); RTCRay ray = SetupRay(start, dirn, dist, self);
rtcIntersect(scene, ray); rtcIntersect(scene, ray);
if (ray.geomID == RTC_INVALID_GEOMETRY_ID if (ray.geomID == RTC_INVALID_GEOMETRY_ID)
|| ray.geomID == skygeom.geomID) return hittype_t::NONE;
return false;
if (hitdist_out) { if (hitdist_out) {
*hitdist_out = ray.tfar; *hitdist_out = ray.tfar;
@ -319,5 +318,9 @@ qboolean Embree_DirtTrace(const vec3_t start, const vec3_t dirn, vec_t dist, con
*face_out = si.triToFace.at(ray.primID); *face_out = si.triToFace.at(ray.primID);
} }
return true; if (ray.geomID == skygeom.geomID) {
return hittype_t::SKY;
} else {
return hittype_t::SOLID;
}
} }