/*!****************************************************************************
@file PVRTTrans.h
@copyright Copyright (c) Imagination Technologies Limited.
@brief Set of functions used for 3D transformations and projections.
******************************************************************************/
#ifndef _PVRTTRANS_H_
#define _PVRTTRANS_H_
/****************************************************************************
** Typedefs
****************************************************************************/
/*!***************************************************************************
@brief PVRTBOUNDINGBOX is a typedef of a PVRTBOUNDINGBOX_TAG struct.
*****************************************************************************/
typedef struct PVRTBOUNDINGBOX_TAG
{
PVRTVECTOR3 Point[8]; ///< 8 Vertices
} PVRTBOUNDINGBOX, *LPPVRTBOUNDINGBOX;
/****************************************************************************
** Functions
****************************************************************************/
/*!***************************************************************************
@fn PVRTBoundingBoxCompute
@param[out] pBoundingBox
@param[in] pV
@param[in] nNumberOfVertices
@brief Calculate the eight vertices that surround an object.
This "bounding box" is used later to determine whether
the object is visible or not.
This function should only be called once to determine the
object's bounding box.
*****************************************************************************/
void PVRTBoundingBoxCompute(
PVRTBOUNDINGBOX * const pBoundingBox,
const PVRTVECTOR3 * const pV,
const int nNumberOfVertices);
/*!***************************************************************************
@fn PVRTBoundingBoxComputeInterleaved
@param[out] pBoundingBox
@param[in] pV
@param[in] nNumberOfVertices
@param[in] i32Offset
@param[in] i32Stride
@brief Calculate the eight vertices that surround an object.
This "bounding box" is used later to determine whether
the object is visible or not.
This function should only be called once to determine the
object's bounding box.
Takes interleaved data using the first vertex's offset
and the stride to the next vertex thereafter
*****************************************************************************/
void PVRTBoundingBoxComputeInterleaved(
PVRTBOUNDINGBOX * const pBoundingBox,
const unsigned char * const pV,
const int nNumberOfVertices,
const int i32Offset,
const int i32Stride);
/*!******************************************************************************
@fn PVRTBoundingBoxIsVisible
@param[out] pNeedsZClipping
@param[in] pBoundingBox
@param[in] pMatrix
@return TRUE if the object is visible, FALSE if not.
@brief Determine if a bounding box is "visible" or not along the
Z axis.
If the function returns TRUE, the object is visible and should
be displayed (check bNeedsZClipping to know if Z Clipping needs
to be done).
If the function returns FALSE, the object is not visible and thus
does not require to be displayed.
bNeedsZClipping indicates whether the object needs Z Clipping
(i.e. the object is partially visible).
- *pBoundingBox is a pointer to the bounding box structure.
- *pMatrix is the World, View & Projection matrices combined.
- *bNeedsZClipping is TRUE if Z clipping is required.
*****************************************************************************/
bool PVRTBoundingBoxIsVisible(
const PVRTBOUNDINGBOX * const pBoundingBox,
const PVRTMATRIX * const pMatrix,
bool * const pNeedsZClipping);
/*!***************************************************************************
@fn PVRTTransformVec3Array
@param[out] pOut Destination for transformed vectors
@param[in] nOutStride Stride between vectors in pOut array
@param[in] pV Input vector array
@param[in] nInStride Stride between vectors in pV array
@param[in] pMatrix Matrix to transform the vectors
@param[in] nNumberOfVertices Number of vectors to transform
@brief Transform all vertices [X Y Z 1] in pV by pMatrix and
store them in pOut.
*****************************************************************************/
void PVRTTransformVec3Array(
PVRTVECTOR4 * const pOut,
const int nOutStride,
const PVRTVECTOR3 * const pV,
const int nInStride,
const PVRTMATRIX * const pMatrix,
const int nNumberOfVertices);
/*!***************************************************************************
@fn PVRTTransformArray
@param[out] pTransformedVertex Destination for transformed vectors
@param[in] pV Input vector array
@param[in] nNumberOfVertices Number of vectors to transform
@param[in] pMatrix Matrix to transform the vectors
@param[in] fW W coordinate of input vector (e.g. use 1 for position, 0 for normal)
@brief Transform all vertices in pVertex by pMatrix and store them in
pTransformedVertex
- pTransformedVertex is the pointer that will receive transformed vertices.
- pVertex is the pointer to untransformed object vertices.
- nNumberOfVertices is the number of vertices of the object.
- pMatrix is the matrix used to transform the object.
*****************************************************************************/
void PVRTTransformArray(
PVRTVECTOR3 * const pTransformedVertex,
const PVRTVECTOR3 * const pV,
const int nNumberOfVertices,
const PVRTMATRIX * const pMatrix,
const VERTTYPE fW = f2vt(1.0f));
/*!***************************************************************************
@fn PVRTTransformArrayBack
@param[out] pTransformedVertex
@param[in] pVertex
@param[in] nNumberOfVertices
@param[in] pMatrix
@brief Transform all vertices in pVertex by the inverse of pMatrix
and store them in pTransformedVertex.
- pTransformedVertex is the pointer that will receive transformed vertices.
- pVertex is the pointer to untransformed object vertices.
- nNumberOfVertices is the number of vertices of the object.
- pMatrix is the matrix used to transform the object.
*****************************************************************************/
void PVRTTransformArrayBack(
PVRTVECTOR3 * const pTransformedVertex,
const PVRTVECTOR3 * const pVertex,
const int nNumberOfVertices,
const PVRTMATRIX * const pMatrix);
/*!***************************************************************************
@fn PVRTTransformBack
@param[out] pOut
@param[in] pV
@param[in] pM
@brief Transform vertex pV by the inverse of pMatrix
and store in pOut.
*****************************************************************************/
void PVRTTransformBack(
PVRTVECTOR4 * const pOut,
const PVRTVECTOR4 * const pV,
const PVRTMATRIX * const pM);
/*!***************************************************************************
@fn PVRTTransform
@param[out] pOut
@param[in] pV
@param[in] pM
@brief Transform vertex pV by pMatrix and store in pOut.
*****************************************************************************/
void PVRTTransform(
PVRTVECTOR4 * const pOut,
const PVRTVECTOR4 * const pV,
const PVRTMATRIX * const pM);
#endif /* _PVRTTRANS_H_ */
/*****************************************************************************
End of file (PVRTTrans.h)
*****************************************************************************/