From 4a0bf0d87b0bc88bc3ce49e35c9f4b1212cf1fd6 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 7 Aug 2008 18:25:44 +0000 Subject: [PATCH] egg-optchar -preload --- pandatool/src/egg-optchar/eggOptchar.cxx | 74 +++++++++++++++++++ pandatool/src/egg-optchar/eggOptchar.h | 2 + pandatool/src/eggcharbase/eggBackPointer.cxx | 11 +++ pandatool/src/eggcharbase/eggBackPointer.h | 1 + .../src/eggcharbase/eggCharacterData.cxx | 22 ++++++ pandatool/src/eggcharbase/eggCharacterData.h | 1 + .../src/eggcharbase/eggComponentData.cxx | 15 ++++ pandatool/src/eggcharbase/eggComponentData.h | 1 + .../src/eggcharbase/eggMatrixTablePointer.cxx | 15 ++++ .../src/eggcharbase/eggMatrixTablePointer.h | 1 + .../src/eggcharbase/eggScalarTablePointer.cxx | 15 ++++ .../src/eggcharbase/eggScalarTablePointer.h | 1 + 12 files changed, 159 insertions(+) diff --git a/pandatool/src/egg-optchar/eggOptchar.cxx b/pandatool/src/egg-optchar/eggOptchar.cxx index f109c47baf..ebd6f28225 100644 --- a/pandatool/src/egg-optchar/eggOptchar.cxx +++ b/pandatool/src/egg-optchar/eggOptchar.cxx @@ -24,6 +24,9 @@ #include "eggGroupNode.h" #include "eggPrimitive.h" #include "eggVertexPool.h" +#include "eggTable.h" +#include "eggGroup.h" +#include "eggAnimPreload.h" #include "string_utils.h" #include "dcast.h" #include "pset.h" @@ -109,6 +112,13 @@ EggOptchar() { "objects parented to this node will not inherit its animation.", &EggOptchar::dispatch_flag_groups, NULL, &_flag_groups); + add_option + ("preload", "", 0, + "Add an entry for each animation to the model file(s). " + "This can be used at runtime to support asynchronous " + "loading and binding of animation channels.", + &EggOptchar::dispatch_none, &_preload); + add_option ("zero", "joint[,hprxyzijkabc]", 0, "Zeroes out the animation channels for the named joint. If " @@ -258,6 +268,11 @@ run() { } } + // Add the AnimPreload entries. + if (_preload) { + do_preload(); + } + write_eggs(); } } @@ -1347,6 +1362,65 @@ rename_primitives(EggGroupNode *egg_group, const string &name) { } } +//////////////////////////////////////////////////////////////////// +// Function: EggOptchar::do_preload +// Access: Private +// Description: Generates the preload tables for each model. +//////////////////////////////////////////////////////////////////// +void EggOptchar:: +do_preload() { + // First, build up the list of AnimPreload entries, one for each + // animation file. + PT(EggGroup) anim_group = new EggGroup("preload"); + + int num_characters = _collection->get_num_characters(); + int ci; + for (ci = 0; ci < num_characters; ++ci) { + EggCharacterData *char_data = _collection->get_character(ci); + + int num_models = char_data->get_num_models(); + for (int mn = 0; mn < num_models; ++mn) { + EggNode *root = char_data->get_model_root(mn); + if (root->is_of_type(EggTable::get_class_type())) { + // This model represents an animation. + EggData *data = char_data->get_egg_data(mn); + string basename = data->get_egg_filename().get_basename_wo_extension(); + PT(EggAnimPreload) anim_preload = new EggAnimPreload(basename); + + int mi = char_data->get_model_index(mn); + anim_preload->set_num_frames(char_data->get_num_frames(mi)); + double frame_rate = char_data->get_frame_rate(mi); + if (frame_rate != 0.0) { + anim_preload->set_fps(frame_rate); + } + + anim_group->add_child(anim_preload); + } + } + } + + // Now go back through and copy the preload tables into each of the + // model files. + for (ci = 0; ci < num_characters; ++ci) { + EggCharacterData *char_data = _collection->get_character(ci); + + int num_models = char_data->get_num_models(); + for (int mn = 0; mn < num_models; ++mn) { + EggNode *root = char_data->get_model_root(mn); + if (root->is_of_type(EggGroup::get_class_type())) { + // This is a model file. Copy in the table. + EggGroup *model_root = DCAST(EggGroup, root); + EggGroup::const_iterator ci; + for (ci = anim_group->begin(); ci != anim_group->end(); ++ci) { + EggAnimPreload *anim_preload = DCAST(EggAnimPreload, *ci); + PT(EggAnimPreload) new_anim_preload = new EggAnimPreload(*anim_preload); + model_root->add_child(new_anim_preload); + } + } + } + } +} + int main(int argc, char *argv[]) { // A call to pystub() to force libpystub.so to be linked in. pystub(); diff --git a/pandatool/src/egg-optchar/eggOptchar.h b/pandatool/src/egg-optchar/eggOptchar.h index 65d893d1fd..c9eb23721d 100644 --- a/pandatool/src/egg-optchar/eggOptchar.h +++ b/pandatool/src/egg-optchar/eggOptchar.h @@ -77,10 +77,12 @@ private: void do_flag_groups(EggGroupNode *egg_group); void rename_primitives(EggGroupNode *egg_group, const string &name); + void do_preload(); bool _list_hierarchy; bool _list_hierarchy_v; bool _list_hierarchy_p; + bool _preload; bool _keep_all; class StringPair { diff --git a/pandatool/src/eggcharbase/eggBackPointer.cxx b/pandatool/src/eggcharbase/eggBackPointer.cxx index 8c4045f46e..0537ee0d9b 100644 --- a/pandatool/src/eggcharbase/eggBackPointer.cxx +++ b/pandatool/src/eggcharbase/eggBackPointer.cxx @@ -26,6 +26,17 @@ EggBackPointer:: EggBackPointer() { } +//////////////////////////////////////////////////////////////////// +// Function: EggBackPointer::get_frame_rate +// Access: Public, Virtual +// Description: Returns the stated frame rate of this particular +// joint, or 0.0 if it doesn't state. +//////////////////////////////////////////////////////////////////// +double EggBackPointer:: +get_frame_rate() const { + return 0.0; +} + //////////////////////////////////////////////////////////////////// // Function: EggBackPointer::extend_to // Access: Public, Virtual diff --git a/pandatool/src/eggcharbase/eggBackPointer.h b/pandatool/src/eggcharbase/eggBackPointer.h index 3a238c47bd..2d752a6678 100644 --- a/pandatool/src/eggcharbase/eggBackPointer.h +++ b/pandatool/src/eggcharbase/eggBackPointer.h @@ -36,6 +36,7 @@ class EggBackPointer : public TypedObject { public: EggBackPointer(); + virtual double get_frame_rate() const; virtual int get_num_frames() const=0; virtual void extend_to(int num_frames); virtual bool has_vertices() const; diff --git a/pandatool/src/eggcharbase/eggCharacterData.cxx b/pandatool/src/eggcharbase/eggCharacterData.cxx index f11f2b1eaa..9023e4203b 100644 --- a/pandatool/src/eggcharbase/eggCharacterData.cxx +++ b/pandatool/src/eggcharbase/eggCharacterData.cxx @@ -133,6 +133,28 @@ get_num_frames(int model_index) const { return max_num_frames; } +//////////////////////////////////////////////////////////////////// +// Function: EggCharacterData::get_frame_rate +// Access: Public +// Description: Returns the stated frame rate of the specified model. +// Similar to get_num_frames(). +//////////////////////////////////////////////////////////////////// +double EggCharacterData:: +get_frame_rate(int model_index) const { + Components::const_iterator ci; + for (ci = _components.begin(); ci != _components.end(); ++ci) { + EggComponentData *component = (*ci); + double frame_rate = component->get_frame_rate(model_index); + if (frame_rate != 0.0) { + // We have a winner. Assume all other components will be + // similar. + return frame_rate; + } + } + + return 0.0; +} + //////////////////////////////////////////////////////////////////// // Function: EggCharacterData::check_num_frames // Access: Public diff --git a/pandatool/src/eggcharbase/eggCharacterData.h b/pandatool/src/eggcharbase/eggCharacterData.h index 9a2b36ad26..c702d67b2d 100644 --- a/pandatool/src/eggcharbase/eggCharacterData.h +++ b/pandatool/src/eggcharbase/eggCharacterData.h @@ -71,6 +71,7 @@ public: INLINE EggData *get_egg_data(int n) const; int get_num_frames(int model_index) const; bool check_num_frames(int model_index); + double get_frame_rate(int model_index) const; INLINE EggJointData *get_root_joint() const; INLINE EggJointData *find_joint(const string &name) const; diff --git a/pandatool/src/eggcharbase/eggComponentData.cxx b/pandatool/src/eggcharbase/eggComponentData.cxx index e236b7408b..f65abcc14d 100644 --- a/pandatool/src/eggcharbase/eggComponentData.cxx +++ b/pandatool/src/eggcharbase/eggComponentData.cxx @@ -118,6 +118,21 @@ extend_to(int model_index, int num_frames) const { back->extend_to(num_frames); } +//////////////////////////////////////////////////////////////////// +// Function: EggComponentData::get_frame_rate +// Access: Public, Virtual +// Description: Returns the number of frames of animation for this +// particular component in the indicated model. +//////////////////////////////////////////////////////////////////// +double EggComponentData:: +get_frame_rate(int model_index) const { + EggBackPointer *back = get_model(model_index); + if (back == (EggBackPointer *)NULL) { + return 0.0; + } + return back->get_frame_rate(); +} + //////////////////////////////////////////////////////////////////// // Function: EggComponentData::set_model // Access: Public diff --git a/pandatool/src/eggcharbase/eggComponentData.h b/pandatool/src/eggcharbase/eggComponentData.h index 01f1c37d09..285d1f45e0 100644 --- a/pandatool/src/eggcharbase/eggComponentData.h +++ b/pandatool/src/eggcharbase/eggComponentData.h @@ -45,6 +45,7 @@ public: int get_num_frames(int model_index) const; void extend_to(int model_index, int num_frames) const; + double get_frame_rate(int model_index) const; virtual void add_back_pointer(int model_index, EggObject *egg_object)=0; virtual void write(ostream &out, int indent_level = 0) const=0; diff --git a/pandatool/src/eggcharbase/eggMatrixTablePointer.cxx b/pandatool/src/eggcharbase/eggMatrixTablePointer.cxx index cd2c14ef63..6eebc2ddad 100644 --- a/pandatool/src/eggcharbase/eggMatrixTablePointer.cxx +++ b/pandatool/src/eggcharbase/eggMatrixTablePointer.cxx @@ -55,6 +55,21 @@ EggMatrixTablePointer(EggObject *object) { } } +//////////////////////////////////////////////////////////////////// +// Function: EggMatrixTablePointer::get_frame_rate +// Access: Public, Virtual +// Description: Returns the stated frame rate of this particular +// joint, or 0.0 if it doesn't state. +//////////////////////////////////////////////////////////////////// +double EggMatrixTablePointer:: +get_frame_rate() const { + if (_xform == (EggXfmSAnim *)NULL || !_xform->has_fps()) { + return 0.0; + } else { + return _xform->get_fps(); + } +} + //////////////////////////////////////////////////////////////////// // Function: EggMatrixTablePointer::get_num_frames // Access: Public, Virtual diff --git a/pandatool/src/eggcharbase/eggMatrixTablePointer.h b/pandatool/src/eggcharbase/eggMatrixTablePointer.h index d7e14e8cc5..17bae5f61f 100644 --- a/pandatool/src/eggcharbase/eggMatrixTablePointer.h +++ b/pandatool/src/eggcharbase/eggMatrixTablePointer.h @@ -34,6 +34,7 @@ class EggMatrixTablePointer : public EggJointPointer { public: EggMatrixTablePointer(EggObject *object); + virtual double get_frame_rate() const; virtual int get_num_frames() const; virtual void extend_to(int num_frames); virtual LMatrix4d get_frame(int n) const; diff --git a/pandatool/src/eggcharbase/eggScalarTablePointer.cxx b/pandatool/src/eggcharbase/eggScalarTablePointer.cxx index 87d57458b4..a3f8cf83cb 100644 --- a/pandatool/src/eggcharbase/eggScalarTablePointer.cxx +++ b/pandatool/src/eggcharbase/eggScalarTablePointer.cxx @@ -28,6 +28,21 @@ EggScalarTablePointer(EggObject *object) { _data = DCAST(EggSAnimData, object); } +//////////////////////////////////////////////////////////////////// +// Function: EggScalarTablePointer::get_frame_rate +// Access: Public, Virtual +// Description: Returns the stated frame rate of this particular +// joint, or 0.0 if it doesn't state. +//////////////////////////////////////////////////////////////////// +double EggScalarTablePointer:: +get_frame_rate() const { + if (_data == (EggSAnimData *)NULL || !_data->has_fps()) { + return 0.0; + } else { + return _data->get_fps(); + } +} + //////////////////////////////////////////////////////////////////// // Function: EggScalarTablePointer::get_num_frames // Access: Public, Virtual diff --git a/pandatool/src/eggcharbase/eggScalarTablePointer.h b/pandatool/src/eggcharbase/eggScalarTablePointer.h index 9e0e66dfa9..6d97249b9b 100644 --- a/pandatool/src/eggcharbase/eggScalarTablePointer.h +++ b/pandatool/src/eggcharbase/eggScalarTablePointer.h @@ -33,6 +33,7 @@ class EggScalarTablePointer : public EggSliderPointer { public: EggScalarTablePointer(EggObject *object); + virtual double get_frame_rate() const; virtual int get_num_frames() const; virtual void extend_to(int num_frames); virtual double get_frame(int n) const;