From b4203252e26109fceb313a85ed591aac4dbfd55e Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 23 Jan 2003 18:45:40 +0000 Subject: [PATCH] more on animated models --- .../src/converter/somethingToEggConverter.I | 24 +++++++ .../src/converter/somethingToEggConverter.h | 4 ++ pandatool/src/eggbase/somethingToEgg.cxx | 7 +++ pandatool/src/eggbase/somethingToEgg.h | 1 + pandatool/src/mayaegg/mayaToEggConverter.cxx | 62 +++++++++++++------ pandatool/src/mayaegg/mayaToEggConverter.h | 1 + pandatool/src/mayaprogs/mayaToEgg.cxx | 1 + 7 files changed, 82 insertions(+), 18 deletions(-) diff --git a/pandatool/src/converter/somethingToEggConverter.I b/pandatool/src/converter/somethingToEggConverter.I index 95bc136398..d3408c3071 100644 --- a/pandatool/src/converter/somethingToEggConverter.I +++ b/pandatool/src/converter/somethingToEggConverter.I @@ -89,6 +89,30 @@ get_animation_convert() const { return _animation_convert; } +//////////////////////////////////////////////////////////////////// +// Function: SomethingToEggConverter::set_character_name +// Access: Public +// Description: Specifies the name of the character generated. This +// name should match between all the model and channel +// egg files for a particular character and its +// associated animations. +//////////////////////////////////////////////////////////////////// +INLINE void SomethingToEggConverter:: +set_character_name(const string &character_name) { + _character_name = character_name; +} + +//////////////////////////////////////////////////////////////////// +// Function: SomethingToEggConverter::get_character_name +// Access: Public +// Description: Returns the name of the character generated. See +// set_character_name(). +//////////////////////////////////////////////////////////////////// +INLINE const string &SomethingToEggConverter:: +get_character_name() const { + return _character_name; +} + //////////////////////////////////////////////////////////////////// // Function: SomethingToEggConverter::set_start_frame // Access: Public diff --git a/pandatool/src/converter/somethingToEggConverter.h b/pandatool/src/converter/somethingToEggConverter.h index 6b814f2a36..5a6cfe7d23 100644 --- a/pandatool/src/converter/somethingToEggConverter.h +++ b/pandatool/src/converter/somethingToEggConverter.h @@ -62,6 +62,9 @@ public: INLINE void set_animation_convert(AnimationConvert animation_convert); INLINE AnimationConvert get_animation_convert() const; + INLINE void set_character_name(const string &character_name); + INLINE const string &get_character_name() const; + INLINE void set_start_frame(double start_frame); INLINE bool has_start_frame() const; INLINE double get_start_frame() const; @@ -132,6 +135,7 @@ protected: Filename _mpc_directory; AnimationConvert _animation_convert; + string _character_name; double _start_frame; double _end_frame; double _frame_inc; diff --git a/pandatool/src/eggbase/somethingToEgg.cxx b/pandatool/src/eggbase/somethingToEgg.cxx index dbede37b87..76ba8fdd7f 100644 --- a/pandatool/src/eggbase/somethingToEgg.cxx +++ b/pandatool/src/eggbase/somethingToEgg.cxx @@ -110,6 +110,13 @@ add_animation_options() { "are supported: none, pose, or flip.", &SomethingToEgg::dispatch_animation_convert, NULL, &_animation_convert); + add_option + ("cn", "name", 40, + "Specifies the name of the animation character. This should match " + "between all of the model files and all of the channel files for a " + "particular model and its associated channels.", + &SomethingToEgg::dispatch_string, NULL, &_character_name); + add_option ("sf", "start-frame", 40, "Specifies the starting frame of animation to extract. If omitted, " diff --git a/pandatool/src/eggbase/somethingToEgg.h b/pandatool/src/eggbase/somethingToEgg.h index dc92e3293f..47f058de08 100644 --- a/pandatool/src/eggbase/somethingToEgg.h +++ b/pandatool/src/eggbase/somethingToEgg.h @@ -69,6 +69,7 @@ protected: DistanceUnit _output_units; AnimationConvert _animation_convert; + string _character_name; double _start_frame; double _end_frame; double _frame_inc; diff --git a/pandatool/src/mayaegg/mayaToEggConverter.cxx b/pandatool/src/mayaegg/mayaToEggConverter.cxx index e495030c3a..1eeca253e2 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.cxx +++ b/pandatool/src/mayaegg/mayaToEggConverter.cxx @@ -160,6 +160,11 @@ convert_file(const Filename &filename) { << "Unable to read " << filename << "\n"; return false; } + + if (_character_name.empty()) { + _character_name = filename.get_basename_wo_extension(); + } + return convert_maya(); } @@ -229,12 +234,13 @@ convert_maya() { case AC_none: // none: just get out a static model, no animation. - // fall through + all_ok = convert_hierarchy(&get_egg_data()); + break; case AC_model: // model: get out an animatable model with joints and vertex // membership. - all_ok = convert_hierarchy(&get_egg_data()); + all_ok = convert_char_model(); break; case AC_flip: @@ -285,6 +291,21 @@ close_api() { _maya.clear(); } +//////////////////////////////////////////////////////////////////// +// Function: MayaToEggConverter::convert_char_model +// Access: Private +// Description: Converts the animation as an animatable character +// model, with joints and vertex membership. +//////////////////////////////////////////////////////////////////// +bool MayaToEggConverter:: +convert_char_model() { + EggGroup *char_node = new EggGroup(_character_name); + get_egg_data().add_child(char_node); + char_node->set_dart_type(EggGroup::DT_default); + + return convert_hierarchy(char_node); +} + //////////////////////////////////////////////////////////////////// // Function: MayaToEggConverter::convert_flip // Access: Private @@ -301,7 +322,7 @@ convert_flip(double start_frame, double end_frame, double frame_inc, double output_frame_rate) { bool all_ok = true; - EggGroup *sequence_node = new EggGroup("model"); + EggGroup *sequence_node = new EggGroup(_character_name); get_egg_data().add_child(sequence_node); sequence_node->set_switch_flag(true); sequence_node->set_switch_fps(output_frame_rate / frame_inc); @@ -443,24 +464,29 @@ process_node(const MDagPath &dag_path, EggGroupNode *egg_root) { } } else if (dag_path.hasFn(MFn::kNurbsCurve)) { - EggGroup *egg_group = get_egg_group(dag_path, egg_root); - - if (egg_group == (EggGroup *)NULL) { - nout << "Cannot determine group node.\n"; - - } else { - get_transform(dag_path, egg_group); - - MFnNurbsCurve curve(dag_path, &status); - if (!status) { - mayaegg_cat.info() - << "Error in node " << dag_path.fullPathName() << ":\n" - << " it appears to have a NURBS curve, but does not.\n"; + // Only convert NurbsCurves if we aren't making an animated model. + // Animated models, as a general rule, don't want these sorts of + // things in them. + if (_animation_convert != AC_model) { + EggGroup *egg_group = get_egg_group(dag_path, egg_root); + + if (egg_group == (EggGroup *)NULL) { + nout << "Cannot determine group node.\n"; + } else { - make_nurbs_curve(dag_path, curve, egg_group, egg_root); + get_transform(dag_path, egg_group); + + MFnNurbsCurve curve(dag_path, &status); + if (!status) { + mayaegg_cat.info() + << "Error in node " << dag_path.fullPathName() << ":\n" + << " it appears to have a NURBS curve, but does not.\n"; + } else { + make_nurbs_curve(dag_path, curve, egg_group, egg_root); + } } } - + } else if (dag_path.hasFn(MFn::kMesh)) { EggGroup *egg_group = get_egg_group(dag_path, egg_root); diff --git a/pandatool/src/mayaegg/mayaToEggConverter.h b/pandatool/src/mayaegg/mayaToEggConverter.h index b28961390a..bb776b5608 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.h +++ b/pandatool/src/mayaegg/mayaToEggConverter.h @@ -69,6 +69,7 @@ public: void close_api(); private: + bool convert_char_model(); bool convert_flip(double start_frame, double end_frame, double frame_inc, double output_frame_rate); bool convert_hierarchy(EggGroupNode *egg_root); diff --git a/pandatool/src/mayaprogs/mayaToEgg.cxx b/pandatool/src/mayaprogs/mayaToEgg.cxx index 1df453e6e3..6a2ba455cf 100644 --- a/pandatool/src/mayaprogs/mayaToEgg.cxx +++ b/pandatool/src/mayaprogs/mayaToEgg.cxx @@ -100,6 +100,7 @@ run() { // Copy in the animation parameters. converter.set_animation_convert(_animation_convert); + converter.set_character_name(_character_name); if (_got_start_frame) { converter.set_start_frame(_start_frame); }