00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggCharacterFilter.h"
00016 #include "eggCharacterCollection.h"
00017 #include "eggCharacterData.h"
00018
00019
00020
00021
00022
00023
00024
00025 EggCharacterFilter::
00026 EggCharacterFilter() : EggMultiFilter(false) {
00027 _collection = (EggCharacterCollection *)NULL;
00028
00029 _force_initial_rest_frame = false;
00030 }
00031
00032
00033
00034
00035
00036
00037 EggCharacterFilter::
00038 ~EggCharacterFilter() {
00039 if (_collection != (EggCharacterCollection *)NULL) {
00040 delete _collection;
00041 }
00042 }
00043
00044
00045
00046
00047
00048
00049 void EggCharacterFilter::
00050 add_fixrest_option() {
00051 add_option
00052 ("fixrest", "", 30,
00053 "Specify this to force all the initial rest frames of the various "
00054 "model files to the same value as the first model specified. This "
00055 "is a fairly drastic way to repair models whose initial rest frame "
00056 "values are completely bogus, but should not be performed when the "
00057 "input models are correct.",
00058 &EggCharacterFilter::dispatch_none, &_force_initial_rest_frame);
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 bool EggCharacterFilter::
00068 post_command_line() {
00069 if (_collection == (EggCharacterCollection *)NULL) {
00070 _collection = make_collection();
00071 }
00072
00073 if (!EggMultiFilter::post_command_line()) {
00074 return false;
00075 }
00076
00077 Eggs::iterator ei;
00078 for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
00079 EggData *data = (*ei);
00080
00081 if (_collection->add_egg(data) < 0) {
00082 nout << data->get_egg_filename().get_basename()
00083 << " does not contain a character model or animation channel.\n";
00084 return false;
00085 }
00086 }
00087
00088 _collection->check_errors(nout, _force_initial_rest_frame);
00089
00090 return true;
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100 void EggCharacterFilter::
00101 write_eggs() {
00102
00103
00104 int num_characters = _collection->get_num_characters();
00105 for (int i = 0; i < num_characters; i++) {
00106 EggCharacterData *char_data = _collection->get_character(i);
00107 char_data->get_root_joint()->optimize();
00108 }
00109
00110 EggMultiFilter::write_eggs();
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 EggCharacterCollection *EggCharacterFilter::
00123 make_collection() {
00124 return new EggCharacterCollection;
00125 }