Added ray bounding box interception test.

This commit is contained in:
Walter Julius Hennecke 2013-11-23 23:04:21 +01:00
parent 8ca34a6df1
commit a9cc86d1d8
2 changed files with 85 additions and 0 deletions

View file

@ -1848,3 +1848,58 @@ char *EndWord(char *pos)
return pos;
}
void BG_PrepareRay(bgRay_t* ray, vec3_t origin, vec3_t dir) {
if(ray == NULL) {
return;
}
VectorCopy(origin, ray->origin);
VectorCopy(dir, ray->direction);
VectorCopy(dir, ray->inverse_direction);
VectorInverse(ray->inverse_direction);
ray->sign[0] = (ray->inverse_direction[0] < 0);
ray->sign[1] = (ray->inverse_direction[1] < 0);
ray->sign[2] = (ray->inverse_direction[2] < 0);
}
int BG_RayIntersect(bgRay_t* ray, bgBBox_t* bbox) {
double tmin = 0.0;
double tmax = 0.0;
double tymin = 0.0;
double tymax = 0.0;
double tzmin = 0.0;
double tzmax = 0.0;
if(ray == NULL || bbox == NULL) {
return 0;
}
tmin = (bbox->bounds[ray->sign[0]][0] - ray->origin[0]) * ray->inverse_direction[0];
tmax = (bbox->bounds[1 - ray->sign[0]][0] - ray->origin[0]) * ray->inverse_direction[0];
tymin = (bbox->bounds[ray->sign[1]][1] - ray->origin[1]) * ray->inverse_direction[1];
tymax = (bbox->bounds[1 - ray->sign[1]][1] - ray->origin[1]) * ray->inverse_direction[1];
if((tmin > tymax) || (tymin > tmax)) {
return 0;
}
if(tymin > tmin) {
tmin = tymin;
}
if(tymax < tmax) {
tmax = tymax;
}
tzmin = (bbox->bounds[ray->sign[2]][2] - ray->origin[2]) * ray->inverse_direction[2];
tzmax = (bbox->bounds[1 - ray->sign[2]][2] - ray->origin[2]) * ray->inverse_direction[2];
if((tmin > tzmax) || (tzmin > tmax)) {
return 0;
}
return 1;
}

View file

@ -1,7 +1,37 @@
#ifndef _BG_MISC_H
#define _BG_MISC_H
#include "q_shared.h"
void BG_LanguageFilename(char *baseName,char *baseExtension,char *finalName);
char* BG_RegisterRace( const char *name );
typedef struct bgRay_s bgRay_t;
struct bgRay_s {
vec3_t origin;
vec3_t direction;
vec3_t inverse_direction;
int sign[3];
};
/**
* @brief Prepares a ray with a given origin and direction.
* @param ray The ray.
* @param origin The origin.
* @param dir The direction.
*/
void BG_PrepareRay(bgRay_t* ray, vec3_t origin, vec3_t dir);
typedef struct bgBBox_s bgBBox_t;
struct bgBBox_s {
vec3_t bounds[2];
};
/**
* @brief Checks is a given ray intersects with a given bounding box.
* @param ray The ray.
* @param bbox The bounding box.
*/
int BG_RayIntersect(bgRay_t* ray, bgBBox_t* bbox);
#endif /* _BG_MISC_H */