mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-16 12:39:02 +00:00
138 lines
6.6 KiB
C
138 lines
6.6 KiB
C
/***************************************************************************
|
|
* *
|
|
* Module : rtintsec.h *
|
|
* *
|
|
* Purpose : Intersection tests on geometry primitives. *
|
|
* *
|
|
**************************************************************************/
|
|
|
|
#ifndef RTINTSEC_H
|
|
#define RTINTSEC_H
|
|
|
|
/**
|
|
* \defgroup rtintersect RtIntersection
|
|
* \ingroup rttool
|
|
*
|
|
* Object Intersection Toolkit for RenderWare.
|
|
*/
|
|
|
|
/****************************************************************************
|
|
Includes
|
|
*/
|
|
|
|
#include <rwcore.h>
|
|
#include "rtintsec.rpe" /* automatically generated header file */
|
|
|
|
/****************************************************************************
|
|
Defines
|
|
*/
|
|
|
|
#define RTINTSECEPSILON (RwReal)(1e-8)
|
|
#define RTINTSECEDGEEPS (RwReal)(1e-5)
|
|
|
|
#define RtIntersectionLineTriangleMacro(_result, \
|
|
_lineStart, _lineDelta, \
|
|
_v0, _v1, _v2, \
|
|
_distance) \
|
|
MACRO_START \
|
|
{ \
|
|
RwV3d edge1, edge2, tVec, pVec, qVec; \
|
|
RwReal det; \
|
|
\
|
|
/* Find vectors for two edges sharing vert0 */ \
|
|
RwV3dSubMacro(&edge1, (_v1), (_v0)); \
|
|
RwV3dSubMacro(&edge2, (_v2), (_v0)); \
|
|
\
|
|
/* Begin calculating determinant \
|
|
* - also used to calculate U parameter */ \
|
|
RwV3dCrossProductMacro(&pVec, (_lineDelta), &edge2); \
|
|
\
|
|
/* If determinant is \
|
|
* + near zero, ray lies in plane of \
|
|
* triangle \
|
|
* + negative, triangle is backfacing \
|
|
*/ \
|
|
det = RwV3dDotProductMacro(&edge1, &pVec); \
|
|
(_result) = (det > RTINTSECEPSILON); \
|
|
\
|
|
if ((_result)) \
|
|
{ \
|
|
RwReal lo, hi, u; \
|
|
\
|
|
/* Calculate bounds for parameters with tolerance */ \
|
|
lo = - det*RTINTSECEDGEEPS; \
|
|
hi = det - lo; \
|
|
\
|
|
/* Calculate U parameter and test bounds */ \
|
|
RwV3dSubMacro(&tVec, (_lineStart), (_v0)); \
|
|
u = RwV3dDotProductMacro(&tVec, &pVec); \
|
|
(_result) = (u >= lo && u <= hi); \
|
|
\
|
|
if ((_result)) \
|
|
{ \
|
|
RwReal v; \
|
|
\
|
|
/* Calculate V parameter and test bounds */ \
|
|
RwV3dCrossProductMacro(&qVec, &tVec, &edge1); \
|
|
v = RwV3dDotProductMacro((_lineDelta), &qVec); \
|
|
(_result) = (v >= lo && (u + v) <= hi); \
|
|
\
|
|
if ((_result)) \
|
|
{ \
|
|
/* Calculate t, \
|
|
* and make sure intersection is in bounds of line */ \
|
|
*(_distance) = RwV3dDotProductMacro(&edge2, &qVec); \
|
|
\
|
|
/* Within bounds of line? */ \
|
|
(_result) = (*(_distance) >= lo && *(_distance) <= hi); \
|
|
\
|
|
if ((_result)) \
|
|
{ \
|
|
*(_distance) = ((*(_distance)) / (det)); \
|
|
} \
|
|
} \
|
|
} \
|
|
} \
|
|
} \
|
|
MACRO_STOP
|
|
|
|
|
|
/****************************************************************************
|
|
Global Types
|
|
*/
|
|
|
|
|
|
/* RWPUBLIC */
|
|
/****************************************************************************
|
|
Function prototypes
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif /* __cplusplus */
|
|
|
|
/* Line intersections */
|
|
extern RwBool
|
|
RtIntersectionLineTriangle(RwV3d *lineStart, RwV3d *lineDelta,
|
|
RwV3d *v0, RwV3d *v1, RwV3d *v2,
|
|
RwReal *distance);
|
|
|
|
/* Sphere intersections */
|
|
extern RwBool
|
|
RtIntersectionSphereTriangle(RwSphere *sphere,
|
|
RwV3d *v0, RwV3d *v1, RwV3d *v2,
|
|
RwV3d *normal,
|
|
RwReal *distance);
|
|
|
|
/* BBox intersections */
|
|
extern RwBool
|
|
RtIntersectionBBoxTriangle(RwBBox *bbox, RwV3d *v0, RwV3d *v1, RwV3d *v2);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
/* RWPUBLICEND */
|
|
|
|
#endif /* RTINTSEC_H */
|