| /*!**************************************************************************** | 
 |  | 
 |  @file         OGLES2/PVRTPFXParserAPI.h | 
 |  @ingroup      API_OGLES2 | 
 |  @copyright    Copyright (c) Imagination Technologies Limited. | 
 |  @brief        Declaration of PFX file parser | 
 |  | 
 | ******************************************************************************/ | 
 |  | 
 | #ifndef _PVRTPFXPARSERAPI_H_ | 
 | #define _PVRTPFXPARSERAPI_H_ | 
 |  | 
 | /*! | 
 |  @addtogroup   API_OGLES2 | 
 |  @{ | 
 | */ | 
 |  | 
 | // Everything been documented in OGL/PVRTPFXParserAPI.h. This would cause documentation duplication in the | 
 | // current version of Doxygen. | 
 | #ifndef NO_DOXYGEN | 
 |  | 
 | #include "../PVRTError.h" | 
 |  | 
 | /**************************************************************************** | 
 | ** Structures | 
 | ****************************************************************************/ | 
 |  | 
 | /*!************************************************************************** | 
 |  @struct        SPVRTPFXUniformSemantic | 
 |  @brief         Struct to convert a semantic string to a number. | 
 |  @details       The application supplies an array of these so PVRTPFX can translate semantic strings to numbers | 
 | ****************************************************************************/ | 
 | struct SPVRTPFXUniformSemantic | 
 | { | 
 | 	const char		*p;	/*!< String containing semantic */ | 
 | 	unsigned int	n;	/*!< Application-defined semantic value */ | 
 | }; | 
 |  | 
 | /*!************************************************************************** | 
 |  @struct       SPVRTPFXUniform | 
 |  @brief        A struct containing GL uniform data. | 
 |  @details      PVRTPFX returns an array of these to indicate GL locations & semantics to the application  | 
 |  ***************************************************************************/ | 
 | struct SPVRTPFXUniform | 
 | { | 
 | 	unsigned int	nLocation;		/*!< GL location of the Uniform */ | 
 | 	unsigned int	nSemantic;		/*!< Application-defined semantic value */ | 
 | 	unsigned int	nIdx;			/*!< Index; for example two semantics might be LIGHTPOSITION0 and LIGHTPOSITION1 */ | 
 | 	CPVRTString		sValueName;		/*!< The name of the variable referenced in shader code */ | 
 | }; | 
 |  | 
 | /*!************************************************************************** | 
 |  @struct       SPVRTPFXTexture | 
 |  @brief        A texture data array.  | 
 |  @details      An array of these is gained from PVRTPFX so the application can fill in the texture handles | 
 |  ***************************************************************************/ | 
 | struct SPVRTPFXTexture | 
 | { | 
 | 	CPVRTStringHash		Name;	    /*!< texture name */ | 
 | 	GLuint				ui;		    /*!< Loaded texture handle */ | 
 | 	GLuint				unit;	    /*!< The bound texture unit */ | 
 | 	unsigned int		flags;	    /*!< Texture type i.e 2D, Cubemap */ | 
 | }; | 
 |  | 
 | /*!************************************************************************** | 
 |  @class        PVRTPFXEffectDelegate | 
 |  @brief        Receives callbacks for effects. | 
 |  ***************************************************************************/ | 
 | class PVRTPFXEffectDelegate | 
 | { | 
 | public: | 
 | 	virtual EPVRTError PVRTPFXOnLoadTexture(const CPVRTStringHash& TextureName, GLuint& uiHandle, unsigned int& uiFlags) = 0; /*!< Returns error if texture could not be loaded */ | 
 | 	virtual ~PVRTPFXEffectDelegate() { }  /*!< Destructor */ | 
 | }; | 
 |  | 
 | /*!************************************************************************** | 
 |  @class CPVRTPFXEffect | 
 |  @brief PFX effect | 
 | ****************************************************************************/ | 
 | class CPVRTPFXEffect | 
 | { | 
 | public: | 
 | 	/*!*************************************************************************** | 
 | 	@brief      		Sets the context to NULL and initialises the member variables to zero. | 
 | 	*****************************************************************************/ | 
 | 	CPVRTPFXEffect(); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief      		Sets the context and initialises the member variables to zero. | 
 | 	*****************************************************************************/ | 
 | 	CPVRTPFXEffect(SPVRTContext &sContext); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief      		Calls Destroy(). | 
 | 	*****************************************************************************/ | 
 | 	~CPVRTPFXEffect(); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Loads the specified effect from the CPVRTPFXParser object. | 
 | 						Compiles and links the shaders. Initialises texture data. | 
 | 	@param[in]			src					PFX Parser Object | 
 | 	@param[in]			pszEffect			Effect name | 
 | 	@param[in]			pszFileName			Effect file name | 
 | 	@param[in]			pDelegate			A delegate which will receive callbacks | 
 | 	@param[out]			uiUnknownUniforms	Number of unknown uniforms found | 
 | 	@param[out]			pReturnError		Error string | 
 | 	@return			    PVR_SUCCESS if load succeeded | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError Load(CPVRTPFXParser &src, const char * const pszEffect, const char * const pszFileName,  | 
 | 					PVRTPFXEffectDelegate* pDelegate, unsigned int& uiUnknownUniforms, CPVRTString *pReturnError); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Deletes the gl program object and texture data. | 
 | 	*****************************************************************************/ | 
 | 	void Destroy(); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Selects the gl program object and binds the textures. | 
 | 						If the render target texture for the current render pass is required | 
 | 						in this effect (and therefore cannot be sampled), | 
 | 						load the replacement texture instead. | 
 | 	@param[in]			i32RenderTextureId		The ID of the render target of the current task | 
 | 	@param[in]			ui32ReplacementTexture	The ID of the texture that should be used instead | 
 | 	@return			    EPVRTError				PVR_SUCCESS if activate succeeded | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError Activate(const int i32RenderTextureId=-1, const unsigned int ui32ReplacementTexture=0); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Gets the texture data array. | 
 | 	@return			    SPVRTPFXTexture*		pointer to the texture data array | 
 | 	*****************************************************************************/ | 
 | 	const CPVRTArray<SPVRTPFXTexture>& GetTextureArray() const; | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Returns a list of known semantics. | 
 | 	@return			    const CPVRTArray<SPVRTPFXUniform>&	 | 
 | 	*****************************************************************************/ | 
 | 	const CPVRTArray<SPVRTPFXUniform>& GetUniformArray() const; | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Gets the array of registered semantics which will be used to | 
 |                         match PFX code. | 
 | 	@return			    const CPVRTArray<SPVRTPFXUniformSemantic>&	 | 
 | 	*****************************************************************************/ | 
 | 	const CPVRTArray<SPVRTPFXUniformSemantic>& GetSemanticArray() const; | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Sets the textrue and applys the filtering. | 
 | 	@param[in]			nIdx				texture number | 
 | 	@param[in]			ui					opengl texture handle | 
 | 	@param[in]			u32flags			texture flags | 
 | 	*****************************************************************************/ | 
 | 	void SetTexture(const unsigned int nIdx, const GLuint ui, const unsigned int u32flags=0); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief		        Sets the dafault value for the uniform semantic. | 
 | 	@param[in]			pszName				name of uniform | 
 | 	@param[in]			psDefaultValue      pointer to default value | 
 | 	*****************************************************************************/ | 
 | 	void SetDefaultUniformValue(const char *const pszName, const SPVRTSemanticDefaultData *psDefaultValue); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Registers a user-provided uniform semantic. | 
 | 	@param[in]			psUniforms			Array of semantics to register | 
 | 	@param[in]			uiNumUniforms		Number provided | 
 | 	@param[out]			pReturnError		Human-readable error if any | 
 | 	@return			    PVR_SUCCESS on success	 | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError RegisterUniformSemantic(const SPVRTPFXUniformSemantic* const psUniforms, unsigned int uiNumUniforms, CPVRTString* pReturnError); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Removes a given semantic ID from the 'known' semantic list and  | 
 |                         re-parses the effect to update the uniform table. | 
 | 	@param[in]			uiSemanticID | 
 | 	@param[out]			pReturnError | 
 | 	@return			    PVR_SUCCESS on success	 | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError RemoveUniformSemantic(unsigned int uiSemanticID, CPVRTString* pReturnError); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	 @brief		        Sets the context for this effect. | 
 | 	 @param[in]			pContext			context pointer | 
 | 	 *****************************************************************************/ | 
 | 	void SetContext(SPVRTContext * const pContext); | 
 | 	 | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Returns the OGL program handle. | 
 | 	@return			    unsigned int | 
 | 	*****************************************************************************/ | 
 | 	unsigned int GetProgramHandle() const; | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Gets the active effect index within the PFX file. | 
 | 	@return			    unsigned int	 | 
 | 	*****************************************************************************/ | 
 | 	unsigned int GetEffectIndex() const; | 
 |  | 
 | private: | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Loads all of the GLSL shaders for an effect. | 
 | 	@param[in]			pszFileName | 
 | 	@param[out]			pReturnError | 
 | 	@return			    EPVRTError	 | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError LoadShadersForEffect(CPVRTPFXParser &src, const char * const pszFileName, CPVRTString *pReturnError); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Loads all of the textures for this effect. | 
 | 	@param[out]			pReturnError | 
 | 	@return			    EPVRTError	 | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError LoadTexturesForEffect(PVRTPFXEffectDelegate* pDelegate, CPVRTString *pReturnError); | 
 |  | 
 | 	/*!*************************************************************************** | 
 | 	@brief	            Builds the uniform table from a list of known semantics. | 
 | 	@param[out]			uiUnknownSemantics | 
 | 	@param[out]			pReturnError | 
 | 	@return			    EPVRTError	 | 
 | 	*****************************************************************************/ | 
 | 	EPVRTError RebuildUniformTable(unsigned int& uiUnknownSemantics, CPVRTString* pReturnError); | 
 |  | 
 | protected: | 
 | 	bool									m_bLoaded; | 
 | 	SPVRTContext*							m_psContext; | 
 | 	CPVRTPFXParser*							m_pParser; | 
 | 	unsigned int							m_nEffect; | 
 |  | 
 | 	GLuint									m_uiProgram;		// Loaded program | 
 |  | 
 | 	CPVRTArray<SPVRTPFXTexture>				m_Textures;			// Array of loaded textures | 
 | 	CPVRTArray<SPVRTPFXUniform>				m_Uniforms;			// Array of found uniforms | 
 |  | 
 | 	CPVRTArray<SPVRTPFXUniformSemantic>		m_Semantics;		// An array of registered semantics. | 
 | }; | 
 |  | 
 | /**************************************************************************** | 
 | ** Auxiliary functions | 
 | ****************************************************************************/ | 
 |  | 
 | /*!************************************************************************** | 
 |  @brief                 'Equivalent to' operator | 
 |  @param[in]             lhs     First SPVRTPFXUniformSemantic | 
 |  @param[in]             rhs     Second SPVRTPFXUniformSemantic | 
 |  @return                True if the numbers in the two SPVRTPFXUniformSemantics are equivalent. | 
 | ****************************************************************************/ | 
 | inline bool operator==(const SPVRTPFXUniformSemantic& lhs, const SPVRTPFXUniformSemantic& rhs) | 
 | { | 
 | 	return (lhs.n == rhs.n); | 
 | } | 
 |  | 
 |  #endif | 
 |   | 
 | /*! @} */ | 
 |  | 
 | #endif /* _PVRTPFXPARSERAPI_H_ */ | 
 |  | 
 | /***************************************************************************** | 
 |  End of file (PVRTPFXParserAPI.h) | 
 | *****************************************************************************/ | 
 |  |