diff options
Diffstat (limited to 'sdk/rwsdk/include/d3d8/rpcollis.h')
-rw-r--r-- | sdk/rwsdk/include/d3d8/rpcollis.h | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/sdk/rwsdk/include/d3d8/rpcollis.h b/sdk/rwsdk/include/d3d8/rpcollis.h new file mode 100644 index 00000000..23e67f35 --- /dev/null +++ b/sdk/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 collisiondetection + * + * 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; + +typedef union RpIntersectData RpIntersectData; +/** + * \ingroup rpcollis + * RpIntersectData, this union type is used to specify the parameters + * for an intersection primitive of the desired type (\ref RpIntersectType) + */ +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 + * \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. + * + * \note The memory pointed to by collTriangle is stored on the stack. + * This memory should be considered volatile. To use this data outside + * of the iterator, copy the contents. + * + * \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 + * \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 + * \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 + * \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 */ + |