rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 Open Asset Import Library (assimp)
|
nuclear@0
|
3 ----------------------------------------------------------------------
|
nuclear@0
|
4
|
nuclear@0
|
5 Copyright (c) 2006-2012, assimp team
|
nuclear@0
|
6 All rights reserved.
|
nuclear@0
|
7
|
nuclear@0
|
8 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
9 with or without modification, are permitted provided that the
|
nuclear@0
|
10 following conditions are met:
|
nuclear@0
|
11
|
nuclear@0
|
12 * Redistributions of source code must retain the above
|
nuclear@0
|
13 copyright notice, this list of conditions and the
|
nuclear@0
|
14 following disclaimer.
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer in the documentation and/or other
|
nuclear@0
|
19 materials provided with the distribution.
|
nuclear@0
|
20
|
nuclear@0
|
21 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
22 contributors may be used to endorse or promote products
|
nuclear@0
|
23 derived from this software without specific prior
|
nuclear@0
|
24 written permission of the assimp team.
|
nuclear@0
|
25
|
nuclear@0
|
26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
27 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
28 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
29 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
30 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
33 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
37
|
nuclear@0
|
38 ----------------------------------------------------------------------
|
nuclear@0
|
39 */
|
nuclear@0
|
40
|
nuclear@0
|
41 /** @file Declaration of the LWO importer class. */
|
nuclear@0
|
42 #ifndef AI_LWOLOADER_H_INCLUDED
|
nuclear@0
|
43 #define AI_LWOLOADER_H_INCLUDED
|
nuclear@0
|
44
|
nuclear@0
|
45 #include "assimp/types.h"
|
nuclear@0
|
46 #include "assimp/DefaultLogger.hpp"
|
nuclear@0
|
47
|
nuclear@0
|
48 #include "LWOFileData.h"
|
nuclear@0
|
49 #include "BaseImporter.h"
|
nuclear@0
|
50
|
nuclear@0
|
51 struct aiTexture;
|
nuclear@0
|
52 struct aiNode;
|
nuclear@0
|
53
|
nuclear@0
|
54 namespace Assimp {
|
nuclear@0
|
55 using namespace LWO;
|
nuclear@0
|
56
|
nuclear@0
|
57 // ---------------------------------------------------------------------------
|
nuclear@0
|
58 /** Class to load LWO files.
|
nuclear@0
|
59 *
|
nuclear@0
|
60 * @note Methods named "xxxLWO2[xxx]" are used with the newer LWO2 format.
|
nuclear@0
|
61 * Methods named "xxxLWOB[xxx]" are used with the older LWOB format.
|
nuclear@0
|
62 * Methods named "xxxLWO[xxx]" are used with both formats.
|
nuclear@0
|
63 * Methods named "xxx" are used to preprocess the loaded data -
|
nuclear@0
|
64 * they aren't specific to one format version
|
nuclear@0
|
65 */
|
nuclear@0
|
66 // ---------------------------------------------------------------------------
|
nuclear@0
|
67 class LWOImporter : public BaseImporter
|
nuclear@0
|
68 {
|
nuclear@0
|
69 public:
|
nuclear@0
|
70 LWOImporter();
|
nuclear@0
|
71 ~LWOImporter();
|
nuclear@0
|
72
|
nuclear@0
|
73
|
nuclear@0
|
74 public:
|
nuclear@0
|
75
|
nuclear@0
|
76 // -------------------------------------------------------------------
|
nuclear@0
|
77 /** Returns whether the class can handle the format of the given file.
|
nuclear@0
|
78 * See BaseImporter::CanRead() for details.
|
nuclear@0
|
79 */
|
nuclear@0
|
80 bool CanRead( const std::string& pFile, IOSystem* pIOHandler,
|
nuclear@0
|
81 bool checkSig) const;
|
nuclear@0
|
82
|
nuclear@0
|
83
|
nuclear@0
|
84 // -------------------------------------------------------------------
|
nuclear@0
|
85 /** Called prior to ReadFile().
|
nuclear@0
|
86 * The function is a request to the importer to update its configuration
|
nuclear@0
|
87 * basing on the Importer's configuration property list.
|
nuclear@0
|
88 */
|
nuclear@0
|
89 void SetupProperties(const Importer* pImp);
|
nuclear@0
|
90
|
nuclear@0
|
91 protected:
|
nuclear@0
|
92
|
nuclear@0
|
93 // -------------------------------------------------------------------
|
nuclear@0
|
94 // Get list of supported extensions
|
nuclear@0
|
95 const aiImporterDesc* GetInfo () const;
|
nuclear@0
|
96
|
nuclear@0
|
97 // -------------------------------------------------------------------
|
nuclear@0
|
98 /** Imports the given file into the given scene structure.
|
nuclear@0
|
99 * See BaseImporter::InternReadFile() for details
|
nuclear@0
|
100 */
|
nuclear@0
|
101 void InternReadFile( const std::string& pFile, aiScene* pScene,
|
nuclear@0
|
102 IOSystem* pIOHandler);
|
nuclear@0
|
103
|
nuclear@0
|
104 private:
|
nuclear@0
|
105
|
nuclear@0
|
106 // -------------------------------------------------------------------
|
nuclear@0
|
107 /** Loads a LWO file in the older LWOB format (LW < 6)
|
nuclear@0
|
108 */
|
nuclear@0
|
109 void LoadLWOBFile();
|
nuclear@0
|
110
|
nuclear@0
|
111 // -------------------------------------------------------------------
|
nuclear@0
|
112 /** Loads a LWO file in the newer LWO2 format (LW >= 6)
|
nuclear@0
|
113 */
|
nuclear@0
|
114 void LoadLWO2File();
|
nuclear@0
|
115
|
nuclear@0
|
116
|
nuclear@0
|
117 // -------------------------------------------------------------------
|
nuclear@0
|
118 /** Parsing functions used for all file format versions
|
nuclear@0
|
119 */
|
nuclear@0
|
120 inline void GetS0(std::string& out,unsigned int max);
|
nuclear@0
|
121 inline float GetF4();
|
nuclear@0
|
122 inline uint32_t GetU4();
|
nuclear@0
|
123 inline uint16_t GetU2();
|
nuclear@0
|
124 inline uint8_t GetU1();
|
nuclear@0
|
125
|
nuclear@0
|
126
|
nuclear@0
|
127 // -------------------------------------------------------------------
|
nuclear@0
|
128 /** Loads a surface chunk from an LWOB file
|
nuclear@0
|
129 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
130 */
|
nuclear@0
|
131 void LoadLWOBSurface(unsigned int size);
|
nuclear@0
|
132
|
nuclear@0
|
133 // -------------------------------------------------------------------
|
nuclear@0
|
134 /** Loads a surface chunk from an LWO2 file
|
nuclear@0
|
135 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
136 */
|
nuclear@0
|
137 void LoadLWO2Surface(unsigned int size);
|
nuclear@0
|
138
|
nuclear@0
|
139 // -------------------------------------------------------------------
|
nuclear@0
|
140 /** Loads a texture block from a LWO2 file.
|
nuclear@0
|
141 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
142 * @param head Header of the SUF.BLOK header
|
nuclear@0
|
143 */
|
nuclear@0
|
144 void LoadLWO2TextureBlock(LE_NCONST IFF::SubChunkHeader* head,
|
nuclear@0
|
145 unsigned int size );
|
nuclear@0
|
146
|
nuclear@0
|
147 // -------------------------------------------------------------------
|
nuclear@0
|
148 /** Loads a shader block from a LWO2 file.
|
nuclear@0
|
149 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
150 * @param head Header of the SUF.BLOK header
|
nuclear@0
|
151 */
|
nuclear@0
|
152 void LoadLWO2ShaderBlock(LE_NCONST IFF::SubChunkHeader* head,
|
nuclear@0
|
153 unsigned int size );
|
nuclear@0
|
154
|
nuclear@0
|
155 // -------------------------------------------------------------------
|
nuclear@0
|
156 /** Loads an image map from a LWO2 file
|
nuclear@0
|
157 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
158 * @param tex Texture object to be filled
|
nuclear@0
|
159 */
|
nuclear@0
|
160 void LoadLWO2ImageMap(unsigned int size, LWO::Texture& tex );
|
nuclear@0
|
161 void LoadLWO2Gradient(unsigned int size, LWO::Texture& tex );
|
nuclear@0
|
162 void LoadLWO2Procedural(unsigned int size, LWO::Texture& tex );
|
nuclear@0
|
163
|
nuclear@0
|
164 // loads the header - used by thethree functions above
|
nuclear@0
|
165 void LoadLWO2TextureHeader(unsigned int size, LWO::Texture& tex );
|
nuclear@0
|
166
|
nuclear@0
|
167 // -------------------------------------------------------------------
|
nuclear@0
|
168 /** Loads the LWO tag list from the file
|
nuclear@0
|
169 * @param size Maximum size to be read, in bytes.
|
nuclear@0
|
170 */
|
nuclear@0
|
171 void LoadLWOTags(unsigned int size);
|
nuclear@0
|
172
|
nuclear@0
|
173 // -------------------------------------------------------------------
|
nuclear@0
|
174 /** Load polygons from a POLS chunk
|
nuclear@0
|
175 * @param length Size of the chunk
|
nuclear@0
|
176 */
|
nuclear@0
|
177 void LoadLWO2Polygons(unsigned int length);
|
nuclear@0
|
178 void LoadLWOBPolygons(unsigned int length);
|
nuclear@0
|
179
|
nuclear@0
|
180 // -------------------------------------------------------------------
|
nuclear@0
|
181 /** Load polygon tags from a PTAG chunk
|
nuclear@0
|
182 * @param length Size of the chunk
|
nuclear@0
|
183 */
|
nuclear@0
|
184 void LoadLWO2PolygonTags(unsigned int length);
|
nuclear@0
|
185
|
nuclear@0
|
186 // -------------------------------------------------------------------
|
nuclear@0
|
187 /** Load a vertex map from a VMAP/VMAD chunk
|
nuclear@0
|
188 * @param length Size of the chunk
|
nuclear@0
|
189 * @param perPoly Operate on per-polygon base?
|
nuclear@0
|
190 */
|
nuclear@0
|
191 void LoadLWO2VertexMap(unsigned int length, bool perPoly);
|
nuclear@0
|
192
|
nuclear@0
|
193 // -------------------------------------------------------------------
|
nuclear@0
|
194 /** Load polygons from a PNTS chunk
|
nuclear@0
|
195 * @param length Size of the chunk
|
nuclear@0
|
196 */
|
nuclear@0
|
197 void LoadLWOPoints(unsigned int length);
|
nuclear@0
|
198
|
nuclear@0
|
199 // -------------------------------------------------------------------
|
nuclear@0
|
200 /** Load a clip from a CLIP chunk
|
nuclear@0
|
201 * @param length Size of the chunk
|
nuclear@0
|
202 */
|
nuclear@0
|
203 void LoadLWO2Clip(unsigned int length);
|
nuclear@0
|
204
|
nuclear@0
|
205 // -------------------------------------------------------------------
|
nuclear@0
|
206 /** Load an envelope from an EVL chunk
|
nuclear@0
|
207 * @param length Size of the chunk
|
nuclear@0
|
208 */
|
nuclear@0
|
209 void LoadLWO2Envelope(unsigned int length);
|
nuclear@0
|
210
|
nuclear@0
|
211 // -------------------------------------------------------------------
|
nuclear@0
|
212 /** Count vertices and faces in a LWOB/LWO2 file
|
nuclear@0
|
213 */
|
nuclear@0
|
214 void CountVertsAndFacesLWO2(unsigned int& verts,
|
nuclear@0
|
215 unsigned int& faces,
|
nuclear@0
|
216 uint16_t*& cursor,
|
nuclear@0
|
217 const uint16_t* const end,
|
nuclear@0
|
218 unsigned int max = UINT_MAX);
|
nuclear@0
|
219
|
nuclear@0
|
220 void CountVertsAndFacesLWOB(unsigned int& verts,
|
nuclear@0
|
221 unsigned int& faces,
|
nuclear@0
|
222 LE_NCONST uint16_t*& cursor,
|
nuclear@0
|
223 const uint16_t* const end,
|
nuclear@0
|
224 unsigned int max = UINT_MAX);
|
nuclear@0
|
225
|
nuclear@0
|
226 // -------------------------------------------------------------------
|
nuclear@0
|
227 /** Read vertices and faces in a LWOB/LWO2 file
|
nuclear@0
|
228 */
|
nuclear@0
|
229 void CopyFaceIndicesLWO2(LWO::FaceList::iterator& it,
|
nuclear@0
|
230 uint16_t*& cursor,
|
nuclear@0
|
231 const uint16_t* const end);
|
nuclear@0
|
232
|
nuclear@0
|
233 // -------------------------------------------------------------------
|
nuclear@0
|
234 void CopyFaceIndicesLWOB(LWO::FaceList::iterator& it,
|
nuclear@0
|
235 LE_NCONST uint16_t*& cursor,
|
nuclear@0
|
236 const uint16_t* const end,
|
nuclear@0
|
237 unsigned int max = UINT_MAX);
|
nuclear@0
|
238
|
nuclear@0
|
239 // -------------------------------------------------------------------
|
nuclear@0
|
240 /** Resolve the tag and surface lists that have been loaded.
|
nuclear@0
|
241 * Generates the mMapping table.
|
nuclear@0
|
242 */
|
nuclear@0
|
243 void ResolveTags();
|
nuclear@0
|
244
|
nuclear@0
|
245 // -------------------------------------------------------------------
|
nuclear@0
|
246 /** Resolve the clip list that has been loaded.
|
nuclear@0
|
247 * Replaces clip references with real clips.
|
nuclear@0
|
248 */
|
nuclear@0
|
249 void ResolveClips();
|
nuclear@0
|
250
|
nuclear@0
|
251 // -------------------------------------------------------------------
|
nuclear@0
|
252 /** Add a texture list to an output material description.
|
nuclear@0
|
253 *
|
nuclear@0
|
254 * @param pcMat Output material
|
nuclear@0
|
255 * @param in Input texture list
|
nuclear@0
|
256 * @param type Type identifier of the texture list
|
nuclear@0
|
257 */
|
nuclear@0
|
258 bool HandleTextures(aiMaterial* pcMat, const TextureList& in,
|
nuclear@0
|
259 aiTextureType type);
|
nuclear@0
|
260
|
nuclear@0
|
261 // -------------------------------------------------------------------
|
nuclear@0
|
262 /** Adjust a texture path
|
nuclear@0
|
263 */
|
nuclear@0
|
264 void AdjustTexturePath(std::string& out);
|
nuclear@0
|
265
|
nuclear@0
|
266 // -------------------------------------------------------------------
|
nuclear@0
|
267 /** Convert a LWO surface description to an ASSIMP material
|
nuclear@0
|
268 */
|
nuclear@0
|
269 void ConvertMaterial(const LWO::Surface& surf,aiMaterial* pcMat);
|
nuclear@0
|
270
|
nuclear@0
|
271
|
nuclear@0
|
272 // -------------------------------------------------------------------
|
nuclear@0
|
273 /** Get a list of all UV/VC channels required by a specific surface.
|
nuclear@0
|
274 *
|
nuclear@0
|
275 * @param surf Working surface
|
nuclear@0
|
276 * @param layer Working layer
|
nuclear@0
|
277 * @param out Output list. The members are indices into the
|
nuclear@0
|
278 * UV/VC channel lists of the layer
|
nuclear@0
|
279 */
|
nuclear@0
|
280 void FindUVChannels(/*const*/ LWO::Surface& surf,
|
nuclear@0
|
281 LWO::SortedRep& sorted,
|
nuclear@0
|
282 /*const*/ LWO::Layer& layer,
|
nuclear@0
|
283 unsigned int out[AI_MAX_NUMBER_OF_TEXTURECOORDS]);
|
nuclear@0
|
284
|
nuclear@0
|
285 // -------------------------------------------------------------------
|
nuclear@0
|
286 char FindUVChannels(LWO::TextureList& list,
|
nuclear@0
|
287 LWO::Layer& layer,LWO::UVChannel& uv, unsigned int next);
|
nuclear@0
|
288
|
nuclear@0
|
289 // -------------------------------------------------------------------
|
nuclear@0
|
290 void FindVCChannels(const LWO::Surface& surf,
|
nuclear@0
|
291 LWO::SortedRep& sorted,
|
nuclear@0
|
292 const LWO::Layer& layer,
|
nuclear@0
|
293 unsigned int out[AI_MAX_NUMBER_OF_COLOR_SETS]);
|
nuclear@0
|
294
|
nuclear@0
|
295 // -------------------------------------------------------------------
|
nuclear@0
|
296 /** Generate the final node graph
|
nuclear@0
|
297 * Unused nodes are deleted.
|
nuclear@0
|
298 * @param apcNodes Flat list of nodes
|
nuclear@0
|
299 */
|
nuclear@0
|
300 void GenerateNodeGraph(std::map<uint16_t,aiNode*>& apcNodes);
|
nuclear@0
|
301
|
nuclear@0
|
302 // -------------------------------------------------------------------
|
nuclear@0
|
303 /** Add children to a node
|
nuclear@0
|
304 * @param node Node to become a father
|
nuclear@0
|
305 * @param parent Index of the node
|
nuclear@0
|
306 * @param apcNodes Flat list of nodes - used nodes are set to NULL.
|
nuclear@0
|
307 */
|
nuclear@0
|
308 void AddChildren(aiNode* node, uint16_t parent,
|
nuclear@0
|
309 std::vector<aiNode*>& apcNodes);
|
nuclear@0
|
310
|
nuclear@0
|
311 // -------------------------------------------------------------------
|
nuclear@0
|
312 /** Read a variable sized integer
|
nuclear@0
|
313 * @param inout Input and output buffer
|
nuclear@0
|
314 */
|
nuclear@0
|
315 int ReadVSizedIntLWO2(uint8_t*& inout);
|
nuclear@0
|
316
|
nuclear@0
|
317 // -------------------------------------------------------------------
|
nuclear@0
|
318 /** Assign a value from a VMAP to a vertex and all vertices
|
nuclear@0
|
319 * attached to it.
|
nuclear@0
|
320 * @param base VMAP destination data
|
nuclear@0
|
321 * @param numRead Number of float's to be read
|
nuclear@0
|
322 * @param idx Absolute index of the first vertex
|
nuclear@0
|
323 * @param data Value of the VMAP to be assigned - read numRead
|
nuclear@0
|
324 * floats from this array.
|
nuclear@0
|
325 */
|
nuclear@0
|
326 void DoRecursiveVMAPAssignment(VMapEntry* base, unsigned int numRead,
|
nuclear@0
|
327 unsigned int idx, float* data);
|
nuclear@0
|
328
|
nuclear@0
|
329 // -------------------------------------------------------------------
|
nuclear@0
|
330 /** Compute normal vectors for a mesh
|
nuclear@0
|
331 * @param mesh Input mesh
|
nuclear@0
|
332 * @param smoothingGroups Smoothing-groups-per-face array
|
nuclear@0
|
333 * @param surface Surface for the mesh
|
nuclear@0
|
334 */
|
nuclear@0
|
335 void ComputeNormals(aiMesh* mesh, const std::vector<unsigned int>& smoothingGroups,
|
nuclear@0
|
336 const LWO::Surface& surface);
|
nuclear@0
|
337
|
nuclear@0
|
338
|
nuclear@0
|
339 // -------------------------------------------------------------------
|
nuclear@0
|
340 /** Setup a new texture after the corresponding chunk was
|
nuclear@0
|
341 * encountered in the file.
|
nuclear@0
|
342 * @param list Texture list
|
nuclear@0
|
343 * @param size Maximum number of bytes to be read
|
nuclear@0
|
344 * @return Pointer to new texture
|
nuclear@0
|
345 */
|
nuclear@0
|
346 LWO::Texture* SetupNewTextureLWOB(LWO::TextureList& list,
|
nuclear@0
|
347 unsigned int size);
|
nuclear@0
|
348
|
nuclear@0
|
349 protected:
|
nuclear@0
|
350
|
nuclear@0
|
351 /** true if the file is a LWO2 file*/
|
nuclear@0
|
352 bool mIsLWO2;
|
nuclear@0
|
353
|
nuclear@0
|
354 /** true if the file is a LXOB file*/
|
nuclear@0
|
355 bool mIsLXOB;
|
nuclear@0
|
356
|
nuclear@0
|
357 /** Temporary list of layers from the file */
|
nuclear@0
|
358 LayerList* mLayers;
|
nuclear@0
|
359
|
nuclear@0
|
360 /** Pointer to the current layer */
|
nuclear@0
|
361 LWO::Layer* mCurLayer;
|
nuclear@0
|
362
|
nuclear@0
|
363 /** Temporary tag list from the file */
|
nuclear@0
|
364 TagList* mTags;
|
nuclear@0
|
365
|
nuclear@0
|
366 /** Mapping table to convert from tag to surface indices.
|
nuclear@0
|
367 UINT_MAX indicates that a no corresponding surface is available */
|
nuclear@0
|
368 TagMappingTable* mMapping;
|
nuclear@0
|
369
|
nuclear@0
|
370 /** Temporary surface list from the file */
|
nuclear@0
|
371 SurfaceList* mSurfaces;
|
nuclear@0
|
372
|
nuclear@0
|
373 /** Temporary clip list from the file */
|
nuclear@0
|
374 ClipList mClips;
|
nuclear@0
|
375
|
nuclear@0
|
376 /** Temporary envelope list from the file */
|
nuclear@0
|
377 EnvelopeList mEnvelopes;
|
nuclear@0
|
378
|
nuclear@0
|
379 /** file buffer */
|
nuclear@0
|
380 uint8_t* mFileBuffer;
|
nuclear@0
|
381
|
nuclear@0
|
382 /** Size of the file, in bytes */
|
nuclear@0
|
383 unsigned int fileSize;
|
nuclear@0
|
384
|
nuclear@0
|
385 /** Output scene */
|
nuclear@0
|
386 aiScene* pScene;
|
nuclear@0
|
387
|
nuclear@0
|
388 /** Configuration option: speed flag set? */
|
nuclear@0
|
389 bool configSpeedFlag;
|
nuclear@0
|
390
|
nuclear@0
|
391 /** Configuration option: index of layer to be loaded */
|
nuclear@0
|
392 unsigned int configLayerIndex;
|
nuclear@0
|
393
|
nuclear@0
|
394 /** Configuration option: name of layer to be loaded */
|
nuclear@0
|
395 std::string configLayerName;
|
nuclear@0
|
396
|
nuclear@0
|
397 /** True if we have a named layer */
|
nuclear@0
|
398 bool hasNamedLayer;
|
nuclear@0
|
399 };
|
nuclear@0
|
400
|
nuclear@0
|
401
|
nuclear@0
|
402 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
403 inline float LWOImporter::GetF4()
|
nuclear@0
|
404 {
|
nuclear@0
|
405 float f = *((float*)mFileBuffer);mFileBuffer += 4;
|
nuclear@0
|
406 AI_LSWAP4(f);
|
nuclear@0
|
407 return f;
|
nuclear@0
|
408 }
|
nuclear@0
|
409
|
nuclear@0
|
410 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
411 inline uint32_t LWOImporter::GetU4()
|
nuclear@0
|
412 {
|
nuclear@0
|
413 uint32_t f = *((uint32_t*)mFileBuffer);mFileBuffer += 4;
|
nuclear@0
|
414 AI_LSWAP4(f);
|
nuclear@0
|
415 return f;
|
nuclear@0
|
416 }
|
nuclear@0
|
417
|
nuclear@0
|
418 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
419 inline uint16_t LWOImporter::GetU2()
|
nuclear@0
|
420 {
|
nuclear@0
|
421 uint16_t f = *((uint16_t*)mFileBuffer);mFileBuffer += 2;
|
nuclear@0
|
422 AI_LSWAP2(f);
|
nuclear@0
|
423 return f;
|
nuclear@0
|
424 }
|
nuclear@0
|
425
|
nuclear@0
|
426 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
427 inline uint8_t LWOImporter::GetU1()
|
nuclear@0
|
428 {
|
nuclear@0
|
429 return *mFileBuffer++;
|
nuclear@0
|
430 }
|
nuclear@0
|
431
|
nuclear@0
|
432 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
433 inline int LWOImporter::ReadVSizedIntLWO2(uint8_t*& inout)
|
nuclear@0
|
434 {
|
nuclear@0
|
435 int i;
|
nuclear@0
|
436 int c = *inout;inout++;
|
nuclear@0
|
437 if(c != 0xFF)
|
nuclear@0
|
438 {
|
nuclear@0
|
439 i = c << 8;
|
nuclear@0
|
440 c = *inout;inout++;
|
nuclear@0
|
441 i |= c;
|
nuclear@0
|
442 }
|
nuclear@0
|
443 else
|
nuclear@0
|
444 {
|
nuclear@0
|
445 c = *inout;inout++;
|
nuclear@0
|
446 i = c << 16;
|
nuclear@0
|
447 c = *inout;inout++;
|
nuclear@0
|
448 i |= c << 8;
|
nuclear@0
|
449 c = *inout;inout++;
|
nuclear@0
|
450 i |= c;
|
nuclear@0
|
451 }
|
nuclear@0
|
452 return i;
|
nuclear@0
|
453 }
|
nuclear@0
|
454
|
nuclear@0
|
455 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
456 inline void LWOImporter::GetS0(std::string& out,unsigned int max)
|
nuclear@0
|
457 {
|
nuclear@0
|
458 unsigned int iCursor = 0;
|
nuclear@0
|
459 const char*sz = (const char*)mFileBuffer;
|
nuclear@0
|
460 while (*mFileBuffer)
|
nuclear@0
|
461 {
|
nuclear@0
|
462 if (++iCursor > max)
|
nuclear@0
|
463 {
|
nuclear@0
|
464 DefaultLogger::get()->warn("LWO: Invalid file, string is is too long");
|
nuclear@0
|
465 break;
|
nuclear@0
|
466 }
|
nuclear@0
|
467 ++mFileBuffer;
|
nuclear@0
|
468 }
|
nuclear@0
|
469 size_t len = (size_t) ((const char*)mFileBuffer-sz);
|
nuclear@0
|
470 out = std::string(sz,len);
|
nuclear@0
|
471 mFileBuffer += (len&0x1 ? 1 : 2);
|
nuclear@0
|
472 }
|
nuclear@0
|
473
|
nuclear@0
|
474
|
nuclear@0
|
475
|
nuclear@0
|
476 } // end of namespace Assimp
|
nuclear@0
|
477
|
nuclear@0
|
478 #endif // AI_LWOIMPORTER_H_INCLUDED
|