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;
			}
		}
Пример #4
0
		virtual int execute(const string &command, ParameterList &params, 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;
			}
		}