vrshoot

annotate libs/assimp/ASEParser.h @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
rev   line source
nuclear@0 1 /*
nuclear@0 2 Open Asset Import Library (assimp)
nuclear@0 3 ----------------------------------------------------------------------
nuclear@0 4
nuclear@0 5 Copyright (c) 2006-2012, assimp team
nuclear@0 6 All rights reserved.
nuclear@0 7
nuclear@0 8 Redistribution and use of this software in source and binary forms,
nuclear@0 9 with or without modification, are permitted provided that the
nuclear@0 10 following conditions are met:
nuclear@0 11
nuclear@0 12 * Redistributions of source code must retain the above
nuclear@0 13 copyright notice, this list of conditions and the
nuclear@0 14 following disclaimer.
nuclear@0 15
nuclear@0 16 * Redistributions in binary form must reproduce the above
nuclear@0 17 copyright notice, this list of conditions and the
nuclear@0 18 following disclaimer in the documentation and/or other
nuclear@0 19 materials provided with the distribution.
nuclear@0 20
nuclear@0 21 * Neither the name of the assimp team, nor the names of its
nuclear@0 22 contributors may be used to endorse or promote products
nuclear@0 23 derived from this software without specific prior
nuclear@0 24 written permission of the assimp team.
nuclear@0 25
nuclear@0 26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
nuclear@0 27 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
nuclear@0 28 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
nuclear@0 29 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
nuclear@0 30 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
nuclear@0 31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
nuclear@0 32 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
nuclear@0 33 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
nuclear@0 34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
nuclear@0 35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nuclear@0 36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nuclear@0 37
nuclear@0 38 ----------------------------------------------------------------------
nuclear@0 39 */
nuclear@0 40
nuclear@0 41
nuclear@0 42 /** @file Defines the helper data structures for importing ASE files */
nuclear@0 43 #ifndef AI_ASEFILEHELPER_H_INC
nuclear@0 44 #define AI_ASEFILEHELPER_H_INC
nuclear@0 45
nuclear@0 46 // STL/CRT headers
nuclear@0 47 #include <string>
nuclear@0 48 #include <vector>
nuclear@0 49 #include <list>
nuclear@0 50
nuclear@0 51 // public ASSIMP headers
nuclear@0 52 #include "assimp/types.h"
nuclear@0 53 #include "assimp/mesh.h"
nuclear@0 54 #include "assimp/anim.h"
nuclear@0 55
nuclear@0 56 // for some helper routines like IsSpace()
nuclear@0 57 #include "ParsingUtils.h"
nuclear@0 58 #include "qnan.h"
nuclear@0 59
nuclear@0 60 // ASE is quite similar to 3ds. We can reuse some structures
nuclear@0 61 #include "3DSLoader.h"
nuclear@0 62
nuclear@0 63 namespace Assimp {
nuclear@0 64 namespace ASE {
nuclear@0 65
nuclear@0 66 using namespace D3DS;
nuclear@0 67
nuclear@0 68 // ---------------------------------------------------------------------------
nuclear@0 69 /** Helper structure representing an ASE material */
nuclear@0 70 struct Material : public D3DS::Material
nuclear@0 71 {
nuclear@0 72 //! Default constructor
nuclear@0 73 Material() : pcInstance(NULL), bNeed (false)
nuclear@0 74 {}
nuclear@0 75
nuclear@0 76 //! Contains all sub materials of this material
nuclear@0 77 std::vector<Material> avSubMaterials;
nuclear@0 78
nuclear@0 79 //! aiMaterial object
nuclear@0 80 aiMaterial* pcInstance;
nuclear@0 81
nuclear@0 82 //! Can we remove this material?
nuclear@0 83 bool bNeed;
nuclear@0 84 };
nuclear@0 85
nuclear@0 86 // ---------------------------------------------------------------------------
nuclear@0 87 /** Helper structure to represent an ASE file face */
nuclear@0 88 struct Face : public FaceWithSmoothingGroup
nuclear@0 89 {
nuclear@0 90 //! Default constructor. Initializes everything with 0
nuclear@0 91 Face()
nuclear@0 92 {
nuclear@0 93 mColorIndices[0] = mColorIndices[1] = mColorIndices[2] = 0;
nuclear@0 94 for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS;++i)
nuclear@0 95 {
nuclear@0 96 amUVIndices[i][0] = amUVIndices[i][1] = amUVIndices[i][2] = 0;
nuclear@0 97 }
nuclear@0 98
nuclear@0 99 iMaterial = DEFAULT_MATINDEX;
nuclear@0 100 iFace = 0;
nuclear@0 101 }
nuclear@0 102
nuclear@0 103 //! special value to indicate that no material index has
nuclear@0 104 //! been assigned to a face. The default material index
nuclear@0 105 //! will replace this value later.
nuclear@0 106 static const unsigned int DEFAULT_MATINDEX = 0xFFFFFFFF;
nuclear@0 107
nuclear@0 108
nuclear@0 109
nuclear@0 110 //! Indices into each list of texture coordinates
nuclear@0 111 unsigned int amUVIndices[AI_MAX_NUMBER_OF_TEXTURECOORDS][3];
nuclear@0 112
nuclear@0 113 //! Index into the list of vertex colors
nuclear@0 114 unsigned int mColorIndices[3];
nuclear@0 115
nuclear@0 116 //! (Sub)Material index to be assigned to this face
nuclear@0 117 unsigned int iMaterial;
nuclear@0 118
nuclear@0 119 //! Index of the face. It is not specified whether it is
nuclear@0 120 //! a requirement of the file format that all faces are
nuclear@0 121 //! written in sequential order, so we have to expect this case
nuclear@0 122 unsigned int iFace;
nuclear@0 123 };
nuclear@0 124
nuclear@0 125 // ---------------------------------------------------------------------------
nuclear@0 126 /** Helper structure to represent an ASE file bone */
nuclear@0 127 struct Bone
nuclear@0 128 {
nuclear@0 129 //! Constructor
nuclear@0 130 Bone()
nuclear@0 131 {
nuclear@0 132 static int iCnt = 0;
nuclear@0 133
nuclear@0 134 // Generate a default name for the bone
nuclear@0 135 char szTemp[128];
nuclear@0 136 ::sprintf(szTemp,"UNNAMED_%i",iCnt++);
nuclear@0 137 mName = szTemp;
nuclear@0 138 }
nuclear@0 139
nuclear@0 140 //! Construction from an existing name
nuclear@0 141 Bone( const std::string& name)
nuclear@0 142 : mName (name)
nuclear@0 143 {}
nuclear@0 144
nuclear@0 145 //! Name of the bone
nuclear@0 146 std::string mName;
nuclear@0 147 };
nuclear@0 148
nuclear@0 149 // ---------------------------------------------------------------------------
nuclear@0 150 /** Helper structure to represent an ASE file bone vertex */
nuclear@0 151 struct BoneVertex
nuclear@0 152 {
nuclear@0 153 //! Bone and corresponding vertex weight.
nuclear@0 154 //! -1 for unrequired bones ....
nuclear@0 155 std::vector<std::pair<int,float> > mBoneWeights;
nuclear@0 156
nuclear@0 157 //! Position of the bone vertex.
nuclear@0 158 //! MUST be identical to the vertex position
nuclear@0 159 //aiVector3D mPosition;
nuclear@0 160 };
nuclear@0 161
nuclear@0 162 // ---------------------------------------------------------------------------
nuclear@0 163 /** Helper structure to represent an ASE file animation */
nuclear@0 164 struct Animation
nuclear@0 165 {
nuclear@0 166 enum Type
nuclear@0 167 {
nuclear@0 168 TRACK = 0x0,
nuclear@0 169 BEZIER = 0x1,
nuclear@0 170 TCB = 0x2
nuclear@0 171 } mRotationType, mScalingType, mPositionType;
nuclear@0 172
nuclear@0 173 Animation()
nuclear@0 174 : mRotationType (TRACK)
nuclear@0 175 , mScalingType (TRACK)
nuclear@0 176 , mPositionType (TRACK)
nuclear@0 177 {}
nuclear@0 178
nuclear@0 179 //! List of track rotation keyframes
nuclear@0 180 std::vector< aiQuatKey > akeyRotations;
nuclear@0 181
nuclear@0 182 //! List of track position keyframes
nuclear@0 183 std::vector< aiVectorKey > akeyPositions;
nuclear@0 184
nuclear@0 185 //! List of track scaling keyframes
nuclear@0 186 std::vector< aiVectorKey > akeyScaling;
nuclear@0 187
nuclear@0 188 };
nuclear@0 189
nuclear@0 190 // ---------------------------------------------------------------------------
nuclear@0 191 /** Helper structure to represent the inheritance information of an ASE node */
nuclear@0 192 struct InheritanceInfo
nuclear@0 193 {
nuclear@0 194 //! Default constructor
nuclear@0 195 InheritanceInfo()
nuclear@0 196 {
nuclear@0 197 // set the inheritance flag for all axes by default to true
nuclear@0 198 for (unsigned int i = 0; i < 3;++i)
nuclear@0 199 abInheritPosition[i] = abInheritRotation[i] = abInheritScaling[i] = true;
nuclear@0 200 }
nuclear@0 201
nuclear@0 202 //! Inherit the parent's position?, axis order is x,y,z
nuclear@0 203 bool abInheritPosition[3];
nuclear@0 204
nuclear@0 205 //! Inherit the parent's rotation?, axis order is x,y,z
nuclear@0 206 bool abInheritRotation[3];
nuclear@0 207
nuclear@0 208 //! Inherit the parent's scaling?, axis order is x,y,z
nuclear@0 209 bool abInheritScaling[3];
nuclear@0 210 };
nuclear@0 211
nuclear@0 212 // ---------------------------------------------------------------------------
nuclear@0 213 /** Represents an ASE file node. Base class for mesh, light and cameras */
nuclear@0 214 struct BaseNode
nuclear@0 215 {
nuclear@0 216 enum Type {Light, Camera, Mesh, Dummy} mType;
nuclear@0 217
nuclear@0 218 //! Constructor. Creates a default name for the node
nuclear@0 219 BaseNode(Type _mType)
nuclear@0 220 : mType (_mType)
nuclear@0 221 , mProcessed (false)
nuclear@0 222 {
nuclear@0 223 // generate a default name for the node
nuclear@0 224 static int iCnt = 0;
nuclear@0 225 char szTemp[128]; // should be sufficiently large
nuclear@0 226 ::sprintf(szTemp,"UNNAMED_%i",iCnt++);
nuclear@0 227 mName = szTemp;
nuclear@0 228
nuclear@0 229 // Set mTargetPosition to qnan
nuclear@0 230 const float qnan = get_qnan();
nuclear@0 231 mTargetPosition.x = qnan;
nuclear@0 232 }
nuclear@0 233
nuclear@0 234 //! Name of the mesh
nuclear@0 235 std::string mName;
nuclear@0 236
nuclear@0 237 //! Name of the parent of the node
nuclear@0 238 //! "" if there is no parent ...
nuclear@0 239 std::string mParent;
nuclear@0 240
nuclear@0 241 //! Transformation matrix of the node
nuclear@0 242 aiMatrix4x4 mTransform;
nuclear@0 243
nuclear@0 244 //! Target position (target lights and cameras)
nuclear@0 245 aiVector3D mTargetPosition;
nuclear@0 246
nuclear@0 247 //! Specifies which axes transformations a node inherits
nuclear@0 248 //! from its parent ...
nuclear@0 249 InheritanceInfo inherit;
nuclear@0 250
nuclear@0 251 //! Animation channels for the node
nuclear@0 252 Animation mAnim;
nuclear@0 253
nuclear@0 254 //! Needed for lights and cameras: target animation channel
nuclear@0 255 //! Should contain position keys only.
nuclear@0 256 Animation mTargetAnim;
nuclear@0 257
nuclear@0 258 bool mProcessed;
nuclear@0 259 };
nuclear@0 260
nuclear@0 261 // ---------------------------------------------------------------------------
nuclear@0 262 /** Helper structure to represent an ASE file mesh */
nuclear@0 263 struct Mesh : public MeshWithSmoothingGroups<ASE::Face>, public BaseNode
nuclear@0 264 {
nuclear@0 265 //! Constructor.
nuclear@0 266 Mesh()
nuclear@0 267 : BaseNode (BaseNode::Mesh)
nuclear@0 268 , bSkip (false)
nuclear@0 269 {
nuclear@0 270 // use 2 texture vertex components by default
nuclear@0 271 for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c)
nuclear@0 272 this->mNumUVComponents[c] = 2;
nuclear@0 273
nuclear@0 274 // setup the default material index by default
nuclear@0 275 iMaterialIndex = Face::DEFAULT_MATINDEX;
nuclear@0 276 }
nuclear@0 277
nuclear@0 278 //! List of all texture coordinate sets
nuclear@0 279 std::vector<aiVector3D> amTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
nuclear@0 280
nuclear@0 281 //! List of all vertex color sets.
nuclear@0 282 std::vector<aiColor4D> mVertexColors;
nuclear@0 283
nuclear@0 284 //! List of all bone vertices
nuclear@0 285 std::vector<BoneVertex> mBoneVertices;
nuclear@0 286
nuclear@0 287 //! List of all bones
nuclear@0 288 std::vector<Bone> mBones;
nuclear@0 289
nuclear@0 290 //! Material index of the mesh
nuclear@0 291 unsigned int iMaterialIndex;
nuclear@0 292
nuclear@0 293 //! Number of vertex components for each UVW set
nuclear@0 294 unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS];
nuclear@0 295
nuclear@0 296 //! used internally
nuclear@0 297 bool bSkip;
nuclear@0 298 };
nuclear@0 299
nuclear@0 300 // ---------------------------------------------------------------------------
nuclear@0 301 /** Helper structure to represent an ASE light source */
nuclear@0 302 struct Light : public BaseNode
nuclear@0 303 {
nuclear@0 304 enum LightType
nuclear@0 305 {
nuclear@0 306 OMNI,
nuclear@0 307 TARGET,
nuclear@0 308 FREE,
nuclear@0 309 DIRECTIONAL
nuclear@0 310 };
nuclear@0 311
nuclear@0 312 //! Constructor.
nuclear@0 313 Light()
nuclear@0 314 : BaseNode (BaseNode::Light)
nuclear@0 315 , mLightType (OMNI)
nuclear@0 316 , mColor (1.f,1.f,1.f)
nuclear@0 317 , mIntensity (1.f) // light is white by default
nuclear@0 318 , mAngle (45.f)
nuclear@0 319 , mFalloff (0.f)
nuclear@0 320 {
nuclear@0 321 }
nuclear@0 322
nuclear@0 323 LightType mLightType;
nuclear@0 324 aiColor3D mColor;
nuclear@0 325 float mIntensity;
nuclear@0 326 float mAngle; // in degrees
nuclear@0 327 float mFalloff;
nuclear@0 328 };
nuclear@0 329
nuclear@0 330 // ---------------------------------------------------------------------------
nuclear@0 331 /** Helper structure to represent an ASE camera */
nuclear@0 332 struct Camera : public BaseNode
nuclear@0 333 {
nuclear@0 334 enum CameraType
nuclear@0 335 {
nuclear@0 336 FREE,
nuclear@0 337 TARGET
nuclear@0 338 };
nuclear@0 339
nuclear@0 340 //! Constructor
nuclear@0 341 Camera()
nuclear@0 342 : BaseNode (BaseNode::Camera)
nuclear@0 343 , mFOV (0.75f) // in radians
nuclear@0 344 , mNear (0.1f)
nuclear@0 345 , mFar (1000.f) // could be zero
nuclear@0 346 , mCameraType (FREE)
nuclear@0 347 {
nuclear@0 348 }
nuclear@0 349
nuclear@0 350 float mFOV, mNear, mFar;
nuclear@0 351 CameraType mCameraType;
nuclear@0 352 };
nuclear@0 353
nuclear@0 354 // ---------------------------------------------------------------------------
nuclear@0 355 /** Helper structure to represent an ASE helper object (dummy) */
nuclear@0 356 struct Dummy : public BaseNode
nuclear@0 357 {
nuclear@0 358 //! Constructor
nuclear@0 359 Dummy()
nuclear@0 360 : BaseNode (BaseNode::Dummy)
nuclear@0 361 {
nuclear@0 362 }
nuclear@0 363 };
nuclear@0 364
nuclear@0 365 // Parameters to Parser::Parse()
nuclear@0 366 #define AI_ASE_NEW_FILE_FORMAT 200
nuclear@0 367 #define AI_ASE_OLD_FILE_FORMAT 110
nuclear@0 368
nuclear@0 369 // Internally we're a little bit more tolerant
nuclear@0 370 #define AI_ASE_IS_NEW_FILE_FORMAT() (iFileFormat >= 200)
nuclear@0 371 #define AI_ASE_IS_OLD_FILE_FORMAT() (iFileFormat < 200)
nuclear@0 372
nuclear@0 373 // -------------------------------------------------------------------------------
nuclear@0 374 /** \brief Class to parse ASE files
nuclear@0 375 */
nuclear@0 376 class Parser
nuclear@0 377 {
nuclear@0 378
nuclear@0 379 private:
nuclear@0 380
nuclear@0 381 Parser() {}
nuclear@0 382
nuclear@0 383 public:
nuclear@0 384
nuclear@0 385 // -------------------------------------------------------------------
nuclear@0 386 //! Construct a parser from a given input file which is
nuclear@0 387 //! guaranted to be terminated with zero.
nuclear@0 388 //! @param szFile Input file
nuclear@0 389 //! @param fileFormatDefault Assumed file format version. If the
nuclear@0 390 //! file format is specified in the file the new value replaces
nuclear@0 391 //! the default value.
nuclear@0 392 Parser (const char* szFile, unsigned int fileFormatDefault);
nuclear@0 393
nuclear@0 394 // -------------------------------------------------------------------
nuclear@0 395 //! Parses the file into the parsers internal representation
nuclear@0 396 void Parse();
nuclear@0 397
nuclear@0 398
nuclear@0 399 private:
nuclear@0 400
nuclear@0 401 // -------------------------------------------------------------------
nuclear@0 402 //! Parse the *SCENE block in a file
nuclear@0 403 void ParseLV1SceneBlock();
nuclear@0 404
nuclear@0 405 // -------------------------------------------------------------------
nuclear@0 406 //! Parse the *MESH_SOFTSKINVERTS block in a file
nuclear@0 407 void ParseLV1SoftSkinBlock();
nuclear@0 408
nuclear@0 409 // -------------------------------------------------------------------
nuclear@0 410 //! Parse the *MATERIAL_LIST block in a file
nuclear@0 411 void ParseLV1MaterialListBlock();
nuclear@0 412
nuclear@0 413 // -------------------------------------------------------------------
nuclear@0 414 //! Parse a *<xxx>OBJECT block in a file
nuclear@0 415 //! \param mesh Node to be filled
nuclear@0 416 void ParseLV1ObjectBlock(BaseNode& mesh);
nuclear@0 417
nuclear@0 418 // -------------------------------------------------------------------
nuclear@0 419 //! Parse a *MATERIAL blocks in a material list
nuclear@0 420 //! \param mat Material structure to be filled
nuclear@0 421 void ParseLV2MaterialBlock(Material& mat);
nuclear@0 422
nuclear@0 423 // -------------------------------------------------------------------
nuclear@0 424 //! Parse a *NODE_TM block in a file
nuclear@0 425 //! \param mesh Node (!) object to be filled
nuclear@0 426 void ParseLV2NodeTransformBlock(BaseNode& mesh);
nuclear@0 427
nuclear@0 428 // -------------------------------------------------------------------
nuclear@0 429 //! Parse a *TM_ANIMATION block in a file
nuclear@0 430 //! \param mesh Mesh object to be filled
nuclear@0 431 void ParseLV2AnimationBlock(BaseNode& mesh);
nuclear@0 432 void ParseLV3PosAnimationBlock(ASE::Animation& anim);
nuclear@0 433 void ParseLV3ScaleAnimationBlock(ASE::Animation& anim);
nuclear@0 434 void ParseLV3RotAnimationBlock(ASE::Animation& anim);
nuclear@0 435
nuclear@0 436 // -------------------------------------------------------------------
nuclear@0 437 //! Parse a *MESH block in a file
nuclear@0 438 //! \param mesh Mesh object to be filled
nuclear@0 439 void ParseLV2MeshBlock(Mesh& mesh);
nuclear@0 440
nuclear@0 441 // -------------------------------------------------------------------
nuclear@0 442 //! Parse a *LIGHT_SETTINGS block in a file
nuclear@0 443 //! \param light Light object to be filled
nuclear@0 444 void ParseLV2LightSettingsBlock(Light& light);
nuclear@0 445
nuclear@0 446 // -------------------------------------------------------------------
nuclear@0 447 //! Parse a *CAMERA_SETTINGS block in a file
nuclear@0 448 //! \param cam Camera object to be filled
nuclear@0 449 void ParseLV2CameraSettingsBlock(Camera& cam);
nuclear@0 450
nuclear@0 451 // -------------------------------------------------------------------
nuclear@0 452 //! Parse the *MAP_XXXXXX blocks in a material
nuclear@0 453 //! \param map Texture structure to be filled
nuclear@0 454 void ParseLV3MapBlock(Texture& map);
nuclear@0 455
nuclear@0 456 // -------------------------------------------------------------------
nuclear@0 457 //! Parse a *MESH_VERTEX_LIST block in a file
nuclear@0 458 //! \param iNumVertices Value of *MESH_NUMVERTEX, if present.
nuclear@0 459 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 460 //! A warning is sent to the logger if the validations fails.
nuclear@0 461 //! \param mesh Mesh object to be filled
nuclear@0 462 void ParseLV3MeshVertexListBlock(
nuclear@0 463 unsigned int iNumVertices,Mesh& mesh);
nuclear@0 464
nuclear@0 465 // -------------------------------------------------------------------
nuclear@0 466 //! Parse a *MESH_FACE_LIST block in a file
nuclear@0 467 //! \param iNumFaces Value of *MESH_NUMFACES, if present.
nuclear@0 468 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 469 //! A warning is sent to the logger if the validations fails.
nuclear@0 470 //! \param mesh Mesh object to be filled
nuclear@0 471 void ParseLV3MeshFaceListBlock(
nuclear@0 472 unsigned int iNumFaces,Mesh& mesh);
nuclear@0 473
nuclear@0 474 // -------------------------------------------------------------------
nuclear@0 475 //! Parse a *MESH_TVERT_LIST block in a file
nuclear@0 476 //! \param iNumVertices Value of *MESH_NUMTVERTEX, if present.
nuclear@0 477 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 478 //! A warning is sent to the logger if the validations fails.
nuclear@0 479 //! \param mesh Mesh object to be filled
nuclear@0 480 //! \param iChannel Output UVW channel
nuclear@0 481 void ParseLV3MeshTListBlock(
nuclear@0 482 unsigned int iNumVertices,Mesh& mesh, unsigned int iChannel = 0);
nuclear@0 483
nuclear@0 484 // -------------------------------------------------------------------
nuclear@0 485 //! Parse a *MESH_TFACELIST block in a file
nuclear@0 486 //! \param iNumFaces Value of *MESH_NUMTVFACES, if present.
nuclear@0 487 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 488 //! A warning is sent to the logger if the validations fails.
nuclear@0 489 //! \param mesh Mesh object to be filled
nuclear@0 490 //! \param iChannel Output UVW channel
nuclear@0 491 void ParseLV3MeshTFaceListBlock(
nuclear@0 492 unsigned int iNumFaces,Mesh& mesh, unsigned int iChannel = 0);
nuclear@0 493
nuclear@0 494 // -------------------------------------------------------------------
nuclear@0 495 //! Parse an additional mapping channel
nuclear@0 496 //! (specified via *MESH_MAPPINGCHANNEL)
nuclear@0 497 //! \param iChannel Channel index to be filled
nuclear@0 498 //! \param mesh Mesh object to be filled
nuclear@0 499 void ParseLV3MappingChannel(
nuclear@0 500 unsigned int iChannel, Mesh& mesh);
nuclear@0 501
nuclear@0 502 // -------------------------------------------------------------------
nuclear@0 503 //! Parse a *MESH_CVERTLIST block in a file
nuclear@0 504 //! \param iNumVertices Value of *MESH_NUMCVERTEX, if present.
nuclear@0 505 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 506 //! A warning is sent to the logger if the validations fails.
nuclear@0 507 //! \param mesh Mesh object to be filled
nuclear@0 508 void ParseLV3MeshCListBlock(
nuclear@0 509 unsigned int iNumVertices, Mesh& mesh);
nuclear@0 510
nuclear@0 511 // -------------------------------------------------------------------
nuclear@0 512 //! Parse a *MESH_CFACELIST block in a file
nuclear@0 513 //! \param iNumFaces Value of *MESH_NUMCVFACES, if present.
nuclear@0 514 //! Otherwise zero. This is used to check the consistency of the file.
nuclear@0 515 //! A warning is sent to the logger if the validations fails.
nuclear@0 516 //! \param mesh Mesh object to be filled
nuclear@0 517 void ParseLV3MeshCFaceListBlock(
nuclear@0 518 unsigned int iNumFaces, Mesh& mesh);
nuclear@0 519
nuclear@0 520 // -------------------------------------------------------------------
nuclear@0 521 //! Parse a *MESH_NORMALS block in a file
nuclear@0 522 //! \param mesh Mesh object to be filled
nuclear@0 523 void ParseLV3MeshNormalListBlock(Mesh& mesh);
nuclear@0 524
nuclear@0 525 // -------------------------------------------------------------------
nuclear@0 526 //! Parse a *MESH_WEIGHTSblock in a file
nuclear@0 527 //! \param mesh Mesh object to be filled
nuclear@0 528 void ParseLV3MeshWeightsBlock(Mesh& mesh);
nuclear@0 529
nuclear@0 530 // -------------------------------------------------------------------
nuclear@0 531 //! Parse the bone list of a file
nuclear@0 532 //! \param mesh Mesh object to be filled
nuclear@0 533 //! \param iNumBones Number of bones in the mesh
nuclear@0 534 void ParseLV4MeshBones(unsigned int iNumBones,Mesh& mesh);
nuclear@0 535
nuclear@0 536 // -------------------------------------------------------------------
nuclear@0 537 //! Parse the bone vertices list of a file
nuclear@0 538 //! \param mesh Mesh object to be filled
nuclear@0 539 //! \param iNumVertices Number of vertices to be parsed
nuclear@0 540 void ParseLV4MeshBonesVertices(unsigned int iNumVertices,Mesh& mesh);
nuclear@0 541
nuclear@0 542 // -------------------------------------------------------------------
nuclear@0 543 //! Parse a *MESH_FACE block in a file
nuclear@0 544 //! \param out receive the face data
nuclear@0 545 void ParseLV4MeshFace(ASE::Face& out);
nuclear@0 546
nuclear@0 547 // -------------------------------------------------------------------
nuclear@0 548 //! Parse a *MESH_VERT block in a file
nuclear@0 549 //! (also works for MESH_TVERT, MESH_CFACE, MESH_VERTCOL ...)
nuclear@0 550 //! \param apOut Output buffer (3 floats)
nuclear@0 551 //! \param rIndexOut Output index
nuclear@0 552 void ParseLV4MeshFloatTriple(float* apOut, unsigned int& rIndexOut);
nuclear@0 553
nuclear@0 554 // -------------------------------------------------------------------
nuclear@0 555 //! Parse a *MESH_VERT block in a file
nuclear@0 556 //! (also works for MESH_TVERT, MESH_CFACE, MESH_VERTCOL ...)
nuclear@0 557 //! \param apOut Output buffer (3 floats)
nuclear@0 558 void ParseLV4MeshFloatTriple(float* apOut);
nuclear@0 559
nuclear@0 560 // -------------------------------------------------------------------
nuclear@0 561 //! Parse a *MESH_TFACE block in a file
nuclear@0 562 //! (also works for MESH_CFACE)
nuclear@0 563 //! \param apOut Output buffer (3 ints)
nuclear@0 564 //! \param rIndexOut Output index
nuclear@0 565 void ParseLV4MeshLongTriple(unsigned int* apOut, unsigned int& rIndexOut);
nuclear@0 566
nuclear@0 567 // -------------------------------------------------------------------
nuclear@0 568 //! Parse a *MESH_TFACE block in a file
nuclear@0 569 //! (also works for MESH_CFACE)
nuclear@0 570 //! \param apOut Output buffer (3 ints)
nuclear@0 571 void ParseLV4MeshLongTriple(unsigned int* apOut);
nuclear@0 572
nuclear@0 573 // -------------------------------------------------------------------
nuclear@0 574 //! Parse a single float element
nuclear@0 575 //! \param fOut Output float
nuclear@0 576 void ParseLV4MeshFloat(float& fOut);
nuclear@0 577
nuclear@0 578 // -------------------------------------------------------------------
nuclear@0 579 //! Parse a single int element
nuclear@0 580 //! \param iOut Output integer
nuclear@0 581 void ParseLV4MeshLong(unsigned int& iOut);
nuclear@0 582
nuclear@0 583 // -------------------------------------------------------------------
nuclear@0 584 //! Skip everything to the next: '*' or '\0'
nuclear@0 585 bool SkipToNextToken();
nuclear@0 586
nuclear@0 587 // -------------------------------------------------------------------
nuclear@0 588 //! Skip the current section until the token after the closing }.
nuclear@0 589 //! This function handles embedded subsections correctly
nuclear@0 590 bool SkipSection();
nuclear@0 591
nuclear@0 592 // -------------------------------------------------------------------
nuclear@0 593 //! Output a warning to the logger
nuclear@0 594 //! \param szWarn Warn message
nuclear@0 595 void LogWarning(const char* szWarn);
nuclear@0 596
nuclear@0 597 // -------------------------------------------------------------------
nuclear@0 598 //! Output a message to the logger
nuclear@0 599 //! \param szWarn Message
nuclear@0 600 void LogInfo(const char* szWarn);
nuclear@0 601
nuclear@0 602 // -------------------------------------------------------------------
nuclear@0 603 //! Output an error to the logger
nuclear@0 604 //! \param szWarn Error message
nuclear@0 605 void LogError(const char* szWarn);
nuclear@0 606
nuclear@0 607 // -------------------------------------------------------------------
nuclear@0 608 //! Parse a string, enclosed in double quotation marks
nuclear@0 609 //! \param out Output string
nuclear@0 610 //! \param szName Name of the enclosing element -> used in error
nuclear@0 611 //! messages.
nuclear@0 612 //! \return false if an error occured
nuclear@0 613 bool ParseString(std::string& out,const char* szName);
nuclear@0 614
nuclear@0 615 public:
nuclear@0 616
nuclear@0 617 //! Pointer to current data
nuclear@0 618 const char* filePtr;
nuclear@0 619
nuclear@0 620 //! background color to be passed to the viewer
nuclear@0 621 //! QNAN if none was found
nuclear@0 622 aiColor3D m_clrBackground;
nuclear@0 623
nuclear@0 624 //! Base ambient color to be passed to all materials
nuclear@0 625 //! QNAN if none was found
nuclear@0 626 aiColor3D m_clrAmbient;
nuclear@0 627
nuclear@0 628 //! List of all materials found in the file
nuclear@0 629 std::vector<Material> m_vMaterials;
nuclear@0 630
nuclear@0 631 //! List of all meshes found in the file
nuclear@0 632 std::vector<Mesh> m_vMeshes;
nuclear@0 633
nuclear@0 634 //! List of all dummies found in the file
nuclear@0 635 std::vector<Dummy> m_vDummies;
nuclear@0 636
nuclear@0 637 //! List of all lights found in the file
nuclear@0 638 std::vector<Light> m_vLights;
nuclear@0 639
nuclear@0 640 //! List of all cameras found in the file
nuclear@0 641 std::vector<Camera> m_vCameras;
nuclear@0 642
nuclear@0 643 //! Current line in the file
nuclear@0 644 unsigned int iLineNumber;
nuclear@0 645
nuclear@0 646 //! First frame
nuclear@0 647 unsigned int iFirstFrame;
nuclear@0 648
nuclear@0 649 //! Last frame
nuclear@0 650 unsigned int iLastFrame;
nuclear@0 651
nuclear@0 652 //! Frame speed - frames per second
nuclear@0 653 unsigned int iFrameSpeed;
nuclear@0 654
nuclear@0 655 //! Ticks per frame
nuclear@0 656 unsigned int iTicksPerFrame;
nuclear@0 657
nuclear@0 658 //! true if the last character read was an end-line character
nuclear@0 659 bool bLastWasEndLine;
nuclear@0 660
nuclear@0 661 //! File format version
nuclear@0 662 unsigned int iFileFormat;
nuclear@0 663 };
nuclear@0 664
nuclear@0 665
nuclear@0 666 } // Namespace ASE
nuclear@0 667 } // Namespace ASSIMP
nuclear@0 668
nuclear@0 669 #endif // !! include guard