#include #include "CM2MeshFileLoader.h" namespace irr { namespace scene { CM2MeshFileLoader::CM2MeshFileLoader(IrrlichtDevice* device, c8* texdir):Device(device), Texdir(texdir) { Mesh = NULL; } 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"; //M2MeshName.clear(); //M2MeshName.reserve(header.nameLength); 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. Global data 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); std::cout<<"This View has "<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 "<0) M2MSubmeshes.clear(); ModelViewSubmesh tempM2Submesh; file->seek(M2MViews[0].ofsSub); for(u32 i =0;iread(&tempM2Submesh,sizeof(ModelViewSubmesh)); M2MSubmeshes.push_back(tempM2Submesh); // std::cout<< "Submesh " <seek(M2MViews[0].ofsTex); for(u32 i=0;iread(&tempM2TexUnit,sizeof(TextureUnit)); M2MTextureUnit.push_back(tempM2TexUnit); } std::cout << "Read "<seek(header.ofsTexLookup); for(u32 i=0;iread(&tempM2TexLookup,sizeof(u16)); M2MTextureLookup.push_back(tempM2TexLookup); } std::cout << "Read "<seek(header.ofsTextures); for(u32 i=0;iread(&tempM2TexDef,sizeof(TextureDefinition)); M2MTextureDef.push_back(tempM2TexDef); } std::cout << "Read "<seek(header.ofsTexFlags); for(u32 i=0;iread(&tempM2RF,sizeof(RenderFlags)); M2MRenderFlags.push_back(tempM2RF); } std::cout << "Read "<seek(M2MTextureDef[i].texFileOfs); file->read(&tempTexFileName[0],M2MTextureDef[i].texFileLen); M2MTextureFiles.push_back(tempTexFileName.c_str()); std::cout<0) M2Vertices.clear(); for(u32 i=0;idrop(); // crash on vc9 Mesh=new SMesh(); while(Mesh->getMeshBufferCount()>0) { Mesh->MeshBuffers.erase(0); } for(u32 i=0; i < M2MViews[0].nSub;i++)// { //std::cout << "Proceeding with Submesh "<0) M2Indices.clear(); for(u32 j=M2MSubmeshes[i].ofsTris;jappend(M2Vertices.const_pointer(),M2Vertices.size(),M2Indices.const_pointer(),M2Indices.size()); IMB->recalculateBoundingBox(); //IMB->getMaterial().DiffuseColor.set(255,255-(u32)(255/(M2MSubmeshes.size()))*i,(u32)(255/(M2MSubmeshes.size()))*i,0); //IMB->getMaterial().DiffuseColor.set(255,(M2MSubmeshes[i].meshpartId==0?0:255),(M2MSubmeshes[i].meshpartId==0?255:0),0); std::string TexName=Texdir.c_str(); TexName+="/"; if(igetMaterial().setTexture(0,Device->getVideoDriver()->getTexture(TexName.c_str())); if(igetMaterial().BackfaceCulling=(M2MRenderFlags[i].flags & 0x04)?false:true; if(M2MRenderFlags[i].blending==1) IMB->getMaterial().MaterialType=video::EMT_TRANSPARENT_ALPHA_CHANNEL; } Mesh->addMeshBuffer(IMB); IMB->drop(); //std::cout << "Mesh now has "<getMeshBufferCount()<<" Buffers\n"; } aniMesh= new SAnimatedMesh(); aniMesh->addMesh(Mesh); Mesh->drop(); Mesh = 0; aniMesh->recalculateBoundingBox(); return aniMesh; } } }