1 /*
2 Open Asset Import Library (assimp)
3 ----------------------------------------------------------------------
4 
5 Copyright (c) 2006-2017, assimp team
6 
7 All rights reserved.
8 
9 Redistribution and use of this software in source and binary forms,
10 with or without modification, are permitted provided that the
11 following conditions are met:
12 
13 * Redistributions of source code must retain the above
14   copyright notice, this list of conditions and the
15   following disclaimer.
16 
17 * Redistributions in binary form must reproduce the above
18   copyright notice, this list of conditions and the
19   following disclaimer in the documentation and/or other
20   materials provided with the distribution.
21 
22 * Neither the name of the assimp team, nor the names of its
23   contributors may be used to endorse or promote products
24   derived from this software without specific prior
25   written permission of the assimp team.
26 
27 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 
39 ----------------------------------------------------------------------
40 */
41 
42 
43 /** @file Defines the helper data structures for importing XFiles */
44 #ifndef AI_XFILEHELPER_H_INC
45 #define AI_XFILEHELPER_H_INC
46 
47 #include <string>
48 #include <vector>
49 #include <stdint.h>
50 
51 #include <assimp/types.h>
52 #include <assimp/quaternion.h>
53 #include <assimp/mesh.h>
54 #include <assimp/anim.h>
55 #include <assimp/Defines.h>
56 
57 namespace Assimp
58 {
59 namespace XFile
60 {
61 
62 /** Helper structure representing a XFile mesh face */
63 struct Face
64 {
65     std::vector<unsigned int> mIndices;
66 };
67 
68 /** Helper structure representing a texture filename inside a material and its potential source */
69 struct TexEntry
70 {
71     std::string mName;
72     bool mIsNormalMap; // true if the texname was specified in a NormalmapFilename tag
73 
TexEntryTexEntry74     TexEntry() { mIsNormalMap = false; }
75     TexEntry( const std::string& pName, bool pIsNormalMap = false)
mNameTexEntry76         : mName( pName), mIsNormalMap( pIsNormalMap)
77     { /* done */ }
78 };
79 
80 /** Helper structure representing a XFile material */
81 struct Material
82 {
83     std::string mName;
84     bool mIsReference; // if true, mName holds a name by which the actual material can be found in the material list
85     aiColor4D mDiffuse;
86     ai_real mSpecularExponent;
87     aiColor3D mSpecular;
88     aiColor3D mEmissive;
89     std::vector<TexEntry> mTextures;
90 
91     size_t sceneIndex; ///< the index under which it was stored in the scene's material list
92 
MaterialMaterial93     Material()
94         : mIsReference(false),
95         mSpecularExponent(),
96         sceneIndex(SIZE_MAX)
97     {}
98 };
99 
100 /** Helper structure to represent a bone weight */
101 struct BoneWeight
102 {
103     unsigned int mVertex;
104     ai_real mWeight;
105 };
106 
107 /** Helper structure to represent a bone in a mesh */
108 struct Bone
109 {
110     std::string mName;
111     std::vector<BoneWeight> mWeights;
112     aiMatrix4x4 mOffsetMatrix;
113 };
114 
115 /** Helper structure to represent an XFile mesh */
116 struct Mesh
117 {
118     std::string mName;
119     std::vector<aiVector3D> mPositions;
120     std::vector<Face> mPosFaces;
121     std::vector<aiVector3D> mNormals;
122     std::vector<Face> mNormFaces;
123     unsigned int mNumTextures;
124     std::vector<aiVector2D> mTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
125     unsigned int mNumColorSets;
126     std::vector<aiColor4D> mColors[AI_MAX_NUMBER_OF_COLOR_SETS];
127 
128     std::vector<unsigned int> mFaceMaterials;
129     std::vector<Material> mMaterials;
130 
131     std::vector<Bone> mBones;
132 
133     explicit Mesh(const std::string &pName = "") { mName = pName; mNumTextures = 0; mNumColorSets = 0; }
134 };
135 
136 /** Helper structure to represent a XFile frame */
137 struct Node
138 {
139     std::string mName;
140     aiMatrix4x4 mTrafoMatrix;
141     Node* mParent;
142     std::vector<Node*> mChildren;
143     std::vector<Mesh*> mMeshes;
144 
NodeNode145     Node() { mParent = NULL; }
NodeNode146     explicit Node( Node* pParent) { mParent = pParent; }
~NodeNode147     ~Node()
148     {
149         for( unsigned int a = 0; a < mChildren.size(); a++)
150             delete mChildren[a];
151         for( unsigned int a = 0; a < mMeshes.size(); a++)
152             delete mMeshes[a];
153     }
154 };
155 
156 struct MatrixKey
157 {
158     double mTime;
159     aiMatrix4x4 mMatrix;
160 };
161 
162 /** Helper structure representing a single animated bone in a XFile */
163 struct AnimBone
164 {
165     std::string mBoneName;
166     std::vector<aiVectorKey> mPosKeys;  // either three separate key sequences for position, rotation, scaling
167     std::vector<aiQuatKey> mRotKeys;
168     std::vector<aiVectorKey> mScaleKeys;
169     std::vector<MatrixKey> mTrafoKeys; // or a combined key sequence of transformation matrices.
170 };
171 
172 /** Helper structure to represent an animation set in a XFile */
173 struct Animation
174 {
175     std::string mName;
176     std::vector<AnimBone*> mAnims;
177 
~AnimationAnimation178     ~Animation()
179     {
180         for( unsigned int a = 0; a < mAnims.size(); a++)
181             delete mAnims[a];
182     }
183 };
184 
185 /** Helper structure analogue to aiScene */
186 struct Scene
187 {
188     Node* mRootNode;
189 
190     std::vector<Mesh*> mGlobalMeshes; // global meshes found outside of any frames
191     std::vector<Material> mGlobalMaterials; // global materials found outside of any meshes.
192 
193     std::vector<Animation*> mAnims;
194     unsigned int mAnimTicksPerSecond;
195 
SceneScene196     Scene() { mRootNode = NULL; mAnimTicksPerSecond = 0; }
~SceneScene197     ~Scene()
198     {
199         delete mRootNode;
200         for( unsigned int a = 0; a < mGlobalMeshes.size(); a++)
201             delete mGlobalMeshes[a];
202         for( unsigned int a = 0; a < mAnims.size(); a++)
203             delete mAnims[a];
204     }
205 };
206 
207 } // end of namespace XFile
208 } // end of namespace Assimp
209 
210 #endif // AI_XFILEHELPER_H_INC
211