Nicolas Capens | 7b21f27 | 2014-06-04 22:51:10 -0400 | [diff] [blame] | 1 | /*!**************************************************************************** |
| 2 | |
| 3 | @file PVRTModelPOD.h |
| 4 | @copyright Copyright (c) Imagination Technologies Limited. |
| 5 | @brief Code to load POD files - models exported from MAX. |
| 6 | |
| 7 | ******************************************************************************/ |
| 8 | #ifndef _PVRTMODELPOD_H_ |
| 9 | #define _PVRTMODELPOD_H_ |
| 10 | |
| 11 | #include "PVRTVector.h" |
| 12 | #include "PVRTError.h" |
| 13 | #include "PVRTVertex.h" |
| 14 | #include "PVRTBoneBatch.h" |
| 15 | |
| 16 | /**************************************************************************** |
| 17 | ** Defines |
| 18 | ****************************************************************************/ |
| 19 | #define PVRTMODELPOD_VERSION ("AB.POD.2.0") /*!< POD file version string */ |
| 20 | |
| 21 | // PVRTMODELPOD Scene Flags |
| 22 | #define PVRTMODELPODSF_FIXED (0x00000001) /*!< PVRTMODELPOD Fixed-point 16.16 data (otherwise float) flag */ |
| 23 | |
| 24 | /**************************************************************************** |
| 25 | ** Enumerations |
| 26 | ****************************************************************************/ |
| 27 | /*!**************************************************************************** |
| 28 | @struct EPODLightType |
| 29 | @brief Enum for the POD format light types |
| 30 | ******************************************************************************/ |
| 31 | enum EPODLightType |
| 32 | { |
| 33 | ePODPoint=0, /*!< Point light */ |
| 34 | ePODDirectional, /*!< Directional light */ |
| 35 | ePODSpot, /*!< Spot light */ |
| 36 | eNumPODLightTypes |
| 37 | }; |
| 38 | |
| 39 | /*!**************************************************************************** |
| 40 | @struct EPODPrimitiveType |
| 41 | @brief Enum for the POD format primitive types |
| 42 | ******************************************************************************/ |
| 43 | enum EPODPrimitiveType |
| 44 | { |
| 45 | ePODTriangles=0, /*!< Triangles */ |
| 46 | eNumPODPrimitiveTypes |
| 47 | }; |
| 48 | |
| 49 | /*!**************************************************************************** |
| 50 | @struct EPODAnimationData |
| 51 | @brief Enum for the POD format animation types |
| 52 | ******************************************************************************/ |
| 53 | enum EPODAnimationData |
| 54 | { |
| 55 | ePODHasPositionAni = 0x01, /*!< Position animation */ |
| 56 | ePODHasRotationAni = 0x02, /*!< Rotation animation */ |
| 57 | ePODHasScaleAni = 0x04, /*!< Scale animation */ |
| 58 | ePODHasMatrixAni = 0x08 /*!< Matrix animation */ |
| 59 | }; |
| 60 | |
| 61 | /*!**************************************************************************** |
| 62 | @struct EPODMaterialFlags |
| 63 | @brief Enum for the material flag options |
| 64 | ******************************************************************************/ |
| 65 | enum EPODMaterialFlag |
| 66 | { |
| 67 | ePODEnableBlending = 0x01 /*!< Enable blending for this material */ |
| 68 | }; |
| 69 | |
| 70 | /*!**************************************************************************** |
| 71 | @struct EPODBlendFunc |
| 72 | @brief Enum for the POD format blend functions |
| 73 | ******************************************************************************/ |
| 74 | enum EPODBlendFunc |
| 75 | { |
| 76 | ePODBlendFunc_ZERO=0, |
| 77 | ePODBlendFunc_ONE, |
| 78 | ePODBlendFunc_BLEND_FACTOR, |
| 79 | ePODBlendFunc_ONE_MINUS_BLEND_FACTOR, |
| 80 | |
| 81 | ePODBlendFunc_SRC_COLOR = 0x0300, |
| 82 | ePODBlendFunc_ONE_MINUS_SRC_COLOR, |
| 83 | ePODBlendFunc_SRC_ALPHA, |
| 84 | ePODBlendFunc_ONE_MINUS_SRC_ALPHA, |
| 85 | ePODBlendFunc_DST_ALPHA, |
| 86 | ePODBlendFunc_ONE_MINUS_DST_ALPHA, |
| 87 | ePODBlendFunc_DST_COLOR, |
| 88 | ePODBlendFunc_ONE_MINUS_DST_COLOR, |
| 89 | ePODBlendFunc_SRC_ALPHA_SATURATE, |
| 90 | |
| 91 | ePODBlendFunc_CONSTANT_COLOR = 0x8001, |
| 92 | ePODBlendFunc_ONE_MINUS_CONSTANT_COLOR, |
| 93 | ePODBlendFunc_CONSTANT_ALPHA, |
| 94 | ePODBlendFunc_ONE_MINUS_CONSTANT_ALPHA |
| 95 | }; |
| 96 | |
| 97 | /*!**************************************************************************** |
| 98 | @struct EPODBlendOp |
| 99 | @brief Enum for the POD format blend operation |
| 100 | ******************************************************************************/ |
| 101 | enum EPODBlendOp |
| 102 | { |
| 103 | ePODBlendOp_ADD = 0x8006, |
| 104 | ePODBlendOp_MIN, |
| 105 | ePODBlendOp_MAX, |
| 106 | ePODBlendOp_SUBTRACT = 0x800A, |
| 107 | ePODBlendOp_REVERSE_SUBTRACT |
| 108 | }; |
| 109 | |
| 110 | /**************************************************************************** |
| 111 | ** Structures |
| 112 | ****************************************************************************/ |
| 113 | /*!**************************************************************************** |
| 114 | @class CPODData |
| 115 | @brief A class for representing POD data |
| 116 | ******************************************************************************/ |
| 117 | class CPODData { |
| 118 | public: |
| 119 | /*!*************************************************************************** |
| 120 | @fn Reset |
| 121 | @brief Resets the POD Data to NULL |
| 122 | *****************************************************************************/ |
| 123 | void Reset(); |
| 124 | |
| 125 | public: |
| 126 | EPVRTDataType eType; /*!< Type of data stored */ |
| 127 | PVRTuint32 n; /*!< Number of values per vertex */ |
| 128 | PVRTuint32 nStride; /*!< Distance in bytes from one array entry to the next */ |
| 129 | PVRTuint8 *pData; /*!< Actual data (array of values); if mesh is interleaved, this is an OFFSET from pInterleaved */ |
| 130 | }; |
| 131 | |
| 132 | /*!**************************************************************************** |
| 133 | @struct SPODCamera |
| 134 | @brief Struct for storing POD camera data |
| 135 | ******************************************************************************/ |
| 136 | struct SPODCamera { |
| 137 | PVRTint32 nIdxTarget; /*!< Index of the target object */ |
| 138 | VERTTYPE fFOV; /*!< Field of view */ |
| 139 | VERTTYPE fFar; /*!< Far clip plane */ |
| 140 | VERTTYPE fNear; /*!< Near clip plane */ |
| 141 | VERTTYPE *pfAnimFOV; /*!< 1 VERTTYPE per frame of animation. */ |
| 142 | }; |
| 143 | |
| 144 | /*!**************************************************************************** |
| 145 | @struct SPODLight |
| 146 | @brief Struct for storing POD light data |
| 147 | ******************************************************************************/ |
| 148 | struct SPODLight { |
| 149 | PVRTint32 nIdxTarget; /*!< Index of the target object */ |
| 150 | VERTTYPE pfColour[3]; /*!< Light colour (0.0f -> 1.0f for each channel) */ |
| 151 | EPODLightType eType; /*!< Light type (point, directional, spot etc.) */ |
| 152 | PVRTfloat32 fConstantAttenuation; /*!< Constant attenuation */ |
| 153 | PVRTfloat32 fLinearAttenuation; /*!< Linear atternuation */ |
| 154 | PVRTfloat32 fQuadraticAttenuation; /*!< Quadratic attenuation */ |
| 155 | PVRTfloat32 fFalloffAngle; /*!< Falloff angle (in radians) */ |
| 156 | PVRTfloat32 fFalloffExponent; /*!< Falloff exponent */ |
| 157 | }; |
| 158 | |
| 159 | /*!**************************************************************************** |
| 160 | @struct SPODMesh |
| 161 | @brief Struct for storing POD mesh data |
| 162 | ******************************************************************************/ |
| 163 | struct SPODMesh { |
| 164 | PVRTuint32 nNumVertex; /*!< Number of vertices in the mesh */ |
| 165 | PVRTuint32 nNumFaces; /*!< Number of triangles in the mesh */ |
| 166 | PVRTuint32 nNumUVW; /*!< Number of texture coordinate channels per vertex */ |
| 167 | CPODData sFaces; /*!< List of triangle indices */ |
| 168 | PVRTuint32 *pnStripLength; /*!< If mesh is stripped: number of tris per strip. */ |
| 169 | PVRTuint32 nNumStrips; /*!< If mesh is stripped: number of strips, length of pnStripLength array. */ |
| 170 | CPODData sVertex; /*!< List of vertices (x0, y0, z0, x1, y1, z1, x2, etc...) */ |
| 171 | CPODData sNormals; /*!< List of vertex normals (Nx0, Ny0, Nz0, Nx1, Ny1, Nz1, Nx2, etc...) */ |
| 172 | CPODData sTangents; /*!< List of vertex tangents (Tx0, Ty0, Tz0, Tx1, Ty1, Tz1, Tx2, etc...) */ |
| 173 | CPODData sBinormals; /*!< List of vertex binormals (Bx0, By0, Bz0, Bx1, By1, Bz1, Bx2, etc...) */ |
| 174 | CPODData *psUVW; /*!< List of UVW coordinate sets; size of array given by 'nNumUVW' */ |
| 175 | CPODData sVtxColours; /*!< A colour per vertex */ |
| 176 | CPODData sBoneIdx; /*!< nNumBones*nNumVertex ints (Vtx0Idx0, Vtx0Idx1, ... Vtx1Idx0, Vtx1Idx1, ...) */ |
| 177 | CPODData sBoneWeight; /*!< nNumBones*nNumVertex floats (Vtx0Wt0, Vtx0Wt1, ... Vtx1Wt0, Vtx1Wt1, ...) */ |
| 178 | |
| 179 | PVRTuint8 *pInterleaved; /*!< Interleaved vertex data */ |
| 180 | |
| 181 | CPVRTBoneBatches sBoneBatches; /*!< Bone tables */ |
| 182 | |
| 183 | EPODPrimitiveType ePrimitiveType; /*!< Primitive type used by this mesh */ |
| 184 | |
| 185 | PVRTMATRIX mUnpackMatrix; /*!< A matrix used for unscaling scaled vertex data created with PVRTModelPODScaleAndConvertVtxData*/ |
| 186 | }; |
| 187 | |
| 188 | /*!**************************************************************************** |
| 189 | @struct SPODNode |
| 190 | @brief Struct for storing POD node data |
| 191 | ******************************************************************************/ |
| 192 | struct SPODNode { |
| 193 | PVRTint32 nIdx; /*!< Index into mesh, light or camera array, depending on which object list contains this Node */ |
| 194 | PVRTchar8 *pszName; /*!< Name of object */ |
| 195 | PVRTint32 nIdxMaterial; /*!< Index of material used on this mesh */ |
| 196 | |
| 197 | PVRTint32 nIdxParent; /*!< Index into MeshInstance array; recursively apply ancestor's transforms after this instance's. */ |
| 198 | |
| 199 | PVRTuint32 nAnimFlags; /*!< Stores which animation arrays the POD Node contains */ |
| 200 | |
| 201 | PVRTuint32 *pnAnimPositionIdx; |
| 202 | VERTTYPE *pfAnimPosition; /*!< 3 floats per frame of animation. */ |
| 203 | |
| 204 | PVRTuint32 *pnAnimRotationIdx; |
| 205 | VERTTYPE *pfAnimRotation; /*!< 4 floats per frame of animation. */ |
| 206 | |
| 207 | PVRTuint32 *pnAnimScaleIdx; |
| 208 | VERTTYPE *pfAnimScale; /*!< 7 floats per frame of animation. */ |
| 209 | |
| 210 | PVRTuint32 *pnAnimMatrixIdx; |
| 211 | VERTTYPE *pfAnimMatrix; /*!< 16 floats per frame of animation. */ |
| 212 | |
| 213 | PVRTuint32 nUserDataSize; |
| 214 | PVRTchar8 *pUserData; |
| 215 | }; |
| 216 | |
| 217 | /*!**************************************************************************** |
| 218 | @struct SPODTexture |
| 219 | @brief Struct for storing POD texture data |
| 220 | ******************************************************************************/ |
| 221 | struct SPODTexture { |
| 222 | PVRTchar8 *pszName; /*!< File-name of texture */ |
| 223 | }; |
| 224 | |
| 225 | /*!**************************************************************************** |
| 226 | @struct SPODMaterial |
| 227 | @brief Struct for storing POD material data |
| 228 | ******************************************************************************/ |
| 229 | struct SPODMaterial { |
| 230 | PVRTchar8 *pszName; /*!< Name of material */ |
| 231 | PVRTint32 nIdxTexDiffuse; /*!< Idx into pTexture for the diffuse texture */ |
| 232 | PVRTint32 nIdxTexAmbient; /*!< Idx into pTexture for the ambient texture */ |
| 233 | PVRTint32 nIdxTexSpecularColour; /*!< Idx into pTexture for the specular colour texture */ |
| 234 | PVRTint32 nIdxTexSpecularLevel; /*!< Idx into pTexture for the specular level texture */ |
| 235 | PVRTint32 nIdxTexBump; /*!< Idx into pTexture for the bump map */ |
| 236 | PVRTint32 nIdxTexEmissive; /*!< Idx into pTexture for the emissive texture */ |
| 237 | PVRTint32 nIdxTexGlossiness; /*!< Idx into pTexture for the glossiness texture */ |
| 238 | PVRTint32 nIdxTexOpacity; /*!< Idx into pTexture for the opacity texture */ |
| 239 | PVRTint32 nIdxTexReflection; /*!< Idx into pTexture for the reflection texture */ |
| 240 | PVRTint32 nIdxTexRefraction; /*!< Idx into pTexture for the refraction texture */ |
| 241 | VERTTYPE fMatOpacity; /*!< Material opacity (used with vertex alpha ?) */ |
| 242 | VERTTYPE pfMatAmbient[3]; /*!< Ambient RGB value */ |
| 243 | VERTTYPE pfMatDiffuse[3]; /*!< Diffuse RGB value */ |
| 244 | VERTTYPE pfMatSpecular[3]; /*!< Specular RGB value */ |
| 245 | VERTTYPE fMatShininess; /*!< Material shininess */ |
| 246 | PVRTchar8 *pszEffectFile; /*!< Name of effect file */ |
| 247 | PVRTchar8 *pszEffectName; /*!< Name of effect in the effect file */ |
| 248 | |
| 249 | EPODBlendFunc eBlendSrcRGB; /*!< Blending RGB source value */ |
| 250 | EPODBlendFunc eBlendSrcA; /*!< Blending alpha source value */ |
| 251 | EPODBlendFunc eBlendDstRGB; /*!< Blending RGB destination value */ |
| 252 | EPODBlendFunc eBlendDstA; /*!< Blending alpha destination value */ |
| 253 | EPODBlendOp eBlendOpRGB; /*!< Blending RGB operation */ |
| 254 | EPODBlendOp eBlendOpA; /*!< Blending alpha operation */ |
| 255 | VERTTYPE pfBlendColour[4]; /*!< A RGBA colour to be used in blending */ |
| 256 | VERTTYPE pfBlendFactor[4]; /*!< An array of blend factors, one for each RGBA component */ |
| 257 | |
| 258 | PVRTuint32 nFlags; /*!< Stores information about the material e.g. Enable blending */ |
| 259 | |
| 260 | PVRTuint32 nUserDataSize; |
| 261 | PVRTchar8 *pUserData; |
| 262 | }; |
| 263 | |
| 264 | /*!**************************************************************************** |
| 265 | @struct SPODScene |
| 266 | @brief Struct for storing POD scene data |
| 267 | ******************************************************************************/ |
| 268 | struct SPODScene { |
| 269 | VERTTYPE fUnits; /*!< Distance in metres that a single unit of measurement represents */ |
| 270 | VERTTYPE pfColourBackground[3]; /*!< Background colour */ |
| 271 | VERTTYPE pfColourAmbient[3]; /*!< Ambient colour */ |
| 272 | |
| 273 | PVRTuint32 nNumCamera; /*!< The length of the array pCamera */ |
| 274 | SPODCamera *pCamera; /*!< Camera nodes array */ |
| 275 | |
| 276 | PVRTuint32 nNumLight; /*!< The length of the array pLight */ |
| 277 | SPODLight *pLight; /*!< Light nodes array */ |
| 278 | |
| 279 | PVRTuint32 nNumMesh; /*!< The length of the array pMesh */ |
| 280 | SPODMesh *pMesh; /*!< Mesh array. Meshes may be instanced several times in a scene; i.e. multiple Nodes may reference any given mesh. */ |
| 281 | |
| 282 | PVRTuint32 nNumNode; /*!< Number of items in the array pNode */ |
| 283 | PVRTuint32 nNumMeshNode; /*!< Number of items in the array pNode which are objects */ |
| 284 | SPODNode *pNode; /*!< Node array. Sorted as such: objects, lights, cameras, Everything Else (bones, helpers etc) */ |
| 285 | |
| 286 | PVRTuint32 nNumTexture; /*!< Number of textures in the array pTexture */ |
| 287 | SPODTexture *pTexture; /*!< Texture array */ |
| 288 | |
| 289 | PVRTuint32 nNumMaterial; /*!< Number of materials in the array pMaterial */ |
| 290 | SPODMaterial *pMaterial; /*!< Material array */ |
| 291 | |
| 292 | PVRTuint32 nNumFrame; /*!< Number of frames of animation */ |
| 293 | PVRTuint32 nFPS; /*!< The frames per second the animation should be played at */ |
| 294 | |
| 295 | PVRTuint32 nFlags; /*!< PVRTMODELPODSF_* bit-flags */ |
| 296 | |
| 297 | PVRTuint32 nUserDataSize; |
| 298 | PVRTchar8 *pUserData; |
| 299 | }; |
| 300 | |
| 301 | struct SPVRTPODImpl; // Internal implementation data |
| 302 | |
| 303 | /*!*************************************************************************** |
| 304 | @class CPVRTModelPOD |
| 305 | @brief A class for loading and storing data from POD files/headers |
| 306 | *****************************************************************************/ |
| 307 | class CPVRTModelPOD : public SPODScene{ |
| 308 | public: |
| 309 | /*!*************************************************************************** |
| 310 | @brief Constructor for CPVRTModelPOD class |
| 311 | *****************************************************************************/ |
| 312 | CPVRTModelPOD(); |
| 313 | |
| 314 | /*!*************************************************************************** |
| 315 | @brief Destructor for CPVRTModelPOD class |
| 316 | *****************************************************************************/ |
| 317 | ~CPVRTModelPOD(); |
| 318 | |
| 319 | /*!*************************************************************************** |
| 320 | @fn ReadFromFile |
| 321 | @param[in] pszFileName Filename to load |
| 322 | @param[out] pszExpOpt String in which to place exporter options |
| 323 | @param[in] count Maximum number of characters to store. |
| 324 | @param[out] pszHistory String in which to place the pod file history |
| 325 | @param[in] historyCount Maximum number of characters to store. |
| 326 | @return PVR_SUCCESS if successful, PVR_FAIL if not |
| 327 | @brief Loads the specified ".POD" file; returns the scene in |
| 328 | pScene. This structure must later be destroyed with |
| 329 | PVRTModelPODDestroy() to prevent memory leaks. |
| 330 | ".POD" files are exported using the PVRGeoPOD exporters. |
| 331 | If pszExpOpt is NULL, the scene is loaded; otherwise the |
| 332 | scene is not loaded and pszExpOpt is filled in. The same |
| 333 | is true for pszHistory. |
| 334 | *****************************************************************************/ |
| 335 | EPVRTError ReadFromFile( |
| 336 | const char * const pszFileName, |
| 337 | char * const pszExpOpt = NULL, |
| 338 | const size_t count = 0, |
| 339 | char * const pszHistory = NULL, |
| 340 | const size_t historyCount = 0); |
| 341 | |
| 342 | /*!*************************************************************************** |
| 343 | @brief Loads the supplied pod data. This data can be exported |
| 344 | directly to a header using one of the pod exporters. |
| 345 | If pszExpOpt is NULL, the scene is loaded; otherwise the |
| 346 | scene is not loaded and pszExpOpt is filled in. The same |
| 347 | is true for pszHistory. |
| 348 | @param[in] pData Data to load |
| 349 | @param[in] i32Size Size of data |
| 350 | @param[out] pszExpOpt String in which to place exporter options |
| 351 | @param[in] count Maximum number of characters to store. |
| 352 | @param[out] pszHistory String in which to place the pod file history |
| 353 | @param[in] historyCount Maximum number of characters to store. |
| 354 | @return PVR_SUCCESS if successful, PVR_FAIL if not |
| 355 | *****************************************************************************/ |
| 356 | EPVRTError ReadFromMemory( |
| 357 | const char * pData, |
| 358 | const size_t i32Size, |
| 359 | char * const pszExpOpt = NULL, |
| 360 | const size_t count = 0, |
| 361 | char * const pszHistory = NULL, |
| 362 | const size_t historyCount = 0); |
| 363 | |
| 364 | /*!*************************************************************************** |
| 365 | @brief Sets the scene data from the supplied data structure. Use |
| 366 | when loading from .H files. |
| 367 | @param[in] scene Scene data from the header file |
| 368 | @return PVR_SUCCESS if successful, PVR_FAIL if not |
| 369 | *****************************************************************************/ |
| 370 | EPVRTError ReadFromMemory( |
| 371 | const SPODScene &scene); |
| 372 | |
| 373 | /*!*************************************************************************** |
| 374 | @fn CopyFromMemory |
| 375 | @param[in] scene Scene data from the header file |
| 376 | @return PVR_SUCCESS if successful, PVR_FAIL if not |
| 377 | @brief Copies the scene data from the supplied data structure. Use |
| 378 | when loading from .H files where you want to modify the data. |
| 379 | *****************************************************************************/ |
| 380 | EPVRTError CopyFromMemory( |
| 381 | const SPODScene &scene); |
| 382 | |
| 383 | #if defined(_WIN32) |
| 384 | /*!*************************************************************************** |
| 385 | @fn ReadFromResource |
| 386 | @param[in] pszName Name of the resource to load from |
| 387 | @return PVR_SUCCESS if successful, PVR_FAIL if not |
| 388 | @brief Loads the specified ".POD" file; returns the scene in |
| 389 | pScene. This structure must later be destroyed with |
| 390 | PVRTModelPODDestroy() to prevent memory leaks. |
| 391 | ".POD" files are exported from 3D Studio MAX using a |
| 392 | PowerVR plugin. |
| 393 | *****************************************************************************/ |
| 394 | EPVRTError ReadFromResource( |
| 395 | const TCHAR * const pszName); |
| 396 | #endif |
| 397 | |
| 398 | /*!*********************************************************************** |
| 399 | @fn InitImpl |
| 400 | @brief Used by the Read*() fns to initialise implementation |
| 401 | details. Should also be called by applications which |
| 402 | manually build data in the POD structures for rendering; |
| 403 | in this case call it after the data has been created. |
| 404 | Otherwise, do not call this function. |
| 405 | *************************************************************************/ |
| 406 | EPVRTError InitImpl(); |
| 407 | |
| 408 | /*!*********************************************************************** |
| 409 | @fn DestroyImpl |
| 410 | @brief Used to free memory allocated by the implementation. |
| 411 | *************************************************************************/ |
| 412 | void DestroyImpl(); |
| 413 | |
| 414 | /*!*********************************************************************** |
| 415 | @fn FlushCache |
| 416 | @brief Clears the matrix cache; use this if necessary when you |
| 417 | edit the position or animation of a node. |
| 418 | *************************************************************************/ |
| 419 | void FlushCache(); |
| 420 | |
| 421 | /*!*********************************************************************** |
| 422 | @fn IsLoaded |
| 423 | @brief Boolean to check whether a POD file has been loaded. |
| 424 | *************************************************************************/ |
| 425 | bool IsLoaded(); |
| 426 | |
| 427 | /*!*************************************************************************** |
| 428 | @fn Destroy |
| 429 | @brief Frees the memory allocated to store the scene in pScene. |
| 430 | *****************************************************************************/ |
| 431 | void Destroy(); |
| 432 | |
| 433 | /*!*************************************************************************** |
| 434 | @fn SetFrame |
| 435 | @param[in] fFrame Frame number |
| 436 | @brief Set the animation frame for which subsequent Get*() calls |
| 437 | should return data. |
| 438 | *****************************************************************************/ |
| 439 | void SetFrame( |
| 440 | const VERTTYPE fFrame); |
| 441 | |
| 442 | /*!*************************************************************************** |
| 443 | @brief Generates the world matrix for the given Mesh Instance; |
| 444 | applies the parent's transform too. Uses animation data. |
| 445 | @param[out] mOut Rotation matrix |
| 446 | @param[in] node Node to get the rotation matrix from |
| 447 | *****************************************************************************/ |
| 448 | void GetRotationMatrix( |
| 449 | PVRTMATRIX &mOut, |
| 450 | const SPODNode &node) const; |
| 451 | |
| 452 | /*!*************************************************************************** |
| 453 | @brief Generates the world matrix for the given Mesh Instance; |
| 454 | applies the parent's transform too. Uses animation data. |
| 455 | @param[in] node Node to get the rotation matrix from |
| 456 | @return Rotation matrix |
| 457 | *****************************************************************************/ |
| 458 | PVRTMat4 GetRotationMatrix( |
| 459 | const SPODNode &node) const; |
| 460 | |
| 461 | /*!*************************************************************************** |
| 462 | @brief Generates the world matrix for the given Mesh Instance; |
| 463 | applies the parent's transform too. Uses animation data. |
| 464 | @param[out] mOut Scaling matrix |
| 465 | @param[in] node Node to get the rotation matrix from |
| 466 | *****************************************************************************/ |
| 467 | void GetScalingMatrix( |
| 468 | PVRTMATRIX &mOut, |
| 469 | const SPODNode &node) const; |
| 470 | |
| 471 | /*!*************************************************************************** |
| 472 | @brief Generates the world matrix for the given Mesh Instance; |
| 473 | applies the parent's transform too. Uses animation data. |
| 474 | @param[in] node Node to get the rotation matrix from |
| 475 | @return Scaling matrix |
| 476 | *****************************************************************************/ |
| 477 | PVRTMat4 GetScalingMatrix( |
| 478 | const SPODNode &node) const; |
| 479 | |
| 480 | /*!*************************************************************************** |
| 481 | @brief Generates the translation vector for the given Mesh |
| 482 | Instance. Uses animation data. |
| 483 | @param[out] V Translation vector |
| 484 | @param[in] node Node to get the translation vector from |
| 485 | *****************************************************************************/ |
| 486 | void GetTranslation( |
| 487 | PVRTVECTOR3 &V, |
| 488 | const SPODNode &node) const; |
| 489 | |
| 490 | /*!*************************************************************************** |
| 491 | @brief Generates the translation vector for the given Mesh |
| 492 | Instance. Uses animation data. |
| 493 | @param[in] node Node to get the translation vector from |
| 494 | @return Translation vector |
| 495 | *****************************************************************************/ |
| 496 | PVRTVec3 GetTranslation( |
| 497 | const SPODNode &node) const; |
| 498 | |
| 499 | /*!*************************************************************************** |
| 500 | @brief Generates the world matrix for the given Mesh Instance; |
| 501 | applies the parent's transform too. Uses animation data. |
| 502 | @param[out] mOut Translation matrix |
| 503 | @param[in] node Node to get the translation matrix from |
| 504 | *****************************************************************************/ |
| 505 | void GetTranslationMatrix( |
| 506 | PVRTMATRIX &mOut, |
| 507 | const SPODNode &node) const; |
| 508 | |
| 509 | /*!*************************************************************************** |
| 510 | @brief Generates the world matrix for the given Mesh Instance; |
| 511 | applies the parent's transform too. Uses animation data. |
| 512 | @param[in] node Node to get the translation matrix from |
| 513 | @return Translation matrix |
| 514 | *****************************************************************************/ |
| 515 | PVRTMat4 GetTranslationMatrix( |
| 516 | const SPODNode &node) const; |
| 517 | |
| 518 | /*!*************************************************************************** |
| 519 | @brief Generates the world matrix for the given Mesh Instance; |
| 520 | applies the parent's transform too. Uses animation data. |
| 521 | @param[out] mOut Transformation matrix |
| 522 | @param[in] node Node to get the transformation matrix from |
| 523 | *****************************************************************************/ |
| 524 | void GetTransformationMatrix(PVRTMATRIX &mOut, const SPODNode &node) const; |
| 525 | |
| 526 | /*!*************************************************************************** |
| 527 | @brief Generates the world matrix for the given Mesh Instance; |
| 528 | applies the parent's transform too. Uses animation data. |
| 529 | @param[out] mOut World matrix |
| 530 | @param[in] node Node to get the world matrix from |
| 531 | *****************************************************************************/ |
| 532 | void GetWorldMatrixNoCache( |
| 533 | PVRTMATRIX &mOut, |
| 534 | const SPODNode &node) const; |
| 535 | |
| 536 | /*!*************************************************************************** |
| 537 | @brief Generates the world matrix for the given Mesh Instance; |
| 538 | applies the parent's transform too. Uses animation data. |
| 539 | @param[in] node Node to get the world matrix from |
| 540 | @return World matrix |
| 541 | *****************************************************************************/ |
| 542 | PVRTMat4 GetWorldMatrixNoCache( |
| 543 | const SPODNode &node) const; |
| 544 | |
| 545 | /*!*************************************************************************** |
| 546 | @brief Generates the world matrix for the given Mesh Instance; |
| 547 | applies the parent's transform too. Uses animation data. |
| 548 | @param[out] mOut World matrix |
| 549 | @param[in] node Node to get the world matrix from |
| 550 | *****************************************************************************/ |
| 551 | void GetWorldMatrix( |
| 552 | PVRTMATRIX &mOut, |
| 553 | const SPODNode &node) const; |
| 554 | |
| 555 | /*!*************************************************************************** |
| 556 | @brief Generates the world matrix for the given Mesh Instance; |
| 557 | applies the parent's transform too. Uses animation data. |
| 558 | @param[in] node Node to get the world matrix from |
| 559 | @return World matrix |
| 560 | *****************************************************************************/ |
| 561 | PVRTMat4 GetWorldMatrix(const SPODNode& node) const; |
| 562 | |
| 563 | /*!*************************************************************************** |
| 564 | @brief Generates the world matrix for the given bone. |
| 565 | @param[out] mOut Bone world matrix |
| 566 | @param[in] NodeMesh Mesh to take the world matrix from |
| 567 | @param[in] NodeBone Bone to take the matrix from |
| 568 | *****************************************************************************/ |
| 569 | void GetBoneWorldMatrix( |
| 570 | PVRTMATRIX &mOut, |
| 571 | const SPODNode &NodeMesh, |
| 572 | const SPODNode &NodeBone); |
| 573 | |
| 574 | /*!*************************************************************************** |
| 575 | @brief Generates the world matrix for the given bone. |
| 576 | @param[in] NodeMesh Mesh to take the world matrix from |
| 577 | @param[in] NodeBone Bone to take the matrix from |
| 578 | @return Bone world matrix |
| 579 | *****************************************************************************/ |
| 580 | PVRTMat4 GetBoneWorldMatrix( |
| 581 | const SPODNode &NodeMesh, |
| 582 | const SPODNode &NodeBone); |
| 583 | |
| 584 | /*!*************************************************************************** |
| 585 | @fn GetCamera |
| 586 | @param[out] vFrom Position of the camera |
| 587 | @param[out] vTo Target of the camera |
| 588 | @param[out] vUp Up direction of the camera |
| 589 | @param[in] nIdx Camera number |
| 590 | @return Camera horizontal FOV |
| 591 | @brief Calculate the From, To and Up vectors for the given |
| 592 | camera. Uses animation data. |
| 593 | Note that even if the camera has a target, *pvTo is not |
| 594 | the position of that target. *pvTo is a position in the |
| 595 | correct direction of the target, one unit away from the |
| 596 | camera. |
| 597 | *****************************************************************************/ |
| 598 | VERTTYPE GetCamera( |
| 599 | PVRTVECTOR3 &vFrom, |
| 600 | PVRTVECTOR3 &vTo, |
| 601 | PVRTVECTOR3 &vUp, |
| 602 | const unsigned int nIdx) const; |
| 603 | |
| 604 | /*!*************************************************************************** |
| 605 | @fn GetCameraPos |
| 606 | @param[out] vFrom Position of the camera |
| 607 | @param[out] vTo Target of the camera |
| 608 | @param[in] nIdx Camera number |
| 609 | @return Camera horizontal FOV |
| 610 | @brief Calculate the position of the camera and its target. Uses |
| 611 | animation data. |
| 612 | If the queried camera does not have a target, *pvTo is |
| 613 | not changed. |
| 614 | *****************************************************************************/ |
| 615 | VERTTYPE GetCameraPos( |
| 616 | PVRTVECTOR3 &vFrom, |
| 617 | PVRTVECTOR3 &vTo, |
| 618 | const unsigned int nIdx) const; |
| 619 | |
| 620 | /*!*************************************************************************** |
| 621 | @fn GetLight |
| 622 | @param[out] vPos Position of the light |
| 623 | @param[out] vDir Direction of the light |
| 624 | @param[in] nIdx Light number |
| 625 | @brief Calculate the position and direction of the given Light. |
| 626 | Uses animation data. |
| 627 | *****************************************************************************/ |
| 628 | void GetLight( |
| 629 | PVRTVECTOR3 &vPos, |
| 630 | PVRTVECTOR3 &vDir, |
| 631 | const unsigned int nIdx) const; |
| 632 | |
| 633 | /*!*************************************************************************** |
| 634 | @fn GetLightPosition |
| 635 | @param[in] u32Idx Light number |
| 636 | @return PVRTVec4 position of light with w set correctly |
| 637 | @brief Calculate the position the given Light. Uses animation data. |
| 638 | *****************************************************************************/ |
| 639 | PVRTVec4 GetLightPosition(const unsigned int u32Idx) const; |
| 640 | |
| 641 | /*!*************************************************************************** |
| 642 | @fn GetLightDirection |
| 643 | @param[in] u32Idx Light number |
| 644 | @return PVRTVec4 direction of light with w set correctly |
| 645 | @brief Calculate the direction of the given Light. Uses animation data. |
| 646 | *****************************************************************************/ |
| 647 | PVRTVec4 GetLightDirection(const unsigned int u32Idx) const; |
| 648 | |
| 649 | /*!*************************************************************************** |
| 650 | @fn CreateSkinIdxWeight |
| 651 | @param[out] pIdx Four bytes containing matrix indices for vertex (0..255) (D3D: use UBYTE4) |
| 652 | @param[out] pWeight Four bytes containing blend weights for vertex (0.0 .. 1.0) (D3D: use D3DCOLOR) |
| 653 | @param[in] nVertexBones Number of bones this vertex uses |
| 654 | @param[in] pnBoneIdx Pointer to 'nVertexBones' indices |
| 655 | @param[in] pfBoneWeight Pointer to 'nVertexBones' blend weights |
| 656 | @brief Creates the matrix indices and blend weights for a boned |
| 657 | vertex. Call once per vertex of a boned mesh. |
| 658 | *****************************************************************************/ |
| 659 | EPVRTError CreateSkinIdxWeight( |
| 660 | char * const pIdx, |
| 661 | char * const pWeight, |
| 662 | const int nVertexBones, |
| 663 | const int * const pnBoneIdx, |
| 664 | const VERTTYPE * const pfBoneWeight); |
| 665 | |
| 666 | /*!*************************************************************************** |
| 667 | @fn SavePOD |
| 668 | @param[in] pszFilename Filename to save to |
| 669 | @param[in] pszExpOpt A string containing the options used by the exporter |
| 670 | @param[in] pszHistory A string containing the history of the exported pod file |
| 671 | @brief Save a binary POD file (.POD). |
| 672 | *****************************************************************************/ |
| 673 | EPVRTError SavePOD(const char * const pszFilename, const char * const pszExpOpt = 0, const char * const pszHistory = 0); |
| 674 | |
| 675 | private: |
| 676 | SPVRTPODImpl *m_pImpl; /*!< Internal implementation data */ |
| 677 | }; |
| 678 | |
| 679 | /**************************************************************************** |
| 680 | ** Declarations |
| 681 | ****************************************************************************/ |
| 682 | |
| 683 | /*!*************************************************************************** |
| 684 | @fn PVRTModelPODDataTypeSize |
| 685 | @param[in] type Type to get the size of |
| 686 | @return Size of the data element |
| 687 | @brief Returns the size of each data element. |
| 688 | *****************************************************************************/ |
| 689 | PVRTuint32 PVRTModelPODDataTypeSize(const EPVRTDataType type); |
| 690 | |
| 691 | /*!*************************************************************************** |
| 692 | @fn PVRTModelPODDataTypeComponentCount |
| 693 | @param[in] type Type to get the number of components from |
| 694 | @return number of components in the data element |
| 695 | @brief Returns the number of components in a data element. |
| 696 | *****************************************************************************/ |
| 697 | PVRTuint32 PVRTModelPODDataTypeComponentCount(const EPVRTDataType type); |
| 698 | |
| 699 | /*!*************************************************************************** |
| 700 | @fn PVRTModelPODDataStride |
| 701 | @param[in] data Data elements |
| 702 | @return Size of the vector elements |
| 703 | @brief Returns the size of the vector of data elements. |
| 704 | *****************************************************************************/ |
| 705 | PVRTuint32 PVRTModelPODDataStride(const CPODData &data); |
| 706 | |
| 707 | /*!*************************************************************************** |
| 708 | @fn PVRTModelPODGetAnimArraySize |
| 709 | @param[in] pAnimDataIdx |
| 710 | @param[in] ui32Frames |
| 711 | @param[in] ui32Components |
| 712 | @return Size of the animation array |
| 713 | @brief Calculates the size of an animation array |
| 714 | *****************************************************************************/ |
| 715 | PVRTuint32 PVRTModelPODGetAnimArraySize(PVRTuint32 *pAnimDataIdx, PVRTuint32 ui32Frames, PVRTuint32 ui32Components); |
| 716 | |
| 717 | /*!*************************************************************************** |
| 718 | @fn PVRTModelPODScaleAndConvertVtxData |
| 719 | @Modified mesh POD mesh to scale and convert the mesh data |
| 720 | @param[in] eNewType The data type to scale and convert the vertex data to |
| 721 | @return PVR_SUCCESS on success and PVR_FAIL on failure. |
| 722 | @brief Scales the vertex data to fit within the range of the requested |
| 723 | data type and then converts the data to that type. This function |
| 724 | isn't currently compiled in for fixed point builds of the tools. |
| 725 | *****************************************************************************/ |
| 726 | #if !defined(PVRT_FIXED_POINT_ENABLE) |
| 727 | EPVRTError PVRTModelPODScaleAndConvertVtxData(SPODMesh &mesh, const EPVRTDataType eNewType); |
| 728 | #endif |
| 729 | /*!*************************************************************************** |
| 730 | @fn PVRTModelPODDataConvert |
| 731 | @Modified data Data elements to convert |
| 732 | @param[in] eNewType New type of elements |
| 733 | @param[in] nCnt Number of elements |
| 734 | @brief Convert the format of the array of vectors. |
| 735 | *****************************************************************************/ |
| 736 | void PVRTModelPODDataConvert(CPODData &data, const unsigned int nCnt, const EPVRTDataType eNewType); |
| 737 | |
| 738 | /*!*************************************************************************** |
| 739 | @fn PVRTModelPODDataShred |
| 740 | @Modified data Data elements to modify |
| 741 | @param[in] nCnt Number of elements |
| 742 | @param[in] pChannels A list of the wanted channels, e.g. {'x', 'y', 0} |
| 743 | @brief Reduce the number of dimensions in 'data' using the requested |
| 744 | channel array. The array should have a maximum length of 4 |
| 745 | or be null terminated if less channels are wanted. Supported |
| 746 | elements are 'x','y','z' and 'w'. They must be defined in lower |
| 747 | case. It is also possible to negate an element, e.g. {'x','y', -'z'}. |
| 748 | *****************************************************************************/ |
| 749 | void PVRTModelPODDataShred(CPODData &data, const unsigned int nCnt, const int *pChannels); |
| 750 | |
| 751 | /*!*************************************************************************** |
| 752 | @fn PVRTModelPODReorderFaces |
| 753 | @Modified mesh The mesh to re-order the faces of |
| 754 | @param[in] i32El1 The first index to be written out |
| 755 | @param[in] i32El2 The second index to be written out |
| 756 | @param[in] i32El3 The third index to be written out |
| 757 | @brief Reorders the face indices of a mesh. |
| 758 | *****************************************************************************/ |
| 759 | void PVRTModelPODReorderFaces(SPODMesh &mesh, const int i32El1, const int i32El2, const int i32El3); |
| 760 | |
| 761 | /*!*************************************************************************** |
| 762 | @fn PVRTModelPODToggleInterleaved |
| 763 | @Modified mesh Mesh to modify |
| 764 | @param[in] ui32AlignToNBytes Align the interleaved data to this no. of bytes. |
| 765 | @brief Switches the supplied mesh to or from interleaved data format. |
| 766 | *****************************************************************************/ |
| 767 | void PVRTModelPODToggleInterleaved(SPODMesh &mesh, unsigned int ui32AlignToNBytes = 1); |
| 768 | |
| 769 | /*!*************************************************************************** |
| 770 | @fn PVRTModelPODDeIndex |
| 771 | @Modified mesh Mesh to modify |
| 772 | @brief De-indexes the supplied mesh. The mesh must be |
| 773 | Interleaved before calling this function. |
| 774 | *****************************************************************************/ |
| 775 | void PVRTModelPODDeIndex(SPODMesh &mesh); |
| 776 | |
| 777 | /*!*************************************************************************** |
| 778 | @fn PVRTModelPODToggleStrips |
| 779 | @Modified mesh Mesh to modify |
| 780 | @brief Converts the supplied mesh to or from strips. |
| 781 | *****************************************************************************/ |
| 782 | void PVRTModelPODToggleStrips(SPODMesh &mesh); |
| 783 | |
| 784 | /*!*************************************************************************** |
| 785 | @fn PVRTModelPODCountIndices |
| 786 | @param[in] mesh Mesh |
| 787 | @return Number of indices used by mesh |
| 788 | @brief Counts the number of indices of a mesh |
| 789 | *****************************************************************************/ |
| 790 | unsigned int PVRTModelPODCountIndices(const SPODMesh &mesh); |
| 791 | |
| 792 | /*!*************************************************************************** |
| 793 | @fn PVRTModelPODCopyCPODData |
| 794 | @param[in] in |
| 795 | @param[out] out |
| 796 | @param[in] ui32No |
| 797 | @param[in] bInterleaved |
| 798 | @brief Used to copy a CPODData of a mesh |
| 799 | *****************************************************************************/ |
| 800 | void PVRTModelPODCopyCPODData(const CPODData &in, CPODData &out, unsigned int ui32No, bool bInterleaved); |
| 801 | |
| 802 | /*!*************************************************************************** |
| 803 | @fn PVRTModelPODCopyNode |
| 804 | @param[in] in |
| 805 | @param[out] out |
| 806 | @param[in] nNumFrames The number of animation frames |
| 807 | @brief Used to copy a pod node |
| 808 | *****************************************************************************/ |
| 809 | void PVRTModelPODCopyNode(const SPODNode &in, SPODNode &out, int nNumFrames); |
| 810 | |
| 811 | /*!*************************************************************************** |
| 812 | @fn PVRTModelPODCopyMesh |
| 813 | @param[in] in |
| 814 | @param[out] out |
| 815 | @brief Used to copy a pod mesh |
| 816 | *****************************************************************************/ |
| 817 | void PVRTModelPODCopyMesh(const SPODMesh &in, SPODMesh &out); |
| 818 | |
| 819 | /*!*************************************************************************** |
| 820 | @fn PVRTModelPODCopyTexture |
| 821 | @param[in] in |
| 822 | @param[out] out |
| 823 | @brief Used to copy a pod texture |
| 824 | *****************************************************************************/ |
| 825 | void PVRTModelPODCopyTexture(const SPODTexture &in, SPODTexture &out); |
| 826 | |
| 827 | /*!*************************************************************************** |
| 828 | @fn PVRTModelPODCopyMaterial |
| 829 | @param[in] in |
| 830 | @param[out] out |
| 831 | @brief Used to copy a pod material |
| 832 | *****************************************************************************/ |
| 833 | void PVRTModelPODCopyMaterial(const SPODMaterial &in, SPODMaterial &out); |
| 834 | |
| 835 | /*!*************************************************************************** |
| 836 | @fn PVRTModelPODCopyCamera |
| 837 | @param[in] in |
| 838 | @param[out] out |
| 839 | @param[in] nNumFrames The number of animation frames |
| 840 | @brief Used to copy a pod camera |
| 841 | *****************************************************************************/ |
| 842 | void PVRTModelPODCopyCamera(const SPODCamera &in, SPODCamera &out, int nNumFrames); |
| 843 | |
| 844 | /*!*************************************************************************** |
| 845 | @fn PVRTModelPODCopyLight |
| 846 | @param[in] in |
| 847 | @param[out] out |
| 848 | @brief Used to copy a pod light |
| 849 | *****************************************************************************/ |
| 850 | void PVRTModelPODCopyLight(const SPODLight &in, SPODLight &out); |
| 851 | |
| 852 | /*!*************************************************************************** |
| 853 | @fn PVRTModelPODFlattenToWorldSpace |
| 854 | @param[in] in - Source scene. All meshes must not be interleaved. |
| 855 | @param[out] out |
| 856 | @brief Used to flatten a pod scene to world space. All animation |
| 857 | and skinning information will be removed. The returned |
| 858 | position, normal, binormals and tangent data if present |
| 859 | will be returned as floats regardless of the input data |
| 860 | type. |
| 861 | *****************************************************************************/ |
| 862 | EPVRTError PVRTModelPODFlattenToWorldSpace(CPVRTModelPOD &in, CPVRTModelPOD &out); |
| 863 | |
| 864 | |
| 865 | /*!*************************************************************************** |
| 866 | @fn PVRTModelPODMergeMaterials |
| 867 | @param[in] src - Source scene |
| 868 | @param[out] dst - Destination scene |
| 869 | @brief This function takes two scenes and merges the textures, |
| 870 | PFX effects and blending parameters from the src materials |
| 871 | into the dst materials if they have the same material name. |
| 872 | *****************************************************************************/ |
| 873 | EPVRTError PVRTModelPODMergeMaterials(const CPVRTModelPOD &src, CPVRTModelPOD &dst); |
| 874 | |
| 875 | #endif /* _PVRTMODELPOD_H_ */ |
| 876 | |
| 877 | /***************************************************************************** |
| 878 | End of file (PVRTModelPOD.h) |
| 879 | *****************************************************************************/ |
| 880 | |