diff --git a/panda/src/egg2pg/characterMaker.cxx b/panda/src/egg2pg/characterMaker.cxx index 5d59715bce..0df6c93b03 100644 --- a/panda/src/egg2pg/characterMaker.cxx +++ b/panda/src/egg2pg/characterMaker.cxx @@ -35,13 +35,17 @@ #include "eggAnimPreload.h" #include "animPreloadTable.h" + + + + //////////////////////////////////////////////////////////////////// // Function: CharacterMaker::Construtor // Access: Public // Description: //////////////////////////////////////////////////////////////////// CharacterMaker:: -CharacterMaker(EggGroup *root, EggLoader &loader) +CharacterMaker(EggGroup *root, EggLoader &loader, bool structured) : _loader(loader), _egg_root(root) { _character_node = new Character(_egg_root->get_name()); @@ -49,6 +53,7 @@ CharacterMaker(EggGroup *root, EggLoader &loader) _morph_root = (PartGroup *)NULL; _skeleton_root = new PartGroup(_bundle, ""); + _structured = structured; } //////////////////////////////////////////////////////////////////// @@ -224,8 +229,11 @@ egg_to_slider(const string &name) { CharacterJointBundle *CharacterMaker:: make_bundle() { build_joint_hierarchy(_egg_root, _skeleton_root, -1); - make_geometry(_egg_root); + //if we are structured, the egg loader is going to take care of making the geometry + if(!_structured) { + make_geometry(_egg_root); + } _bundle->sort_descendants(); parent_joint_nodes(_skeleton_root); diff --git a/panda/src/egg2pg/characterMaker.h b/panda/src/egg2pg/characterMaker.h index b643fd1a14..f9417f8ff9 100644 --- a/panda/src/egg2pg/characterMaker.h +++ b/panda/src/egg2pg/characterMaker.h @@ -24,6 +24,7 @@ #include "typedef.h" #include "pmap.h" + class EggNode; class EggGroup; class EggGroupNode; @@ -46,7 +47,7 @@ class PandaNode; //////////////////////////////////////////////////////////////////// class EXPCL_PANDAEGG CharacterMaker { public: - CharacterMaker(EggGroup *root, EggLoader &loader); + CharacterMaker(EggGroup *root, EggLoader &loader, bool structured = false); Character *make_node(); @@ -89,6 +90,9 @@ private: CharacterJointBundle *_bundle; PartGroup *_morph_root; PartGroup *_skeleton_root; + + bool _structured; + }; #endif diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 96c87677c9..99722371e7 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -135,6 +135,8 @@ EggLoader() { _data = new EggData; _data->set_coordinate_system(egg_coordinate_system); _error = false; + _dynamic_override = false; + _dynamic_override_char_maker = NULL; } //////////////////////////////////////////////////////////////////// @@ -148,6 +150,8 @@ EggLoader(const EggData *data) : _data(new EggData(*data)) { _error = false; + _dynamic_override = true; + _dynamic_override_char_maker = NULL; } @@ -210,7 +214,6 @@ build_graph() { apply_deferred_nodes(_root, DeferredNodeProperty()); } - //////////////////////////////////////////////////////////////////// // Function: EggLoader::reparent_decals // Access: Public @@ -1696,7 +1699,7 @@ make_node(EggBin *egg_bin, PandaNode *parent) { // node (a parent of one or more similar EggPrimitives). switch (egg_bin->get_bin_number()) { case EggBinner::BN_polyset: - make_polyset(egg_bin, parent, NULL, false, NULL); + make_polyset(egg_bin, parent, NULL, _dynamic_override, _dynamic_override_char_maker); return NULL; case EggBinner::BN_lod: @@ -1788,8 +1791,23 @@ make_node(EggGroup *egg_group, PandaNode *parent) { if (egg_group->get_dart_type() != EggGroup::DT_none) { // A group with the flag set means to create a character. - CharacterMaker char_maker(egg_group, *this); + bool structured = (egg_group->get_dart_type() == EggGroup::DT_structured); + + CharacterMaker char_maker(egg_group, *this, structured); + node = char_maker.make_node(); + if(structured) { + //we're going to generate the rest of the children normally + //except we'll be making dynamic geometry + _dynamic_override = true; + _dynamic_override_char_maker = &char_maker; + EggGroup::const_iterator ci; + for (ci = egg_group->begin(); ci != egg_group->end(); ++ci) { + make_node(*ci, node); + } + _dynamic_override_char_maker = NULL; + _dynamic_override = false; + } } else if (egg_group->get_cs_type() != EggGroup::CST_none) { // A collision group: create collision geometry. diff --git a/panda/src/egg2pg/eggLoader.h b/panda/src/egg2pg/eggLoader.h index cf400c45d6..14e4b47e67 100644 --- a/panda/src/egg2pg/eggLoader.h +++ b/panda/src/egg2pg/eggLoader.h @@ -252,6 +252,10 @@ public: PT(BamCacheRecord) _record; bool _error; + CharacterMaker * _dynamic_override_char_maker; + bool _dynamic_override; + + friend class EggRenderState; friend class PandaNode; }; diff --git a/pandatool/src/egg-optchar/eggOptchar.cxx b/pandatool/src/egg-optchar/eggOptchar.cxx index 0cbf62cbbb..840d8bcdf2 100644 --- a/pandatool/src/egg-optchar/eggOptchar.cxx +++ b/pandatool/src/egg-optchar/eggOptchar.cxx @@ -198,6 +198,12 @@ EggOptchar() { "to quantize different channels by a different amount.", &EggOptchar::dispatch_double_components, NULL, &_quantize_anims); + add_option + ("dart", "[default, sync, nosync, or structured]", 0, + "change the dart value in the given eggs", + &EggOptchar::dispatch_string, NULL, &_dart_type); + + _optimal_hierarchy = false; _vref_quantum = 0.01; } @@ -290,6 +296,7 @@ run() { do_preload(); } + // Finally, set the default poses. It's important not to do this // until after we have adjusted all of the transforms for the // various joints. @@ -297,6 +304,13 @@ run() { do_defpose(); } + if (!_dart_type.empty()) { + Eggs::iterator ei; + for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) { + change_dart_type(*ei, _dart_type); + } + } + write_eggs(); } } @@ -1400,6 +1414,33 @@ rename_joints() { } } +//////////////////////////////////////////////////////////////////// +// Function: EggOptchar::change_dart_type +// Access: Private +// Description: Recursively walks the indicated egg hierarchy, +// renaming geometry to the indicated name. +//////////////////////////////////////////////////////////////////// +void EggOptchar:: +change_dart_type(EggGroupNode *egg_group, const string &new_dart_type) { + EggGroupNode::iterator gi; + for (gi = egg_group->begin(); gi != egg_group->end(); ++gi) { + EggNode *child = (*gi); + if (child->is_of_type(EggGroupNode::get_class_type())) { + EggGroupNode *group = DCAST(EggGroupNode, child); + if (child->is_of_type(EggGroup::get_class_type())) { + EggGroup *gr = DCAST(EggGroup, child); + EggGroup::DartType dt = gr->get_dart_type(); + if(dt != EggGroup::DT_none) { + EggGroup::DartType newDt = gr->string_dart_type(new_dart_type); + gr->set_dart_type(newDt); + } + } + change_dart_type(group, new_dart_type); + } + } +} + + //////////////////////////////////////////////////////////////////// // Function: EggOptchar::rename_primitives // Access: Private diff --git a/pandatool/src/egg-optchar/eggOptchar.h b/pandatool/src/egg-optchar/eggOptchar.h index 8f05d3cd78..58de903d36 100644 --- a/pandatool/src/egg-optchar/eggOptchar.h +++ b/pandatool/src/egg-optchar/eggOptchar.h @@ -78,6 +78,7 @@ private: void do_flag_groups(EggGroupNode *egg_group); void rename_joints(); void rename_primitives(EggGroupNode *egg_group, const string &name); + void change_dart_type(EggGroupNode *egg_group, const string &new_dart_type); void do_preload(); void do_defpose(); @@ -103,6 +104,8 @@ private: vector_string _expose_components; vector_string _suppress_components; + string _dart_type; + class DoubleString { public: double _a;