summaryrefslogtreecommitdiffstats
path: root/rwsdk/include/d3d8/rpcollis.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rwsdk/include/d3d8/rpcollis.h372
1 files changed, 372 insertions, 0 deletions
diff --git a/rwsdk/include/d3d8/rpcollis.h b/rwsdk/include/d3d8/rpcollis.h
new file mode 100644
index 00000000..908fb68e
--- /dev/null
+++ b/rwsdk/include/d3d8/rpcollis.h
@@ -0,0 +1,372 @@
+
+/*****************************************************************************
+ *
+ * File : rpcollis.h
+ *
+ * Abstract : World collision plugin for Renderware.
+ *
+ *****************************************************************************
+ *
+ * This file is a product of Criterion Software Ltd.
+ *
+ * This file is provided as is with no warranties of any kind and is
+ * provided without any obligation on Criterion Software Ltd. or
+ * Canon Inc. to assist in its use or modification.
+ *
+ * Criterion Software Ltd. will not, under any
+ * circumstances, be liable for any lost revenue or other damages arising
+ * from the use of this file.
+ *
+ * Copyright (c) 2000 Criterion Software Ltd.
+ * All Rights Reserved.
+ *
+ * RenderWare is a trademark of Canon Inc.
+ *
+ *****************************************************************************/
+
+#ifndef RPCOLLIS_H
+#define RPCOLLIS_H
+
+/* Doxygen plugin groups. */
+
+/**
+ * \defgroup rpcollis RpCollision
+ * \ingroup rpplugin
+ *
+ * Collision Plugin for RenderWare Graphics.
+ */
+
+/******************************************************************************
+ * Include files
+ */
+
+#include <rwcore.h>
+#include <rpworld.h>
+
+#include "rpcollis.rpe" /* automatically generated header file */
+
+/******************************************************************************
+ * Global Types
+ */
+
+/**
+ * \ingroup rpcollis
+ * RpIntersectType, this type represents the different types of
+ * primitives that can be used to intersect with an object (for example, see
+ * \ref RpCollisionWorldForAllIntersections):
+ */
+enum RpIntersectType
+{
+ rpINTERSECTNONE = 0,
+ rpINTERSECTLINE, /**<Line Intersection */
+ rpINTERSECTPOINT, /**<Point Intersection */
+ rpINTERSECTSPHERE, /**<Sphere Intersection */
+ rpINTERSECTBOX, /**<Box intersection */
+ rpINTERSECTATOMIC, /**<Atomic Intersection based on bounding sphere */
+ rpINTERSECTTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RpIntersectType RpIntersectType;
+
+/**
+ * \ingroup rpcollis
+ * RpIntersectData, this union type is used to specify the parameters
+ * for an intersection primitive of the desired type (\ref RpIntersectType)
+ */
+typedef union RpIntersectData RpIntersectData;
+union RpIntersectData
+{
+ RwLine line; /**<For type rpINTERSECTLINE */
+ RwV3d point; /**<For type rpINTERSECTPOINT */
+ RwSphere sphere; /**<For type rpINTERSECTSPHERE */
+ RwBBox box; /**<For type rpINTERSECTBOX */
+ void *object; /**<For type rpINTERSECTATOMIC - this
+ * should hold a pointer to the atomic */
+};
+
+typedef struct RpIntersection RpIntersection;
+/**
+ * \ingroup rpcollis
+ * \struct RpIntersection
+ * Intersection Object. This type represents data for an
+ * intersection primitive. It specifies the intersection type
+ * (line, sphere, etc.) (type) and parameters describing the given type (t):
+ */
+struct RpIntersection
+{
+ RpIntersectData t; /**< Intersection data. Union type - one
+ * of line, point, sphere or RW object */
+ RpIntersectType type; /**< Intersection type - see
+ * \ref RpIntersectType */
+};
+
+typedef struct RpCollisionTriangle RpCollisionTriangle;
+/**
+ * \ingroup rpcollis
+ * \struct RpCollisionTriangle
+ * A structure representing a collision between
+ * an \ref RpIntersection primitive and a triangle.
+ * The collision is specified by the triangle's plane normal
+ * (normal), the first triangle vertex (point), an index to the triangle in
+ * the object geometry's triangle list (index) and the positions of the
+ * triangle's vertices (vertices). Note all vector components are in object
+ * space.
+ *
+ * \see RpCollisionWorldForAllIntersections
+ * \see RpCollisionGeometryForAllIntersections
+ * \see RpAtomicForAllIntersections
+ * \see RpIntersectionCallBackWorldTriangle
+ * \see RpIntersectionCallBackGeometryTriangle
+ */
+struct RpCollisionTriangle
+{
+ RwV3d normal; /**< Triangle normal */
+ RwV3d point; /**< First triangle vertex */
+ RwInt32 index; /**< Index of triangle in object (if applicable) */
+ RwV3d *vertices[3]; /**< Pointers to three triangle vertices */
+};
+
+typedef struct RpCollisionBuildParam RpCollisionBuildParam;
+/**
+ * \ingroup rpcollis
+ * \struct RpCollisionBuildParam
+ * This structure is a place-holder for parameters that may be
+ * introduced in future to control the generation of collision data when using
+ * the functions \ref RpCollisionWorldSectorBuildData,
+ * \ref RpCollisionWorldBuildData or \ref RpCollisionGeometryBuildData.
+ * Currently, a NULL pointer should be passed to these functions, as no
+ * parameters are defined. If parameters are introduced, a NULL pointer will
+ * indicate that default values should be used.
+ */
+struct RpCollisionBuildParam
+{
+ RwInt32 dummy; /**< Not used */
+};
+
+/**
+ * \ingroup rpcollis
+ * \typedef RpIntersectionCallBackWorldTriangle
+ * \ref RpIntersectionCallBackWorldTriangle represents the function called
+ * from \ref RpCollisionWorldForAllIntersections for all intersections between
+ * the specified primitive and the static geometry in a given world. This
+ * function should return a pointer to the current collision triangle to
+ * indicate success. The callback may return NULL to terminate further
+ * callbacks on the world.
+ *
+ * \param intersection Pointer to the intersection primitive.
+ * \param sector Pointer to the world sector containing the triangle.
+ * \param collTriangle Pointer to the \ref RpCollisionTriangle representing
+ * the triangle in the world's static geometry that is intersected.
+ * \param distance The distance to the intersection point(s).
+ * Note that the distance returned depends on the intersection type and is
+ * normalized for the given intersection primitive.
+ * \li rpINTERSECTLINE Distance from start of line to collision
+ * triangle, normalized to length of line.
+ * \li rpINTERSECTSPHERE Distance of sphere's center from the collision
+ * triangle along the direction of the normal, and normalized
+ * to the sphere's radius (may be negative if the sphere center
+ * is behind the triangle's plane with respect to the direction
+ * of the normal).
+ * \li rpINTERSECTBOX Distance is undefined.
+ * \li rpINTERSECTATOMIC Distance of atomic's bounding-sphere center
+ * from the collision triangle along the direction of the normal
+ * and normalized to sphere's radius.
+ * \param data User defined data pointer
+ *
+ * \return Pointer to the current collision triangle.
+ */
+typedef RpCollisionTriangle *(*RpIntersectionCallBackWorldTriangle)
+ (RpIntersection * intersection,
+ RpWorldSector * sector,
+ RpCollisionTriangle * collTriangle, RwReal distance, void *data);
+
+/**
+ * \ingroup rpcollis
+ * \typedef RpIntersectionCallBackAtomic
+ * \ref RpIntersectionCallBackAtomic represents the function called from
+ * \ref RpWorldForAllAtomicIntersections for all intersections between the
+ * specified primitive and collision atomics in a given world. This function
+ * should return the current atomic to indicate success. The callback may
+ * return NULL to terminate further callbacks on the world.
+ *
+ * \param intersection Pointer to the intersection primitive.
+ * \param sector Pointer to the world sector containing
+ * the intersected triangles.
+ * \param atomic Pointer to the intersected atomic.
+ * \param distance The collision distance. The distance returned
+ * depends on the intersection type which is defined in \ref RpIntersectType.
+ * \li rpINTERSECTPOINT Distance of point from atomic's bounding
+ * sphere center, normalized to sphere's radius.
+ * \li rpINTERSECTLINE Distance of atomic's bounding-sphere center from
+ * start of line, projected onto the line, normalized to length of line.
+ * Note that by this definition, if the line starts or ends inside the
+ * sphere, this distance maybe negative or greater than one.
+ * \li rpINTERSECTSPHERE Distance of atomic's bounding-sphere center
+ * from sphere's center, normalized to sum of spheres' radii.
+ * \li rpINTERSECTBOX Distance undefined.
+ * \li rpINTERSECTATOMIC Distance between atomics' bounding-sphere
+ * centers, normalized to sum of spheres' radii.
+ * \param data User defined data pointer.
+ *
+ * \return Pointer to the current atomic.
+ */
+typedef RpAtomic *(*RpIntersectionCallBackAtomic)
+ (RpIntersection * intersection,
+ RpWorldSector * sector, RpAtomic * atomic, RwReal distance, void *data);
+
+/**
+ * \ingroup rpcollis
+ * \typedef RpIntersectionCallBackWorldSector
+ * \ref RpIntersectionCallBackWorldSector represents the function called from
+ * \ref RpWorldForAllWorldSectorIntersections for all intersections between the
+ * specified primitive and world sectors in a given world. This function should
+ * return the current world sector to indicate success. The callback may return
+ * NULL to terminate further callbacks on the world.
+ *
+ * \param intersection Pointer to the intersection primitive.
+ * \param sector Pointer to the world sector containing the intersected
+ * polygons.
+ * \param data User defined data pointer
+ *
+ * \return Pointer to the current world sector.
+ */
+typedef RpWorldSector *(*RpIntersectionCallBackWorldSector)
+ (RpIntersection * intersection, RpWorldSector * worldSector, void *data);
+
+/**
+ * \ingroup rpcollis
+ * \typedef RpIntersectionCallBackGeometryTriangle
+ * \ref RpIntersectionCallBackGeometryTriangle represents the function called
+ * from \ref RpAtomicForAllIntersections and
+ * \ref RpCollisionGeometryForAllIntersections
+ * for all intersections between the specified primitive and a given atomic.
+ * This function should return a pointer to the current collision triangle to
+ * indicate success. The callback may return NULL to terminate further
+ * callbacks on the atomic.
+ *
+ * Note that the vertices and normal of the collision triangle are given
+ * in the coordinate space of the geometry. If they are required in world
+ * coordinates, they must be transformed using \ref RwV3dTransformPoints and
+ * \ref RwV3dTransformVectors with the LTM of the atomic's frame. This must
+ * be passed via the user-defined data if required.
+ *
+ * \param intersection Pointer to the intersection primitive.
+ * \param collTri Pointer to the \ref RpCollisionTriangle
+ * representing the triangle in the atomic that is intersected.
+ * \param distance The distance to the intersection point(s).
+ * Note that the distance returned depends on the intersection type and is
+ * normalized for the given intersection primitive.
+ * \li rpINTERSECTLINE Distance from start of line to collision
+ * triangle, normalized to length of line.
+ * \li rpINTERSECTSPHERE Distance of sphere's center from the collision
+ * triangle along the direction of the normal, and normalized
+ * to the sphere's radius (may be negative if the sphere center
+ * is behind the triangle's plane with respect to the direction
+ * of the normal).
+ * \li rpINTERSECTATOMIC Distance of atomic's bounding-sphere center
+ * from the collision triangle along the direction of the normal, and
+ * normalized to sphere's radius.
+ * \param data User defined data pointer
+ *
+ * \return Pointer to the current collision triangle.
+ */
+typedef RpCollisionTriangle *(*RpIntersectionCallBackGeometryTriangle)
+ (RpIntersection *intersection, RpCollisionTriangle *collTriangle,
+ RwReal distance, void *data);
+
+
+/******************************************************************************
+ * Plugin API Functions
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Plugin attachment */
+extern RwBool
+RpCollisionPluginAttach(void);
+
+/* World collisions */
+extern RpWorldSector *
+RpCollisionWorldSectorBuildData(
+ RpWorldSector *worldSector,
+ RpCollisionBuildParam *param);
+
+extern RpWorldSector *
+RpCollisionWorldSectorDestroyData(
+ RpWorldSector *worldSector);
+
+extern RwBool
+RpCollisionWorldSectorQueryData(
+ RpWorldSector *worldSector);
+
+extern RpWorld *
+RpCollisionWorldBuildData(
+ RpWorld *world,
+ RpCollisionBuildParam *param);
+
+extern RpWorld *
+RpCollisionWorldDestroyData(
+ RpWorld *world);
+
+extern RwBool
+RpCollisionWorldQueryData(
+ RpWorld *world);
+
+
+extern RpWorld *
+RpWorldForAllWorldSectorIntersections(
+ RpWorld *world,
+ RpIntersection *intersection,
+ RpIntersectionCallBackWorldSector callBack,
+ void *data);
+
+extern RpWorld *
+RpWorldForAllAtomicIntersections(
+ RpWorld *world,
+ RpIntersection *intersection,
+ RpIntersectionCallBackAtomic callBack,
+ void *data);
+
+extern RpWorld *
+RpCollisionWorldForAllIntersections(
+ RpWorld *world,
+ RpIntersection *intersection,
+ RpIntersectionCallBackWorldTriangle callBack,
+ void *data);
+
+/* Geometry and atomic collisions */
+extern RpGeometry *
+RpCollisionGeometryBuildData(
+ RpGeometry *geometry,
+ RpCollisionBuildParam *param);
+
+extern RwBool
+RpCollisionGeometryQueryData(
+ RpGeometry *geometry);
+
+extern RpGeometry *
+RpCollisionGeometryDestroyData(
+ RpGeometry *geometry);
+
+extern RpGeometry *
+RpCollisionGeometryForAllIntersections(
+ RpGeometry *geometry,
+ RpIntersection *intersection,
+ RpIntersectionCallBackGeometryTriangle callBack,
+ void *data);
+
+extern RpAtomic *
+RpAtomicForAllIntersections(
+ RpAtomic *atomic,
+ RpIntersection *intersection,
+ RpIntersectionCallBackGeometryTriangle callBack,
+ void *data);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* RPCOLLIS_H */
+