00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "animPreloadTable.h"
00016
00017 #include "indent.h"
00018 #include "datagram.h"
00019 #include "datagramIterator.h"
00020 #include "bamReader.h"
00021 #include "bamWriter.h"
00022
00023 TypeHandle AnimPreloadTable::_type_handle;
00024
00025
00026
00027
00028
00029
00030 PT(CopyOnWriteObject) AnimPreloadTable::
00031 make_cow_copy() {
00032 return new AnimPreloadTable(*this);
00033 }
00034
00035
00036
00037
00038
00039
00040 AnimPreloadTable::
00041 AnimPreloadTable() {
00042 _needs_sort = false;
00043 }
00044
00045
00046
00047
00048
00049
00050 AnimPreloadTable::
00051 ~AnimPreloadTable() {
00052 }
00053
00054
00055
00056
00057
00058
00059 int AnimPreloadTable::
00060 get_num_anims() const {
00061 return (int)_anims.size();
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 int AnimPreloadTable::
00075 find_anim(const string &basename) const {
00076 consider_sort();
00077 AnimRecord record;
00078 record._basename = basename;
00079 Anims::const_iterator ai = _anims.find(record);
00080 if (ai != _anims.end()) {
00081 return int(ai - _anims.begin());
00082 }
00083 return -1;
00084 }
00085
00086
00087
00088
00089
00090
00091 void AnimPreloadTable::
00092 clear_anims() {
00093 _anims.clear();
00094 _needs_sort = false;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103 void AnimPreloadTable::
00104 remove_anim(int n) {
00105 nassertv(n >= 0 && n < (int)_anims.size());
00106 _anims.erase(_anims.begin() + n);
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 void AnimPreloadTable::
00119 add_anim(const string &basename, PN_stdfloat base_frame_rate, int num_frames) {
00120 AnimRecord record;
00121 record._basename = basename;
00122 record._base_frame_rate = base_frame_rate;
00123 record._num_frames = num_frames;
00124
00125 _anims.push_back(record);
00126 _needs_sort = true;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136 void AnimPreloadTable::
00137 add_anims_from(const AnimPreloadTable *other) {
00138 _anims.reserve(_anims.size() + other->_anims.size());
00139 Anims::const_iterator ai;
00140 for (ai = other->_anims.begin(); ai != other->_anims.end(); ++ai) {
00141 _anims.push_back(*ai);
00142 }
00143 _needs_sort = true;
00144 }
00145
00146
00147
00148
00149
00150
00151 void AnimPreloadTable::
00152 output(ostream &out) const {
00153 consider_sort();
00154 out << "AnimPreloadTable, " << _anims.size() << " animation records.";
00155 }
00156
00157
00158
00159
00160
00161
00162 void AnimPreloadTable::
00163 write(ostream &out, int indent_level) const {
00164 consider_sort();
00165 indent(out, indent_level)
00166 << "AnimPreloadTable, " << _anims.size() << " animation records:\n";
00167 Anims::const_iterator ai;
00168 for (ai = _anims.begin(); ai != _anims.end(); ++ai) {
00169 const AnimRecord &record = (*ai);
00170 indent(out, indent_level + 2)
00171 << record._basename << ": " << record._num_frames << " frames at "
00172 << record._base_frame_rate << " fps\n";
00173 }
00174 }
00175
00176
00177
00178
00179
00180
00181 void AnimPreloadTable::
00182 register_with_read_factory() {
00183 BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
00184 }
00185
00186
00187
00188
00189
00190
00191
00192 void AnimPreloadTable::
00193 write_datagram(BamWriter *manager, Datagram &dg) {
00194 consider_sort();
00195
00196 dg.add_uint16(_anims.size());
00197 Anims::const_iterator ai;
00198 for (ai = _anims.begin(); ai != _anims.end(); ++ai) {
00199 const AnimRecord &record = (*ai);
00200 dg.add_string(record._basename);
00201 dg.add_stdfloat(record._base_frame_rate);
00202 dg.add_int32(record._num_frames);
00203 }
00204 }
00205
00206
00207
00208
00209
00210
00211 TypedWritable *AnimPreloadTable::
00212 make_from_bam(const FactoryParams ¶ms) {
00213 AnimPreloadTable *me = new AnimPreloadTable;
00214 DatagramIterator scan;
00215 BamReader *manager;
00216
00217 parse_params(params, scan, manager);
00218 me->fillin(scan, manager);
00219 return me;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 void AnimPreloadTable::
00231 fillin(DatagramIterator &scan, BamReader *manager) {
00232 int num_anims = scan.get_uint16();
00233 _anims.reserve(num_anims);
00234 for (int i = 0; i < num_anims; ++i) {
00235 AnimRecord record;
00236 record._basename = scan.get_string();
00237 record._base_frame_rate = scan.get_stdfloat();
00238 record._num_frames = scan.get_int32();
00239 _anims.push_back(record);
00240 }
00241 }