Panda3D
|
00001 // Filename: fltTrans.cxx 00002 // Created by: drose (11Apr01) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #include "fltTrans.h" 00016 00017 #include "fltHeader.h" 00018 #include "pystub.h" 00019 00020 //////////////////////////////////////////////////////////////////// 00021 // Function: FltTrans::Constructor 00022 // Access: Public 00023 // Description: 00024 //////////////////////////////////////////////////////////////////// 00025 FltTrans:: 00026 FltTrans() : 00027 WithOutputFile(true, false, true) 00028 { 00029 // Indicate the extension name we expect the user to supply for 00030 // output files. 00031 _preferred_extension = ".flt"; 00032 00033 set_program_description 00034 ("This program reads a MultiGen OpenFlight (.flt) file and writes an " 00035 "essentially equivalent .flt file, to the file specified with -o (or " 00036 "as the second parameter). Some simple operations may be performed."); 00037 00038 clear_runlines(); 00039 add_runline("[opts] input.flt output.flt"); 00040 add_runline("[opts] -o output.flt input.flt"); 00041 00042 add_path_replace_options(); 00043 add_path_store_options(); 00044 00045 add_option 00046 ("v", "version", 0, 00047 "Upgrade (or downgrade) the flt file to the indicated version. This " 00048 "may not be completely correct for all version-to-version combinations.", 00049 &FltTrans::dispatch_double, &_got_new_version, &_new_version); 00050 00051 add_option 00052 ("o", "filename", 0, 00053 "Specify the filename to which the resulting .flt file will be written. " 00054 "If this option is omitted, the last parameter name is taken to be the " 00055 "name of the output file.", 00056 &FltTrans::dispatch_filename, &_got_output_filename, &_output_filename); 00057 } 00058 00059 00060 //////////////////////////////////////////////////////////////////// 00061 // Function: FltTrans::run 00062 // Access: Public 00063 // Description: 00064 //////////////////////////////////////////////////////////////////// 00065 void FltTrans:: 00066 run() { 00067 if (_got_new_version) { 00068 int new_version = (int)floor(_new_version * 100.0 + 0.5); 00069 if (new_version < FltHeader::min_flt_version() || 00070 new_version > FltHeader::max_flt_version()) { 00071 nout << "Cannot write flt files of version " << new_version / 100.0 00072 << ". This program only understands how to write flt files between version " 00073 << FltHeader::min_flt_version() / 100.0 << " and " 00074 << FltHeader::max_flt_version() / 100.0 << ".\n"; 00075 exit(1); 00076 } 00077 } 00078 00079 PT(FltHeader) header = new FltHeader(_path_replace); 00080 00081 nout << "Reading " << _input_filename << "\n"; 00082 FltError result = header->read_flt(_input_filename); 00083 if (result != FE_ok) { 00084 nout << "Unable to read: " << result << "\n"; 00085 exit(1); 00086 } 00087 00088 if (header->check_version()) { 00089 nout << "Version is " << header->get_flt_version() / 100.0 << "\n"; 00090 } 00091 00092 if (_got_new_version) { 00093 int new_version = (int)floor(_new_version * 100.0 + 0.5); 00094 header->set_flt_version(new_version); 00095 } 00096 00097 header->apply_converted_filenames(); 00098 00099 result = header->write_flt(get_output()); 00100 if (result != FE_ok) { 00101 nout << "Unable to write: " << result << "\n"; 00102 exit(1); 00103 } 00104 00105 nout << "Successfully written.\n"; 00106 } 00107 00108 00109 //////////////////////////////////////////////////////////////////// 00110 // Function: FltTrans::handle_args 00111 // Access: Protected, Virtual 00112 // Description: 00113 //////////////////////////////////////////////////////////////////// 00114 bool FltTrans:: 00115 handle_args(ProgramBase::Args &args) { 00116 if (!check_last_arg(args, 1)) { 00117 return false; 00118 } 00119 00120 if (args.empty()) { 00121 nout << "You must specify the .flt file to read on the command line.\n"; 00122 return false; 00123 00124 } else if (args.size() != 1) { 00125 nout << "You must specify only one .flt file to read on the command line.\n"; 00126 return false; 00127 } 00128 00129 _input_filename = args[0]; 00130 00131 return true; 00132 } 00133 00134 00135 int main(int argc, char *argv[]) { 00136 // A call to pystub() to force libpystub.so to be linked in. 00137 pystub(); 00138 00139 FltTrans prog; 00140 prog.parse_command_line(argc, argv); 00141 prog.run(); 00142 return 0; 00143 }