00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "renderEffect.h"
00016 #include "bamReader.h"
00017 #include "indent.h"
00018 #include "config_pgraph.h"
00019
00020 RenderEffect::Effects *RenderEffect::_effects = NULL;
00021 TypeHandle RenderEffect::_type_handle;
00022
00023
00024
00025
00026
00027
00028 RenderEffect::
00029 RenderEffect() {
00030 if (_effects == (Effects *)NULL) {
00031
00032
00033
00034
00035
00036 _effects = new Effects;
00037 }
00038 _saved_entry = _effects->end();
00039 }
00040
00041
00042
00043
00044
00045
00046 RenderEffect::
00047 RenderEffect(const RenderEffect &) {
00048 nassertv(false);
00049 }
00050
00051
00052
00053
00054
00055
00056 void RenderEffect::
00057 operator = (const RenderEffect &) {
00058 nassertv(false);
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 RenderEffect::
00068 ~RenderEffect() {
00069 if (_saved_entry != _effects->end()) {
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 _effects->erase(_saved_entry);
00085 _saved_entry = _effects->end();
00086 }
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096 bool RenderEffect::
00097 safe_to_transform() const {
00098 return true;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 CPT(TransformState) RenderEffect::
00110 prepare_flatten_transform(const TransformState *net_transform) const {
00111 return net_transform;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121 bool RenderEffect::
00122 safe_to_combine() const {
00123 return true;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132 CPT(RenderEffect) RenderEffect::
00133 xform(const LMatrix4f &) const {
00134 return this;
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 bool RenderEffect::
00147 has_cull_callback() const {
00148 return false;
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 void RenderEffect::
00169 cull_callback(CullTraverser *, CullTraverserData &,
00170 CPT(TransformState) &, CPT(RenderState) &) const {
00171 }
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 bool RenderEffect::
00182 has_adjust_transform() const {
00183 return false;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 void RenderEffect::
00198 adjust_transform(CPT(TransformState) &, CPT(TransformState) &,
00199 PandaNode *) const {
00200 }
00201
00202
00203
00204
00205
00206
00207 void RenderEffect::
00208 output(ostream &out) const {
00209 out << get_type();
00210 }
00211
00212
00213
00214
00215
00216
00217 void RenderEffect::
00218 write(ostream &out, int indent_level) const {
00219 indent(out, indent_level) << *this << "\n";
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229 int RenderEffect::
00230 get_num_effects() {
00231 if (_effects == (Effects *)NULL) {
00232 return 0;
00233 }
00234 return _effects->size();
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244 void RenderEffect::
00245 list_effects(ostream &out) {
00246 out << _effects->size() << " effects:\n";
00247 Effects::const_iterator si;
00248 for (si = _effects->begin(); si != _effects->end(); ++si) {
00249 const RenderEffect *effect = (*si);
00250 effect->write(out, 2);
00251 }
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 bool RenderEffect::
00263 validate_effects() {
00264 if (_effects->empty()) {
00265 return true;
00266 }
00267
00268 Effects::const_iterator si = _effects->begin();
00269 Effects::const_iterator snext = si;
00270 ++snext;
00271 while (snext != _effects->end()) {
00272 if ((*si)->compare_to(*(*snext)) >= 0) {
00273 pgraph_cat.error()
00274 << "RenderEffects out of order!\n";
00275 (*si)->write(pgraph_cat.error(false), 2);
00276 (*snext)->write(pgraph_cat.error(false), 2);
00277 return false;
00278 }
00279 si = snext;
00280 ++snext;
00281 }
00282
00283 return true;
00284 }
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 CPT(RenderEffect) RenderEffect::
00301 return_new(RenderEffect *effect) {
00302 nassertr(effect != (RenderEffect *)NULL, effect);
00303
00304
00305
00306 nassertr(effect->_saved_entry == _effects->end(), effect);
00307
00308 #ifndef NDEBUG
00309 if (paranoid_const) {
00310 nassertr(validate_effects(), effect);
00311 }
00312 #endif
00313
00314
00315
00316 CPT(RenderEffect) pt_effect = effect;
00317
00318 pair<Effects::iterator, bool> result = _effects->insert(effect);
00319 if (result.second) {
00320
00321
00322 effect->_saved_entry = result.first;
00323 return pt_effect;
00324 }
00325
00326
00327
00328 return *(result.first);
00329 }
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 int RenderEffect::
00347 compare_to_impl(const RenderEffect *other) const {
00348 return 0;
00349 }
00350
00351
00352
00353
00354
00355
00356
00357 void RenderEffect::
00358 write_datagram(BamWriter *manager, Datagram &dg) {
00359 TypedWritable::write_datagram(manager, dg);
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 TypedWritable *RenderEffect::
00374 change_this(TypedWritable *old_ptr, BamReader *manager) {
00375
00376 RenderEffect *effect = DCAST(RenderEffect, old_ptr);
00377 CPT(RenderEffect) pointer = return_new(effect);
00378
00379
00380
00381
00382
00383
00384 if (pointer == effect) {
00385 pointer->ref();
00386 manager->register_finalize(effect);
00387 }
00388
00389
00390
00391 return (RenderEffect *)pointer.p();
00392 }
00393
00394
00395
00396
00397
00398
00399
00400
00401 void RenderEffect::
00402 finalize(BamReader *) {
00403
00404 unref();
00405
00406
00407
00408
00409
00410
00411 nassertv(get_ref_count() != 0);
00412 }
00413
00414
00415
00416
00417
00418
00419
00420
00421 void RenderEffect::
00422 fillin(DatagramIterator &scan, BamReader *manager) {
00423 TypedWritable::fillin(scan, manager);
00424 }