| /*!**************************************************************************** |
| |
| @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) |
| *****************************************************************************/ |
| |