Browse Source

structured character support

Zachary Pavlov 16 years ago
parent
commit
7d2e756b48

+ 10 - 2
panda/src/egg2pg/characterMaker.cxx

@@ -35,13 +35,17 @@
 #include "eggAnimPreload.h"
 #include "eggAnimPreload.h"
 #include "animPreloadTable.h"
 #include "animPreloadTable.h"
 
 
+
+
+
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: CharacterMaker::Construtor
 //     Function: CharacterMaker::Construtor
 //       Access: Public
 //       Access: Public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 CharacterMaker::
 CharacterMaker::
-CharacterMaker(EggGroup *root, EggLoader &loader)
+CharacterMaker(EggGroup *root, EggLoader &loader, bool structured)
   : _loader(loader), _egg_root(root) {
   : _loader(loader), _egg_root(root) {
 
 
   _character_node = new Character(_egg_root->get_name());
   _character_node = new Character(_egg_root->get_name());
@@ -49,6 +53,7 @@ CharacterMaker(EggGroup *root, EggLoader &loader)
 
 
   _morph_root = (PartGroup *)NULL;
   _morph_root = (PartGroup *)NULL;
   _skeleton_root = new PartGroup(_bundle, "<skeleton>");
   _skeleton_root = new PartGroup(_bundle, "<skeleton>");
+  _structured = structured;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -224,8 +229,11 @@ egg_to_slider(const string &name) {
 CharacterJointBundle *CharacterMaker::
 CharacterJointBundle *CharacterMaker::
 make_bundle() {
 make_bundle() {
   build_joint_hierarchy(_egg_root, _skeleton_root, -1);
   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();
   _bundle->sort_descendants();
   parent_joint_nodes(_skeleton_root);
   parent_joint_nodes(_skeleton_root);
 
 

+ 5 - 1
panda/src/egg2pg/characterMaker.h

@@ -24,6 +24,7 @@
 #include "typedef.h"
 #include "typedef.h"
 #include "pmap.h"
 #include "pmap.h"
 
 
+
 class EggNode;
 class EggNode;
 class EggGroup;
 class EggGroup;
 class EggGroupNode;
 class EggGroupNode;
@@ -46,7 +47,7 @@ class PandaNode;
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 class EXPCL_PANDAEGG CharacterMaker {
 class EXPCL_PANDAEGG CharacterMaker {
 public:
 public:
-  CharacterMaker(EggGroup *root, EggLoader &loader);
+  CharacterMaker(EggGroup *root, EggLoader &loader, bool structured = false);
 
 
   Character *make_node();
   Character *make_node();
 
 
@@ -89,6 +90,9 @@ private:
   CharacterJointBundle *_bundle;
   CharacterJointBundle *_bundle;
   PartGroup *_morph_root;
   PartGroup *_morph_root;
   PartGroup *_skeleton_root;
   PartGroup *_skeleton_root;
+  
+  bool _structured;
+
 };
 };
 
 
 #endif
 #endif

+ 21 - 3
panda/src/egg2pg/eggLoader.cxx

@@ -135,6 +135,8 @@ EggLoader() {
   _data = new EggData;
   _data = new EggData;
   _data->set_coordinate_system(egg_coordinate_system);
   _data->set_coordinate_system(egg_coordinate_system);
   _error = false;
   _error = false;
+  _dynamic_override = false;
+  _dynamic_override_char_maker = NULL;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -148,6 +150,8 @@ EggLoader(const EggData *data) :
   _data(new EggData(*data))
   _data(new EggData(*data))
 {
 {
   _error = false;
   _error = false;
+  _dynamic_override = true;
+  _dynamic_override_char_maker = NULL;
 }
 }
 
 
 
 
@@ -210,7 +214,6 @@ build_graph() {
   apply_deferred_nodes(_root, DeferredNodeProperty());
   apply_deferred_nodes(_root, DeferredNodeProperty());
 }
 }
 
 
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: EggLoader::reparent_decals
 //     Function: EggLoader::reparent_decals
 //       Access: Public
 //       Access: Public
@@ -1696,7 +1699,7 @@ make_node(EggBin *egg_bin, PandaNode *parent) {
   // node (a parent of one or more similar EggPrimitives).
   // node (a parent of one or more similar EggPrimitives).
   switch (egg_bin->get_bin_number()) {
   switch (egg_bin->get_bin_number()) {
   case EggBinner::BN_polyset:
   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;
     return NULL;
 
 
   case EggBinner::BN_lod:
   case EggBinner::BN_lod:
@@ -1788,8 +1791,23 @@ make_node(EggGroup *egg_group, PandaNode *parent) {
 
 
   if (egg_group->get_dart_type() != EggGroup::DT_none) {
   if (egg_group->get_dart_type() != EggGroup::DT_none) {
     // A group with the <Dart> flag set means to create a character.
     // A group with the <Dart> 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();
     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) {
   } else if (egg_group->get_cs_type() != EggGroup::CST_none) {
     // A collision group: create collision geometry.
     // A collision group: create collision geometry.

+ 4 - 0
panda/src/egg2pg/eggLoader.h

@@ -252,6 +252,10 @@ public:
   PT(BamCacheRecord) _record;
   PT(BamCacheRecord) _record;
   bool _error;
   bool _error;
 
 
+  CharacterMaker * _dynamic_override_char_maker;
+  bool _dynamic_override;
+
+
   friend class EggRenderState;
   friend class EggRenderState;
   friend class PandaNode;
   friend class PandaNode;
 };
 };

+ 41 - 0
pandatool/src/egg-optchar/eggOptchar.cxx

@@ -198,6 +198,12 @@ EggOptchar() {
      "to quantize different channels by a different amount.",
      "to quantize different channels by a different amount.",
      &EggOptchar::dispatch_double_components, NULL, &_quantize_anims);
      &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;
   _optimal_hierarchy = false;
   _vref_quantum = 0.01;
   _vref_quantum = 0.01;
 }
 }
@@ -290,6 +296,7 @@ run() {
       do_preload();
       do_preload();
     }
     }
 
 
+
     // Finally, set the default poses.  It's important not to do this
     // Finally, set the default poses.  It's important not to do this
     // until after we have adjusted all of the transforms for the
     // until after we have adjusted all of the transforms for the
     // various joints.
     // various joints.
@@ -297,6 +304,13 @@ run() {
       do_defpose();
       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();
     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
 //     Function: EggOptchar::rename_primitives
 //       Access: Private
 //       Access: Private

+ 3 - 0
pandatool/src/egg-optchar/eggOptchar.h

@@ -78,6 +78,7 @@ private:
   void do_flag_groups(EggGroupNode *egg_group);
   void do_flag_groups(EggGroupNode *egg_group);
   void rename_joints();
   void rename_joints();
   void rename_primitives(EggGroupNode *egg_group, const string &name);
   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_preload();
   void do_defpose();
   void do_defpose();
 
 
@@ -103,6 +104,8 @@ private:
   vector_string _expose_components;
   vector_string _expose_components;
   vector_string _suppress_components;
   vector_string _suppress_components;
 
 
+  string _dart_type;
+
   class DoubleString {
   class DoubleString {
   public:
   public:
     double _a;
     double _a;