#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; file->seek(header.nameOfs); file->read(&M2MeshName[0],header.nameLength); logger->log("Mesh Name",M2MeshName.c_str(),ELL_INFORMATION); ModelVertex tempM2MVert; file->seek(header.ofsVertices); for(u32 i =0;iread(&tempM2MVert,sizeof(ModelVertex)); M2MVertices.push_back(tempM2MVert); } std::cout << "Read "<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); u16 tempM2Index; file->seek(M2MViews[0].ofsIndex); for(u32 i =0;iread(&tempM2Index,sizeof(u16)); M2MIndices.push_back(tempM2Index); } std::cout << "Read "<seek(M2MViews[0].ofsTris); for(u32 i =0;iread(&tempM2Triangle,sizeof(u16)); M2MTriangles.push_back(tempM2Triangle); } std::cout << "Read "<drop(); Mesh=new SMesh(); SMeshBuffer* IMB = new SMeshBuffer; IMB->append(M2Vertices.const_pointer(),M2Vertices.size(),M2Indices.const_pointer(),M2Indices.size()); //Device->getSceneManager()->getMeshManipulator()->recalculateNormals(IMB,false); IMB->recalculateBoundingBox(); Mesh->addMeshBuffer(IMB); //IMesh* tangentMesh = Device->getSceneManager()->getMeshManipulator()->createMeshWithTangents(Mesh); aniMesh= new SAnimatedMesh(); aniMesh->addMesh(Mesh); aniMesh->recalculateBoundingBox(); return aniMesh; } } }