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 IRRLoader.h 44 * @brief Declaration of the .irrMesh (Irrlight Engine Mesh Format) 45 * importer class. 46 */ 47 #ifndef AI_IRRLOADER_H_INCLUDED 48 #define AI_IRRLOADER_H_INCLUDED 49 50 #include "IRRShared.h" 51 #include <assimp/SceneCombiner.h> 52 #include "Importer.h" 53 #include "StringUtils.h" 54 #include <assimp/anim.h> 55 56 namespace Assimp { 57 58 59 // --------------------------------------------------------------------------- 60 /** Irr importer class. 61 * 62 * Irr is the native scene file format of the Irrlight engine and its editor 63 * irrEdit. As IrrEdit itself is capable of importing quite many file formats, 64 * it might be a good file format for data exchange. 65 */ 66 class IRRImporter : public BaseImporter, public IrrlichtBase 67 { 68 public: 69 IRRImporter(); 70 ~IRRImporter(); 71 72 73 public: 74 75 // ------------------------------------------------------------------- 76 /** Returns whether the class can handle the format of the given file. 77 * See BaseImporter::CanRead() for details. 78 */ 79 bool CanRead( const std::string& pFile, IOSystem* pIOHandler, 80 bool checkSig) const; 81 82 protected: 83 84 // ------------------------------------------------------------------- 85 /** 86 */ 87 const aiImporterDesc* GetInfo () const; 88 89 // ------------------------------------------------------------------- 90 /** 91 */ 92 void InternReadFile( const std::string& pFile, aiScene* pScene, 93 IOSystem* pIOHandler); 94 95 // ------------------------------------------------------------------- 96 /** 97 */ 98 void SetupProperties(const Importer* pImp); 99 100 private: 101 102 /** Data structure for a scenegraph node animator 103 */ 104 struct Animator 105 { 106 // Type of the animator 107 enum AT 108 { 109 UNKNOWN = 0x0, 110 ROTATION = 0x1, 111 FLY_CIRCLE = 0x2, 112 FLY_STRAIGHT = 0x3, 113 FOLLOW_SPLINE = 0x4, 114 OTHER = 0x5 115 116 } type; 117 118 explicit Animator(AT t = UNKNOWN) typeAnimator119 : type (t) 120 , speed ( ai_real( 0.001 ) ) 121 , direction ( ai_real( 0.0 ), ai_real( 1.0 ), ai_real( 0.0 ) ) 122 , circleRadius ( ai_real( 1.0) ) 123 , tightness ( ai_real( 0.5 ) ) 124 , loop (true) 125 , timeForWay (100) 126 { 127 } 128 129 130 // common parameters 131 ai_real speed; 132 aiVector3D direction; 133 134 // FLY_CIRCLE 135 aiVector3D circleCenter; 136 ai_real circleRadius; 137 138 // FOLLOW_SPLINE 139 ai_real tightness; 140 std::vector<aiVectorKey> splineKeys; 141 142 // ROTATION (angles given in direction) 143 144 // FLY STRAIGHT 145 // circleCenter = start, direction = end 146 bool loop; 147 int timeForWay; 148 }; 149 150 /** Data structure for a scenegraph node in an IRR file 151 */ 152 struct Node 153 { 154 // Type of the node 155 enum ET 156 { 157 LIGHT, 158 CUBE, 159 MESH, 160 SKYBOX, 161 DUMMY, 162 CAMERA, 163 TERRAIN, 164 SPHERE, 165 ANIMMESH 166 } type; 167 NodeNode168 explicit Node(ET t) 169 : type (t) 170 , scaling (1.0,1.0,1.0) // assume uniform scaling by default 171 , parent() 172 , framesPerSecond (0.0) 173 , id() 174 , sphereRadius (1.0) 175 , spherePolyCountX (100) 176 , spherePolyCountY (100) 177 { 178 179 // Generate a default name for the node 180 char buffer[128]; 181 static int cnt; 182 ai_snprintf(buffer, 128, "IrrNode_%i",cnt++); 183 name = std::string(buffer); 184 185 // reserve space for up to 5 materials 186 materials.reserve(5); 187 188 // reserve space for up to 5 children 189 children.reserve(5); 190 } 191 192 // Transformation of the node 193 aiVector3D position, rotation, scaling; 194 195 // Name of the node 196 std::string name; 197 198 // List of all child nodes 199 std::vector<Node*> children; 200 201 // Parent node 202 Node* parent; 203 204 // Animated meshes: frames per second 205 // 0.f if not specified 206 ai_real framesPerSecond; 207 208 // Meshes: path to the mesh to be loaded 209 std::string meshPath; 210 unsigned int id; 211 212 // Meshes: List of materials to be assigned 213 // along with their corresponding material flags 214 std::vector< std::pair<aiMaterial*, unsigned int> > materials; 215 216 // Spheres: radius of the sphere to be generates 217 ai_real sphereRadius; 218 219 // Spheres: Number of polygons in the x,y direction 220 unsigned int spherePolyCountX,spherePolyCountY; 221 222 // List of all animators assigned to the node 223 std::list<Animator> animators; 224 }; 225 226 /** Data structure for a vertex in an IRR skybox 227 */ 228 struct SkyboxVertex 229 { SkyboxVertexSkyboxVertex230 SkyboxVertex() 231 {} 232 233 //! Construction from single vertex components SkyboxVertexSkyboxVertex234 SkyboxVertex(ai_real px, ai_real py, ai_real pz, 235 ai_real nx, ai_real ny, ai_real nz, 236 ai_real uvx, ai_real uvy) 237 238 : position (px,py,pz) 239 , normal (nx,ny,nz) 240 , uv (uvx,uvy,0.0) 241 {} 242 243 aiVector3D position, normal, uv; 244 }; 245 246 247 // ------------------------------------------------------------------- 248 /** Fill the scenegraph recursively 249 */ 250 void GenerateGraph(Node* root,aiNode* rootOut ,aiScene* scene, 251 BatchLoader& batch, 252 std::vector<aiMesh*>& meshes, 253 std::vector<aiNodeAnim*>& anims, 254 std::vector<AttachmentInfo>& attach, 255 std::vector<aiMaterial*>& materials, 256 unsigned int& defaultMatIdx); 257 258 259 // ------------------------------------------------------------------- 260 /** Generate a mesh that consists of just a single quad 261 */ 262 aiMesh* BuildSingleQuadMesh(const SkyboxVertex& v1, 263 const SkyboxVertex& v2, 264 const SkyboxVertex& v3, 265 const SkyboxVertex& v4); 266 267 268 // ------------------------------------------------------------------- 269 /** Build a skybox 270 * 271 * @param meshes Receives 6 output meshes 272 * @param materials The last 6 materials are assigned to the newly 273 * created meshes. The names of the materials are adjusted. 274 */ 275 void BuildSkybox(std::vector<aiMesh*>& meshes, 276 std::vector<aiMaterial*> materials); 277 278 279 // ------------------------------------------------------------------- 280 /** Copy a material for a mesh to the output material list 281 * 282 * @param materials Receives an output material 283 * @param inmaterials List of input materials 284 * @param defMatIdx Default material index - UINT_MAX if not present 285 * @param mesh Mesh to work on 286 */ 287 void CopyMaterial(std::vector<aiMaterial*>& materials, 288 std::vector< std::pair<aiMaterial*, unsigned int> >& inmaterials, 289 unsigned int& defMatIdx, 290 aiMesh* mesh); 291 292 293 // ------------------------------------------------------------------- 294 /** Compute animations for a specific node 295 * 296 * @param root Node to be processed 297 * @param anims The list of output animations 298 */ 299 void ComputeAnimations(Node* root, aiNode* real, 300 std::vector<aiNodeAnim*>& anims); 301 302 303 private: 304 305 /** Configuration option: desired output FPS */ 306 double fps; 307 308 /** Configuration option: speed flag was set? */ 309 bool configSpeedFlag; 310 }; 311 312 } // end of namespace Assimp 313 314 #endif // AI_IRRIMPORTER_H_INC 315