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 881