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