vrshoot

annotate libs/assimp/LWOLoader.h @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
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