virtual RetCodeEnum convert(const std::string &inputFormat, const std::string &outputFormat, const std::string &opCode) { if ( inputFormat == "Wavefront" && outputFormat== "BFXM" ) { if ( opCode == "create" ) { bool forcenormals=atoi(getNamedOption("forcenormals").c_str())!=0; string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); FILE * Inputfile=fopen(input.c_str(),"r"); if (!Inputfile) return RC_INVALID_INPUT; string mtl = ObjGetMtl(Inputfile,input.c_str()); FILE * InputMtl = fopen (mtl.c_str(),"r"); if (!InputMtl) { fclose(Inputfile); return RC_INVALID_INPUT; } FILE * Outputfile=fopen(output.c_str(),"wb+"); if (!Outputfile) { fclose(Inputfile); fclose(InputMtl); return RC_INTERNAL_ERROR; } ObjToBFXM(Inputfile,InputMtl,Outputfile,forcenormals); return RC_OK; } else { return RC_NOT_IMPLEMENTED; } } else { return RC_NOT_IMPLEMENTED; } }
virtual RetCodeEnum convert(const std::string &inputFormat, const std::string &outputFormat, const std::string &opCode) { if ( inputFormat == "XMesh" && outputFormat== "BFXM" ) { if ( opCode == "add" ) { bool forcenormals=atoi(getNamedOption("forcenormals").c_str())!=0; string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); FILE *Outputfile=fopen(output.c_str(),"rb+"); //append to end, but not append, which doesn't do what you want it to. fseek(Outputfile, 0, SEEK_END); XML memfile=(LoadXML(input.c_str(),1)); xmeshToBFXM(memfile,Outputfile,'a',forcenormals); return RC_OK; } else if ( opCode == "create" ) { bool forcenormals=atoi(getNamedOption("forcenormals").c_str())!=0; string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); FILE *Outputfile=fopen(output.c_str(),"wb+"); //create file for BFXM output XML memfile=(LoadXML(input.c_str(),1)); xmeshToBFXM(memfile,Outputfile,'c',forcenormals); return RC_OK; } else { return RC_NOT_IMPLEMENTED; } } else { return RC_NOT_IMPLEMENTED; } }
virtual RetCodeEnum convert(const std::string &inputFormat, const std::string &outputFormat, const std::string &opCode) { if ( inputFormat == "XMesh" && outputFormat== "Ogre" ) { if ( opCode == "create" ) { string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); string base = input.substr(0,input.rfind('.')); string mtl = base + string(".material"); XML memfile=(LoadXML(input.c_str(),1)); OgreMeshConverter::ConverterInit(); void *data = OgreMeshConverter::Init(); OgreMeshConverter::Add(data, memfile); OgreMeshConverter::DoneMeshes(data); OgreMeshConverter::Dump(data, output.c_str(), mtl.c_str()); OgreMeshConverter::ConverterClose(); return RC_OK; } else if (opCode == "append") { string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); string base = input.substr(0,input.rfind('.')); string mtl = base + string(".material"); XML memfile=(LoadXML(input.c_str(),1)); OgreMeshConverter::ConverterInit(); void *data = OgreMeshConverter::Init(output.c_str(), mtl.c_str()); OgreMeshConverter::Add(data, memfile); OgreMeshConverter::DoneMeshes(data); OgreMeshConverter::Dump(data, output.c_str(), mtl.c_str()); OgreMeshConverter::ConverterClose(); return RC_OK; } else if (opCode == "optimize") { string input = getNamedOption("inputPath"); string output= getNamedOption("outputPath"); string base = input.substr(0,input.rfind('.')); string mtl = base + string(".material"); OgreMeshConverter::ConverterInit(); void *data = OgreMeshConverter::Init(output.c_str(), mtl.c_str()); OgreMeshConverter::Optimize(data); OgreMeshConverter::DoneMeshes(data); OgreMeshConverter::Dump(data, output.c_str(), mtl.c_str()); OgreMeshConverter::ConverterClose(); } else { return RC_NOT_IMPLEMENTED; } } else { return RC_NOT_IMPLEMENTED; } }
virtual int execute(const string &command, ParameterList ¶ms, unsigned int phase) { if (command == "-i" || command == "--input") { if (params.size()==0) { cerr << "Warning: " << command << " needs a file path to follow. Ignoring." << endl; return 0; } else { getInputPath() = params[0]; params.erase(params.begin()); return 0; } } else if (command == "-o" || command == "--output") { if (params.size()==0) { cerr << "Warning: " << command << " needs a file path to follow. Ignoring." << endl; return 0; } else { getOutputPath() = params[0]; params.erase(params.begin()); return 0; } } else if (command == "-c" || command == "--convert") { if (params.size() < 3) { cerr << "Fatal: " << command << " needs three arguments:\n" << "\tmesher <...> " << command << " {XMesh|BFXM|Wavefront} (XMesh|BFXM|Wafefront|Ogre) (create|append|optimize)\n" << "\n" << "Do \"mesher --help convert\" for details" << endl; return 1; } else { if (phase == 0) { // Do nothing in phase 0. return 0; } else if (phase == 1) { ConversionImplList& registry = getRegistry(); ConversionImpl::RetCodeEnum rc = ConversionImpl::RC_NOT_IMPLEMENTED; for (ConversionImplList::iterator cit=registry.begin(); (rc == ConversionImpl::RC_NOT_IMPLEMENTED)&&(cit!=registry.end()); ++cit) { rc = cit->second->convert(params[0],params[1],params[2]); } if (rc == ConversionImpl::RC_NOT_IMPLEMENTED) { cerr << "Error: " << params[2] << " from " << params[0] << " to " << params[1] << " unimplemneted" << endl; return ConversionImpl::RC_NOT_IMPLEMENTED; } else if (rc == ConversionImpl::RC_OK) { params.erase(params.begin(),params.begin()+3); return ConversionImpl::RC_OK; } else { cerr << "Error: "; switch (rc) { case ConversionImpl::RC_INVALID_PARAMS: cerr << "Invalid parameters specified for " << command; break; case ConversionImpl::RC_INVALID_INPUT: cerr << "Invalid input"; break; case ConversionImpl::RC_INTERNAL_ERROR: cerr << "Internal error"; break; default: cerr << "(see above messages)"; break; } cerr << endl; return rc; } } else { cerr << "Warning: ConvertHandler::execute(): received an unexpected phase. Ignoring." << endl; return 0; } } } else if (command.length()>2 && command[0]=='-' && command[1]!='-') { string::size_type eq = command.rfind('='); string::size_type nn = ((eq==string::npos)?string::npos:eq-1); string option = command.substr(1,nn); if (mOptions.count(option)) { string value = ((eq!=string::npos)?command.substr(eq+1):string("1")); AliasList::const_iterator ait = mAliases.find(option); if (ait != mAliases.end()) option = ait->second; getNamedOption(option) = value; return 0; } else { cerr << "Fatal: Internal error - ConvertHandler::execute() received an unrecognized option" << endl; return 1; } } else { cerr << "Fatal: Internal error - ConvertHandler::execute() received an unrecognized command" << endl; return 1; } }