EG/pandatool/src/eggbase/eggToSomething.cxx

156 lines
5.1 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file eggToSomething.cxx
* @author drose
* @date 2000-02-15
*/
#include "eggToSomething.h"
/**
* The first parameter to the constructor should be the one-word name of the
* file format that is to be read, for instance "OpenFlight" or "Alias". It's
* just used in printing error messages and such.
*/
EggToSomething::
EggToSomething(const std::string &format_name,
const std::string &preferred_extension,
bool allow_last_param, bool allow_stdout) :
EggConverter(format_name, preferred_extension, allow_last_param,
allow_stdout)
{
clear_runlines();
if (_allow_last_param) {
add_runline("[opts] input.egg output" + _preferred_extension);
}
add_runline("[opts] -o output" + _preferred_extension + " input.egg");
if (_allow_stdout) {
add_runline("[opts] input.egg >output" + _preferred_extension);
}
std::string o_description;
if (_allow_stdout) {
if (_allow_last_param) {
o_description =
"Specify the filename to which the resulting " + format_name +
" file will be written. "
"If this option is omitted, the last parameter name is taken to be the "
"name of the output file, or standard output is used if there are no "
"other parameters.";
} else {
o_description =
"Specify the filename to which the resulting " + format_name +
" file will be written. "
"If this option is omitted, the " + format_name +
" file is written to standard output.";
}
} else {
if (_allow_last_param) {
o_description =
"Specify the filename to which the resulting " + format_name +
" file will be written. "
"If this option is omitted, the last parameter name is taken to be the "
"name of the output file.";
} else {
o_description =
"Specify the filename to which the resulting " + format_name +
" file will be written.";
}
}
redescribe_option("o", o_description);
redescribe_option
("cs",
"Specify the coordinate system of the resulting " + _format_name +
" file. This may be "
"one of 'y-up', 'z-up', 'y-up-left', or 'z-up-left'. The default "
"is the same coordinate system as the input egg file. If this is "
"different from the input egg file, a conversion will be performed.");
_input_units = DU_invalid;
_output_units = DU_invalid;
}
/**
* Adds -ui and -uo as valid options for this program. If the user specifies
* -uo and -ui, or just -uo and the program specifies -ui by setting
* _input_units, the indicated units conversion will be automatically applied
* before writing out the egg file.
*/
void EggToSomething::
add_units_options() {
add_option
("ui", "units", 40,
"Specify the units of the input egg file. If this is "
"specified, the vertices in the egg file will be scaled as "
"necessary to make the appropriate units conversion; otherwise, "
"the vertices will be left as they are.",
&EggToSomething::dispatch_units, nullptr, &_input_units);
add_option
("uo", "units", 40,
"Specify the units of the resulting " + _format_name +
" file. Normally, the default units for the format are used.",
&EggToSomething::dispatch_units, nullptr, &_output_units);
}
/**
* Applies the scale indicated by the input and output units to the indicated
* egg file. This is normally done automatically when the file is read in.
*/
void EggToSomething::
apply_units_scale(EggData *data) {
// [gjeon] since maya's internal unit is fixed to cm and when we can't
// change UI unit without affecting data we need to convert data to cm for
// now this will be set later to proper output unit user provided by using
// MayaApi::set_units() in eggToMaya.cxx
DistanceUnit output_units = _output_units;
if (_format_name == "Maya")
_output_units = DU_centimeters;
if (_output_units != DU_invalid && _input_units != DU_invalid &&
_input_units != _output_units) {
nout << "Converting from " << format_long_unit(_input_units)
<< " to " << format_long_unit(_output_units) << "\n";
double scale = convert_units(_input_units, _output_units);
data->transform(LMatrix4d::scale_mat(scale));
}
_output_units = output_units;
}
/**
* Performs any processing of the egg file that is appropriate after reading
* it in.
*
* Normally, you should not need to call this function directly; it is called
* automatically at startup.
*/
void EggToSomething::
pre_process_egg_file() {
apply_units_scale(_data);
EggConverter::pre_process_egg_file();
}
/**
* Does something with the additional arguments on the command line (after all
* the -options have been parsed). Returns true if the arguments are good,
* false otherwise.
*/
bool EggToSomething::
handle_args(ProgramBase::Args &args) {
if (!check_last_arg(args, 1)) {
return false;
}
return EggConverter::handle_args(args);
}