| /* |
| Open Asset Import Library (assimp) |
| ---------------------------------------------------------------------- |
| |
| Copyright (c) 2006-2017, assimp team |
| |
| All rights reserved. |
| |
| Redistribution and use of this software in source and binary forms, |
| with or without modification, are permitted provided that the |
| following conditions are met: |
| |
| * Redistributions of source code must retain the above |
| copyright notice, this list of conditions and the |
| following disclaimer. |
| |
| * Redistributions in binary form must reproduce the above |
| copyright notice, this list of conditions and the |
| following disclaimer in the documentation and/or other |
| materials provided with the distribution. |
| |
| * Neither the name of the assimp team, nor the names of its |
| contributors may be used to endorse or promote products |
| derived from this software without specific prior |
| written permission of the assimp team. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| ---------------------------------------------------------------------- |
| */ |
| |
| |
| /** @file Defines the helper data structures for importing XFiles */ |
| #ifndef AI_XFILEHELPER_H_INC |
| #define AI_XFILEHELPER_H_INC |
| |
| #include <string> |
| #include <vector> |
| #include <stdint.h> |
| |
| #include <assimp/types.h> |
| #include <assimp/quaternion.h> |
| #include <assimp/mesh.h> |
| #include <assimp/anim.h> |
| #include <assimp/Defines.h> |
| |
| namespace Assimp |
| { |
| namespace XFile |
| { |
| |
| /** Helper structure representing a XFile mesh face */ |
| struct Face |
| { |
| std::vector<unsigned int> mIndices; |
| }; |
| |
| /** Helper structure representing a texture filename inside a material and its potential source */ |
| struct TexEntry |
| { |
| std::string mName; |
| bool mIsNormalMap; // true if the texname was specified in a NormalmapFilename tag |
| |
| TexEntry() { mIsNormalMap = false; } |
| TexEntry( const std::string& pName, bool pIsNormalMap = false) |
| : mName( pName), mIsNormalMap( pIsNormalMap) |
| { /* done */ } |
| }; |
| |
| /** Helper structure representing a XFile material */ |
| struct Material |
| { |
| std::string mName; |
| bool mIsReference; // if true, mName holds a name by which the actual material can be found in the material list |
| aiColor4D mDiffuse; |
| ai_real mSpecularExponent; |
| aiColor3D mSpecular; |
| aiColor3D mEmissive; |
| std::vector<TexEntry> mTextures; |
| |
| size_t sceneIndex; ///< the index under which it was stored in the scene's material list |
| |
| Material() |
| : mIsReference(false), |
| mSpecularExponent(), |
| sceneIndex(SIZE_MAX) |
| {} |
| }; |
| |
| /** Helper structure to represent a bone weight */ |
| struct BoneWeight |
| { |
| unsigned int mVertex; |
| ai_real mWeight; |
| }; |
| |
| /** Helper structure to represent a bone in a mesh */ |
| struct Bone |
| { |
| std::string mName; |
| std::vector<BoneWeight> mWeights; |
| aiMatrix4x4 mOffsetMatrix; |
| }; |
| |
| /** Helper structure to represent an XFile mesh */ |
| struct Mesh |
| { |
| std::string mName; |
| std::vector<aiVector3D> mPositions; |
| std::vector<Face> mPosFaces; |
| std::vector<aiVector3D> mNormals; |
| std::vector<Face> mNormFaces; |
| unsigned int mNumTextures; |
| std::vector<aiVector2D> mTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; |
| unsigned int mNumColorSets; |
| std::vector<aiColor4D> mColors[AI_MAX_NUMBER_OF_COLOR_SETS]; |
| |
| std::vector<unsigned int> mFaceMaterials; |
| std::vector<Material> mMaterials; |
| |
| std::vector<Bone> mBones; |
| |
| explicit Mesh(const std::string &pName = "") { mName = pName; mNumTextures = 0; mNumColorSets = 0; } |
| }; |
| |
| /** Helper structure to represent a XFile frame */ |
| struct Node |
| { |
| std::string mName; |
| aiMatrix4x4 mTrafoMatrix; |
| Node* mParent; |
| std::vector<Node*> mChildren; |
| std::vector<Mesh*> mMeshes; |
| |
| Node() { mParent = NULL; } |
| explicit Node( Node* pParent) { mParent = pParent; } |
| ~Node() |
| { |
| for( unsigned int a = 0; a < mChildren.size(); a++) |
| delete mChildren[a]; |
| for( unsigned int a = 0; a < mMeshes.size(); a++) |
| delete mMeshes[a]; |
| } |
| }; |
| |
| struct MatrixKey |
| { |
| double mTime; |
| aiMatrix4x4 mMatrix; |
| }; |
| |
| /** Helper structure representing a single animated bone in a XFile */ |
| struct AnimBone |
| { |
| std::string mBoneName; |
| std::vector<aiVectorKey> mPosKeys; // either three separate key sequences for position, rotation, scaling |
| std::vector<aiQuatKey> mRotKeys; |
| std::vector<aiVectorKey> mScaleKeys; |
| std::vector<MatrixKey> mTrafoKeys; // or a combined key sequence of transformation matrices. |
| }; |
| |
| /** Helper structure to represent an animation set in a XFile */ |
| struct Animation |
| { |
| std::string mName; |
| std::vector<AnimBone*> mAnims; |
| |
| ~Animation() |
| { |
| for( unsigned int a = 0; a < mAnims.size(); a++) |
| delete mAnims[a]; |
| } |
| }; |
| |
| /** Helper structure analogue to aiScene */ |
| struct Scene |
| { |
| Node* mRootNode; |
| |
| std::vector<Mesh*> mGlobalMeshes; // global meshes found outside of any frames |
| std::vector<Material> mGlobalMaterials; // global materials found outside of any meshes. |
| |
| std::vector<Animation*> mAnims; |
| unsigned int mAnimTicksPerSecond; |
| |
| Scene() { mRootNode = NULL; mAnimTicksPerSecond = 0; } |
| ~Scene() |
| { |
| delete mRootNode; |
| for( unsigned int a = 0; a < mGlobalMeshes.size(); a++) |
| delete mGlobalMeshes[a]; |
| for( unsigned int a = 0; a < mAnims.size(); a++) |
| delete mAnims[a]; |
| } |
| }; |
| |
| } // end of namespace XFile |
| } // end of namespace Assimp |
| |
| #endif // AI_XFILEHELPER_H_INC |