| /*!**************************************************************************** |
| |
| @file PVRTVertex.h |
| @copyright Copyright (c) Imagination Technologies Limited. |
| @brief Utility functions which process vertices. |
| |
| ******************************************************************************/ |
| #ifndef _PVRTVERTEX_H_ |
| #define _PVRTVERTEX_H_ |
| |
| #include "PVRTError.h" |
| #include "PVRTMatrix.h" |
| |
| /**************************************************************************** |
| ** Enumerations |
| ****************************************************************************/ |
| enum EPVRTDataType { |
| EPODDataNone, |
| EPODDataFloat, |
| EPODDataInt, |
| EPODDataUnsignedShort, |
| EPODDataRGBA, |
| EPODDataARGB, |
| EPODDataD3DCOLOR, |
| EPODDataUBYTE4, |
| EPODDataDEC3N, |
| EPODDataFixed16_16, |
| EPODDataUnsignedByte, |
| EPODDataShort, |
| EPODDataShortNorm, |
| EPODDataByte, |
| EPODDataByteNorm, |
| EPODDataUnsignedByteNorm, |
| EPODDataUnsignedShortNorm, |
| EPODDataUnsignedInt, |
| EPODDataABGR |
| }; |
| |
| /***************************************************************************** |
| ** Functions |
| *****************************************************************************/ |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexRead |
| @param[out] pV |
| @param[in] pData |
| @param[in] eType |
| @param[in] nCnt |
| @brief Read a vector |
| *****************************************************************************/ |
| void PVRTVertexRead( |
| PVRTVECTOR4f * const pV, |
| const void * const pData, |
| const EPVRTDataType eType, |
| const int nCnt); |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexRead |
| @param[out] pV |
| @param[in] pData |
| @param[in] eType |
| @brief Read an int |
| *****************************************************************************/ |
| void PVRTVertexRead( |
| unsigned int * const pV, |
| const void * const pData, |
| const EPVRTDataType eType); |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexWrite |
| @param[out] pOut |
| @param[in] eType |
| @param[in] nCnt |
| @param[in] pV |
| @brief Write a vector |
| *****************************************************************************/ |
| void PVRTVertexWrite( |
| void * const pOut, |
| const EPVRTDataType eType, |
| const int nCnt, |
| const PVRTVECTOR4f * const pV); |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexWrite |
| @param[out] pOut |
| @param[in] eType |
| @param[in] V |
| @brief Write an int |
| *****************************************************************************/ |
| void PVRTVertexWrite( |
| void * const pOut, |
| const EPVRTDataType eType, |
| const unsigned int V); |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexTangentBitangent |
| @param[out] pvTan |
| @param[out] pvBin |
| @param[in] pvNor |
| @param[in] pfPosA |
| @param[in] pfPosB |
| @param[in] pfPosC |
| @param[in] pfTexA |
| @param[in] pfTexB |
| @param[in] pfTexC |
| @brief Calculates the tangent and bitangent vectors for |
| vertex 'A' of the triangle defined by the 3 supplied |
| 3D position coordinates (pfPosA) and 2D texture |
| coordinates (pfTexA). |
| *****************************************************************************/ |
| void PVRTVertexTangentBitangent( |
| PVRTVECTOR3 * const pvTan, |
| PVRTVECTOR3 * const pvBin, |
| const PVRTVECTOR3 * const pvNor, |
| const float * const pfPosA, |
| const float * const pfPosB, |
| const float * const pfPosC, |
| const float * const pfTexA, |
| const float * const pfTexB, |
| const float * const pfTexC); |
| |
| /*!*************************************************************************** |
| @fn PVRTVertexGenerateTangentSpace |
| @param[out] pnVtxNumOut Output vertex count |
| @param[out] pVtxOut Output vertices (program must free() this) |
| @param[in,out] pui32Idx input AND output; index array for triangle list |
| @param[in] nVtxNum Input vertex count |
| @param[in] pVtx Input vertices |
| @param[in] nStride Size of a vertex (in bytes) |
| @param[in] nOffsetPos Offset in bytes to the vertex position |
| @param[in] eTypePos Data type of the position |
| @param[in] nOffsetNor Offset in bytes to the vertex normal |
| @param[in] eTypeNor Data type of the normal |
| @param[in] nOffsetTex Offset in bytes to the vertex texture coordinate to use |
| @param[in] eTypeTex Data type of the texture coordinate |
| @param[in] nOffsetTan Offset in bytes to the vertex tangent |
| @param[in] eTypeTan Data type of the tangent |
| @param[in] nOffsetBin Offset in bytes to the vertex bitangent |
| @param[in] eTypeBin Data type of the bitangent |
| @param[in] nTriNum Number of triangles |
| @param[in] fSplitDifference Split a vertex if the DP3 of tangents/bitangents are below this (range -1..1) |
| @return PVR_FAIL if there was a problem. |
| @brief Calculates the tangent space for all supplied vertices. |
| Writes tangent and bitangent vectors to the output |
| vertices, copies all other elements from input vertices. |
| Will split vertices if necessary - i.e. if two triangles |
| sharing a vertex want to assign it different |
| tangent-space matrices. The decision whether to split |
| uses fSplitDifference - of the DP3 of two desired |
| tangents or two desired bitangents is higher than this, |
| the vertex will be split. |
| *****************************************************************************/ |
| EPVRTError PVRTVertexGenerateTangentSpace( |
| unsigned int * const pnVtxNumOut, |
| char ** const pVtxOut, |
| unsigned int * const pui32Idx, |
| const unsigned int nVtxNum, |
| const char * const pVtx, |
| const unsigned int nStride, |
| const unsigned int nOffsetPos, |
| EPVRTDataType eTypePos, |
| const unsigned int nOffsetNor, |
| EPVRTDataType eTypeNor, |
| const unsigned int nOffsetTex, |
| EPVRTDataType eTypeTex, |
| const unsigned int nOffsetTan, |
| EPVRTDataType eTypeTan, |
| const unsigned int nOffsetBin, |
| EPVRTDataType eTypeBin, |
| const unsigned int nTriNum, |
| const float fSplitDifference); |
| |
| |
| #endif /* _PVRTVERTEX_H_ */ |
| |
| /***************************************************************************** |
| End of file (PVRTVertex.h) |
| *****************************************************************************/ |
| |