ASELoader.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. Open Asset Import Library (ASSIMP)
  3. ----------------------------------------------------------------------
  4. Copyright (c) 2006-2008, ASSIMP Development Team
  5. All rights reserved.
  6. Redistribution and use of this software in source and binary forms,
  7. with or without modification, are permitted provided that the
  8. following conditions are met:
  9. * Redistributions of source code must retain the above
  10. copyright notice, this list of conditions and the
  11. following disclaimer.
  12. * Redistributions in binary form must reproduce the above
  13. copyright notice, this list of conditions and the
  14. following disclaimer in the documentation and/or other
  15. materials provided with the distribution.
  16. * Neither the name of the ASSIMP team, nor the names of its
  17. contributors may be used to endorse or promote products
  18. derived from this software without specific prior
  19. written permission of the ASSIMP Development Team.
  20. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. ----------------------------------------------------------------------
  32. */
  33. /** @file ASELoader.h
  34. * @brief Definition of the .ASE importer class.
  35. */
  36. #ifndef AI_ASELOADER_H_INCLUDED
  37. #define AI_ASELOADER_H_INCLUDED
  38. #include "BaseImporter.h"
  39. #include "../include/aiTypes.h"
  40. struct aiNode;
  41. #include "ASEParser.h"
  42. namespace Assimp {
  43. class MaterialHelper;
  44. using namespace ASE;
  45. // --------------------------------------------------------------------------------
  46. /** Importer class for the 3DS ASE ASCII format
  47. *
  48. * fixme: consider code cleanup
  49. */
  50. class ASEImporter : public BaseImporter
  51. {
  52. friend class Importer;
  53. protected:
  54. /** Constructor to be privately used by Importer */
  55. ASEImporter();
  56. /** Destructor, private as well */
  57. ~ASEImporter();
  58. public:
  59. // -------------------------------------------------------------------
  60. /** Returns whether the class can handle the format of the given file.
  61. * See BaseImporter::CanRead() for details.
  62. */
  63. bool CanRead( const std::string& pFile, IOSystem* pIOHandler,
  64. bool checkSig) const;
  65. protected:
  66. // -------------------------------------------------------------------
  67. /** Called by Importer::GetExtensionList() for each loaded importer.
  68. * See BaseImporter::GetExtensionList() for details
  69. */
  70. void GetExtensionList(std::string& append);
  71. // -------------------------------------------------------------------
  72. /** Imports the given file into the given scene structure.
  73. * See BaseImporter::InternReadFile() for details
  74. */
  75. void InternReadFile( const std::string& pFile, aiScene* pScene,
  76. IOSystem* pIOHandler);
  77. // -------------------------------------------------------------------
  78. /** Called prior to ReadFile().
  79. * The function is a request to the importer to update its configuration
  80. * basing on the Importer's configuration property list.
  81. */
  82. void SetupProperties(const Importer* pImp);
  83. // -------------------------------------------------------------------
  84. /** Generate normal vectors basing on smoothing groups
  85. * (in some cases the normal are already contained in the file)
  86. * \param mesh Mesh to work on
  87. * \return false if the normals have been recomputed
  88. */
  89. bool GenerateNormals(ASE::Mesh& mesh);
  90. // -------------------------------------------------------------------
  91. /** Create valid vertex/normal/UV/color/face lists.
  92. * All elements are unique, faces have only one set of indices
  93. * after this step occurs.
  94. * \param mesh Mesh to work on
  95. */
  96. void BuildUniqueRepresentation(ASE::Mesh& mesh);
  97. /** Create one-material-per-mesh meshes ;-)
  98. * \param mesh Mesh to work with
  99. * \param Receives the list of all created meshes
  100. */
  101. void ConvertMeshes(ASE::Mesh& mesh, std::vector<aiMesh*>& avOut);
  102. // -------------------------------------------------------------------
  103. /** Convert a material to a MaterialHelper object
  104. * \param mat Input material
  105. */
  106. void ConvertMaterial(ASE::Material& mat);
  107. // -------------------------------------------------------------------
  108. /** Setup the final material indices for each mesh
  109. */
  110. void BuildMaterialIndices();
  111. // -------------------------------------------------------------------
  112. /** Build the node graph
  113. */
  114. void BuildNodes();
  115. // -------------------------------------------------------------------
  116. /** Build output cameras
  117. */
  118. void BuildCameras();
  119. // -------------------------------------------------------------------
  120. /** Build output lights
  121. */
  122. void BuildLights();
  123. // -------------------------------------------------------------------
  124. /** Build output animations
  125. */
  126. void BuildAnimations();
  127. // -------------------------------------------------------------------
  128. /** Add sub nodes to a node
  129. * \param pcParent parent node to be filled
  130. * \param szName Name of the parent node
  131. * \param matrix Current transform
  132. */
  133. void AddNodes(std::vector<BaseNode*>& nodes,
  134. aiNode* pcParent,const char* szName);
  135. void AddNodes(std::vector<BaseNode*>& nodes,
  136. aiNode* pcParent,const char* szName,
  137. const aiMatrix4x4& matrix);
  138. void AddMeshes(const ASE::BaseNode* snode,aiNode* node);
  139. // -------------------------------------------------------------------
  140. /** Generate a default material and add it to the parser's list
  141. * Called if no material has been found in the file (rare for ASE,
  142. * but not impossible)
  143. */
  144. void GenerateDefaultMaterial();
  145. protected:
  146. /** Parser instance */
  147. ASE::Parser* mParser;
  148. /** Buffer to hold the loaded file */
  149. char* mBuffer;
  150. /** Scene to be filled */
  151. aiScene* pcScene;
  152. std::vector<BaseNode*> nodes;
  153. /** Config options: Recompute the normals in every case - WA
  154. for 3DS Max broken ASE normal export */
  155. bool configRecomputeNormals;
  156. };
  157. } // end of namespace Assimp
  158. #endif // AI_3DSIMPORTER_H_INC