/** @file Helper class to parse a XFile into a temporary structure */ #ifndef AI_XFILEPARSER_H_INC #define AI_XFILEPARSER_H_INC #include #include #include "../include/aiTypes.h" namespace Assimp { namespace XFile { struct Node; struct Mesh; struct Scene; struct Material; struct Animation; struct AnimBone; } /** The XFileParser reads a XFile either in text or binary form and builds a temporary * data structure out of it. */ class XFileParser { public: /** Constructor. Creates a data structure out of the XFile given in the memory block. * @param pBuffer Memory buffer containing the XFile */ XFileParser( const std::vector& pBuffer); /** Destructor. Destroys all imported data along with it */ ~XFileParser(); /** Returns the temporary representation of the imported data */ const XFile::Scene* GetImportedData() const { return mScene; } protected: void ParseFile(); void ParseDataObjectTemplate(); void ParseDataObjectFrame( XFile::Node *pParent); void ParseDataObjectTransformationMatrix( aiMatrix4x4& pMatrix); void ParseDataObjectMesh( XFile::Mesh* pMesh); void ParseDataObjectSkinWeights( XFile::Mesh* pMesh); void ParseDataObjectSkinMeshHeader( XFile::Mesh* pMesh); void ParseDataObjectMeshNormals( XFile::Mesh* pMesh); void ParseDataObjectMeshTextureCoords( XFile::Mesh* pMesh); void ParseDataObjectMeshVertexColors( XFile::Mesh* pMesh); void ParseDataObjectMeshMaterialList( XFile::Mesh* pMesh); void ParseDataObjectMaterial( XFile::Material* pMaterial); void ParseDataObjectAnimTicksPerSecond(); void ParseDataObjectAnimationSet(); void ParseDataObjectAnimation( XFile::Animation* pAnim); void ParseDataObjectAnimationKey( XFile::AnimBone *pAnimBone); void ParseDataObjectTextureFilename( std::string& pName); void ParseUnknownDataObject(); //! places pointer to next begin of a token, and ignores comments void FindNextNoneWhiteSpace(); //! returns next parseable token. Returns empty string if no token there std::string GetNextToken(); //! reads header of dataobject including the opening brace. //! returns false if error happened, and writes name of object //! if there is one void readHeadOfDataObject( std::string* poName = NULL); //! checks for closing curly brace, throws exception if not there void CheckForClosingBrace(); //! checks for one following semicolon, throws exception if not there void CheckForSemicolon(); //! checks for a separator char, either a ',' or a ';' void CheckForSeparator(); //! reads a x file style string void GetNextTokenAsString( std::string& poString); void ReadUntilEndOfLine(); unsigned short ReadBinWord(); unsigned int ReadBinDWord(); unsigned int ReadInt(); float ReadFloat(); aiVector2D ReadVector2(); aiVector3D ReadVector3(); aiColor3D ReadRGB(); aiColor4D ReadRGBA(); /** Throws an exception with a line number and the given text. */ void ThrowException( const std::string& pText); /** Filters the imported hierarchy for some degenerated cases that some exporters produce. * @param pData The sub-hierarchy to filter */ void FilterHierarchy( XFile::Node* pNode); protected: unsigned int mMajorVersion, mMinorVersion; ///< version numbers bool mIsBinaryFormat; ///< true if the file is in binary, false if it's in text form unsigned int mBinaryFloatSize; ///< float size, either 32 or 64 bits // counter for number arrays in binary format unsigned int mBinaryNumCount; const char* P; const char* End; /// Line number when reading in text format unsigned int mLineNumber; /// Imported data XFile::Scene* mScene; }; } #endif // AI_XFILEPARSER_H_INC