| /*!**************************************************************************** | |
| @file PVRTShadowVol.h | |
| @copyright Copyright (c) Imagination Technologies Limited. | |
| @brief Declarations of functions relating to shadow volume generation. | |
| ******************************************************************************/ | |
| #ifndef _PVRTSHADOWVOL_H_ | |
| #define _PVRTSHADOWVOL_H_ | |
| #include "PVRTContext.h" | |
| #include "PVRTVector.h" | |
| /**************************************************************************** | |
| ** Defines | |
| ****************************************************************************/ | |
| #define PVRTSHADOWVOLUME_VISIBLE 0x00000001 | |
| #define PVRTSHADOWVOLUME_NEED_CAP_FRONT 0x00000002 | |
| #define PVRTSHADOWVOLUME_NEED_CAP_BACK 0x00000004 | |
| #define PVRTSHADOWVOLUME_NEED_ZFAIL 0x00000008 | |
| /**************************************************************************** | |
| ** Structures | |
| ****************************************************************************/ | |
| /*!*********************************************************************** | |
| @brief Edge to form part of a shadow volume mesh. | |
| *************************************************************************/ | |
| struct PVRTShadowVolMEdge { | |
| unsigned short wV0, wV1; /*!< Indices of the vertices of the edge */ | |
| int nVis; /*!< Bit0 = Visible, Bit1 = Hidden, Bit2 = Reverse Winding */ | |
| }; | |
| /*!*********************************************************************** | |
| @brief Triangle to form part of a shadow volume mesh. | |
| *************************************************************************/ | |
| struct PVRTShadowVolMTriangle { | |
| unsigned short w[3]; /*!< Source indices of the triangle */ | |
| unsigned int wE0, wE1, wE2; /*!< Indices of the edges of the triangle */ | |
| PVRTVECTOR3 vNormal; /*!< Triangle normal */ | |
| int nWinding; /*!< BitN = Correct winding for edge N */ | |
| }; | |
| /*!*********************************************************************** | |
| @brief Shadow volume mesh. | |
| *************************************************************************/ | |
| struct PVRTShadowVolShadowMesh { | |
| PVRTVECTOR3 *pV; /*!< Unique vertices in object space */ | |
| PVRTShadowVolMEdge *pE; /*!< Unique edges in object space */ | |
| PVRTShadowVolMTriangle *pT; /*!< Unique triangles in object space */ | |
| unsigned int nV; /*!< Vertex count */ | |
| unsigned int nE; /*!< Edge count */ | |
| unsigned int nT; /*!< Triangle count */ | |
| #ifdef BUILD_DX11 | |
| ID3D11Buffer *pivb; /*!< Two copies of the vertices */ | |
| #endif | |
| #if defined(BUILD_OGL) | |
| unsigned int pivb; /*!< Two copies of the vertices */ | |
| #endif | |
| #if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3) | |
| void *pivb; /*!< Two copies of the vertices */ | |
| #endif | |
| }; | |
| /*!*********************************************************************** | |
| @brief Renderable shadow-volume information. | |
| *************************************************************************/ | |
| struct PVRTShadowVolShadowVol { | |
| #ifdef BUILD_DX11 | |
| ID3D11Buffer *piib; /*!< Two copies of the vertices */ | |
| #endif | |
| #if defined(BUILD_OGL) | |
| unsigned int piib; | |
| #endif | |
| #if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3) | |
| unsigned short *piib; /*!< Indices to render the volume */ | |
| #endif | |
| unsigned int nIdxCnt; /*!< Number of indices in piib */ | |
| #ifdef _DEBUG | |
| unsigned int nIdxCntMax; /*!< Number of indices which can fit in piib */ | |
| #endif | |
| }; | |
| /**************************************************************************** | |
| ** Declarations | |
| ****************************************************************************/ | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshCreateMesh | |
| @param[in,out] psMesh The shadow volume mesh to populate | |
| @param[in] pVertex A list of vertices | |
| @param[in] nNumVertex The number of vertices | |
| @param[in] pFaces A list of faces | |
| @param[in] nNumFaces The number of faces | |
| @brief Creates a mesh format suitable for generating shadow volumes | |
| *************************************************************************/ | |
| void PVRTShadowVolMeshCreateMesh( | |
| PVRTShadowVolShadowMesh * const psMesh, | |
| const float * const pVertex, | |
| const unsigned int nNumVertex, | |
| const unsigned short * const pFaces, | |
| const unsigned int nNumFaces); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshInitMesh | |
| @param[in] psMesh The shadow volume mesh | |
| @param[in] pContext A struct for API specific data | |
| @return True on success | |
| @brief Init the mesh | |
| *************************************************************************/ | |
| bool PVRTShadowVolMeshInitMesh( | |
| PVRTShadowVolShadowMesh * const psMesh, | |
| const SPVRTContext * const pContext); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshInitVol | |
| @param[in,out] psVol The shadow volume struct | |
| @param[in] psMesh The shadow volume mesh | |
| @param[in] pContext A struct for API specific data | |
| @return True on success | |
| @brief Init the renderable shadow volume information. | |
| *************************************************************************/ | |
| bool PVRTShadowVolMeshInitVol( | |
| PVRTShadowVolShadowVol * const psVol, | |
| const PVRTShadowVolShadowMesh * const psMesh, | |
| const SPVRTContext * const pContext); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshDestroyMesh | |
| @param[in] psMesh The shadow volume mesh to destroy | |
| @brief Destroys all shadow volume mesh data created by PVRTShadowVolMeshCreateMesh | |
| *************************************************************************/ | |
| void PVRTShadowVolMeshDestroyMesh( | |
| PVRTShadowVolShadowMesh * const psMesh); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshReleaseMesh | |
| @param[in] psMesh The shadow volume mesh to release | |
| @brief Releases all shadow volume mesh data created by PVRTShadowVolMeshInitMesh | |
| *************************************************************************/ | |
| void PVRTShadowVolMeshReleaseMesh( | |
| PVRTShadowVolShadowMesh * const psMesh, | |
| SPVRTContext * const psContext=NULL); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolMeshReleaseVol | |
| @param[in] psVol The shadow volume information to release | |
| @brief Releases all data create by PVRTShadowVolMeshInitVol | |
| *************************************************************************/ | |
| void PVRTShadowVolMeshReleaseVol( | |
| PVRTShadowVolShadowVol * const psVol, | |
| SPVRTContext * const psContext=NULL); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolSilhouetteProjectedBuild | |
| @param[in,out] psVol The shadow volume information | |
| @param[in] dwVisFlags Shadow volume creation flags | |
| @param[in] psMesh The shadow volume mesh | |
| @param[in] pvLightModel The light position/direction | |
| @param[in] bPointLight Is the light a point light | |
| @param[in] pContext A struct for passing in API specific data | |
| @brief Using the light set up the shadow volume so it can be extruded. | |
| *************************************************************************/ | |
| void PVRTShadowVolSilhouetteProjectedBuild( | |
| PVRTShadowVolShadowVol * const psVol, | |
| const unsigned int dwVisFlags, | |
| const PVRTShadowVolShadowMesh * const psMesh, | |
| const PVRTVECTOR3 * const pvLightModel, | |
| const bool bPointLight, | |
| const SPVRTContext * const pContext = 0); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolSilhouetteProjectedBuild | |
| @param[in,out] psVol The shadow volume information | |
| @param[in] dwVisFlags Shadow volume creation flags | |
| @param[in] psMesh The shadow volume mesh | |
| @param[in] pvLightModel The light position/direction | |
| @param[in] bPointLight Is the light a point light | |
| @param[in] pContext A struct for passing in API specific data | |
| @brief Using the light set up the shadow volume so it can be extruded. | |
| *************************************************************************/ | |
| void PVRTShadowVolSilhouetteProjectedBuild( | |
| PVRTShadowVolShadowVol * const psVol, | |
| const unsigned int dwVisFlags, | |
| const PVRTShadowVolShadowMesh * const psMesh, | |
| const PVRTVec3 * const pvLightModel, | |
| const bool bPointLight, | |
| const SPVRTContext * const pContext = 0); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolBoundingBoxExtrude | |
| @param[in,out] pvExtrudedCube 8 Vertices to represent the extruded box | |
| @param[in] pBoundingBox The bounding box to extrude | |
| @param[in] pvLightMdl The light position/direction | |
| @param[in] bPointLight Is the light a point light | |
| @param[in] fVolLength The length the volume has been extruded by | |
| @brief Extrudes the bounding box of the volume | |
| *************************************************************************/ | |
| void PVRTShadowVolBoundingBoxExtrude( | |
| PVRTVECTOR3 * const pvExtrudedCube, | |
| const PVRTBOUNDINGBOX * const pBoundingBox, | |
| const PVRTVECTOR3 * const pvLightMdl, | |
| const bool bPointLight, | |
| const float fVolLength); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolBoundingBoxIsVisible | |
| @param[in,out] pdwVisFlags Visibility flags | |
| @param[in] bObVisible Is the object visible? Unused set to true | |
| @param[in] bNeedsZClipping Does the object require Z clipping? Unused set to true | |
| @param[in] pBoundingBox The volumes bounding box | |
| @param[in] pmTrans The projection matrix | |
| @param[in] pvLightMdl The light position/direction | |
| @param[in] bPointLight Is the light a point light | |
| @param[in] fCamZProj The camera's z projection value | |
| @param[in] fVolLength The length the volume is extruded by | |
| @brief Determines if the volume is visible and if it needs caps | |
| *************************************************************************/ | |
| void PVRTShadowVolBoundingBoxIsVisible( | |
| unsigned int * const pdwVisFlags, | |
| const bool bObVisible, | |
| const bool bNeedsZClipping, | |
| const PVRTBOUNDINGBOX * const pBoundingBox, | |
| const PVRTMATRIX * const pmTrans, | |
| const PVRTVECTOR3 * const pvLightMdl, | |
| const bool bPointLight, | |
| const float fCamZProj, | |
| const float fVolLength); | |
| /*!*********************************************************************** | |
| @fn PVRTShadowVolSilhouetteProjectedRender | |
| @param[in] psMesh Shadow volume mesh | |
| @param[in] psVol Renderable shadow volume information | |
| @param[in] pContext A struct for passing in API specific data | |
| @brief Draws the shadow volume | |
| *************************************************************************/ | |
| int PVRTShadowVolSilhouetteProjectedRender( | |
| const PVRTShadowVolShadowMesh * const psMesh, | |
| const PVRTShadowVolShadowVol * const psVol, | |
| const SPVRTContext * const pContext); | |
| #endif /* _PVRTSHADOWVOL_H_ */ | |
| /***************************************************************************** | |
| End of file (PVRTShadowVol.h) | |
| *****************************************************************************/ | |