Panda3D

animInterface.h

00001 // Filename: animInterface.h
00002 // Created by:  drose (20Sep05)
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 ANIMINTERFACE_H
00016 #define ANIMINTERFACE_H
00017 
00018 #include "pandabase.h"
00019 #include "typeHandle.h"
00020 #include "register_type.h"
00021 #include "cycleData.h"
00022 #include "cycleDataReader.h"
00023 #include "cycleDataWriter.h"
00024 #include "pipelineCycler.h"
00025 
00026 class BamWriter;
00027 class BamReader;
00028 class Datagram;
00029 class DatagramIterator;
00030 
00031 ////////////////////////////////////////////////////////////////////
00032 //       Class : AnimInterface
00033 // Description : This is the fundamental interface for things that
00034 //               have a play/loop/stop type interface for frame-based
00035 //               animation, such as animated characters.  This is the
00036 //               base class for AnimControl and other, similar
00037 //               classes.
00038 ////////////////////////////////////////////////////////////////////
00039 class EXPCL_PANDA_PUTIL AnimInterface {
00040 protected:
00041   AnimInterface();
00042   AnimInterface(const AnimInterface &copy);
00043 
00044 PUBLISHED:
00045   virtual ~AnimInterface();
00046   INLINE void play();
00047   INLINE void play(double from, double to);
00048   INLINE void loop(bool restart);
00049   INLINE void loop(bool restart, double from, double to);
00050   INLINE void pingpong(bool restart);
00051   INLINE void pingpong(bool restart, double from, double to);
00052   INLINE void stop();
00053   INLINE void pose(double frame);
00054 
00055   INLINE void set_play_rate(double play_rate);
00056   INLINE double get_play_rate() const;
00057   INLINE double get_frame_rate() const;
00058   virtual int get_num_frames() const;
00059 
00060   INLINE int get_frame() const;
00061   INLINE int get_next_frame() const;
00062   INLINE double get_frac() const;
00063   INLINE int get_full_frame() const;
00064   INLINE double get_full_fframe() const;
00065   INLINE bool is_playing() const;
00066 
00067   virtual void output(ostream &out) const;
00068 
00069 protected:
00070   INLINE void set_frame_rate(double frame_rate);
00071   INLINE void set_num_frames(int num_frames);
00072   virtual void animation_activated();
00073 
00074 private:
00075   enum PlayMode {
00076     PM_pose,
00077     PM_play,
00078     PM_loop,
00079     PM_pingpong,
00080   };
00081 
00082   // This data is not cycled, because it is a semi-permanent part of
00083   // the interface.  Also, some derivatives of AnimInterface don't
00084   // even use it.
00085   int _num_frames;
00086 
00087   // This is the data that must be cycled between pipeline stages.
00088   class EXPCL_PANDA_PUTIL CData : public CycleData {
00089   public:
00090     CData();
00091     CData(const CData &copy);
00092     virtual CycleData *make_copy() const;
00093     virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
00094     virtual void fillin(DatagramIterator &scan, BamReader *manager);
00095     virtual TypeHandle get_parent_type() const {
00096       return AnimInterface::get_class_type();
00097     }
00098 
00099     void play(double from, double to);
00100     void loop(bool restart, double from, double to);
00101     void pingpong(bool restart, double from, double to);
00102     void pose(double frame);
00103 
00104     INLINE double get_frac() const;
00105     int get_full_frame(int increment) const;
00106     double get_full_fframe() const;
00107     bool is_playing() const;
00108 
00109     virtual void output(ostream &out) const;
00110 
00111     void internal_set_rate(double frame_rate, double play_rate);
00112     double get_f() const;
00113 
00114     double _frame_rate;
00115 
00116     PlayMode _play_mode;
00117     double _start_time;
00118     double _start_frame;
00119     double _play_frames;
00120     int _from_frame;
00121     int _to_frame;
00122     
00123     double _play_rate;
00124     double _effective_frame_rate;
00125     bool _paused;
00126     double _paused_f;
00127   };
00128 
00129   PipelineCycler<CData> _cycler;
00130   typedef CycleDataReader<CData> CDReader;
00131   typedef CycleDataWriter<CData> CDWriter;
00132 
00133 protected:
00134   virtual void write_datagram(BamWriter *manager, Datagram &dg);
00135   void fillin(DatagramIterator &scan, BamReader *manager);
00136 
00137 public:
00138   static TypeHandle get_class_type() {
00139     return _type_handle;
00140   }
00141   static void init_type() {
00142     register_type(_type_handle, "AnimInterface");
00143   }
00144 
00145 private:
00146   static TypeHandle _type_handle;
00147 };
00148 
00149 INLINE ostream &operator << (ostream &out, const AnimInterface &ai);
00150 
00151 #include "animInterface.I"
00152 
00153 #endif
 All Classes Functions Variables Enumerations