// Copyright (C) 2002-2007 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h #ifndef __C_3DS_MESH_FILE_LOADER_H_INCLUDED__ #define __C_3DS_MESH_FILE_LOADER_H_INCLUDED__ #include "IMeshLoader.h" #include "IFileSystem.h" #include "IVideoDriver.h" #include "irrString.h" #include "SMesh.h" #include "IMeshManipulator.h" #include "matrix4.h" namespace irr { namespace scene { //! Meshloader capable of loading 3ds meshes. class C3DSMeshFileLoader : public IMeshLoader { public: //! Constructor C3DSMeshFileLoader(IMeshManipulator* manip,io::IFileSystem* fs, video::IVideoDriver* driver); //! destructor virtual ~C3DSMeshFileLoader(); //! returns true if the file maybe is able to be loaded by this class //! based on the file extension (e.g. ".cob") virtual bool isALoadableFileExtension(const c8* fileName) const; //! creates/loads an animated mesh from the file. //! \return Pointer to the created mesh. Returns 0 if loading failed. //! If you no longer need the mesh, you should call IAnimatedMesh::drop(). //! See IReferenceCounted::drop() for more information. virtual IAnimatedMesh* createMesh(io::IReadFile* file); private: // byte-align structures #if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack( push, packing ) # pragma pack( 1 ) # define PACK_STRUCT #elif defined( __GNUC__ ) # define PACK_STRUCT __attribute__((packed)) #else # error compiler not supported #endif struct ChunkHeader { u16 id; s32 length; } PACK_STRUCT; // Default alignment #if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack( pop, packing ) #endif #undef PACK_STRUCT struct ChunkData { ChunkData() : read(0) {} ChunkHeader header; s32 read; }; struct SCurrentMaterial { void clear() { Material=video::SMaterial(); Name=""; Filename[0]=""; Filename[1]=""; Filename[2]=""; Filename[3]=""; Filename[4]=""; } video::SMaterial Material; core::stringc Name; core::stringc Filename[5]; }; struct SMaterialGroup { SMaterialGroup() : faceCount(0), faces(0) {}; SMaterialGroup(const SMaterialGroup& o) { *this = o; } ~SMaterialGroup() { clear(); } void clear() { delete [] faces; faces = 0; faceCount = 0; } void operator =(const SMaterialGroup& o) { MaterialName = o.MaterialName; faceCount = o.faceCount; faces = new u16[faceCount]; for (u32 i=0; i TempIndices; f32* TCoords; u16 CountVertices; u16 CountFaces; // = CountIndices/4 u16 CountTCoords; core::array MaterialGroups; SCurrentMaterial CurrentMaterial; core::array Materials; core::array MeshBufferNames; core::matrix4 TransformationMatrix; SMesh* Mesh; IMeshManipulator* Manipulator; }; } // end namespace scene } // end namespace irr #endif