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