summaryrefslogtreecommitdiffstats
path: root/rwsdk/include/d3d8/rppatch.h
diff options
context:
space:
mode:
Diffstat (limited to 'rwsdk/include/d3d8/rppatch.h')
-rw-r--r--rwsdk/include/d3d8/rppatch.h683
1 files changed, 683 insertions, 0 deletions
diff --git a/rwsdk/include/d3d8/rppatch.h b/rwsdk/include/d3d8/rppatch.h
new file mode 100644
index 00000000..eb80663f
--- /dev/null
+++ b/rwsdk/include/d3d8/rppatch.h
@@ -0,0 +1,683 @@
+
+#ifndef RPPATCH_H
+#define RPPATCH_H
+
+/**
+ * \defgroup rppatch RpPatch
+ * \ingroup rpplugin
+ *
+ * Bezier patch library
+ *
+ * This library provides efficient evaluation of patches.
+ */
+
+/*===========================================================================*
+ *--- Include files ---------------------------------------------------------*
+ *===========================================================================*/
+#include "rwcore.h"
+#include "rpworld.h"
+
+#include "rpcriter.h"
+#include "rppatch.rpe"
+
+/*===========================================================================*
+ *--- Defines ---------------------------------------------------------------*
+ *===========================================================================*/
+
+/**
+ * \ingroup rppatch
+ * \def rpQUADPATCHNUMCONTROLPOINTS defines the number of control points in
+ * a quadrilateral patch.
+ *
+ * \see RpQuadPatch
+ * \see rpQUADPATCHNUMCONTROLINDICES
+ * \see RpPatchMeshSetQuadPatch
+ */
+#define rpQUADPATCHNUMCONTROLPOINTS (16)
+
+/**
+ * \ingroup rppatch
+ * \def rpTRIPATCHNUMCONTROLPOINTS defines the number of control points in
+ * a triangular patch.
+ *
+ * \see RpTriPatch
+ * \see rpTRIPATCHNUMCONTROLINDICES
+ * \see RpPatchMeshSetTriPatch
+ */
+#define rpTRIPATCHNUMCONTROLPOINTS (10)
+
+/**
+ * \ingroup rppatch
+ * \def rpQUADPATCHNUMCONTROLINDICES defines the number of control point
+ * indices in a \ref RpQuadPatch quadrilateral patch.
+ *
+ * \see rpQUADPATCHNUMCONTROLPOINTS
+ * \see RpPatchMeshSetQuadPatch
+ */
+#define rpQUADPATCHNUMCONTROLINDICES rpQUADPATCHNUMCONTROLPOINTS
+
+/**
+ * \ingroup rppatch
+ * \def rpTRIPATCHNUMCONTROLINDICES defines the number of control points
+ * indices in a \ref RpTriPatch triangular patch.
+ *
+ * \see rpTRIPATCHNUMCONTROLPOINTS
+ * \see RpPatchMeshSetTriPatch
+ */
+#define rpTRIPATCHNUMCONTROLINDICES rpTRIPATCHNUMCONTROLPOINTS
+
+/**
+ * \ingroup rppatch
+ * \def rpPATCHLODMAXVALUE defines the maximum value that can be returned for
+ * the patch evaluation LOD.
+ *
+ * \see rpPATCHSKINLODMAXVALUE
+ * \see rpPATCHLODMINVALUE
+ * \see RpPatchLODCallBack
+ */
+#define rpPATCHLODMAXVALUE (20)
+
+/**
+ * \ingroup rppatch
+ * \def rpPATCHSKINLODMAXVALUE defines the maximum value that can be returned
+ * for the skinned patch evaluation LOD.
+ *
+ * \see rpPATCHLODMAXVALUE
+ * \see rpPATCHLODMINVALUE
+ * \see RpPatchLODCallBack
+ */
+#define rpPATCHSKINLODMAXVALUE (18)
+
+/**
+ * \ingroup rppatch
+ * \def rpPATCHLODMINVALUE defines the minimum value that can be returned for
+ * the patch evaluation LOD.
+ *
+ * \see rpPATCHSKINLODMAXVALUE
+ * \see rpPATCHLODMAXVALUE
+ * \see RpPatchLODCallBack
+ */
+#define rpPATCHLODMINVALUE (4)
+
+/**
+ * \ingroup rppatch
+ * \def rpPATCHMESHTEXCOORDSETS Multi texture coordinate format specifier
+ * for \ref RpPatchMeshCreate(). This should be OR'd into the
+ * \ref RpPatchMeshFlag .
+ */
+#define rpPATCHMESHTEXCOORDSETS(_num) \
+ ((_num & 0xff) << 16)
+
+/**
+ * \ingroup rppatch
+ * \def rpPATCHMESHLOCKTEXCOORDSIDX
+ * Convenience macro for generating a texture coordinate lock flag.
+ */
+#define rpPATCHMESHLOCKTEXCOORDSIDX(_idx) \
+ (rpPATCHMESHLOCKTEXCOORDS1 << (_idx))
+
+/*===========================================================================*
+ *--- Global Types ----------------------------------------------------------*
+ *===========================================================================*/
+
+/**
+ * \ingroup rppatch
+ * \ref RpPatchMeshFlag
+ * When creating a \ref RpPatchMesh, these flags can be OR'ed together to
+ * specify the format along with the \ref rpPATCHMESHTEXCOORDSETS (n) macro
+ * to specify the number of texture coordinate sets required.
+ *
+ * \see RpPatchMeshCreate
+ */
+enum RpPatchMeshFlag
+{
+ rpNAPATCHMESHFLAG = 0,
+ rpPATCHMESHPOSITIONS = 0x01, /**<Patch mesh contains control point
+ positions. */
+ rpPATCHMESHNORMALS = 0x02, /**<Patch mesh contains control point
+ normals. */
+ rpPATCHMESHPRELIGHTS = 0x04, /**<Patch mesh contains control point
+ pre-light color values. */
+ rpPATCHMESHTEXTURED = 0x08, /**<Patch mesh is textured. The number
+ of texture sets must also be
+ defined. */
+ rpPATCHMESHLIGHT = 0x10, /**<Patch mesh will be lit. */
+ rpPATCHMESHMODULATEMATERIALCOLOR = 0x20,
+ /**<Control point color will be
+ modulated with the material color. */
+ rpPATCHMESHSMOOTHNORMALS = 0x40,
+ /**<Patch mesh normals will be
+ smoothed automatically. */
+ rpPATCHMESHFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RpPatchMeshFlag RpPatchMeshFlag;
+
+/**
+ * \ingroup rppatch
+ * \ref RpPatchMeshLockMode patch mesh lock flags.
+ *
+ * \see rpPATCHMESHLOCKTEXCOORDSIDX
+ */
+enum RpPatchMeshLockMode
+{
+ rpNAPATCHMESHLOCKMODE = 0,
+ rpPATCHMESHLOCKPATCHES = 0x0001, /**<Lock the mesh patches. */
+ rpPATCHMESHLOCKPOSITIONS = 0x0002, /**<Lock the control point
+ positions. */
+ rpPATCHMESHLOCKNORMALS = 0x0004, /**<Lock the control point
+ normals. */
+ rpPATCHMESHLOCKPRELIGHTS = 0x0008, /**<Lock the control point
+ pre-light color values. */
+ rpPATCHMESHLOCKTEXCOORDS1 = 0x0100, /**<Lock the texture coordinates
+ set 1. */
+ rpPATCHMESHLOCKTEXCOORDS2 = 0x0200, /**<Lock the texture coordinates
+ set 2. */
+ rpPATCHMESHLOCKTEXCOORDS3 = 0x0400, /**<Lock the texture coordinates
+ set 3. */
+ rpPATCHMESHLOCKTEXCOORDS4 = 0x0800, /**<Lock the texture coordinates
+ set 4. */
+ rpPATCHMESHLOCKTEXCOORDS5 = 0x1000, /**<Lock the texture coordinates
+ set 5. */
+ rpPATCHMESHLOCKTEXCOORDS6 = 0x2000, /**<Lock the texture coordinates
+ set 6. */
+ rpPATCHMESHLOCKTEXCOORDS7 = 0x4000, /**<Lock the texture coordinates
+ set 7. */
+ rpPATCHMESHLOCKTEXCOORDS8 = 0x8000, /**<Lock the texture coordinates
+ set 8. */
+ rpPATCHMESHLOCKTEXCOORDSALL = 0xff00, /**<Lock all texture coordinate
+ sets. */
+ rpPATCHMESHLOCKALL = 0xffff, /**<Combination of all the
+ above. */
+ rpPATCHMESHLOCKMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RpPatchMeshLockMode RpPatchMeshLockMode;
+
+typedef struct RpPatchMeshDefinition RpPatchMeshDefinition;
+/**
+ * \ingroup rppatch
+ * \struct RpPatchMeshDefinition
+ * holds the definition sizes of the patch mesh. This data should be considered
+ * read only.
+ */
+struct RpPatchMeshDefinition
+{
+ RwUInt32 flag; /**<Patch mesh definition flag. */
+ RwUInt32 numControlPoints; /**<Number of control points. */
+ RwUInt32 numTriPatches; /**<Number of tri patches. */
+ RwUInt32 numQuadPatches; /**<Number of quad patches. */
+ RwUInt32 numTexCoordSets; /**<Number of sets of texture coordinates. */
+};
+
+typedef struct RpPatchMesh RpPatchMesh;
+/**
+ * \ingroup rppatch
+ * \struct RpPatchMesh
+ * holds the control point data for a patch mesh. The patch mesh should be
+ * created with \ref RpPatchMeshCreate. The patch mesh should be locked with
+ * \ref RpPatchMeshLock before the data is edited. Quadrilateral and triangle
+ * patches can be defined from the control points with
+ * \ref RpPatchMeshSetQuadPatch and \ref RpPatchMeshSetTriPatch respectively.
+ * The patch mesh should be unlocked with \ref RpPatchMeshUnlock before it is
+ * added to an \ref RpAtomic with \ref RpPatchAtomicSetPatchMesh.
+ *
+ * \see RpPatchMesDefinition
+ */
+struct RpPatchMesh
+{
+ RwV3d *positions; /**<Control point positions. */
+ RwV3d *normals; /**<Control point normals. */
+ RwRGBA *preLightColors; /**<Control point pre-light colors. */
+ RwTexCoords *texCoords[rwMAXTEXTURECOORDS];
+ /**<Control point texture coordinates. */
+ RpPatchMeshDefinition definition; /**<Patch mesh definition data. */
+};
+
+typedef struct RpQuadPatch RpQuadPatch;
+/**
+ * \ingroup rppatch
+ * \struct RpQuadPatch
+ * holds the control point indices for a quadrilateral patch. There are
+ * \ref rpQUADPATCHNUMCONTROLINDICES indices for a quadrilateral patch.
+ *
+ * \see RpPatchMeshSetQuadPatch
+ */
+struct RpQuadPatch
+{
+ RwUInt32 cpIndices[rpQUADPATCHNUMCONTROLINDICES]; /**<Control point
+ indices. */
+};
+
+typedef struct RpTriPatch RpTriPatch;
+/**
+ * \ingroup rppatch
+ * \struct RpTriPatch
+ * holds the control point indices for a triangle patch. There are
+ * \ref rpTRIPATCHNUMCONTROLINDICES indices for a triangular patch.
+ *
+ * \see RpPatchMeshSetTriPatch
+ */
+struct RpTriPatch
+{
+ RwUInt32 cpIndices[rpTRIPATCHNUMCONTROLINDICES]; /**<Control point
+ indices. */
+};
+
+typedef struct RpPatchLODRange RpPatchLODRange;
+/**
+ * \ingroup rppatch
+ * \struct RpPatchLODRange
+ * holds the variables used by the default atomic LOD call back function.
+ */
+struct RpPatchLODRange
+{
+ RwUInt32 minLod; /**<Minimum LOD value. */
+ RwUInt32 maxLod; /**<Maximum LOD value. */
+ RwReal minRange; /**<Minimum LOD range. */
+ RwReal maxRange; /**<Maximum LOD range. */
+};
+
+/**
+ * \ingroup rppatch
+ * \typedef RpPatchLODUserData
+ * typedef for the user data passed to the \ref RpPatchLODCallBack
+ * function which calculates the atomics' LOD.
+ *
+ * \see RpPatchAtomicSetPatchLODCallBack
+ * \see RpPatchAtomicGetPatchLODCallBack
+ */
+typedef void *RpPatchLODUserData;
+
+/**
+ * \ingroup rppatch
+ * \typedef RpPatchLODCallBack
+ * typedef for the patch atomic LOD calculation function.
+ *
+ * \see RpPatchAtomicSetPatchLODCallBack
+ * \see RpPatchAtomicGetPatchLODCallBack
+ */
+typedef RwUInt32 (* RpPatchLODCallBack)( RpAtomic *atomic,
+ RpPatchLODUserData userData );
+
+/*===========================================================================*
+ *--- Plugin API Functions --------------------------------------------------*
+ *===========================================================================*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/*---------------------------------------------------------------------------*
+ *- Plugin functions -*
+ *---------------------------------------------------------------------------*/
+extern RwBool
+RpPatchPluginAttach(void);
+
+/*---------------------------------------------------------------------------*
+ *- Patch Mesh functions -*
+ *---------------------------------------------------------------------------*/
+extern RpPatchMesh *
+RpPatchMeshCreate( RwUInt32 numQuadPatches,
+ RwUInt32 numTriPatches,
+ RwUInt32 numControlPoints,
+ RwUInt32 definitionFlag );
+
+extern RwBool
+RpPatchMeshDestroy( RpPatchMesh *patchMesh );
+
+extern RpPatchMesh *
+RpPatchMeshLock( RpPatchMesh *patchMesh,
+ RwUInt32 lockMode );
+
+extern RpPatchMesh *
+RpPatchMeshUnlock( RpPatchMesh *patchMesh );
+
+/*---------------------------------------------------------------------------*
+ *- Patch mesh helper functions -*
+ *---------------------------------------------------------------------------*/
+
+extern RpPatchMesh *
+RpPatchMeshTransform( RpPatchMesh *patchMesh,
+ const RwMatrix *matrix );
+
+/*---------------------------------------------------------------------------*/
+#define RpPatchMeshGetFlagsMacro(patchMesh) \
+ (patchMesh->definition.flag)
+
+#define RpPatchMeshSetFlagsMacro(patchMesh, flags) \
+ (patchMesh->definition.flag = flags)
+
+#define RpPatchMeshGetNumControlPointsMacro(patchMesh) \
+ (patchMesh->definition.numControlPoints)
+
+#define RpPatchMeshGetNumTriPatchesMacro(patchMesh) \
+ (patchMesh->definition.numTriPatches)
+
+#define RpPatchMeshGetNumQuadPatchesMacro(patchMesh) \
+ (patchMesh->definition.numQuadPatches)
+
+#define RpPatchMeshGetNumTexCoordSetsMacro(patchMesh) \
+ (patchMesh->definition.numTexCoordSets)
+
+#define RpPatchMeshGetPositionsMacro(patchMesh) \
+ (patchMesh->positions)
+
+#define RpPatchMeshGetNormalsMacro(patchMesh) \
+ (patchMesh->normals)
+
+#define RpPatchMeshGetPreLightColorsMacro(patchMesh) \
+ (patchMesh->preLightColors)
+
+#define RpPatchMeshGetTexCoordsMacro(patchMesh, index) \
+ (patchMesh->texCoords[index - 1])
+/*---------------------------------------------------------------------------*/
+
+#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
+
+/*---------------------------------------------------------------------------*/
+extern RwUInt32
+RpPatchMeshGetFlags( const RpPatchMesh *patchMesh );
+
+extern RpPatchMesh *
+RpPatchMeshSetFlags( RpPatchMesh *patchMesh,
+ RwUInt32 flags );
+
+extern RwUInt32
+RpPatchMeshGetNumControlPoints( const RpPatchMesh *patchMesh );
+
+extern RwUInt32
+RpPatchMeshGetNumTriPatches( const RpPatchMesh *patchMesh );
+
+extern RwUInt32
+RpPatchMeshGetNumQuadPatches( const RpPatchMesh *patchMesh );
+
+extern RwUInt32
+RpPatchMeshGetNumTexCoordSets( const RpPatchMesh *patchMesh );
+
+extern RwV3d *
+RpPatchMeshGetPositions( const RpPatchMesh *patchMesh );
+
+extern RwV3d *
+RpPatchMeshGetNormals( const RpPatchMesh *patchMesh );
+
+extern RwRGBA *
+RpPatchMeshGetPreLightColors( const RpPatchMesh *patchMesh );
+
+extern RwTexCoords *
+RpPatchMeshGetTexCoords( const RpPatchMesh *patchMesh,
+ RwTextureCoordinateIndex index );
+/*---------------------------------------------------------------------------*/
+
+#else /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
+
+/*---------------------------------------------------------------------------*/
+#define RpPatchMeshGetFlags(patchMesh) \
+ RpPatchMeshGetFlagsMacro(patchMesh)
+
+#define RpPatchMeshSetFlags(patchMesh, flags) \
+ RpPatchMeshSetFlagsMacro(patchMesh, flags)
+
+#define RpPatchMeshGetNumControlPoints(patchMesh) \
+ RpPatchMeshGetNumControlPointsMacro(patchMesh)
+
+#define RpPatchMeshGetNumTriPatches(patchMesh) \
+ RpPatchMeshGetNumTriPatchesMacro(patchMesh)
+
+#define RpPatchMeshGetNumQuadPatches(patchMesh) \
+ RpPatchMeshGetNumQuadPatchesMacro(patchMesh)
+
+#define RpPatchMeshGetNumTexCoordSets(patchMesh) \
+ RpPatchMeshGetNumTexCoordSetsMacro(patchMesh)
+
+#define RpPatchMeshGetPositions(patchMesh) \
+ RpPatchMeshGetPositionsMacro(patchMesh)
+
+#define RpPatchMeshGetNormals(patchMesh) \
+ RpPatchMeshGetNormalsMacro(patchMesh)
+
+#define RpPatchMeshGetPreLightColors(patchMesh) \
+ RpPatchMeshGetPreLightColorsMacro(patchMesh)
+
+#define RpPatchMeshGetTexCoords(patchMesh, index) \
+ RpPatchMeshGetTexCoordsMacro(patchMesh, index)
+/*---------------------------------------------------------------------------*/
+
+#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
+
+/*---------------------------------------------------------------------------*
+ *- Patch streaming functions -*
+ *---------------------------------------------------------------------------*/
+extern RwUInt32
+RpPatchMeshStreamGetSize( const RpPatchMesh *patchMesh );
+
+extern RpPatchMesh *
+RpPatchMeshStreamRead( RwStream *stream );
+
+extern const RpPatchMesh *
+RpPatchMeshStreamWrite( const RpPatchMesh *patchMesh,
+ RwStream *stream );
+
+/*---------------------------------------------------------------------------*
+ *- Patch Mesh patch functions -*
+ *---------------------------------------------------------------------------*/
+extern RpPatchMesh *
+RpPatchMeshSetQuadPatch( RpPatchMesh *patchMesh,
+ RwUInt32 quadIndex,
+ RpQuadPatch *quadPatch );
+
+extern RpPatchMesh *
+RpPatchMeshSetTriPatch( RpPatchMesh *patchMesh,
+ RwUInt32 triIndex,
+ RpTriPatch *triPatch );
+
+extern const RpQuadPatch *
+RpPatchMeshGetQuadPatch( const RpPatchMesh *patchMesh,
+ RwUInt32 quadIndex );
+
+extern const RpTriPatch *
+RpPatchMeshGetTriPatch( const RpPatchMesh *patchMesh,
+ RwUInt32 triIndex );
+
+/*---------------------------------------------------------------------------*
+ *- Patch Mesh material functions -*
+ *---------------------------------------------------------------------------*/
+extern RpPatchMesh *
+RpPatchMeshSetQuadPatchMaterial( RpPatchMesh *patchMesh,
+ RwUInt32 quadIndex,
+ RpMaterial *material );
+
+extern RpPatchMesh *
+RpPatchMeshSetTriPatchMaterial( RpPatchMesh *patchMesh,
+ RwUInt32 triIndex,
+ RpMaterial *material );
+
+extern RpMaterial *
+RpPatchMeshGetQuadPatchMaterial( const RpPatchMesh *patchMesh,
+ RwUInt32 quadIndex );
+
+extern RpMaterial *
+RpPatchMeshGetTriPatchMaterial( const RpPatchMesh *patchMesh,
+ RwUInt32 triIndex );
+
+extern const RpPatchMesh *
+RpPatchMeshForAllMaterials( const RpPatchMesh *patchMesh,
+ RpMaterialCallBack callBack,
+ void *userData );
+
+extern RwUInt32
+RpPatchMeshGetNumMaterials( const RpPatchMesh *patchMesh );
+
+extern RpMaterial *
+RpPatchMeshGetMaterial( const RpPatchMesh *patchMesh,
+ RwUInt32 materialIndex );
+
+/*---------------------------------------------------------------------------*
+ *- Patch Skin functions -*
+ *---------------------------------------------------------------------------*/
+#if (defined(RPSKIN_H))
+
+extern RpSkin *
+RpPatchMeshGetSkin( RpPatchMesh *patchMesh );
+
+extern RpPatchMesh *
+RpPatchMeshSetSkin( RpPatchMesh *patchMesh,
+ RpSkin *skin );
+
+#endif /* (defined(RPSKIN_H)) */
+
+/*---------------------------------------------------------------------------*
+ *- Patch Atomic functions -*
+ *---------------------------------------------------------------------------*/
+extern RpAtomic *
+RpPatchAtomicSetPatchMesh( RpAtomic *atomic,
+ RpPatchMesh *patchMesh );
+
+extern RpPatchMesh *
+RpPatchAtomicGetPatchMesh( const RpAtomic *atomic );
+
+/*---------------------------------------------------------------------------*
+ *- Patch Atomic LOD functions -*
+ *---------------------------------------------------------------------------*/
+extern RwBool
+RpPatchAtomicSetPatchLODCallBack( RpAtomic *atomic,
+ RpPatchLODCallBack callback,
+ RpPatchLODUserData userData );
+
+extern RwBool
+RpPatchAtomicGetPatchLODCallBack( const RpAtomic *atomic,
+ RpPatchLODCallBack *callback,
+ RpPatchLODUserData *userData );
+
+/*---------------------------------------------------------------------------*
+ *- Patch default LOD range -*
+ *---------------------------------------------------------------------------*/
+extern RwBool
+RpPatchSetDefaultLODCallBackRange( RpPatchLODRange *lodRange );
+
+extern RwBool
+RpPatchGetDefaultLODCallBackRange( RpPatchLODRange *lodRange );
+
+/*---------------------------------------------------------------------------*
+ *- Patch pipeline -*
+ *---------------------------------------------------------------------------*/
+
+/**
+ * \ingroup rppatch
+ * \ref RpPatchType defines the different ways a patch atomic can be rendered.
+ * Once a \ref RpPatchMesh has been attached to an \ref RpAtomic with
+ * \ref RpPatchAtomicSetPatchMesh the atomic must be setup with the correct
+ * rendering pipeline with \ref RpPatchAtomicSetType .
+ *
+ * The patch plugin makes no assumptions about how to render the
+ * patch atomics. Once an \ref RpPatchMesh has been attached to an
+ * \ref RpAtomic it is necessary to attach a suitable patch
+ * rendering pipeline. The patch plugin supports four different
+ * rendering types, these are defined in the \ref RpPatchType
+ * enumeration:-
+ * \li \ref rpPATCHTYPEGENERIC
+ * The patch \ref RpAtomic will be rendered with the
+ * default generic patch rendering pipeline.
+ * \li \ref rpPATCHTYPESKIN
+ * The patch \ref RpAtomic will be rendered with a
+ * custom pipeline for rendering skinning patches. Make sure
+ * an \ref RpSkin has been attached to the \ref RpPatchMesh
+ * and an \ref RpHAnimHierarchy has been attached to the
+ * \ref RpAtomic.
+ * \li \ref rpPATCHTYPEMATFX
+ * The patch \ref RpAtomic will be rendered with a
+ * custom pipeline for rendering the material effects
+ * of patches. The
+ * patch matfx pipeline supports all the material effects
+ * defined in the \ref rpmatfx plugin. The patches
+ * materials should be setup as usual.
+ * \li \ref rpPATCHTYPESKINMATFX
+ * The patch \ref RpAtomic will be rendered with a
+ * custom skinned material effects patch rendering pipeline.
+ * The \ref RpPatchMesh, \ref RpAtomic and the patches'
+ * \ref RpMaterial's must be setup correctly.
+ */
+enum RpPatchType
+{
+ rpNAPATCHTYPE = 0, /**<Invalid patch pipeline. */
+ rpPATCHTYPEGENERIC = 1, /**<Generic patch rendering. */
+ rpPATCHTYPESKIN = 2, /**<Skinned patch rendering. */
+ rpPATCHTYPEMATFX = 3, /**<Material effects patch rendering. */
+ rpPATCHTYPESKINMATFX = 4, /**<Skinned material effects patch rendering. */
+ rpPATCHTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RpPatchType RpPatchType;
+
+extern RpAtomic *
+RpPatchAtomicSetType( RpAtomic *atomic,
+ RpPatchType type );
+
+extern RpPatchType
+RpPatchAtomicGetType( const RpAtomic *atomic );
+
+/*---------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/*---- start: ./d3d8/patchplatform.h----*/
+
+/**
+ * \defgroup rppatchd3d8 D3D8
+ * \ingroup rppatch
+ *
+ * D3D8 patch pipeline extension.
+ */
+
+
+/*===========================================================================*
+ *--- D3D8 Defines -----------------------------------------------------------*
+ *===========================================================================*/
+
+/*===========================================================================*
+ *--- D3D8 Global Types ------------------------------------------------------*
+ *===========================================================================*/
+
+/**
+ * \ingroup rppatchd3d8
+ * \ref RpPatchD3D8Pipeline rendering pipelines available within the
+ * \ref rppatch plugin. Use \ref RpPatchGetD3D8Pipeline to retrieve
+ * the \ref RxPipeline s.
+ */
+enum RpPatchD3D8Pipeline
+{
+ rpPATCHD3D8PIPELINEGENERIC = 0, /**<D3D8 generic
+ patch rendering pipeline. */
+ rpPATCHD3D8PIPELINEMATFX = 1, /**<D3D8 material effect
+ (single set of texture coordinates)
+ patch rendering pipeline. */
+ rpPATCHD3D8PIPELINESKINNED = 2, /**<D3D8 skinned
+ patch rendering pipeline. */
+ rpPATCHD3D8PIPELINESKINMATFX = 3, /**<D3D8 skinned material effect
+ (single set of texture coordinates)
+ patch rendering pipeline. */
+ rpPATCHD3D8PIPELINEMAX,
+ rpPATCHD3D8PIPELINEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RpPatchD3D8Pipeline RpPatchD3D8Pipeline;
+
+/*===========================================================================*
+ *--- D3D8 Plugin API Functions ----------------------------------------------*
+ *===========================================================================*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+/*---------------------------------------------------------------------------*/
+
+extern RxPipeline *
+RpPatchGetD3D8Pipeline( RpPatchD3D8Pipeline d3d8Pipeline );
+
+/*---------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/*---- end: ./d3d8/patchplatform.h----*/
+
+#endif /* RPPATCH_H */
+
+