00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggNode.h"
00016 #include "eggGroupNode.h"
00017 #include "config_egg.h"
00018 #include "eggTextureCollection.h"
00019 #include "dcast.h"
00020
00021 #include <algorithm>
00022
00023 extern int eggyyparse();
00024 #include "parserDefs.h"
00025 #include "lexerDefs.h"
00026
00027 TypeHandle EggNode::_type_handle;
00028
00029
00030
00031
00032
00033
00034
00035 int EggNode::
00036 rename_node(vector_string strip_prefix) {
00037 int num_renamed = 0;
00038 for (unsigned int ni = 0; ni < strip_prefix.size(); ++ni) {
00039 string axe_name = strip_prefix[ni];
00040 if (this->get_name().substr(0, axe_name.size()) == axe_name) {
00041 string new_name = this->get_name().substr(axe_name.size());
00042
00043 this->set_name(new_name);
00044 num_renamed += 1;
00045 }
00046 }
00047 return num_renamed;
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057 void EggNode::
00058 apply_texmats() {
00059 EggTextureCollection textures;
00060 textures.find_used_textures(this);
00061 r_apply_texmats(textures);
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 bool EggNode::
00074 is_joint() const {
00075 return false;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 bool EggNode::
00085 is_anim_matrix() const {
00086 return false;
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 EggRenderMode *EggNode::
00099 determine_alpha_mode() {
00100 if (_parent == (EggGroupNode *)NULL) {
00101
00102 return (EggRenderMode *)NULL;
00103 }
00104 return _parent->determine_alpha_mode();
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 EggRenderMode *EggNode::
00117 determine_depth_write_mode() {
00118 if (_parent == (EggGroupNode *)NULL) {
00119
00120 return (EggRenderMode *)NULL;
00121 }
00122 return _parent->determine_depth_write_mode();
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 EggRenderMode *EggNode::
00135 determine_depth_test_mode() {
00136 if (_parent == (EggGroupNode *)NULL) {
00137
00138 return (EggRenderMode *)NULL;
00139 }
00140 return _parent->determine_depth_test_mode();
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 EggRenderMode *EggNode::
00153 determine_visibility_mode() {
00154 if (_parent == (EggGroupNode *)NULL) {
00155
00156 return (EggRenderMode *)NULL;
00157 }
00158 return _parent->determine_visibility_mode();
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 EggRenderMode *EggNode::
00171 determine_depth_offset() {
00172 if (_parent == (EggGroupNode *)NULL) {
00173
00174 return (EggRenderMode *)NULL;
00175 }
00176 return _parent->determine_depth_offset();
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 EggRenderMode *EggNode::
00189 determine_draw_order() {
00190 if (_parent == (EggGroupNode *)NULL) {
00191
00192 return (EggRenderMode *)NULL;
00193 }
00194 return _parent->determine_draw_order();
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 EggRenderMode *EggNode::
00207 determine_bin() {
00208 if (_parent == (EggGroupNode *)NULL) {
00209
00210 return (EggRenderMode *)NULL;
00211 }
00212 return _parent->determine_bin();
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 bool EggNode::
00227 determine_indexed() {
00228 if (_parent == (EggGroupNode *)NULL) {
00229
00230 return false;
00231 }
00232 return _parent->determine_indexed();
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 bool EggNode::
00247 determine_decal() {
00248 if (_parent == (EggGroupNode *)NULL) {
00249
00250 return false;
00251 }
00252 return _parent->determine_decal();
00253 }
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 bool EggNode::
00267 parse_egg(const string &egg_syntax) {
00268 EggGroupNode *group = get_parent();
00269 if (is_of_type(EggGroupNode::get_class_type())) {
00270 DCAST_INTO_R(group, this, false);
00271 }
00272
00273 istringstream in(egg_syntax);
00274
00275 LightMutexHolder holder(egg_lock);
00276
00277 egg_init_parser(in, "", this, group);
00278
00279 if (!egg_start_parse_body()) {
00280 egg_cleanup_parser();
00281 return false;
00282 }
00283
00284 eggyyparse();
00285 egg_cleanup_parser();
00286
00287 return (egg_error_count() == 0);
00288 }
00289
00290 #ifndef NDEBUG
00291
00292
00293
00294
00295
00296
00297
00298
00299 void EggNode::
00300 test_under_integrity() const {
00301 if (_parent == NULL) {
00302
00303 nassertv(_depth == 0);
00304 nassertv(_under_flags == 0);
00305 } else {
00306
00307 _parent->test_ref_count_integrity();
00308
00309 nassertv(_depth == _parent->_depth + 1);
00310
00311
00312
00313
00314
00315 nassertv((_under_flags & _parent->_under_flags) == _parent->_under_flags);
00316
00317
00318 EggGroupNode::iterator ci;
00319 ci = find(_parent->begin(), _parent->end(), this);
00320 nassertv(ci != _parent->end());
00321
00322
00323 _parent->test_under_integrity();
00324 }
00325 }
00326
00327 #endif // NDEBUG
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 bool EggNode::
00340 egg_start_parse_body() {
00341 return false;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 void EggNode::
00358 update_under(int depth_offset) {
00359 int depth;
00360 if (_parent == NULL) {
00361 depth = 0;
00362 _under_flags = 0;
00363 _vertex_frame = NULL;
00364 _node_frame = NULL;
00365 _vertex_frame_inv = NULL;
00366 _node_frame_inv = NULL;
00367 _vertex_to_node = NULL;
00368 _node_to_vertex = NULL;
00369 } else {
00370 _parent->test_ref_count_integrity();
00371 depth = _parent->_depth + 1;
00372 _under_flags = _parent->_under_flags;
00373 _vertex_frame = _parent->_vertex_frame;
00374 _node_frame = _parent->_node_frame;
00375 _vertex_frame_inv = _parent->_vertex_frame_inv;
00376 _node_frame_inv = _parent->_node_frame_inv;
00377 _vertex_to_node = _parent->_vertex_to_node;
00378 _node_to_vertex = _parent->_node_to_vertex;
00379 }
00380
00381 if (depth - _depth != depth_offset) {
00382 egg_cat.error() << "Cycle in egg graph or invalid egg pointer!\n";
00383 return;
00384 }
00385 _depth = depth;
00386
00387 adjust_under();
00388 }
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 void EggNode::
00401 adjust_under() {
00402 }
00403
00404
00405
00406
00407
00408
00409
00410
00411 bool EggNode::
00412 has_primitives() const {
00413 return false;
00414 }
00415
00416
00417
00418
00419
00420
00421
00422
00423 bool EggNode::
00424 joint_has_primitives() const {
00425 return false;
00426 }
00427
00428
00429
00430
00431
00432
00433
00434
00435 bool EggNode::
00436 has_normals() const {
00437 return false;
00438 }
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 void EggNode::
00455 r_transform(const LMatrix4d &, const LMatrix4d &, CoordinateSystem) {
00456 }
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 void EggNode::
00468 r_transform_vertices(const LMatrix4d &) {
00469 }
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480 void EggNode::
00481 r_mark_coordsys(CoordinateSystem) {
00482 }
00483
00484
00485
00486
00487
00488
00489 void EggNode::
00490 r_flatten_transforms() {
00491 }
00492
00493
00494
00495
00496
00497
00498 void EggNode::
00499 r_apply_texmats(EggTextureCollection &textures) {
00500 }