#include #include "CM2MeshFileLoader.h" namespace irr { namespace scene { CM2MeshFileLoader::CM2MeshFileLoader(IrrlichtDevice* device):Device(device) { } CM2MeshFileLoader::~CM2MeshFileLoader() { } bool CM2MeshFileLoader::isALoadableFileExtension(const c8* filename)const { return strstr(filename, ".m2")!=0; } //! 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 IUnknown::drop() for more information. IAnimatedMesh* CM2MeshFileLoader::createMesh(io::IReadFile* file) { ILogger* logger =Device->getLogger(); logger->log("Trying to open file",file->getFileName(),ELL_INFORMATION); file->read(&header,sizeof(ModelHeader)); if (header.version[0] != 4 && header.version[1] != 1 && header.version[2] != 0 && header.version[3] != 0) { logger->log("Something wrong!",ELL_ERROR); return 0; } else logger->log(L"header okay",ELL_INFORMATION); //Name -> not very important I think, but save it nontheless; std::cout << "Name offset:" << header.nameOfs << "Name length:" << header.nameLength << "\n"; file->seek(header.nameOfs); file->read(&M2MeshName[0],header.nameLength); std::cout << "Read name:"<log("Mesh Name",M2MeshName.c_str(),ELL_INFORMATION); //Now we load all kinds of data from the file //Vertices if(!M2MVertices.empty()) M2MVertices.clear(); ModelVertex tempM2MVert; file->seek(header.ofsVertices); for(u32 i =0;iread(&tempM2MVert,sizeof(ModelVertex)); M2MVertices.push_back(tempM2MVert); } std::cout << "Read "<0) M2MViews.clear(); ModelView tempM2MView; file->seek(header.ofsViews); for(u32 i =0;iread(&tempM2MView,sizeof(ModelView)); M2MViews.push_back(tempM2MView); } std::cout << "Read "<log("Using View 0 for all further operations",ELL_INFORMATION); //Vertex indices of a specific view. if(M2MIndices.size()>0) M2MIndices.clear(); u16 tempM2Index; file->seek(M2MViews[0].ofsIndex); for(u32 i =0;iread(&tempM2Index,sizeof(u16)); M2MIndices.push_back(tempM2Index); } std::cout << "Read "<0) M2MTriangles.clear(); u16 tempM2Triangle; file->seek(M2MViews[0].ofsTris); for(u32 i =0;iread(&tempM2Triangle,sizeof(u16)); M2MTriangles.push_back(tempM2Triangle); } std::cout << "Read "<seek(header.ofsTexLookup); for(u32 i=0;i0) M2Vertices.clear(); for(u32 i=0;i0) M2Indices.clear(); for(u32 i=0;idrop(); Mesh=new SMesh(); SMeshBuffer* IMB = new SMeshBuffer; std::cout << "Sending "<append(M2Vertices.const_pointer(),M2Vertices.size(),M2Indices.const_pointer(),M2Indices.size()); IMB->recalculateBoundingBox(); Mesh->addMeshBuffer(IMB); IMB->drop(); /*if(aniMesh) { aniMesh->drop(); aniMesh=NULL; std::cout << "Dropped old animesh\n"; }*/ aniMesh= new SAnimatedMesh(); aniMesh->addMesh(Mesh); Mesh->drop(); aniMesh->recalculateBoundingBox(); return aniMesh; } } }