blob: 48cab837a29f8cec5fc3ce9b73b27aef09725123 [file] [log] [blame]
/*!****************************************************************************
@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)
*****************************************************************************/