00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "characterJointEffect.h"
00016 #include "cullTraverser.h"
00017 #include "cullTraverserData.h"
00018 #include "nodePath.h"
00019 #include "look_at.h"
00020 #include "bamReader.h"
00021 #include "bamWriter.h"
00022 #include "datagram.h"
00023 #include "datagramIterator.h"
00024
00025 TypeHandle CharacterJointEffect::_type_handle;
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 CPT(RenderEffect) CharacterJointEffect::
00037 make(Character *character) {
00038 CharacterJointEffect *effect = new CharacterJointEffect;
00039 effect->_character = character;
00040
00041 CPT(RenderEffect) new_effect_raw = return_new(effect);
00042 const CharacterJointEffect *new_effect;
00043 DCAST_INTO_R(new_effect, new_effect_raw, new_effect_raw);
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 if (!new_effect->_character.is_valid_pointer()) {
00062 nassertr(new_effect->_character.get_orig() == character, new_effect_raw);
00063 ((CharacterJointEffect *)new_effect)->_character = character;
00064 }
00065
00066 return new_effect_raw;
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076 bool CharacterJointEffect::
00077 safe_to_transform() const {
00078
00079
00080
00081 return true;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 bool CharacterJointEffect::
00092 safe_to_combine() const {
00093 return false;
00094 }
00095
00096
00097
00098
00099
00100
00101 void CharacterJointEffect::
00102 output(ostream &out) const {
00103 out << get_type();
00104 if (_character.is_valid_pointer()) {
00105 out << "(" << _character->get_name() << ")";
00106 } else {
00107 out << "(**invalid**)";
00108 }
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 bool CharacterJointEffect::
00121 has_cull_callback() const {
00122 return true;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 void CharacterJointEffect::
00143 cull_callback(CullTraverser *trav, CullTraverserData &data,
00144 CPT(TransformState) &node_transform,
00145 CPT(RenderState) &) const {
00146 CPT(TransformState) dummy_transform = TransformState::make_identity();
00147 adjust_transform(dummy_transform, node_transform, data.node());
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 bool CharacterJointEffect::
00159 has_adjust_transform() const {
00160 return true;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 void CharacterJointEffect::
00175 adjust_transform(CPT(TransformState) &net_transform,
00176 CPT(TransformState) &node_transform,
00177 PandaNode *node) const {
00178 if (_character.is_valid_pointer()) {
00179 _character->update();
00180 }
00181 node_transform = node->get_transform();
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 int CharacterJointEffect::
00201 compare_to_impl(const RenderEffect *other) const {
00202 const CharacterJointEffect *ta;
00203 DCAST_INTO_R(ta, other, 0);
00204
00205 if (_character.get_orig() != ta->_character.get_orig()) {
00206 return _character.get_orig() < ta->_character.get_orig() ? -1 : 1;
00207 }
00208
00209
00210
00211
00212
00213
00214
00215 return 0;
00216 }
00217
00218
00219
00220
00221
00222
00223
00224 void CharacterJointEffect::
00225 register_with_read_factory() {
00226 BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
00227 }
00228
00229
00230
00231
00232
00233
00234
00235 void CharacterJointEffect::
00236 write_datagram(BamWriter *manager, Datagram &dg) {
00237 RenderEffect::write_datagram(manager, dg);
00238
00239 if (_character.is_valid_pointer()) {
00240 manager->write_pointer(dg, _character);
00241 } else {
00242 manager->write_pointer(dg, NULL);
00243 }
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253 int CharacterJointEffect::
00254 complete_pointers(TypedWritable **p_list, BamReader *manager) {
00255 int pi = RenderEffect::complete_pointers(p_list, manager);
00256
00257 _character = DCAST(Character, p_list[pi++]);
00258
00259 return pi;
00260 }
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 TypedWritable *CharacterJointEffect::
00271 make_from_bam(const FactoryParams ¶ms) {
00272 CharacterJointEffect *effect = new CharacterJointEffect;
00273 DatagramIterator scan;
00274 BamReader *manager;
00275
00276 parse_params(params, scan, manager);
00277 effect->fillin(scan, manager);
00278
00279 return effect;
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289 void CharacterJointEffect::
00290 fillin(DatagramIterator &scan, BamReader *manager) {
00291 RenderEffect::fillin(scan, manager);
00292
00293 manager->read_pointer(scan);
00294 }