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