00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef EGGCHARACTERCOLLECTION_H
00016 #define EGGCHARACTERCOLLECTION_H
00017
00018 #include "pandatoolbase.h"
00019
00020 #include "eggCharacterData.h"
00021
00022 #include "eggData.h"
00023 #include "eggNode.h"
00024 #include "pointerTo.h"
00025
00026 class EggTable;
00027 class EggAttributes;
00028
00029
00030
00031
00032
00033
00034
00035 class EggCharacterCollection {
00036 public:
00037 EggCharacterCollection();
00038 virtual ~EggCharacterCollection();
00039
00040 int add_egg(EggData *egg);
00041
00042 INLINE int get_num_eggs() const;
00043 INLINE EggData *get_egg(int i) const;
00044 INLINE int get_first_model_index(int egg_index) const;
00045 INLINE int get_num_models(int egg_index) const;
00046
00047 INLINE int get_num_characters() const;
00048 INLINE EggCharacterData *get_character(int i) const;
00049 EggCharacterData *get_character_by_name(const string &character_name) const;
00050
00051 INLINE EggCharacterData *get_character_by_model_index(int model_index) const;
00052
00053 void rename_char(int i, const string &name);
00054
00055 virtual void write(ostream &out, int indent_level = 0) const;
00056 void check_errors(ostream &out, bool force_initial_rest_frame);
00057
00058 virtual EggCharacterData *make_character_data();
00059 virtual EggJointData *make_joint_data(EggCharacterData *char_data);
00060 virtual EggSliderData *make_slider_data(EggCharacterData *char_data);
00061
00062 public:
00063 EggCharacterData *make_character(const string &character_name);
00064
00065 class EggInfo {
00066 public:
00067 PT(EggData) _egg;
00068 typedef pvector< PT(EggNode) > Models;
00069 Models _models;
00070 int _first_model_index;
00071 };
00072
00073 typedef pvector<EggInfo> Eggs;
00074 Eggs _eggs;
00075
00076 typedef pvector<EggCharacterData *> Characters;
00077 Characters _characters;
00078 Characters _characters_by_model_index;
00079
00080 private:
00081 bool scan_hierarchy(EggNode *egg_node);
00082 void scan_for_top_joints(EggNode *egg_node, EggNode *model_root,
00083 const string &character_name);
00084 void scan_for_top_tables(EggTable *bundle, EggNode *model_root,
00085 const string &character_name);
00086 void scan_for_morphs(EggNode *egg_node, int model_index,
00087 EggCharacterData *char_data);
00088 void scan_for_sliders(EggNode *egg_node, int model_index,
00089 EggCharacterData *char_data);
00090
00091 void add_morph_back_pointers(EggAttributes *attrib, EggObject *egg_object,
00092 int model_index, EggCharacterData *char_data);
00093 void add_morph_back_pointers_vertex(EggVertex *vertex, EggObject *egg_object,
00094 int model_index, EggCharacterData *char_data);
00095
00096
00097
00098 typedef pvector<EggNode *> EggNodeList;
00099 class ModelDescription {
00100 public:
00101 INLINE ModelDescription();
00102 EggNodeList _top_nodes;
00103 EggObject *_root_node;
00104 };
00105
00106 typedef pmap<EggNode *, ModelDescription> TopEggNodes;
00107 typedef pmap<string, TopEggNodes> TopEggNodesByName;
00108 TopEggNodesByName _top_egg_nodes;
00109
00110 int _next_model_index;
00111
00112 void match_egg_nodes(EggCharacterData *char_Data, EggJointData *joint_data,
00113 EggNodeList &egg_nodes, int egg_index, int model_index);
00114 void found_egg_match(EggCharacterData *char_data, EggJointData *joint_data,
00115 EggNode *egg_node, int egg_index, int model_index);
00116 };
00117
00118 #include "eggCharacterCollection.I"
00119
00120 #endif
00121
00122