Panda3D

animPreloadTable.h

00001 // Filename: animPreloadTable.h
00002 // Created by:  drose (05Aug08)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #ifndef ANIMPRELOADTABLE_H
00016 #define ANIMPRELOADTABLE_H
00017 
00018 #include "pandabase.h"
00019 #include "typedWritableReferenceCount.h"
00020 #include "ordered_vector.h"
00021 #include "copyOnWriteObject.h"
00022 
00023 class BamWriter;
00024 class BamReader;
00025 class Datagram;
00026 class DatagramIterator;
00027 class FactoryParams;
00028 
00029 ////////////////////////////////////////////////////////////////////
00030 //       Class : AnimPreloadTable
00031 // Description : This table records data about a list of animations
00032 //               for a particular model, such as number of frames and
00033 //               frame rate.  It's used for implementating
00034 //               asynchronous binding.
00035 //
00036 //               This table is normally built by an offline tool, such
00037 //               as egg-optchar.
00038 ////////////////////////////////////////////////////////////////////
00039 class EXPCL_PANDA_CHAN AnimPreloadTable : public CopyOnWriteObject {
00040 public:
00041   class AnimRecord {
00042   public:
00043     INLINE AnimRecord();
00044     INLINE bool operator < (const AnimRecord &other) const;
00045 
00046     string _basename;
00047     PN_stdfloat _base_frame_rate;
00048     int _num_frames;
00049   };
00050 
00051 protected:
00052   virtual PT(CopyOnWriteObject) make_cow_copy();
00053 
00054 PUBLISHED:
00055   AnimPreloadTable();
00056   virtual ~AnimPreloadTable();
00057 
00058   int get_num_anims() const;
00059   int find_anim(const string &basename) const;
00060 
00061   INLINE string get_basename(int n) const;
00062   INLINE PN_stdfloat get_base_frame_rate(int n) const;
00063   INLINE int get_num_frames(int n) const;
00064 
00065   void clear_anims();
00066   void remove_anim(int n);
00067   void add_anim(const string &basename, PN_stdfloat base_frame_rate, int num_frames);
00068   void add_anims_from(const AnimPreloadTable *other);
00069 
00070   virtual void output(ostream &out) const;
00071   virtual void write(ostream &out, int indent_level) const;
00072 
00073 private:
00074   INLINE void consider_sort() const;
00075 
00076 public:
00077   static void register_with_read_factory();
00078   virtual void write_datagram(BamWriter *manager, Datagram &dg);
00079   static TypedWritable *make_from_bam(const FactoryParams &params);
00080 
00081 protected:
00082   void fillin(DatagramIterator &scan, BamReader *manager);
00083 
00084 private:
00085   typedef ov_set<AnimRecord> Anims;
00086   Anims _anims;
00087   bool _needs_sort;
00088 
00089 public:
00090   virtual TypeHandle get_type() const {
00091     return get_class_type();
00092   }
00093   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00094 
00095   static TypeHandle get_class_type() {
00096     return _type_handle;
00097   }
00098   static void init_type() {
00099     CopyOnWriteObject::init_type();
00100     register_type(_type_handle, "AnimPreloadTable",
00101                   CopyOnWriteObject::get_class_type());
00102   }
00103 
00104 private:
00105   static TypeHandle _type_handle;
00106 };
00107 
00108 inline ostream &operator << (ostream &out, const AnimPreloadTable &anim) {
00109   anim.output(out);
00110   return out;
00111 }
00112 
00113 #include "animPreloadTable.I"
00114 
00115 #endif
00116 
00117 
 All Classes Functions Variables Enumerations