summaryrefslogtreecommitdiffstats
path: root/rwsdk/include/d3d8/rtintsec.h
diff options
context:
space:
mode:
Diffstat (limited to 'rwsdk/include/d3d8/rtintsec.h')
-rw-r--r--rwsdk/include/d3d8/rtintsec.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/rwsdk/include/d3d8/rtintsec.h b/rwsdk/include/d3d8/rtintsec.h
new file mode 100644
index 00000000..cb482b17
--- /dev/null
+++ b/rwsdk/include/d3d8/rtintsec.h
@@ -0,0 +1,138 @@
+/***************************************************************************
+ * *
+ * 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 */