00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef NODEPATH_H
00019 #define NODEPATH_H
00020
00021 #include "pandabase.h"
00022
00023 #include "pandaNode.h"
00024 #include "renderState.h"
00025 #include "transformState.h"
00026 #include "renderModeAttrib.h"
00027 #include "transparencyAttrib.h"
00028 #include "nodePathComponent.h"
00029 #include "pointerTo.h"
00030 #include "referenceCount.h"
00031 #include "pnotify.h"
00032 #include "typedObject.h"
00033 #include "pta_float.h"
00034 #include "pta_double.h"
00035 #include "pta_LMatrix4.h"
00036 #include "pta_LMatrix3.h"
00037 #include "pta_LVecBase4.h"
00038 #include "pta_LVecBase3.h"
00039 #include "pta_LVecBase2.h"
00040 #include "stl_compares.h"
00041
00042 class NodePathCollection;
00043 class FindApproxPath;
00044 class FindApproxLevelEntry;
00045 class Light;
00046 class PolylightNode;
00047 class InternalNameCollection;
00048 class Texture;
00049 class TextureStage;
00050 class TextureCollection;
00051 class TextureStageCollection;
00052 class Material;
00053 class MaterialCollection;
00054 class Fog;
00055 class GlobPattern;
00056 class PreparedGraphicsObjects;
00057 class Shader;
00058 class ShaderInput;
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 class EXPCL_PANDA_PGRAPH NodePath {
00162 PUBLISHED:
00163
00164
00165 enum ErrorType {
00166 ET_ok = 0,
00167 ET_not_found,
00168 ET_removed,
00169 ET_fail,
00170 };
00171
00172 INLINE NodePath();
00173 INLINE NodePath(const string &top_node_name, Thread *current_thread = Thread::get_current_thread());
00174 INLINE NodePath(PandaNode *node, Thread *current_thread = Thread::get_current_thread());
00175 INLINE static NodePath any_path(PandaNode *node, Thread *current_thread = Thread::get_current_thread());
00176 NodePath(const NodePath &parent, PandaNode *child_node,
00177 Thread *current_thread = Thread::get_current_thread());
00178
00179 INLINE NodePath(const NodePath ©);
00180 INLINE void operator = (const NodePath ©);
00181
00182 #ifdef HAVE_PYTHON
00183 NodePath __copy__() const;
00184 PyObject *__deepcopy__(PyObject *self, PyObject *memo) const;
00185 PyObject *__reduce__(PyObject *self) const;
00186 PyObject *__reduce_persist__(PyObject *self, PyObject *pickler) const;
00187 #endif
00188
00189 INLINE static NodePath not_found();
00190 INLINE static NodePath removed();
00191 INLINE static NodePath fail();
00192
00193 INLINE static void set_max_search_depth(int max_search_depth);
00194 INLINE static int get_max_search_depth();
00195
00196
00197 INLINE bool is_empty() const;
00198 operator bool () const;
00199
00200 INLINE bool is_singleton(Thread *current_thread = Thread::get_current_thread()) const;
00201 int get_num_nodes(Thread *current_thread = Thread::get_current_thread()) const;
00202 PandaNode *get_node(int index, Thread *current_thread = Thread::get_current_thread()) const;
00203 MAKE_SEQ(get_nodes, get_num_nodes, get_node);
00204 NodePath get_ancestor(int index, Thread *current_thread = Thread::get_current_thread()) const;
00205 MAKE_SEQ(get_ancestors, get_num_nodes, get_ancestor);
00206
00207 INLINE ErrorType get_error_type() const;
00208
00209 INLINE PandaNode *get_top_node(Thread *current_thread = Thread::get_current_thread()) const;
00210 NodePath get_top(Thread *current_thread = Thread::get_current_thread()) const;
00211
00212 INLINE PandaNode *node() const;
00213
00214 INLINE int get_key() const;
00215 INLINE size_t add_hash(size_t hash) const;
00216
00217 INLINE bool is_same_graph(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00218 INLINE bool is_ancestor_of(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00219 INLINE NodePath get_common_ancestor(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00220
00221
00222
00223
00224 NodePathCollection get_children(Thread *current_thread = Thread::get_current_thread()) const;
00225 INLINE int get_num_children(Thread *current_thread = Thread::get_current_thread()) const;
00226 INLINE NodePath get_child(int n, Thread *current_thread = Thread::get_current_thread()) const;
00227 NodePathCollection get_stashed_children(Thread *current_thread = Thread::get_current_thread()) const;
00228
00229 INLINE int count_num_descendants() const;
00230
00231 INLINE bool has_parent(Thread *current_thread = Thread::get_current_thread()) const;
00232 INLINE NodePath get_parent(Thread *current_thread = Thread::get_current_thread()) const;
00233 int get_sort(Thread *current_thread = Thread::get_current_thread()) const;
00234
00235 NodePath find(const string &path) const;
00236 NodePath find_path_to(PandaNode *node) const;
00237 NodePathCollection find_all_matches(const string &path) const;
00238 NodePathCollection find_all_paths_to(PandaNode *node) const;
00239
00240
00241
00242
00243
00244
00245 void reparent_to(const NodePath &other, int sort = 0,
00246 Thread *current_thread = Thread::get_current_thread());
00247 void stash_to(const NodePath &other, int sort = 0,
00248 Thread *current_thread = Thread::get_current_thread());
00249 void wrt_reparent_to(const NodePath &other, int sort = 0,
00250 Thread *current_thread = Thread::get_current_thread());
00251 NodePath instance_to(const NodePath &other, int sort = 0,
00252 Thread *current_thread = Thread::get_current_thread()) const;
00253 NodePath instance_under_node(const NodePath &other, const string &name,
00254 int sort = 0,
00255 Thread *current_thread = Thread::get_current_thread()) const;
00256 NodePath copy_to(const NodePath &other, int sort = 0,
00257 Thread *current_thread = Thread::get_current_thread()) const;
00258 NodePath attach_new_node(PandaNode *node, int sort = 0,
00259 Thread *current_thread = Thread::get_current_thread()) const;
00260 INLINE NodePath attach_new_node(const string &name, int sort = 0,
00261 Thread *current_thread = Thread::get_current_thread()) const;
00262 void remove_node(Thread *current_thread = Thread::get_current_thread());
00263 void detach_node(Thread *current_thread = Thread::get_current_thread());
00264
00265
00266
00267
00268 void output(ostream &out) const;
00269
00270 INLINE void ls() const;
00271 INLINE void ls(ostream &out, int indent_level = 0) const;
00272 INLINE void reverse_ls() const;
00273 INLINE int reverse_ls(ostream &out, int indent_level = 0) const;
00274
00275
00276
00277 const RenderState *get_state(Thread *current_thread = Thread::get_current_thread()) const;
00278 INLINE void set_state(const RenderState *state, Thread *current_thread = Thread::get_current_thread());
00279 CPT(RenderState) get_state(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00280 void set_state(const NodePath &other, const RenderState *state, Thread *current_thread = Thread::get_current_thread());
00281 INLINE CPT(RenderState) get_net_state(Thread *current_thread = Thread::get_current_thread()) const;
00282
00283 INLINE void set_attrib(const RenderAttrib *attrib, int priority = 0);
00284 INLINE const RenderAttrib *get_attrib(TypeHandle type) const;
00285 INLINE bool has_attrib(TypeHandle type) const;
00286 INLINE void clear_attrib(TypeHandle type);
00287
00288 INLINE void set_effect(const RenderEffect *effect);
00289 INLINE const RenderEffect *get_effect(TypeHandle type) const;
00290 INLINE bool has_effect(TypeHandle type) const;
00291 INLINE void clear_effect(TypeHandle type);
00292
00293 INLINE void set_effects(const RenderEffects *effects);
00294 INLINE const RenderEffects *get_effects() const;
00295 INLINE void clear_effects();
00296
00297 const TransformState *get_transform(Thread *current_thread = Thread::get_current_thread()) const;
00298 INLINE void clear_transform(Thread *current_thread = Thread::get_current_thread());
00299 INLINE void set_transform(const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
00300 CPT(TransformState) get_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00301 INLINE void clear_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread());
00302 void set_transform(const NodePath &other, const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
00303 INLINE CPT(TransformState) get_net_transform(Thread *current_thread = Thread::get_current_thread()) const;
00304
00305 const TransformState *get_prev_transform(Thread *current_thread = Thread::get_current_thread()) const;
00306 INLINE void set_prev_transform(const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
00307 CPT(TransformState) get_prev_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
00308 void set_prev_transform(const NodePath &other, const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
00309 INLINE CPT(TransformState) get_net_prev_transform(Thread *current_thread = Thread::get_current_thread()) const;
00310
00311
00312
00313
00314
00315 INLINE void set_pos(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00316 void set_pos(const LVecBase3 &pos);
00317 void set_x(PN_stdfloat x);
00318 void set_y(PN_stdfloat y);
00319 void set_z(PN_stdfloat z);
00320 INLINE void set_fluid_pos(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00321 void set_fluid_pos(const LVecBase3 &pos);
00322 void set_fluid_x(PN_stdfloat x);
00323 void set_fluid_y(PN_stdfloat y);
00324 void set_fluid_z(PN_stdfloat z);
00325 LPoint3 get_pos() const;
00326 INLINE PN_stdfloat get_x() const;
00327 INLINE PN_stdfloat get_y() const;
00328 INLINE PN_stdfloat get_z() const;
00329
00330 LVector3 get_pos_delta() const;
00331
00332 INLINE void set_hpr(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00333 void set_hpr(const LVecBase3 &hpr);
00334 void set_h(PN_stdfloat h);
00335 void set_p(PN_stdfloat p);
00336 void set_r(PN_stdfloat r);
00337 LVecBase3 get_hpr() const;
00338 INLINE PN_stdfloat get_h() const;
00339 INLINE PN_stdfloat get_p() const;
00340 INLINE PN_stdfloat get_r() const;
00341
00342 void set_quat(const LQuaternion &quat);
00343 LQuaternion get_quat() const;
00344
00345 INLINE void set_scale(PN_stdfloat scale);
00346 INLINE void set_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00347 void set_scale(const LVecBase3 &scale);
00348 void set_sx(PN_stdfloat sx);
00349 void set_sy(PN_stdfloat sy);
00350 void set_sz(PN_stdfloat sz);
00351 LVecBase3 get_scale() const;
00352 INLINE PN_stdfloat get_sx() const;
00353 INLINE PN_stdfloat get_sy() const;
00354 INLINE PN_stdfloat get_sz() const;
00355
00356 INLINE void set_shear(PN_stdfloat shxy, PN_stdfloat shxz, PN_stdfloat shyz);
00357 void set_shear(const LVecBase3 &shear);
00358 void set_shxy(PN_stdfloat shxy);
00359 void set_shxz(PN_stdfloat shxz);
00360 void set_shyz(PN_stdfloat shyz);
00361 LVecBase3 get_shear() const;
00362 INLINE PN_stdfloat get_shxy() const;
00363 INLINE PN_stdfloat get_shxz() const;
00364 INLINE PN_stdfloat get_shyz() const;
00365
00366 INLINE void set_pos_hpr(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
00367 PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00368 void set_pos_hpr(const LVecBase3 &pos,
00369 const LVecBase3 &hpr);
00370 void set_pos_quat(const LVecBase3 &pos,
00371 const LQuaternion &quat);
00372
00373 INLINE void set_hpr_scale(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
00374 PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00375 void set_hpr_scale(const LVecBase3 &hpr,
00376 const LVecBase3 &scale);
00377 void set_quat_scale(const LQuaternion &quat,
00378 const LVecBase3 &scale);
00379 INLINE void set_pos_hpr_scale(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
00380 PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
00381 PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00382 void set_pos_hpr_scale(const LVecBase3 &pos,
00383 const LVecBase3 &hpr,
00384 const LVecBase3 &scale);
00385 void set_pos_quat_scale(const LVecBase3 &pos,
00386 const LQuaternion &quat,
00387 const LVecBase3 &scale);
00388 void set_pos_hpr_scale_shear(const LVecBase3 &pos,
00389 const LVecBase3 &hpr,
00390 const LVecBase3 &scale,
00391 const LVecBase3 &shear);
00392 void set_pos_quat_scale_shear(const LVecBase3 &pos,
00393 const LQuaternion &quat,
00394 const LVecBase3 &scale,
00395 const LVecBase3 &shear);
00396
00397 void set_mat(const LMatrix4 &mat);
00398 INLINE void clear_mat();
00399 INLINE bool has_mat() const;
00400 INLINE const LMatrix4 &get_mat() const;
00401
00402 INLINE void look_at(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00403 void look_at(const LPoint3 &point, const LVector3 &up = LVector3::up());
00404 INLINE void heads_up(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00405 void heads_up(const LPoint3 &point, const LVector3 &up = LVector3::up());
00406
00407
00408
00409
00410 INLINE void set_pos(const NodePath &other, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00411 void set_pos(const NodePath &other, const LVecBase3 &pos);
00412 void set_x(const NodePath &other, PN_stdfloat x);
00413 void set_y(const NodePath &other, PN_stdfloat y);
00414 void set_z(const NodePath &other, PN_stdfloat z);
00415 INLINE void set_fluid_pos(const NodePath &other, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00416 void set_fluid_pos(const NodePath &other, const LVecBase3 &pos);
00417 void set_fluid_x(const NodePath &other, PN_stdfloat x);
00418 void set_fluid_y(const NodePath &other, PN_stdfloat y);
00419 void set_fluid_z(const NodePath &other, PN_stdfloat z);
00420 LPoint3 get_pos(const NodePath &other) const;
00421 INLINE PN_stdfloat get_x(const NodePath &other) const;
00422 INLINE PN_stdfloat get_y(const NodePath &other) const;
00423 INLINE PN_stdfloat get_z(const NodePath &other) const;
00424
00425 LVector3 get_pos_delta(const NodePath &other) const;
00426
00427 INLINE void set_hpr(const NodePath &other, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00428 void set_hpr(const NodePath &other, const LVecBase3 &hpr);
00429 void set_h(const NodePath &other, PN_stdfloat h);
00430 void set_p(const NodePath &other, PN_stdfloat p);
00431 void set_r(const NodePath &other, PN_stdfloat r);
00432 LVecBase3 get_hpr(const NodePath &other) const;
00433 INLINE PN_stdfloat get_h(const NodePath &other) const;
00434 INLINE PN_stdfloat get_p(const NodePath &other) const;
00435 INLINE PN_stdfloat get_r(const NodePath &other) const;
00436
00437 void set_quat(const NodePath &other, const LQuaternion &quat);
00438 LQuaternion get_quat(const NodePath &other) const;
00439
00440 INLINE void set_scale(const NodePath &other, PN_stdfloat scale);
00441 INLINE void set_scale(const NodePath &other, PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00442 void set_scale(const NodePath &other, const LVecBase3 &scale);
00443 void set_sx(const NodePath &other, PN_stdfloat sx);
00444 void set_sy(const NodePath &other, PN_stdfloat sy);
00445 void set_sz(const NodePath &other, PN_stdfloat sz);
00446 LVecBase3 get_scale(const NodePath &other) const;
00447 INLINE PN_stdfloat get_sx(const NodePath &other) const;
00448 INLINE PN_stdfloat get_sy(const NodePath &other) const;
00449 INLINE PN_stdfloat get_sz(const NodePath &other) const;
00450
00451 INLINE void set_shear(const NodePath &other, PN_stdfloat shxy, PN_stdfloat shxz, PN_stdfloat shyz);
00452 void set_shear(const NodePath &other, const LVecBase3 &shear);
00453 void set_shxy(const NodePath &other, PN_stdfloat shxy);
00454 void set_shxz(const NodePath &other, PN_stdfloat shxz);
00455 void set_shyz(const NodePath &other, PN_stdfloat shyz);
00456 LVecBase3 get_shear(const NodePath &other) const;
00457 INLINE PN_stdfloat get_shxy(const NodePath &other) const;
00458 INLINE PN_stdfloat get_shxz(const NodePath &other) const;
00459 INLINE PN_stdfloat get_shyz(const NodePath &other) const;
00460
00461 INLINE void set_pos_hpr(const NodePath &other,
00462 PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
00463 PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00464 void set_pos_hpr(const NodePath &other,
00465 const LVecBase3 &pos,
00466 const LVecBase3 &hpr);
00467 void set_pos_quat(const NodePath &other,
00468 const LVecBase3 &pos,
00469 const LQuaternion &quat);
00470 INLINE void set_hpr_scale(const NodePath &other,
00471 PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
00472 PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00473 void set_hpr_scale(const NodePath &other,
00474 const LVecBase3 &hpr,
00475 const LVecBase3 &scale);
00476 void set_quat_scale(const NodePath &other,
00477 const LQuaternion &quat,
00478 const LVecBase3 &scale);
00479 INLINE void set_pos_hpr_scale(const NodePath &other,
00480 PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
00481 PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
00482 PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
00483 void set_pos_hpr_scale(const NodePath &other,
00484 const LVecBase3 &pos,
00485 const LVecBase3 &hpr,
00486 const LVecBase3 &scale);
00487 void set_pos_quat_scale(const NodePath &other,
00488 const LVecBase3 &pos,
00489 const LQuaternion &quat,
00490 const LVecBase3 &scale);
00491 void set_pos_hpr_scale_shear(const NodePath &other,
00492 const LVecBase3 &pos,
00493 const LVecBase3 &hpr,
00494 const LVecBase3 &scale,
00495 const LVecBase3 &shear);
00496 void set_pos_quat_scale_shear(const NodePath &other,
00497 const LVecBase3 &pos,
00498 const LQuaternion &quat,
00499 const LVecBase3 &scale,
00500 const LVecBase3 &shear);
00501
00502 LMatrix4 get_mat(const NodePath &other) const;
00503 void set_mat(const NodePath &other, const LMatrix4 &mat);
00504
00505 LPoint3 get_relative_point(const NodePath &other, const LVecBase3 &point) const;
00506 LVector3 get_relative_vector(const NodePath &other, const LVecBase3 &vec) const;
00507
00508 INLINE void look_at(const NodePath &other,
00509 PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00510 void look_at(const NodePath &other,
00511 const LPoint3 &point = LPoint3(0.0, 0.0, 0.0),
00512 const LVector3 &up = LVector3::up());
00513 INLINE void heads_up(const NodePath &other,
00514 PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00515 void heads_up(const NodePath &other,
00516 const LPoint3 &point = LPoint3(0.0, 0.0, 0.0),
00517 const LVector3 &up = LVector3::up());
00518
00519 INLINE PN_stdfloat get_distance(const NodePath &other) const;
00520
00521
00522
00523
00524
00525 void set_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a = 1.0,
00526 int priority = 0);
00527 void set_color(const LColor &color, int priority = 0);
00528 void set_color_off(int priority = 0);
00529 void clear_color();
00530 bool has_color() const;
00531 LColor get_color() const;
00532
00533 bool has_color_scale() const;
00534 void clear_color_scale();
00535 void set_color_scale(const LVecBase4 &scale,
00536 int priority = 0);
00537 INLINE void set_color_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz, PN_stdfloat sa,
00538 int priority = 0);
00539 void compose_color_scale(const LVecBase4 &scale,
00540 int priority = 0);
00541 INLINE void compose_color_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz, PN_stdfloat sa,
00542 int priority = 0);
00543 void set_color_scale_off(int priority = 0);
00544
00545 void set_alpha_scale(PN_stdfloat scale, int priority = 0);
00546 void set_all_color_scale(PN_stdfloat scale, int priority = 0);
00547 INLINE void set_sr(PN_stdfloat sr);
00548 INLINE void set_sg(PN_stdfloat sg);
00549 INLINE void set_sb(PN_stdfloat sb);
00550 INLINE void set_sa(PN_stdfloat sa);
00551
00552 const LVecBase4 &get_color_scale() const;
00553 INLINE PN_stdfloat get_sr() const;
00554 INLINE PN_stdfloat get_sg() const;
00555 INLINE PN_stdfloat get_sb() const;
00556 INLINE PN_stdfloat get_sa() const;
00557
00558 void set_light(const NodePath &light, int priority = 0);
00559 void set_light_off(int priority = 0);
00560 void set_light_off(const NodePath &light, int priority = 0);
00561 void clear_light();
00562 void clear_light(const NodePath &light);
00563 bool has_light(const NodePath &light) const;
00564 bool has_light_off() const;
00565 bool has_light_off(const NodePath &light) const;
00566
00567 void set_clip_plane(const NodePath &clip_plane, int priority = 0);
00568 void set_clip_plane_off(int priority = 0);
00569 void set_clip_plane_off(const NodePath &clip_plane, int priority = 0);
00570 void clear_clip_plane();
00571 void clear_clip_plane(const NodePath &clip_plane);
00572 bool has_clip_plane(const NodePath &clip_plane) const;
00573 bool has_clip_plane_off() const;
00574 bool has_clip_plane_off(const NodePath &clip_plane) const;
00575
00576 void set_scissor(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top);
00577 void set_scissor(const LPoint3 &a, const LPoint3 &b);
00578 void set_scissor(const LPoint3 &a, const LPoint3 &b,
00579 const LPoint3 &c, const LPoint3 &d);
00580 void set_scissor(const NodePath &other,
00581 const LPoint3 &a, const LPoint3 &b);
00582 void set_scissor(const NodePath &other,
00583 const LPoint3 &a, const LPoint3 &b,
00584 const LPoint3 &c, const LPoint3 &d);
00585 void clear_scissor();
00586 bool has_scissor() const;
00587
00588 void set_occluder(const NodePath &occluder);
00589 void clear_occluder();
00590 void clear_occluder(const NodePath &occluder);
00591 bool has_occluder(const NodePath &occluder) const;
00592
00593 void set_bin(const string &bin_name, int draw_order, int priority = 0);
00594 void clear_bin();
00595 bool has_bin() const;
00596 string get_bin_name() const;
00597 int get_bin_draw_order() const;
00598
00599 void set_texture(Texture *tex, int priority = 0);
00600 void set_texture(TextureStage *stage, Texture *tex, int priority = 0);
00601 void set_texture_off(int priority = 0);
00602 void set_texture_off(TextureStage *stage, int priority = 0);
00603 void clear_texture();
00604 void clear_texture(TextureStage *stage);
00605 bool has_texture() const;
00606 bool has_texture(TextureStage *stage) const;
00607 bool has_texture_off() const;
00608 bool has_texture_off(TextureStage *stage) const;
00609 Texture *get_texture() const;
00610 Texture *get_texture(TextureStage *stage) const;
00611
00612 void set_shader(const Shader *sha, int priority = 0);
00613 void set_shader_off(int priority = 0);
00614 void set_shader_auto(int priority = 0);
00615 void set_shader_auto(BitMask32 shader_switch, int priority=0);
00616 void clear_shader();
00617
00618 void set_shader_input(const ShaderInput *inp);
00619 void set_shader_input(const InternalName *id, Texture *tex, int priority=0);
00620 void set_shader_input(const InternalName *id, const NodePath &np, int priority=0);
00621 void set_shader_input(const InternalName *id, const PTA_float &v, int priority=0);
00622 void set_shader_input(const InternalName *id, const PTA_double &v, int priority=0);
00623 void set_shader_input(const InternalName *id, const PTA_LVecBase4 &v, int priority=0);
00624 void set_shader_input(const InternalName *id, const PTA_LVecBase3 &v, int priority=0);
00625 void set_shader_input(const InternalName *id, const PTA_LVecBase2 &v, int priority=0);
00626 void set_shader_input(const InternalName *id, const PTA_LMatrix4 &v, int priority=0);
00627 void set_shader_input(const InternalName *id, const PTA_LMatrix3 &v, int priority=0);
00628 void set_shader_input(const InternalName *id, const LVecBase4 &v, int priority=0);
00629 void set_shader_input(const InternalName *id, const LVecBase3 &v, int priority=0);
00630 void set_shader_input(const InternalName *id, const LVecBase2 &v, int priority=0);
00631 void set_shader_input(const InternalName *id, const LMatrix4 &v, int priority=0);
00632 void set_shader_input(const InternalName *id, const LMatrix3 &v, int priority=0);
00633 void set_shader_input(const InternalName *id, double n1=0, double n2=0, double n3=0,
00634 double n4=1, int priority=0);
00635
00636 void set_shader_input(const string &id, Texture *tex, int priority=0);
00637 void set_shader_input(const string &id, const NodePath &np, int priority=0);
00638 void set_shader_input(const string &id, const PTA_float &v, int priority=0);
00639 void set_shader_input(const string &id, const PTA_double &v, int priority=0);
00640 void set_shader_input(const string &id, const PTA_LVecBase4 &v, int priority=0);
00641 void set_shader_input(const string &id, const PTA_LVecBase3 &v, int priority=0);
00642 void set_shader_input(const string &id, const PTA_LVecBase2 &v, int priority=0);
00643 void set_shader_input(const string &id, const PTA_LMatrix4 &v, int priority=0);
00644 void set_shader_input(const string &id, const PTA_LMatrix3 &v, int priority=0);
00645 void set_shader_input(const string &id, const LVecBase4 &v, int priority=0);
00646 void set_shader_input(const string &id, const LVecBase3 &v, int priority=0);
00647 void set_shader_input(const string &id, const LVecBase2 &v, int priority=0);
00648 void set_shader_input(const string &id, const LMatrix4 &v, int priority=0);
00649 void set_shader_input(const string &id, const LMatrix3 &v, int priority=0);
00650 void set_shader_input(const string &id, double n1=0, double n2=0, double n3=0,
00651 double n4=1, int priority=0);
00652
00653 void clear_shader_input(const InternalName *id);
00654 void clear_shader_input(const string &id);
00655 void set_instance_count(int instance_count);
00656
00657 const Shader *get_shader() const;
00658 const ShaderInput *get_shader_input(const InternalName *id) const;
00659 const ShaderInput *get_shader_input(const string &id) const;
00660 const int get_instance_count() const;
00661
00662 void set_tex_transform(TextureStage *stage, const TransformState *transform);
00663 void clear_tex_transform();
00664 void clear_tex_transform(TextureStage *stage);
00665 bool has_tex_transform(TextureStage *stage) const;
00666 CPT(TransformState) get_tex_transform(TextureStage *stage) const;
00667
00668 INLINE void set_tex_offset(TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
00669 INLINE void set_tex_offset(TextureStage *stage, const LVecBase2 &uv);
00670 INLINE void set_tex_rotate(TextureStage *stage, PN_stdfloat r);
00671 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat scale);
00672 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
00673 INLINE void set_tex_scale(TextureStage *stage, const LVecBase2 &scale);
00674 INLINE LVecBase2 get_tex_offset(TextureStage *stage) const;
00675 INLINE PN_stdfloat get_tex_rotate(TextureStage *stage) const;
00676 INLINE LVecBase2 get_tex_scale(TextureStage *stage) const;
00677
00678 INLINE void set_tex_pos(TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
00679 INLINE void set_tex_pos(TextureStage *stage, const LVecBase3 &uvw);
00680 INLINE void set_tex_hpr(TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00681 INLINE void set_tex_hpr(TextureStage *stage, const LVecBase3 &hpr);
00682 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
00683 INLINE void set_tex_scale(TextureStage *stage, const LVecBase3 &scale);
00684 INLINE LVecBase3 get_tex_pos(TextureStage *stage) const;
00685 INLINE LVecBase3 get_tex_hpr(TextureStage *stage) const;
00686 INLINE LVecBase3 get_tex_scale_3d(TextureStage *stage) const;
00687
00688 void set_tex_transform(const NodePath &other, TextureStage *stage, const TransformState *transform);
00689 CPT(TransformState) get_tex_transform(const NodePath &other, TextureStage *stage) const;
00690
00691 INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
00692 INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, const LVecBase2 &uv);
00693 INLINE void set_tex_rotate(const NodePath &other, TextureStage *stage, PN_stdfloat r);
00694 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat scale);
00695 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
00696 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase2 &scale);
00697 INLINE LVecBase2 get_tex_offset(const NodePath &other, TextureStage *stage) const;
00698 INLINE PN_stdfloat get_tex_rotate(const NodePath &other, TextureStage *stage) const;
00699 INLINE LVecBase2 get_tex_scale(const NodePath &other, TextureStage *stage) const;
00700
00701 INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
00702 INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, const LVecBase3 &uvw);
00703 INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
00704 INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, const LVecBase3 &hpr);
00705 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
00706 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase3 &scale);
00707 INLINE LVecBase3 get_tex_pos(const NodePath &other, TextureStage *stage) const;
00708 INLINE LVecBase3 get_tex_hpr(const NodePath &other, TextureStage *stage) const;
00709 INLINE LVecBase3 get_tex_scale_3d(const NodePath &other, TextureStage *stage) const;
00710
00711 void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority = 0);
00712 void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
00713 const string &source_name, const NodePath &light,
00714 int priority = 0);
00715 void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
00716 const LTexCoord3 &constant_value,
00717 int priority = 0);
00718 void clear_tex_gen();
00719 void clear_tex_gen(TextureStage *stage);
00720 bool has_tex_gen(TextureStage *stage) const;
00721 RenderAttrib::TexGenMode get_tex_gen(TextureStage *stage) const;
00722 NodePath get_tex_gen_light(TextureStage *stage) const;
00723
00724 void set_tex_projector(TextureStage *stage, const NodePath &from, const NodePath &to);
00725 void clear_tex_projector(TextureStage *stage);
00726 void clear_tex_projector();
00727 bool has_tex_projector(TextureStage *stage) const;
00728 NodePath get_tex_projector_from(TextureStage *stage) const;
00729 NodePath get_tex_projector_to(TextureStage *stage) const;
00730
00731 void project_texture(TextureStage *stage, Texture *tex, const NodePath &projector);
00732 INLINE void clear_project_texture(TextureStage *stage);
00733
00734 void set_normal_map(Texture *normal_map, const string &texcoord_name = string(),
00735 bool preserve_color = false);
00736 void clear_normal_map();
00737
00738 INLINE bool has_texcoord(const string &texcoord_name) const;
00739 bool has_vertex_column(const InternalName *name) const;
00740 InternalNameCollection find_all_vertex_columns() const;
00741 InternalNameCollection find_all_vertex_columns(const string &name) const;
00742 InternalNameCollection find_all_texcoords() const;
00743 InternalNameCollection find_all_texcoords(const string &name) const;
00744
00745 Texture *find_texture(const string &name) const;
00746 Texture *find_texture(TextureStage *stage) const;
00747 TextureCollection find_all_textures() const;
00748 TextureCollection find_all_textures(const string &name) const;
00749 TextureCollection find_all_textures(TextureStage *stage) const;
00750
00751 TextureStage *find_texture_stage(const string &name) const;
00752 TextureStageCollection find_all_texture_stages() const;
00753 TextureStageCollection find_all_texture_stages(const string &name) const;
00754
00755 void unify_texture_stages(TextureStage *stage);
00756
00757 Material *find_material(const string &name) const;
00758 MaterialCollection find_all_materials() const;
00759 MaterialCollection find_all_materials(const string &name) const;
00760
00761 void set_material(Material *tex, int priority = 0);
00762 void set_material_off(int priority = 0);
00763 void clear_material();
00764 bool has_material() const;
00765 PT(Material) get_material() const;
00766
00767 void set_fog(Fog *fog, int priority = 0);
00768 void set_fog_off(int priority = 0);
00769 void clear_fog();
00770 bool has_fog() const;
00771 bool has_fog_off() const;
00772 Fog *get_fog() const;
00773
00774 void set_render_mode_wireframe(int priority = 0);
00775 void set_render_mode_filled(int priority = 0);
00776 void set_render_mode_thickness(PN_stdfloat thickness, int priority = 0);
00777 void set_render_mode_perspective(bool perspective, int priority = 0);
00778 void set_render_mode(RenderModeAttrib::Mode mode, PN_stdfloat thickness, int priority = 0);
00779 void clear_render_mode();
00780 bool has_render_mode() const;
00781 RenderModeAttrib::Mode get_render_mode() const;
00782 PN_stdfloat get_render_mode_thickness() const;
00783 bool get_render_mode_perspective() const;
00784
00785 void set_two_sided(bool two_sided, int priority = 0);
00786 void clear_two_sided();
00787 bool has_two_sided() const;
00788 bool get_two_sided() const;
00789
00790 void set_depth_test(bool depth_test, int priority = 0);
00791 void clear_depth_test();
00792 bool has_depth_test() const;
00793 bool get_depth_test() const;
00794
00795 void set_depth_write(bool depth_write, int priority = 0);
00796 void clear_depth_write();
00797 bool has_depth_write() const;
00798 bool get_depth_write() const;
00799
00800 void set_depth_offset(int bias, int priority = 0);
00801 void clear_depth_offset();
00802 bool has_depth_offset() const;
00803 int get_depth_offset() const;
00804
00805 void do_billboard_axis(const NodePath &camera, PN_stdfloat offset);
00806 void do_billboard_point_eye(const NodePath &camera, PN_stdfloat offset);
00807 void do_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
00808 INLINE void set_billboard_axis(PN_stdfloat offset = 0.0);
00809 INLINE void set_billboard_point_eye(PN_stdfloat offset = 0.0);
00810 INLINE void set_billboard_point_world(PN_stdfloat offset = 0.0);
00811 void set_billboard_axis(const NodePath &camera, PN_stdfloat offset);
00812 void set_billboard_point_eye(const NodePath &camera, PN_stdfloat offset);
00813 void set_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
00814 void clear_billboard();
00815 bool has_billboard() const;
00816
00817 void set_compass(const NodePath &reference = NodePath());
00818 void clear_compass();
00819 bool has_compass() const;
00820
00821 void set_transparency(TransparencyAttrib::Mode mode, int priority = 0);
00822 void clear_transparency();
00823 bool has_transparency() const;
00824 TransparencyAttrib::Mode get_transparency() const;
00825
00826 void set_antialias(unsigned short mode, int priority = 0);
00827 void clear_antialias();
00828 bool has_antialias() const;
00829 unsigned short get_antialias() const;
00830
00831 bool has_audio_volume() const;
00832 void clear_audio_volume();
00833 void set_audio_volume(PN_stdfloat volume,
00834 int priority = 0);
00835 void set_audio_volume_off(int priority = 0);
00836 PN_stdfloat get_audio_volume() const;
00837 PN_stdfloat get_net_audio_volume() const;
00838
00839 INLINE void adjust_all_priorities(int adjustment);
00840
00841
00842 INLINE void show();
00843 INLINE void show(DrawMask camera_mask);
00844 INLINE void show_through();
00845 INLINE void show_through(DrawMask camera_mask);
00846 INLINE void hide();
00847 INLINE void hide(DrawMask camera_mask);
00848 INLINE bool is_hidden(DrawMask camera_mask = PandaNode::get_overall_bit()) const;
00849 NodePath get_hidden_ancestor(DrawMask camera_mask = PandaNode::get_overall_bit(),
00850 Thread *current_thread = Thread::get_current_thread()) const;
00851
00852 void stash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
00853 void unstash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
00854 void unstash_all(Thread *current_thread = Thread::get_current_thread());
00855 INLINE bool is_stashed() const;
00856 NodePath get_stashed_ancestor(Thread *current_thread = Thread::get_current_thread()) const;
00857
00858 INLINE CollideMask get_collide_mask() const;
00859 INLINE void set_collide_mask(CollideMask new_mask, CollideMask bits_to_change = CollideMask::all_on(),
00860 TypeHandle node_type = TypeHandle::none());
00861
00862
00863 INLINE bool operator == (const NodePath &other) const;
00864 INLINE bool operator != (const NodePath &other) const;
00865 INLINE bool operator < (const NodePath &other) const;
00866 INLINE int compare_to(const NodePath &other) const;
00867
00868
00869 bool verify_complete(Thread *current_thread = Thread::get_current_thread()) const;
00870
00871 void premunge_scene(GraphicsStateGuardianBase *gsg = NULL);
00872 void prepare_scene(GraphicsStateGuardianBase *gsg);
00873
00874 void show_bounds();
00875 void show_tight_bounds();
00876 void hide_bounds();
00877 PT(BoundingVolume) get_bounds(Thread *current_thread = Thread::get_current_thread()) const;
00878 void force_recompute_bounds();
00879 void write_bounds(ostream &out) const;
00880 bool calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point,
00881 Thread *current_thread = Thread::get_current_thread()) const;
00882
00883
00884
00885 int flatten_light();
00886 int flatten_medium();
00887 int flatten_strong();
00888 void apply_texture_colors();
00889 INLINE int clear_model_nodes();
00890
00891 INLINE void set_tag(const string &key, const string &value);
00892 INLINE string get_tag(const string &key) const;
00893 INLINE bool has_tag(const string &key) const;
00894 INLINE void clear_tag(const string &key);
00895 INLINE string get_net_tag(const string &key) const;
00896 INLINE bool has_net_tag(const string &key) const;
00897 NodePath find_net_tag(const string &key) const;
00898
00899 #ifdef HAVE_PYTHON
00900 INLINE void set_python_tag(const string &key, PyObject *value);
00901 INLINE PyObject *get_python_tag(const string &key) const;
00902 INLINE bool has_python_tag(const string &key) const;
00903 INLINE void clear_python_tag(const string &key);
00904 INLINE PyObject *get_net_python_tag(const string &key) const;
00905 INLINE bool has_net_python_tag(const string &key) const;
00906 NodePath find_net_python_tag(const string &key) const;
00907 #endif // HAVE_PYTHON
00908
00909 INLINE void list_tags() const;
00910
00911 INLINE void set_name(const string &name);
00912 INLINE string get_name() const;
00913
00914 BLOCKING bool write_bam_file(const Filename &filename) const;
00915 BLOCKING bool write_bam_stream(ostream &out) const;
00916
00917 INLINE string encode_to_bam_stream() const;
00918 bool encode_to_bam_stream(string &data, BamWriter *writer = NULL) const;
00919 static NodePath decode_from_bam_stream(const string &data, BamReader *reader = NULL);
00920
00921 private:
00922 static NodePathComponent *
00923 find_common_ancestor(const NodePath &a, const NodePath &b,
00924 int &a_count, int &b_count,
00925 Thread *current_thread);
00926
00927 CPT(RenderState) r_get_net_state(NodePathComponent *comp,
00928 Thread *current_thread) const;
00929 CPT(RenderState) r_get_partial_state(NodePathComponent *comp, int n,
00930 Thread *current_thread) const;
00931 CPT(TransformState) r_get_net_transform(NodePathComponent *comp,
00932 Thread *current_thread) const;
00933 CPT(TransformState) r_get_partial_transform(NodePathComponent *comp, int n,
00934 Thread *current_thread) const;
00935 CPT(TransformState) r_get_net_prev_transform(NodePathComponent *comp,
00936 Thread *current_thread) const;
00937 CPT(TransformState) r_get_partial_prev_transform(NodePathComponent *comp,
00938 int n, Thread *current_thread) const;
00939
00940 void find_matches(NodePathCollection &result,
00941 const string &approx_path_str,
00942 int max_matches) const;
00943 void find_matches(NodePathCollection &result,
00944 FindApproxPath &approx_path,
00945 int max_matches) const;
00946 void find_matches(NodePathCollection &result,
00947 FindApproxLevelEntry *level,
00948 int max_matches) const;
00949
00950 int r_clear_model_nodes(PandaNode *node);
00951 void r_adjust_all_priorities(PandaNode *node, int adjustment);
00952
00953 void r_force_recompute_bounds(PandaNode *node);
00954
00955 void r_set_collide_mask(PandaNode *node,
00956 CollideMask and_mask, CollideMask or_mask,
00957 TypeHandle node_type);
00958
00959 typedef phash_set<InternalName *, pointer_hash> InternalNames;
00960 bool r_has_vertex_column(PandaNode *node, const InternalName *name) const;
00961 void r_find_all_vertex_columns(PandaNode *node,
00962 InternalNames &vertex_columns) const;
00963
00964 typedef phash_set<Texture *, pointer_hash> Textures;
00965 Texture *r_find_texture(PandaNode *node, const RenderState *state,
00966 const GlobPattern &glob) const;
00967 void r_find_all_textures(PandaNode *node, const RenderState *state,
00968 Textures &textures) const;
00969 Texture *r_find_texture(PandaNode *node, TextureStage *stage) const;
00970 void r_find_all_textures(PandaNode *node, TextureStage *stage,
00971 Textures &textures) const;
00972
00973 typedef phash_set<TextureStage *, pointer_hash> TextureStages;
00974 TextureStage *r_find_texture_stage(PandaNode *node, const RenderState *state,
00975 const GlobPattern &glob) const;
00976 void r_find_all_texture_stages(PandaNode *node, const RenderState *state,
00977 TextureStages &texture_stages) const;
00978
00979 void r_unify_texture_stages(PandaNode *node, TextureStage *stage);
00980
00981 typedef phash_set<Material *, pointer_hash> Materials;
00982 Material *r_find_material(PandaNode *node, const RenderState *state,
00983 const GlobPattern &glob) const;
00984 void r_find_all_materials(PandaNode *node, const RenderState *state,
00985 Materials &materials) const;
00986
00987 PT(NodePathComponent) _head;
00988 int _backup_key;
00989 ErrorType _error_type;
00990 static int _max_search_depth;
00991
00992 static PStatCollector _get_transform_pcollector;
00993 static PStatCollector _verify_complete_pcollector;
00994
00995 public:
00996 static TypeHandle get_class_type() {
00997 return _type_handle;
00998 }
00999 static void init_type() {
01000 register_type(_type_handle, "NodePath");
01001 }
01002
01003 private:
01004 static TypeHandle _type_handle;
01005
01006 friend class NodePathCollection;
01007 friend class WorkingNodePath;
01008 friend class WeakNodePath;
01009 };
01010
01011 INLINE ostream &operator << (ostream &out, const NodePath &node_path);
01012
01013 #ifdef HAVE_PYTHON
01014 BEGIN_PUBLISH
01015 NodePath py_decode_NodePath_from_bam_stream(const string &data);
01016 NodePath py_decode_NodePath_from_bam_stream_persist(PyObject *unpickler, const string &data);
01017 END_PUBLISH
01018 #endif
01019
01020 #include "nodePath.I"
01021
01022 #endif