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