| /*!**************************************************************************** |
| |
| @file PVRTModelPOD.h |
| @copyright Copyright (c) Imagination Technologies Limited. |
| @brief Code to load POD files - models exported from MAX. |
| |
| ******************************************************************************/ |
| #ifndef _PVRTMODELPOD_H_ |
| #define _PVRTMODELPOD_H_ |
| |
| #include "PVRTVector.h" |
| #include "PVRTError.h" |
| #include "PVRTVertex.h" |
| #include "PVRTBoneBatch.h" |
| |
| /**************************************************************************** |
| ** Defines |
| ****************************************************************************/ |
| #define PVRTMODELPOD_VERSION ("AB.POD.2.0") /*!< POD file version string */ |
| |
| // PVRTMODELPOD Scene Flags |
| #define PVRTMODELPODSF_FIXED (0x00000001) /*!< PVRTMODELPOD Fixed-point 16.16 data (otherwise float) flag */ |
| |
| /**************************************************************************** |
| ** Enumerations |
| ****************************************************************************/ |
| /*!**************************************************************************** |
| @struct EPODLightType |
| @brief Enum for the POD format light types |
| ******************************************************************************/ |
| enum EPODLightType |
| { |
| ePODPoint=0, /*!< Point light */ |
| ePODDirectional, /*!< Directional light */ |
| ePODSpot, /*!< Spot light */ |
| eNumPODLightTypes |
| }; |
| |
| /*!**************************************************************************** |
| @struct EPODPrimitiveType |
| @brief Enum for the POD format primitive types |
| ******************************************************************************/ |
| enum EPODPrimitiveType |
| { |
| ePODTriangles=0, /*!< Triangles */ |
| eNumPODPrimitiveTypes |
| }; |
| |
| /*!**************************************************************************** |
| @struct EPODAnimationData |
| @brief Enum for the POD format animation types |
| ******************************************************************************/ |
| enum EPODAnimationData |
| { |
| ePODHasPositionAni = 0x01, /*!< Position animation */ |
| ePODHasRotationAni = 0x02, /*!< Rotation animation */ |
| ePODHasScaleAni = 0x04, /*!< Scale animation */ |
| ePODHasMatrixAni = 0x08 /*!< Matrix animation */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct EPODMaterialFlags |
| @brief Enum for the material flag options |
| ******************************************************************************/ |
| enum EPODMaterialFlag |
| { |
| ePODEnableBlending = 0x01 /*!< Enable blending for this material */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct EPODBlendFunc |
| @brief Enum for the POD format blend functions |
| ******************************************************************************/ |
| enum EPODBlendFunc |
| { |
| ePODBlendFunc_ZERO=0, |
| ePODBlendFunc_ONE, |
| ePODBlendFunc_BLEND_FACTOR, |
| ePODBlendFunc_ONE_MINUS_BLEND_FACTOR, |
| |
| ePODBlendFunc_SRC_COLOR = 0x0300, |
| ePODBlendFunc_ONE_MINUS_SRC_COLOR, |
| ePODBlendFunc_SRC_ALPHA, |
| ePODBlendFunc_ONE_MINUS_SRC_ALPHA, |
| ePODBlendFunc_DST_ALPHA, |
| ePODBlendFunc_ONE_MINUS_DST_ALPHA, |
| ePODBlendFunc_DST_COLOR, |
| ePODBlendFunc_ONE_MINUS_DST_COLOR, |
| ePODBlendFunc_SRC_ALPHA_SATURATE, |
| |
| ePODBlendFunc_CONSTANT_COLOR = 0x8001, |
| ePODBlendFunc_ONE_MINUS_CONSTANT_COLOR, |
| ePODBlendFunc_CONSTANT_ALPHA, |
| ePODBlendFunc_ONE_MINUS_CONSTANT_ALPHA |
| }; |
| |
| /*!**************************************************************************** |
| @struct EPODBlendOp |
| @brief Enum for the POD format blend operation |
| ******************************************************************************/ |
| enum EPODBlendOp |
| { |
| ePODBlendOp_ADD = 0x8006, |
| ePODBlendOp_MIN, |
| ePODBlendOp_MAX, |
| ePODBlendOp_SUBTRACT = 0x800A, |
| ePODBlendOp_REVERSE_SUBTRACT |
| }; |
| |
| /**************************************************************************** |
| ** Structures |
| ****************************************************************************/ |
| /*!**************************************************************************** |
| @class CPODData |
| @brief A class for representing POD data |
| ******************************************************************************/ |
| class CPODData { |
| public: |
| /*!*************************************************************************** |
| @fn Reset |
| @brief Resets the POD Data to NULL |
| *****************************************************************************/ |
| void Reset(); |
| |
| public: |
| EPVRTDataType eType; /*!< Type of data stored */ |
| PVRTuint32 n; /*!< Number of values per vertex */ |
| PVRTuint32 nStride; /*!< Distance in bytes from one array entry to the next */ |
| PVRTuint8 *pData; /*!< Actual data (array of values); if mesh is interleaved, this is an OFFSET from pInterleaved */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODCamera |
| @brief Struct for storing POD camera data |
| ******************************************************************************/ |
| struct SPODCamera { |
| PVRTint32 nIdxTarget; /*!< Index of the target object */ |
| VERTTYPE fFOV; /*!< Field of view */ |
| VERTTYPE fFar; /*!< Far clip plane */ |
| VERTTYPE fNear; /*!< Near clip plane */ |
| VERTTYPE *pfAnimFOV; /*!< 1 VERTTYPE per frame of animation. */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODLight |
| @brief Struct for storing POD light data |
| ******************************************************************************/ |
| struct SPODLight { |
| PVRTint32 nIdxTarget; /*!< Index of the target object */ |
| VERTTYPE pfColour[3]; /*!< Light colour (0.0f -> 1.0f for each channel) */ |
| EPODLightType eType; /*!< Light type (point, directional, spot etc.) */ |
| PVRTfloat32 fConstantAttenuation; /*!< Constant attenuation */ |
| PVRTfloat32 fLinearAttenuation; /*!< Linear atternuation */ |
| PVRTfloat32 fQuadraticAttenuation; /*!< Quadratic attenuation */ |
| PVRTfloat32 fFalloffAngle; /*!< Falloff angle (in radians) */ |
| PVRTfloat32 fFalloffExponent; /*!< Falloff exponent */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODMesh |
| @brief Struct for storing POD mesh data |
| ******************************************************************************/ |
| struct SPODMesh { |
| PVRTuint32 nNumVertex; /*!< Number of vertices in the mesh */ |
| PVRTuint32 nNumFaces; /*!< Number of triangles in the mesh */ |
| PVRTuint32 nNumUVW; /*!< Number of texture coordinate channels per vertex */ |
| CPODData sFaces; /*!< List of triangle indices */ |
| PVRTuint32 *pnStripLength; /*!< If mesh is stripped: number of tris per strip. */ |
| PVRTuint32 nNumStrips; /*!< If mesh is stripped: number of strips, length of pnStripLength array. */ |
| CPODData sVertex; /*!< List of vertices (x0, y0, z0, x1, y1, z1, x2, etc...) */ |
| CPODData sNormals; /*!< List of vertex normals (Nx0, Ny0, Nz0, Nx1, Ny1, Nz1, Nx2, etc...) */ |
| CPODData sTangents; /*!< List of vertex tangents (Tx0, Ty0, Tz0, Tx1, Ty1, Tz1, Tx2, etc...) */ |
| CPODData sBinormals; /*!< List of vertex binormals (Bx0, By0, Bz0, Bx1, By1, Bz1, Bx2, etc...) */ |
| CPODData *psUVW; /*!< List of UVW coordinate sets; size of array given by 'nNumUVW' */ |
| CPODData sVtxColours; /*!< A colour per vertex */ |
| CPODData sBoneIdx; /*!< nNumBones*nNumVertex ints (Vtx0Idx0, Vtx0Idx1, ... Vtx1Idx0, Vtx1Idx1, ...) */ |
| CPODData sBoneWeight; /*!< nNumBones*nNumVertex floats (Vtx0Wt0, Vtx0Wt1, ... Vtx1Wt0, Vtx1Wt1, ...) */ |
| |
| PVRTuint8 *pInterleaved; /*!< Interleaved vertex data */ |
| |
| CPVRTBoneBatches sBoneBatches; /*!< Bone tables */ |
| |
| EPODPrimitiveType ePrimitiveType; /*!< Primitive type used by this mesh */ |
| |
| PVRTMATRIX mUnpackMatrix; /*!< A matrix used for unscaling scaled vertex data created with PVRTModelPODScaleAndConvertVtxData*/ |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODNode |
| @brief Struct for storing POD node data |
| ******************************************************************************/ |
| struct SPODNode { |
| PVRTint32 nIdx; /*!< Index into mesh, light or camera array, depending on which object list contains this Node */ |
| PVRTchar8 *pszName; /*!< Name of object */ |
| PVRTint32 nIdxMaterial; /*!< Index of material used on this mesh */ |
| |
| PVRTint32 nIdxParent; /*!< Index into MeshInstance array; recursively apply ancestor's transforms after this instance's. */ |
| |
| PVRTuint32 nAnimFlags; /*!< Stores which animation arrays the POD Node contains */ |
| |
| PVRTuint32 *pnAnimPositionIdx; |
| VERTTYPE *pfAnimPosition; /*!< 3 floats per frame of animation. */ |
| |
| PVRTuint32 *pnAnimRotationIdx; |
| VERTTYPE *pfAnimRotation; /*!< 4 floats per frame of animation. */ |
| |
| PVRTuint32 *pnAnimScaleIdx; |
| VERTTYPE *pfAnimScale; /*!< 7 floats per frame of animation. */ |
| |
| PVRTuint32 *pnAnimMatrixIdx; |
| VERTTYPE *pfAnimMatrix; /*!< 16 floats per frame of animation. */ |
| |
| PVRTuint32 nUserDataSize; |
| PVRTchar8 *pUserData; |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODTexture |
| @brief Struct for storing POD texture data |
| ******************************************************************************/ |
| struct SPODTexture { |
| PVRTchar8 *pszName; /*!< File-name of texture */ |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODMaterial |
| @brief Struct for storing POD material data |
| ******************************************************************************/ |
| struct SPODMaterial { |
| PVRTchar8 *pszName; /*!< Name of material */ |
| PVRTint32 nIdxTexDiffuse; /*!< Idx into pTexture for the diffuse texture */ |
| PVRTint32 nIdxTexAmbient; /*!< Idx into pTexture for the ambient texture */ |
| PVRTint32 nIdxTexSpecularColour; /*!< Idx into pTexture for the specular colour texture */ |
| PVRTint32 nIdxTexSpecularLevel; /*!< Idx into pTexture for the specular level texture */ |
| PVRTint32 nIdxTexBump; /*!< Idx into pTexture for the bump map */ |
| PVRTint32 nIdxTexEmissive; /*!< Idx into pTexture for the emissive texture */ |
| PVRTint32 nIdxTexGlossiness; /*!< Idx into pTexture for the glossiness texture */ |
| PVRTint32 nIdxTexOpacity; /*!< Idx into pTexture for the opacity texture */ |
| PVRTint32 nIdxTexReflection; /*!< Idx into pTexture for the reflection texture */ |
| PVRTint32 nIdxTexRefraction; /*!< Idx into pTexture for the refraction texture */ |
| VERTTYPE fMatOpacity; /*!< Material opacity (used with vertex alpha ?) */ |
| VERTTYPE pfMatAmbient[3]; /*!< Ambient RGB value */ |
| VERTTYPE pfMatDiffuse[3]; /*!< Diffuse RGB value */ |
| VERTTYPE pfMatSpecular[3]; /*!< Specular RGB value */ |
| VERTTYPE fMatShininess; /*!< Material shininess */ |
| PVRTchar8 *pszEffectFile; /*!< Name of effect file */ |
| PVRTchar8 *pszEffectName; /*!< Name of effect in the effect file */ |
| |
| EPODBlendFunc eBlendSrcRGB; /*!< Blending RGB source value */ |
| EPODBlendFunc eBlendSrcA; /*!< Blending alpha source value */ |
| EPODBlendFunc eBlendDstRGB; /*!< Blending RGB destination value */ |
| EPODBlendFunc eBlendDstA; /*!< Blending alpha destination value */ |
| EPODBlendOp eBlendOpRGB; /*!< Blending RGB operation */ |
| EPODBlendOp eBlendOpA; /*!< Blending alpha operation */ |
| VERTTYPE pfBlendColour[4]; /*!< A RGBA colour to be used in blending */ |
| VERTTYPE pfBlendFactor[4]; /*!< An array of blend factors, one for each RGBA component */ |
| |
| PVRTuint32 nFlags; /*!< Stores information about the material e.g. Enable blending */ |
| |
| PVRTuint32 nUserDataSize; |
| PVRTchar8 *pUserData; |
| }; |
| |
| /*!**************************************************************************** |
| @struct SPODScene |
| @brief Struct for storing POD scene data |
| ******************************************************************************/ |
| struct SPODScene { |
| VERTTYPE fUnits; /*!< Distance in metres that a single unit of measurement represents */ |
| VERTTYPE pfColourBackground[3]; /*!< Background colour */ |
| VERTTYPE pfColourAmbient[3]; /*!< Ambient colour */ |
| |
| PVRTuint32 nNumCamera; /*!< The length of the array pCamera */ |
| SPODCamera *pCamera; /*!< Camera nodes array */ |
| |
| PVRTuint32 nNumLight; /*!< The length of the array pLight */ |
| SPODLight *pLight; /*!< Light nodes array */ |
| |
| PVRTuint32 nNumMesh; /*!< The length of the array pMesh */ |
| SPODMesh *pMesh; /*!< Mesh array. Meshes may be instanced several times in a scene; i.e. multiple Nodes may reference any given mesh. */ |
| |
| PVRTuint32 nNumNode; /*!< Number of items in the array pNode */ |
| PVRTuint32 nNumMeshNode; /*!< Number of items in the array pNode which are objects */ |
| SPODNode *pNode; /*!< Node array. Sorted as such: objects, lights, cameras, Everything Else (bones, helpers etc) */ |
| |
| PVRTuint32 nNumTexture; /*!< Number of textures in the array pTexture */ |
| SPODTexture *pTexture; /*!< Texture array */ |
| |
| PVRTuint32 nNumMaterial; /*!< Number of materials in the array pMaterial */ |
| SPODMaterial *pMaterial; /*!< Material array */ |
| |
| PVRTuint32 nNumFrame; /*!< Number of frames of animation */ |
| PVRTuint32 nFPS; /*!< The frames per second the animation should be played at */ |
| |
| PVRTuint32 nFlags; /*!< PVRTMODELPODSF_* bit-flags */ |
| |
| PVRTuint32 nUserDataSize; |
| PVRTchar8 *pUserData; |
| }; |
| |
| struct SPVRTPODImpl; // Internal implementation data |
| |
| /*!*************************************************************************** |
| @class CPVRTModelPOD |
| @brief A class for loading and storing data from POD files/headers |
| *****************************************************************************/ |
| class CPVRTModelPOD : public SPODScene{ |
| public: |
| /*!*************************************************************************** |
| @brief Constructor for CPVRTModelPOD class |
| *****************************************************************************/ |
| CPVRTModelPOD(); |
| |
| /*!*************************************************************************** |
| @brief Destructor for CPVRTModelPOD class |
| *****************************************************************************/ |
| ~CPVRTModelPOD(); |
| |
| /*!*************************************************************************** |
| @fn ReadFromFile |
| @param[in] pszFileName Filename to load |
| @param[out] pszExpOpt String in which to place exporter options |
| @param[in] count Maximum number of characters to store. |
| @param[out] pszHistory String in which to place the pod file history |
| @param[in] historyCount Maximum number of characters to store. |
| @return PVR_SUCCESS if successful, PVR_FAIL if not |
| @brief Loads the specified ".POD" file; returns the scene in |
| pScene. This structure must later be destroyed with |
| PVRTModelPODDestroy() to prevent memory leaks. |
| ".POD" files are exported using the PVRGeoPOD exporters. |
| If pszExpOpt is NULL, the scene is loaded; otherwise the |
| scene is not loaded and pszExpOpt is filled in. The same |
| is true for pszHistory. |
| *****************************************************************************/ |
| EPVRTError ReadFromFile( |
| const char * const pszFileName, |
| char * const pszExpOpt = NULL, |
| const size_t count = 0, |
| char * const pszHistory = NULL, |
| const size_t historyCount = 0); |
| |
| /*!*************************************************************************** |
| @brief Loads the supplied pod data. This data can be exported |
| directly to a header using one of the pod exporters. |
| If pszExpOpt is NULL, the scene is loaded; otherwise the |
| scene is not loaded and pszExpOpt is filled in. The same |
| is true for pszHistory. |
| @param[in] pData Data to load |
| @param[in] i32Size Size of data |
| @param[out] pszExpOpt String in which to place exporter options |
| @param[in] count Maximum number of characters to store. |
| @param[out] pszHistory String in which to place the pod file history |
| @param[in] historyCount Maximum number of characters to store. |
| @return PVR_SUCCESS if successful, PVR_FAIL if not |
| *****************************************************************************/ |
| EPVRTError ReadFromMemory( |
| const char * pData, |
| const size_t i32Size, |
| char * const pszExpOpt = NULL, |
| const size_t count = 0, |
| char * const pszHistory = NULL, |
| const size_t historyCount = 0); |
| |
| /*!*************************************************************************** |
| @brief Sets the scene data from the supplied data structure. Use |
| when loading from .H files. |
| @param[in] scene Scene data from the header file |
| @return PVR_SUCCESS if successful, PVR_FAIL if not |
| *****************************************************************************/ |
| EPVRTError ReadFromMemory( |
| const SPODScene &scene); |
| |
| /*!*************************************************************************** |
| @fn CopyFromMemory |
| @param[in] scene Scene data from the header file |
| @return PVR_SUCCESS if successful, PVR_FAIL if not |
| @brief Copies the scene data from the supplied data structure. Use |
| when loading from .H files where you want to modify the data. |
| *****************************************************************************/ |
| EPVRTError CopyFromMemory( |
| const SPODScene &scene); |
| |
| #if defined(_WIN32) |
| /*!*************************************************************************** |
| @fn ReadFromResource |
| @param[in] pszName Name of the resource to load from |
| @return PVR_SUCCESS if successful, PVR_FAIL if not |
| @brief Loads the specified ".POD" file; returns the scene in |
| pScene. This structure must later be destroyed with |
| PVRTModelPODDestroy() to prevent memory leaks. |
| ".POD" files are exported from 3D Studio MAX using a |
| PowerVR plugin. |
| *****************************************************************************/ |
| EPVRTError ReadFromResource( |
| const TCHAR * const pszName); |
| #endif |
| |
| /*!*********************************************************************** |
| @fn InitImpl |
| @brief Used by the Read*() fns to initialise implementation |
| details. Should also be called by applications which |
| manually build data in the POD structures for rendering; |
| in this case call it after the data has been created. |
| Otherwise, do not call this function. |
| *************************************************************************/ |
| EPVRTError InitImpl(); |
| |
| /*!*********************************************************************** |
| @fn DestroyImpl |
| @brief Used to free memory allocated by the implementation. |
| *************************************************************************/ |
| void DestroyImpl(); |
| |
| /*!*********************************************************************** |
| @fn FlushCache |
| @brief Clears the matrix cache; use this if necessary when you |
| edit the position or animation of a node. |
| *************************************************************************/ |
| void FlushCache(); |
| |
| /*!*********************************************************************** |
| @fn IsLoaded |
| @brief Boolean to check whether a POD file has been loaded. |
| *************************************************************************/ |
| bool IsLoaded(); |
| |
| /*!*************************************************************************** |
| @fn Destroy |
| @brief Frees the memory allocated to store the scene in pScene. |
| *****************************************************************************/ |
| void Destroy(); |
| |
| /*!*************************************************************************** |
| @fn SetFrame |
| @param[in] fFrame Frame number |
| @brief Set the animation frame for which subsequent Get*() calls |
| should return data. |
| *****************************************************************************/ |
| void SetFrame( |
| const VERTTYPE fFrame); |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut Rotation matrix |
| @param[in] node Node to get the rotation matrix from |
| *****************************************************************************/ |
| void GetRotationMatrix( |
| PVRTMATRIX &mOut, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[in] node Node to get the rotation matrix from |
| @return Rotation matrix |
| *****************************************************************************/ |
| PVRTMat4 GetRotationMatrix( |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut Scaling matrix |
| @param[in] node Node to get the rotation matrix from |
| *****************************************************************************/ |
| void GetScalingMatrix( |
| PVRTMATRIX &mOut, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[in] node Node to get the rotation matrix from |
| @return Scaling matrix |
| *****************************************************************************/ |
| PVRTMat4 GetScalingMatrix( |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the translation vector for the given Mesh |
| Instance. Uses animation data. |
| @param[out] V Translation vector |
| @param[in] node Node to get the translation vector from |
| *****************************************************************************/ |
| void GetTranslation( |
| PVRTVECTOR3 &V, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the translation vector for the given Mesh |
| Instance. Uses animation data. |
| @param[in] node Node to get the translation vector from |
| @return Translation vector |
| *****************************************************************************/ |
| PVRTVec3 GetTranslation( |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut Translation matrix |
| @param[in] node Node to get the translation matrix from |
| *****************************************************************************/ |
| void GetTranslationMatrix( |
| PVRTMATRIX &mOut, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[in] node Node to get the translation matrix from |
| @return Translation matrix |
| *****************************************************************************/ |
| PVRTMat4 GetTranslationMatrix( |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut Transformation matrix |
| @param[in] node Node to get the transformation matrix from |
| *****************************************************************************/ |
| void GetTransformationMatrix(PVRTMATRIX &mOut, const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut World matrix |
| @param[in] node Node to get the world matrix from |
| *****************************************************************************/ |
| void GetWorldMatrixNoCache( |
| PVRTMATRIX &mOut, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[in] node Node to get the world matrix from |
| @return World matrix |
| *****************************************************************************/ |
| PVRTMat4 GetWorldMatrixNoCache( |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[out] mOut World matrix |
| @param[in] node Node to get the world matrix from |
| *****************************************************************************/ |
| void GetWorldMatrix( |
| PVRTMATRIX &mOut, |
| const SPODNode &node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given Mesh Instance; |
| applies the parent's transform too. Uses animation data. |
| @param[in] node Node to get the world matrix from |
| @return World matrix |
| *****************************************************************************/ |
| PVRTMat4 GetWorldMatrix(const SPODNode& node) const; |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given bone. |
| @param[out] mOut Bone world matrix |
| @param[in] NodeMesh Mesh to take the world matrix from |
| @param[in] NodeBone Bone to take the matrix from |
| *****************************************************************************/ |
| void GetBoneWorldMatrix( |
| PVRTMATRIX &mOut, |
| const SPODNode &NodeMesh, |
| const SPODNode &NodeBone); |
| |
| /*!*************************************************************************** |
| @brief Generates the world matrix for the given bone. |
| @param[in] NodeMesh Mesh to take the world matrix from |
| @param[in] NodeBone Bone to take the matrix from |
| @return Bone world matrix |
| *****************************************************************************/ |
| PVRTMat4 GetBoneWorldMatrix( |
| const SPODNode &NodeMesh, |
| const SPODNode &NodeBone); |
| |
| /*!*************************************************************************** |
| @fn GetCamera |
| @param[out] vFrom Position of the camera |
| @param[out] vTo Target of the camera |
| @param[out] vUp Up direction of the camera |
| @param[in] nIdx Camera number |
| @return Camera horizontal FOV |
| @brief Calculate the From, To and Up vectors for the given |
| camera. Uses animation data. |
| Note that even if the camera has a target, *pvTo is not |
| the position of that target. *pvTo is a position in the |
| correct direction of the target, one unit away from the |
| camera. |
| *****************************************************************************/ |
| VERTTYPE GetCamera( |
| PVRTVECTOR3 &vFrom, |
| PVRTVECTOR3 &vTo, |
| PVRTVECTOR3 &vUp, |
| const unsigned int nIdx) const; |
| |
| /*!*************************************************************************** |
| @fn GetCameraPos |
| @param[out] vFrom Position of the camera |
| @param[out] vTo Target of the camera |
| @param[in] nIdx Camera number |
| @return Camera horizontal FOV |
| @brief Calculate the position of the camera and its target. Uses |
| animation data. |
| If the queried camera does not have a target, *pvTo is |
| not changed. |
| *****************************************************************************/ |
| VERTTYPE GetCameraPos( |
| PVRTVECTOR3 &vFrom, |
| PVRTVECTOR3 &vTo, |
| const unsigned int nIdx) const; |
| |
| /*!*************************************************************************** |
| @fn GetLight |
| @param[out] vPos Position of the light |
| @param[out] vDir Direction of the light |
| @param[in] nIdx Light number |
| @brief Calculate the position and direction of the given Light. |
| Uses animation data. |
| *****************************************************************************/ |
| void GetLight( |
| PVRTVECTOR3 &vPos, |
| PVRTVECTOR3 &vDir, |
| const unsigned int nIdx) const; |
| |
| /*!*************************************************************************** |
| @fn GetLightPosition |
| @param[in] u32Idx Light number |
| @return PVRTVec4 position of light with w set correctly |
| @brief Calculate the position the given Light. Uses animation data. |
| *****************************************************************************/ |
| PVRTVec4 GetLightPosition(const unsigned int u32Idx) const; |
| |
| /*!*************************************************************************** |
| @fn GetLightDirection |
| @param[in] u32Idx Light number |
| @return PVRTVec4 direction of light with w set correctly |
| @brief Calculate the direction of the given Light. Uses animation data. |
| *****************************************************************************/ |
| PVRTVec4 GetLightDirection(const unsigned int u32Idx) const; |
| |
| /*!*************************************************************************** |
| @fn CreateSkinIdxWeight |
| @param[out] pIdx Four bytes containing matrix indices for vertex (0..255) (D3D: use UBYTE4) |
| @param[out] pWeight Four bytes containing blend weights for vertex (0.0 .. 1.0) (D3D: use D3DCOLOR) |
| @param[in] nVertexBones Number of bones this vertex uses |
| @param[in] pnBoneIdx Pointer to 'nVertexBones' indices |
| @param[in] pfBoneWeight Pointer to 'nVertexBones' blend weights |
| @brief Creates the matrix indices and blend weights for a boned |
| vertex. Call once per vertex of a boned mesh. |
| *****************************************************************************/ |
| EPVRTError CreateSkinIdxWeight( |
| char * const pIdx, |
| char * const pWeight, |
| const int nVertexBones, |
| const int * const pnBoneIdx, |
| const VERTTYPE * const pfBoneWeight); |
| |
| /*!*************************************************************************** |
| @fn SavePOD |
| @param[in] pszFilename Filename to save to |
| @param[in] pszExpOpt A string containing the options used by the exporter |
| @param[in] pszHistory A string containing the history of the exported pod file |
| @brief Save a binary POD file (.POD). |
| *****************************************************************************/ |
| EPVRTError SavePOD(const char * const pszFilename, const char * const pszExpOpt = 0, const char * const pszHistory = 0); |
| |
| private: |
| SPVRTPODImpl *m_pImpl; /*!< Internal implementation data */ |
| }; |
| |
| /**************************************************************************** |
| ** Declarations |
| ****************************************************************************/ |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODDataTypeSize |
| @param[in] type Type to get the size of |
| @return Size of the data element |
| @brief Returns the size of each data element. |
| *****************************************************************************/ |
| PVRTuint32 PVRTModelPODDataTypeSize(const EPVRTDataType type); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODDataTypeComponentCount |
| @param[in] type Type to get the number of components from |
| @return number of components in the data element |
| @brief Returns the number of components in a data element. |
| *****************************************************************************/ |
| PVRTuint32 PVRTModelPODDataTypeComponentCount(const EPVRTDataType type); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODDataStride |
| @param[in] data Data elements |
| @return Size of the vector elements |
| @brief Returns the size of the vector of data elements. |
| *****************************************************************************/ |
| PVRTuint32 PVRTModelPODDataStride(const CPODData &data); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODGetAnimArraySize |
| @param[in] pAnimDataIdx |
| @param[in] ui32Frames |
| @param[in] ui32Components |
| @return Size of the animation array |
| @brief Calculates the size of an animation array |
| *****************************************************************************/ |
| PVRTuint32 PVRTModelPODGetAnimArraySize(PVRTuint32 *pAnimDataIdx, PVRTuint32 ui32Frames, PVRTuint32 ui32Components); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODScaleAndConvertVtxData |
| @Modified mesh POD mesh to scale and convert the mesh data |
| @param[in] eNewType The data type to scale and convert the vertex data to |
| @return PVR_SUCCESS on success and PVR_FAIL on failure. |
| @brief Scales the vertex data to fit within the range of the requested |
| data type and then converts the data to that type. This function |
| isn't currently compiled in for fixed point builds of the tools. |
| *****************************************************************************/ |
| #if !defined(PVRT_FIXED_POINT_ENABLE) |
| EPVRTError PVRTModelPODScaleAndConvertVtxData(SPODMesh &mesh, const EPVRTDataType eNewType); |
| #endif |
| /*!*************************************************************************** |
| @fn PVRTModelPODDataConvert |
| @Modified data Data elements to convert |
| @param[in] eNewType New type of elements |
| @param[in] nCnt Number of elements |
| @brief Convert the format of the array of vectors. |
| *****************************************************************************/ |
| void PVRTModelPODDataConvert(CPODData &data, const unsigned int nCnt, const EPVRTDataType eNewType); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODDataShred |
| @Modified data Data elements to modify |
| @param[in] nCnt Number of elements |
| @param[in] pChannels A list of the wanted channels, e.g. {'x', 'y', 0} |
| @brief Reduce the number of dimensions in 'data' using the requested |
| channel array. The array should have a maximum length of 4 |
| or be null terminated if less channels are wanted. Supported |
| elements are 'x','y','z' and 'w'. They must be defined in lower |
| case. It is also possible to negate an element, e.g. {'x','y', -'z'}. |
| *****************************************************************************/ |
| void PVRTModelPODDataShred(CPODData &data, const unsigned int nCnt, const int *pChannels); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODReorderFaces |
| @Modified mesh The mesh to re-order the faces of |
| @param[in] i32El1 The first index to be written out |
| @param[in] i32El2 The second index to be written out |
| @param[in] i32El3 The third index to be written out |
| @brief Reorders the face indices of a mesh. |
| *****************************************************************************/ |
| void PVRTModelPODReorderFaces(SPODMesh &mesh, const int i32El1, const int i32El2, const int i32El3); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODToggleInterleaved |
| @Modified mesh Mesh to modify |
| @param[in] ui32AlignToNBytes Align the interleaved data to this no. of bytes. |
| @brief Switches the supplied mesh to or from interleaved data format. |
| *****************************************************************************/ |
| void PVRTModelPODToggleInterleaved(SPODMesh &mesh, unsigned int ui32AlignToNBytes = 1); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODDeIndex |
| @Modified mesh Mesh to modify |
| @brief De-indexes the supplied mesh. The mesh must be |
| Interleaved before calling this function. |
| *****************************************************************************/ |
| void PVRTModelPODDeIndex(SPODMesh &mesh); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODToggleStrips |
| @Modified mesh Mesh to modify |
| @brief Converts the supplied mesh to or from strips. |
| *****************************************************************************/ |
| void PVRTModelPODToggleStrips(SPODMesh &mesh); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCountIndices |
| @param[in] mesh Mesh |
| @return Number of indices used by mesh |
| @brief Counts the number of indices of a mesh |
| *****************************************************************************/ |
| unsigned int PVRTModelPODCountIndices(const SPODMesh &mesh); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyCPODData |
| @param[in] in |
| @param[out] out |
| @param[in] ui32No |
| @param[in] bInterleaved |
| @brief Used to copy a CPODData of a mesh |
| *****************************************************************************/ |
| void PVRTModelPODCopyCPODData(const CPODData &in, CPODData &out, unsigned int ui32No, bool bInterleaved); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyNode |
| @param[in] in |
| @param[out] out |
| @param[in] nNumFrames The number of animation frames |
| @brief Used to copy a pod node |
| *****************************************************************************/ |
| void PVRTModelPODCopyNode(const SPODNode &in, SPODNode &out, int nNumFrames); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyMesh |
| @param[in] in |
| @param[out] out |
| @brief Used to copy a pod mesh |
| *****************************************************************************/ |
| void PVRTModelPODCopyMesh(const SPODMesh &in, SPODMesh &out); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyTexture |
| @param[in] in |
| @param[out] out |
| @brief Used to copy a pod texture |
| *****************************************************************************/ |
| void PVRTModelPODCopyTexture(const SPODTexture &in, SPODTexture &out); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyMaterial |
| @param[in] in |
| @param[out] out |
| @brief Used to copy a pod material |
| *****************************************************************************/ |
| void PVRTModelPODCopyMaterial(const SPODMaterial &in, SPODMaterial &out); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyCamera |
| @param[in] in |
| @param[out] out |
| @param[in] nNumFrames The number of animation frames |
| @brief Used to copy a pod camera |
| *****************************************************************************/ |
| void PVRTModelPODCopyCamera(const SPODCamera &in, SPODCamera &out, int nNumFrames); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODCopyLight |
| @param[in] in |
| @param[out] out |
| @brief Used to copy a pod light |
| *****************************************************************************/ |
| void PVRTModelPODCopyLight(const SPODLight &in, SPODLight &out); |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODFlattenToWorldSpace |
| @param[in] in - Source scene. All meshes must not be interleaved. |
| @param[out] out |
| @brief Used to flatten a pod scene to world space. All animation |
| and skinning information will be removed. The returned |
| position, normal, binormals and tangent data if present |
| will be returned as floats regardless of the input data |
| type. |
| *****************************************************************************/ |
| EPVRTError PVRTModelPODFlattenToWorldSpace(CPVRTModelPOD &in, CPVRTModelPOD &out); |
| |
| |
| /*!*************************************************************************** |
| @fn PVRTModelPODMergeMaterials |
| @param[in] src - Source scene |
| @param[out] dst - Destination scene |
| @brief This function takes two scenes and merges the textures, |
| PFX effects and blending parameters from the src materials |
| into the dst materials if they have the same material name. |
| *****************************************************************************/ |
| EPVRTError PVRTModelPODMergeMaterials(const CPVRTModelPOD &src, CPVRTModelPOD &dst); |
| |
| #endif /* _PVRTMODELPOD_H_ */ |
| |
| /***************************************************************************** |
| End of file (PVRTModelPOD.h) |
| *****************************************************************************/ |
| |