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  ACLoader.h
43  *  @brief Declaration of the .ac importer class.
44  */
45 #ifndef AI_AC3DLOADER_H_INCLUDED
46 #define AI_AC3DLOADER_H_INCLUDED
47 
48 #include <vector>
49 
50 #include "BaseImporter.h"
51 #include <assimp/types.h>
52 
53 struct aiNode;
54 struct aiMesh;
55 struct aiMaterial;
56 struct aiLight;
57 
58 
59 namespace Assimp    {
60 
61 // ---------------------------------------------------------------------------
62 /** AC3D (*.ac) importer class
63 */
64 class AC3DImporter : public BaseImporter
65 {
66 public:
67     AC3DImporter();
68     ~AC3DImporter();
69 
70 
71 
72     // Represents an AC3D material
73     struct Material
74     {
MaterialMaterial75         Material()
76             :   rgb     (0.6f,0.6f,0.6f)
77             ,   spec    (1.f,1.f,1.f)
78             ,   shin    (0.f)
79             ,   trans   (0.f)
80         {}
81 
82         // base color of the material
83         aiColor3D rgb;
84 
85         // ambient color of the material
86         aiColor3D amb;
87 
88         // emissive color of the material
89         aiColor3D emis;
90 
91         // specular color of the material
92         aiColor3D spec;
93 
94         // shininess exponent
95         float shin;
96 
97         // transparency. 0 == opaque
98         float trans;
99 
100         // name of the material. optional.
101         std::string name;
102     };
103 
104     // Represents an AC3D surface
105     struct Surface
106     {
SurfaceSurface107         Surface()
108             :   mat     (0)
109             ,   flags   (0)
110         {}
111 
112         unsigned int mat,flags;
113 
114         typedef std::pair<unsigned int, aiVector2D > SurfaceEntry;
115         std::vector< SurfaceEntry > entries;
116     };
117 
118     // Represents an AC3D object
119     struct Object
120     {
ObjectObject121         Object()
122             :   type    (World)
123             ,   name( "" )
124             ,   children()
125             ,   texture( "" )
126             ,   texRepeat( 1.f, 1.f )
127             ,   texOffset( 0.0f, 0.0f )
128             ,   rotation()
129             ,   translation()
130             ,   vertices()
131             ,   surfaces()
132             ,   numRefs (0)
133             ,   subDiv  (0)
134             ,   crease()
135         {}
136 
137         // Type description
138         enum Type
139         {
140             World = 0x0,
141             Poly  = 0x1,
142             Group = 0x2,
143             Light = 0x4
144         } type;
145 
146         // name of the object
147         std::string name;
148 
149         // object children
150         std::vector<Object> children;
151 
152         // texture to be assigned to all surfaces of the object
153         std::string texture;
154 
155         // texture repat factors (scaling for all coordinates)
156         aiVector2D texRepeat, texOffset;
157 
158         // rotation matrix
159         aiMatrix3x3 rotation;
160 
161         // translation vector
162         aiVector3D translation;
163 
164         // vertices
165         std::vector<aiVector3D> vertices;
166 
167         // surfaces
168         std::vector<Surface> surfaces;
169 
170         // number of indices (= num verts in verbose format)
171         unsigned int numRefs;
172 
173         // number of subdivisions to be performed on the
174         // imported data
175         unsigned int subDiv;
176 
177         // max angle limit for smoothing
178         float crease;
179     };
180 
181 
182 public:
183 
184     // -------------------------------------------------------------------
185     /** Returns whether the class can handle the format of the given file.
186      * See BaseImporter::CanRead() for details.
187      */
188     bool CanRead( const std::string& pFile, IOSystem* pIOHandler,
189         bool checkSig) const;
190 
191 protected:
192 
193     // -------------------------------------------------------------------
194     /** Return importer meta information.
195      * See #BaseImporter::GetInfo for the details */
196     const aiImporterDesc* GetInfo () const;
197 
198     // -------------------------------------------------------------------
199     /** Imports the given file into the given scene structure.
200      * See BaseImporter::InternReadFile() for details*/
201     void InternReadFile( const std::string& pFile, aiScene* pScene,
202         IOSystem* pIOHandler);
203 
204     // -------------------------------------------------------------------
205     /** Called prior to ReadFile().
206     * The function is a request to the importer to update its configuration
207     * basing on the Importer's configuration property list.*/
208     void SetupProperties(const Importer* pImp);
209 
210 private:
211 
212     // -------------------------------------------------------------------
213     /** Get the next line from the file.
214      *  @return false if the end of the file was reached*/
215     bool GetNextLine();
216 
217     // -------------------------------------------------------------------
218     /** Load the object section. This method is called recursively to
219      *  load subobjects, the method returns after a 'kids 0' was
220      *  encountered.
221      *  @objects List of output objects*/
222     void LoadObjectSection(std::vector<Object>& objects);
223 
224     // -------------------------------------------------------------------
225     /** Convert all objects into meshes and nodes.
226      *  @param object Current object to work on
227      *  @param meshes Pointer to the list of output meshes
228      *  @param outMaterials List of output materials
229      *  @param materials Material list
230      *  @param Scenegraph node for the object */
231     aiNode* ConvertObjectSection(Object& object,
232         std::vector<aiMesh*>& meshes,
233         std::vector<aiMaterial*>& outMaterials,
234         const std::vector<Material>& materials,
235         aiNode* parent = NULL);
236 
237     // -------------------------------------------------------------------
238     /** Convert a material
239      *  @param object Current object
240      *  @param matSrc Source material description
241      *  @param matDest Destination material to be filled */
242     void ConvertMaterial(const Object& object,
243         const Material& matSrc,
244         aiMaterial& matDest);
245 
246 private:
247 
248 
249     // points to the next data line
250     const char* buffer;
251 
252     // Configuration option: if enabled, up to two meshes
253     // are generated per material: those faces who have
254     // their bf cull flags set are separated.
255     bool configSplitBFCull;
256 
257     // Configuration switch: subdivision surfaces are only
258     // evaluated if the value is true.
259     bool configEvalSubdivision;
260 
261     // counts how many objects we have in the tree.
262     // basing on this information we can find a
263     // good estimate how many meshes we'll have in the final scene.
264     unsigned int mNumMeshes;
265 
266     // current list of light sources
267     std::vector<aiLight*>* mLights;
268 
269     // name counters
270     unsigned int lights, groups, polys, worlds;
271 };
272 
273 } // end of namespace Assimp
274 
275 #endif // AI_AC3DIMPORTER_H_INC
276