FS2_Open
Open source remastering of the Freespace 2 engine
fvi.h File Reference

Go to the source code of this file.

Functions

float fvi_point_dist_plane (const vec3d *plane_pnt, const vec3d *plane_norm, const vec3d *point)
 
float fvi_ray_plane (vec3d *new_pnt, const vec3d *plane_pnt, const vec3d *plane_norm, const vec3d *ray_origin, const vec3d *ray_direction, float rad)
 
int fvi_segment_plane (vec3d *new_pnt, const vec3d *plane_pnt, const vec3d *plane_norm, const vec3d *p0, const vec3d *p1, float rad)
 
int fvi_point_face (const vec3d *checkp, int nv, vec3d const *const *verts, const vec3d *norm1, float *u_out, float *v_out, const uv_pair *uvls)
 
int fvi_segment_sphere (vec3d *intp, const vec3d *p0, const vec3d *p1, const vec3d *sphere_pos, float sphere_rad)
 
int fvi_ray_sphere (vec3d *intp, const vec3d *p0, const vec3d *p1, const vec3d *sphere_pos, float sphere_rad)
 
int fvi_ray_boundingbox (const vec3d *min, const vec3d *max, const vec3d *p0, const vec3d *pdir, vec3d *hitpt)
 
int fvi_polyedge_sphereline (vec3d *hit_point, const vec3d *xs0, const vec3d *vs, float Rs, int nv, vec3d const *const *verts, float *hit_time)
 
int fvi_sphere_plane (vec3d *intersect_point, const vec3d *sphere_center_start, const vec3d *sphere_velocity, float sphere_radius, const vec3d *plane_normal, const vec3d *plane_point, float *hit_time, float *delta_time)
 
void fvi_two_lines_in_3space (const vec3d *p1, const vec3d *v1, const vec3d *p2, const vec3d *v2, float *s, float *t)
 
int project_point_onto_bbox (const vec3d *mins, const vec3d *maxs, const vec3d *start, vec3d *box_pt)
 

Function Documentation

float fvi_point_dist_plane ( const vec3d plane_pnt,
const vec3d plane_norm,
const vec3d point 
)

Tells distance from a plain to a point-Bobboau

Parameters
plane_pntPlane description, a point
plane_normPlane description, a normal
pointA point to test

Definition at line 71 of file fvi.cpp.

int fvi_point_face ( const vec3d checkp,
int  nv,
vec3d const *const *  verts,
const vec3d norm1,
float u_out,
float v_out,
const uv_pair uvls 
)

Definition at line 419 of file fvi.cpp.

int fvi_polyedge_sphereline ( vec3d hit_point,
const vec3d xs0,
const vec3d vs,
float  Rs,
int  nv,
vec3d const *const *  verts,
float hit_time 
)

Given a polygon vertex list and a moving sphere, find the first contact the sphere makes with the edge, if any

Parameters
hit_pointpoint on edge
xs0starting point for sphere
vssphere velocity
Rssphere radius
nvnumber of vertices
vertsvertices making up polygon edges
hit_timetime the sphere hits an edge
Returns
1 if sphere hits polyedge, 0 if sphere misses

Definition at line 694 of file fvi.cpp.

int fvi_ray_boundingbox ( const vec3d min,
const vec3d max,
const vec3d p0,
const vec3d pdir,
vec3d hitpt 
)

Finds intersection of a ray and an axis-aligned bounding box

Given a ray with origin at p0, and direction pdir, this function returns non-zero if that ray intersects an axis-aligned bounding box from min to max. If there was an intersection, then hitpt will contain the point where the ray begins inside the box. Fast ray-box intersection taken from Graphics Gems I, pages 395,736.

Definition at line 321 of file fvi.cpp.

float fvi_ray_plane ( vec3d new_pnt,
const vec3d plane_pnt,
const vec3d plane_norm,
const vec3d ray_origin,
const vec3d ray_direction,
float  rad 
)

Finds the point on the specified plane where the infinite ray intersects.

Parameters
new_pntA point to test
plane_pntPlane description, a point
plane_normPlane description, a normal
ray_originRay description, an origin
ray_directionRay description, a direction
radRadius

Returns scaled-distance plane is from the ray_origin (t), so P = O + t*D, where P is the point of intersection, O is the ray origin, and D is the ray's direction. So 0.0 would mean the intersection is exactly on the ray origin, 1.0 would be on the ray origin plus the ray direction vector, anything negative would be behind the ray's origin. If you pass a pointer to the new_pnt, this routine will perform the P= calculation to calculate the point of intersection and put the result in *new_pnt.

If radius is anything other than 0.0, it assumes you want the intersection point to be that radius from the plane.

Note that ray_direction doesn't have to be normalized unless you want the return value to be in units from the ray origin.

Also note that new_pnt will always be filled in to some valid value, even if it is a point at infinity.

If the plane and line are parallel, this will return the largest negative float number possible.

So if you want to check a line segment from p0 to p1, you would pass p0 as ray_origin, p1-p0 as the ray_direction, and there would be an intersection if the return value is between 0 and 1.

Definition at line 118 of file fvi.cpp.

int fvi_ray_sphere ( vec3d intp,
const vec3d p0,
const vec3d p1,
const vec3d sphere_pos,
float  sphere_rad 
)

Determine if and where a ray intersects with a sphere

vector defined by p0,p1

Returns
1 if intersects, and fills in intp. else returns 0

Definition at line 255 of file fvi.cpp.

int fvi_segment_plane ( vec3d new_pnt,
const vec3d plane_pnt,
const vec3d plane_norm,
const vec3d p0,
const vec3d p1,
float  rad 
)

Find the point on the specified plane where the line intersects

Parameters
new_pntThe found point on the plane
plane_pntPlane description, a point
plane_normPlane description, a normal
p0The first end of the line
p1The second end of the line
radRadius
Returns
true if point found, false if line parallel to plane

Definition at line 162 of file fvi.cpp.

int fvi_segment_sphere ( vec3d intp,
const vec3d p0,
const vec3d p1,
const vec3d sphere_pos,
float  sphere_rad 
)

Determine if and where a vector intersects with a sphere

vector defined by p0,p1

Returns
1 if intersects, and fills in intp, else returns 0

Definition at line 188 of file fvi.cpp.

int fvi_sphere_plane ( vec3d intersect_point,
const vec3d sphere_center_start,
const vec3d sphere_velocity,
float  sphere_radius,
const vec3d plane_normal,
const vec3d plane_point,
float hit_time,
float crossing_time 
)

Returns whether a sphere hits a given plane in the time [0,1] If two collisions occur, returns earliest legal time returns the intersection point on the plane

Parameters
intersect_pointposition on plane where sphere makes first contact [if hit_time in range 0-1]
sphere_center_startinitial sphere center
sphere_velocityinitial sphere velocity
sphere_radiusradius of sphere
plane_normalnormal to the colliding plane
plane_pointpoint in the colliding plane
hit_timetime surface of sphere first hits plane
crossing_timetime for sphere to cross plane (first to last contact)
Returns
1 if sphere may be in contact with plane in time range [0-1], 0 otherwise

Definition at line 516 of file fvi.cpp.

void fvi_two_lines_in_3space ( const vec3d p1,
const vec3d v1,
const vec3d p2,
const vec3d v2,
float s,
float t 
)

Finds the point on each line of closest approach (s and t) (lines need not intersect to get closest point) Taken from graphic gems I, p. 304

lines: L1 = P1 + V1s and L2 = P2 + V2t

Definition at line 42 of file fvi.cpp.

int project_point_onto_bbox ( const vec3d mins,
const vec3d maxs,
const vec3d start,
vec3d box_pt 
)

Project point on bounding box

NOTE: if a coordinate of start is inside the bbox, it is not moved to surface of bbox

Parameters
minsminimum extents of bbox
maxsmaximum extents of bbox
startpoint in bbox reference frame
box_ptpoint in bbox reference frame.
Returns
1 if inside, 0 otherwise.

Definition at line 1107 of file fvi.cpp.