00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SLIDERTABLE_H
00016 #define SLIDERTABLE_H
00017
00018 #include "pandabase.h"
00019 #include "vertexSlider.h"
00020 #include "typedWritableReferenceCount.h"
00021 #include "pointerTo.h"
00022 #include "pmap.h"
00023 #include "cycleData.h"
00024 #include "cycleDataReader.h"
00025 #include "cycleDataWriter.h"
00026 #include "pipelineCycler.h"
00027 #include "sparseArray.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 class EXPCL_PANDA_GOBJ SliderTable : public TypedWritableReferenceCount {
00043 PUBLISHED:
00044 SliderTable();
00045 SliderTable(const SliderTable ©);
00046 void operator = (const SliderTable ©);
00047 virtual ~SliderTable();
00048
00049 INLINE bool is_registered() const;
00050 INLINE static CPT(SliderTable) register_table(const SliderTable *table);
00051
00052 INLINE int get_num_sliders() const;
00053 INLINE const VertexSlider *get_slider(int n) const;
00054 MAKE_SEQ(get_sliders, get_num_sliders, get_slider);
00055 INLINE const SparseArray &get_slider_rows(int n) const;
00056
00057 INLINE const SparseArray &find_sliders(const InternalName *name) const;
00058 INLINE bool has_slider(const InternalName *name) const;
00059 INLINE bool is_empty() const;
00060 INLINE UpdateSeq get_modified(Thread *current_thread) const;
00061
00062 void set_slider(int n, const VertexSlider *slider);
00063 void set_slider_rows(int n, const SparseArray &rows);
00064 void remove_slider(int n);
00065 int add_slider(const VertexSlider *slider, const SparseArray &rows);
00066
00067 void write(ostream &out) const;
00068
00069 private:
00070 void do_register();
00071 void do_unregister();
00072 INLINE void update_modified(UpdateSeq modified, Thread *current_thread);
00073
00074 private:
00075 bool _is_registered;
00076
00077 class SliderDef {
00078 public:
00079 CPT(VertexSlider) _slider;
00080 SparseArray _rows;
00081 };
00082
00083 typedef pvector<SliderDef> Sliders;
00084 Sliders _sliders;
00085
00086 typedef pmap< CPT(InternalName), SparseArray > SlidersByName;
00087 SlidersByName _sliders_by_name;
00088
00089 static SparseArray _empty_array;
00090
00091
00092 class EXPCL_PANDA_GOBJ CData : public CycleData {
00093 public:
00094 INLINE CData();
00095 INLINE CData(const CData ©);
00096 virtual CycleData *make_copy() const;
00097 virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
00098 virtual void fillin(DatagramIterator &scan, BamReader *manager);
00099 virtual TypeHandle get_parent_type() const {
00100 return SliderTable::get_class_type();
00101 }
00102
00103 UpdateSeq _modified;
00104 };
00105
00106 PipelineCycler<CData> _cycler;
00107 typedef CycleDataReader<CData> CDReader;
00108 typedef CycleDataWriter<CData> CDWriter;
00109
00110 public:
00111 static void register_with_read_factory();
00112 virtual void write_datagram(BamWriter *manager, Datagram &dg);
00113 virtual int complete_pointers(TypedWritable **plist, BamReader *manager);
00114
00115 protected:
00116 static TypedWritable *make_from_bam(const FactoryParams ¶ms);
00117 void fillin(DatagramIterator &scan, BamReader *manager);
00118
00119 public:
00120 static TypeHandle get_class_type() {
00121 return _type_handle;
00122 }
00123 static void init_type() {
00124 TypedWritableReferenceCount::init_type();
00125 register_type(_type_handle, "SliderTable",
00126 TypedWritableReferenceCount::get_class_type());
00127 }
00128 virtual TypeHandle get_type() const {
00129 return get_class_type();
00130 }
00131 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00132
00133 private:
00134 static TypeHandle _type_handle;
00135
00136 friend class VertexSlider;
00137 };
00138
00139 INLINE ostream &operator << (ostream &out, const SliderTable &obj);
00140
00141 #include "sliderTable.I"
00142
00143 #endif