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 /** @file  ASELoader.h
43  *  @brief Definition of the .ASE importer class.
44  */
45 #ifndef AI_ASELOADER_H_INCLUDED
46 #define AI_ASELOADER_H_INCLUDED
47 
48 #include "BaseImporter.h"
49 #include <assimp/types.h>
50 #include "ASEParser.h"
51 
52 struct aiNode;
53 
54 namespace Assimp {
55 
56 #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
57 
58 // --------------------------------------------------------------------------------
59 /** Importer class for the 3DS ASE ASCII format.
60  *
61  */
62 class ASEImporter : public BaseImporter {
63 public:
64     ASEImporter();
65     ~ASEImporter();
66 
67     // -------------------------------------------------------------------
68     /** Returns whether the class can handle the format of the given file.
69      * See BaseImporter::CanRead() for details.
70      */
71     bool CanRead( const std::string& pFile, IOSystem* pIOHandler,
72         bool checkSig) const;
73 
74 protected:
75 
76     // -------------------------------------------------------------------
77     /** Return importer meta information.
78      * See #BaseImporter::GetInfo for the details
79      */
80     const aiImporterDesc* GetInfo () const;
81 
82 
83     // -------------------------------------------------------------------
84     /** Imports the given file into the given scene structure.
85     * See BaseImporter::InternReadFile() for details
86     */
87     void InternReadFile( const std::string& pFile, aiScene* pScene,
88         IOSystem* pIOHandler);
89 
90 
91     // -------------------------------------------------------------------
92     /** Called prior to ReadFile().
93     * The function is a request to the importer to update its configuration
94     * basing on the Importer's configuration property list.
95     */
96     void SetupProperties(const Importer* pImp);
97 
98 
99 private:
100 
101     // -------------------------------------------------------------------
102     /** Generate normal vectors basing on smoothing groups
103      * (in some cases the normal are already contained in the file)
104      * \param mesh Mesh to work on
105      * \return false if the normals have been recomputed
106      */
107     bool GenerateNormals(ASE::Mesh& mesh);
108 
109 
110     // -------------------------------------------------------------------
111     /** Create valid vertex/normal/UV/color/face lists.
112      *  All elements are unique, faces have only one set of indices
113      *  after this step occurs.
114      * \param mesh Mesh to work on
115      */
116     void BuildUniqueRepresentation(ASE::Mesh& mesh);
117 
118 
119     /** Create one-material-per-mesh meshes ;-)
120      * \param mesh Mesh to work with
121      *  \param Receives the list of all created meshes
122      */
123     void ConvertMeshes(ASE::Mesh& mesh, std::vector<aiMesh*>& avOut);
124 
125 
126     // -------------------------------------------------------------------
127     /** Convert a material to a aiMaterial object
128      * \param mat Input material
129      */
130     void ConvertMaterial(ASE::Material& mat);
131 
132 
133     // -------------------------------------------------------------------
134     /** Setup the final material indices for each mesh
135      */
136     void BuildMaterialIndices();
137 
138 
139     // -------------------------------------------------------------------
140     /** Build the node graph
141      */
142     void BuildNodes(std::vector<ASE::BaseNode*>& nodes);
143 
144 
145     // -------------------------------------------------------------------
146     /** Build output cameras
147      */
148     void BuildCameras();
149 
150 
151     // -------------------------------------------------------------------
152     /** Build output lights
153      */
154     void BuildLights();
155 
156 
157     // -------------------------------------------------------------------
158     /** Build output animations
159      */
160     void BuildAnimations(const std::vector<ASE::BaseNode*>& nodes);
161 
162 
163     // -------------------------------------------------------------------
164     /** Add sub nodes to a node
165      *  \param pcParent parent node to be filled
166      *  \param szName Name of the parent node
167      *  \param matrix Current transform
168      */
169     void AddNodes(const std::vector<ASE::BaseNode*>& nodes,
170         aiNode* pcParent,const char* szName);
171 
172     void AddNodes(const std::vector<ASE::BaseNode*>& nodes,
173         aiNode* pcParent,const char* szName,
174         const aiMatrix4x4& matrix);
175 
176     void AddMeshes(const ASE::BaseNode* snode,aiNode* node);
177 
178     // -------------------------------------------------------------------
179     /** Generate a default material and add it to the parser's list
180      *  Called if no material has been found in the file (rare for ASE,
181      *  but not impossible)
182      */
183     void GenerateDefaultMaterial();
184 
185 protected:
186 
187     /** Parser instance */
188     ASE::Parser* mParser;
189 
190     /** Buffer to hold the loaded file */
191     char* mBuffer;
192 
193     /** Scene to be filled */
194     aiScene* pcScene;
195 
196     /** Config options: Recompute the normals in every case - WA
197         for 3DS Max broken ASE normal export */
198     bool configRecomputeNormals;
199     bool noSkeletonMesh;
200 };
201 
202 #endif // ASSIMP_BUILD_NO_3DS_IMPORTER
203 
204 } // end of namespace Assimp
205 
206 
207 #endif // AI_3DSIMPORTER_H_INC
208