00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "animControlCollection.h"
00017
00018
00019
00020
00021
00022
00023
00024
00025 AnimControlCollection::
00026 AnimControlCollection() {
00027 _last_started_control = (AnimControl *)NULL;
00028 }
00029
00030
00031
00032
00033
00034
00035 AnimControlCollection::
00036 ~AnimControlCollection() {
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 void AnimControlCollection::
00049 store_anim(AnimControl *control, const string &name) {
00050 ControlsByName::iterator ci = _controls_by_name.find(name);
00051
00052 if (ci == _controls_by_name.end()) {
00053
00054 size_t index = _controls.size();
00055 ControlDef cdef;
00056 cdef._control = control;
00057 cdef._name = name;
00058 _controls.push_back(cdef);
00059 _controls_by_name.insert(ControlsByName::value_type(name, index));
00060
00061 } else {
00062
00063 size_t index = (*ci).second;
00064 nassertv(index < _controls.size());
00065 nassertv(_controls[index]._name == name);
00066 if (_last_started_control == _controls[index]._control) {
00067 _last_started_control = (AnimControl *)NULL;
00068 }
00069 _controls[index]._control = control;
00070 }
00071 }
00072
00073
00074
00075
00076
00077
00078
00079 AnimControl *AnimControlCollection::
00080 find_anim(const string &name) const {
00081 ControlsByName::const_iterator ci = _controls_by_name.find(name);
00082 if (ci == _controls_by_name.end()) {
00083 return (AnimControl *)NULL;
00084 }
00085 size_t index = (*ci).second;
00086 nassertr(index < _controls.size(), NULL);
00087 nassertr(_controls[index]._name == name, NULL);
00088 return _controls[index]._control;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 bool AnimControlCollection::
00100 unbind_anim(const string &name) {
00101 ControlsByName::iterator ci = _controls_by_name.find(name);
00102 if (ci == _controls_by_name.end()) {
00103 return false;
00104 }
00105 size_t index = (*ci).second;
00106 nassertr(index < _controls.size(), false);
00107 nassertr(_controls[index]._name == name, false);
00108
00109 if (_last_started_control == _controls[index]._control) {
00110 _last_started_control = (AnimControl *)NULL;
00111 }
00112 _controls_by_name.erase(ci);
00113
00114 _controls.erase(_controls.begin() + index);
00115
00116
00117 for (ci = _controls_by_name.begin();
00118 ci != _controls_by_name.end();
00119 ++ci) {
00120 if ((*ci).second > index) {
00121 (*ci).second--;
00122 }
00123 }
00124
00125 return true;
00126 }
00127
00128
00129
00130
00131
00132
00133
00134 int AnimControlCollection::
00135 get_num_anims() const {
00136 return _controls.size();
00137 }
00138
00139
00140
00141
00142
00143
00144
00145 AnimControl *AnimControlCollection::
00146 get_anim(int n) const {
00147 nassertr(n >= 0 && n < (int)_controls.size(), NULL);
00148 return _controls[n]._control;
00149 }
00150
00151
00152
00153
00154
00155
00156
00157 string AnimControlCollection::
00158 get_anim_name(int n) const {
00159 nassertr(n >= 0 && n < (int)_controls.size(), string());
00160 return _controls[n]._name;
00161 }
00162
00163
00164
00165
00166
00167
00168 void AnimControlCollection::
00169 clear_anims() {
00170 _controls.clear();
00171 _controls_by_name.clear();
00172 }
00173
00174
00175
00176
00177
00178
00179 void AnimControlCollection::
00180 play_all() {
00181 Controls::const_iterator ci;
00182 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00183 (*ci)._control->play();
00184 _last_started_control = (*ci)._control;
00185 }
00186 }
00187
00188
00189
00190
00191
00192
00193 void AnimControlCollection::
00194 play_all(int from, int to) {
00195 Controls::const_iterator ci;
00196 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00197 (*ci)._control->play(from, to);
00198 _last_started_control = (*ci)._control;
00199 }
00200 }
00201
00202
00203
00204
00205
00206
00207 void AnimControlCollection::
00208 loop_all(bool restart) {
00209 Controls::const_iterator ci;
00210 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00211 (*ci)._control->loop(restart);
00212 _last_started_control = (*ci)._control;
00213 }
00214 }
00215
00216
00217
00218
00219
00220
00221 void AnimControlCollection::
00222 loop_all(bool restart, int from, int to) {
00223 Controls::const_iterator ci;
00224 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00225 (*ci)._control->loop(restart, from, to);
00226 _last_started_control = (*ci)._control;
00227 }
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237 bool AnimControlCollection::
00238 stop_all() {
00239 bool any = false;
00240 Controls::const_iterator ci;
00241 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00242 if ((*ci)._control->is_playing()) {
00243 any = true;
00244 (*ci)._control->stop();
00245 }
00246 }
00247
00248 return any;
00249 }
00250
00251
00252
00253
00254
00255
00256 void AnimControlCollection::
00257 pose_all(int frame) {
00258 Controls::const_iterator ci;
00259 for (ci = _controls.begin(); ci != _controls.end(); ++ci) {
00260 (*ci)._control->pose(frame);
00261 _last_started_control = (*ci)._control;
00262 }
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 string AnimControlCollection::
00274 which_anim_playing() const {
00275 string result;
00276
00277 Controls::const_iterator ci;
00278 for (ci = _controls.begin();
00279 ci != _controls.end();
00280 ++ci) {
00281 if ((*ci)._control->is_playing()) {
00282 if (!result.empty()) {
00283 result += " ";
00284 }
00285 result += (*ci)._name;
00286 }
00287 }
00288
00289 return result;
00290 }
00291
00292
00293
00294
00295
00296
00297 void AnimControlCollection::
00298 output(ostream &out) const {
00299 out << _controls.size() << " anims.";
00300 }
00301
00302
00303
00304
00305
00306
00307 void AnimControlCollection::
00308 write(ostream &out) const {
00309 ControlsByName::const_iterator ci;
00310 for (ci = _controls_by_name.begin();
00311 ci != _controls_by_name.end();
00312 ++ci) {
00313 out << (*ci).first << ": " << *_controls[(*ci).second]._control << "\n";
00314 }
00315 }