Panda3D
nodePath.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file nodePath.h
10  * @author drose
11  * @date 2002-02-25
12  * @author fperazzi, PandaSE
13  * @date 2010-04-06
14  * for set_shader_input)
15  * @author weifengh, PandaSE
16  * @date 2010-04-30
17  */
18 
19 #ifndef NODEPATH_H
20 #define NODEPATH_H
21 
22 #include "pandabase.h"
23 
24 #include "pandaNode.h"
25 #include "renderState.h"
26 #include "transformState.h"
27 #include "renderModeAttrib.h"
28 #include "transparencyAttrib.h"
29 #include "logicOpAttrib.h"
30 #include "nodePathComponent.h"
31 #include "pointerTo.h"
32 #include "referenceCount.h"
33 #include "pnotify.h"
34 #include "typedObject.h"
35 #include "pta_float.h"
36 #include "pta_double.h"
37 #include "pta_LMatrix4.h"
38 #include "pta_LMatrix3.h"
39 #include "pta_LVecBase4.h"
40 #include "pta_LVecBase3.h"
41 #include "pta_LVecBase2.h"
42 #include "stl_compares.h"
43 #include "shaderInput.h"
44 #include "internalNameCollection.h"
45 #include "materialCollection.h"
46 #include "textureCollection.h"
47 #include "textureStageCollection.h"
48 
49 class NodePathCollection;
50 class FindApproxPath;
52 class Light;
53 class PolylightNode;
54 class Texture;
55 class TextureStage;
56 class Material;
57 class Fog;
58 class GlobPattern;
60 class SamplerState;
61 class Shader;
62 class ShaderBuffer;
63 class ShaderInput;
64 class WeakNodePath;
65 
66 //
67 // A NodePath is the fundamental unit of high-level interaction with the scene
68 // graph. It encapsulates the complete path down to a node from some other
69 // node, usually the root of the scene graph. This is used to resolve
70 // ambiguities associated with instancing.
71 //
72 // NodePath also contains a number of handy high-level methods for common
73 // scene-graph manipulations, such as reparenting, and common state changes,
74 // such as repositioning.
75 //
76 // There are also a number of NodePath methods for finding nodes deep within
77 // the tree by name or by type. These take a path string, which at its
78 // simplest consists of a series of node names separated by slashes, like a
79 // directory pathname.
80 //
81 // Each component of the path string may optionally consist of one of the
82 // following special names, instead of a node name:
83 //
84 // * -- matches exactly one node, with any name.
85 // ** -- matches any sequence of zero or more nodes.
86 // +typename -- matches any node that is or derives from the given type.
87 // -typename -- matches any node that is the given type exactly.
88 // =tag -- matches any node that has the indicated tag.
89 // =tag=value -- matches any node whose tag matches the indicated value.
90 //
91 // Furthermore, a node name may itself contain standard filename globbing
92 // characters, like *, ?, and [a-z], that will be accepted as a partial match.
93 // (In fact, the '*' special name may be seen as just a special case of this.)
94 // The globbing characters may not be used with the typename matches or with
95 // tag matches, but they may be used to match a tag's value in the =tag=value
96 // syntax.
97 //
98 // The special characters "@@", appearing at the beginning of a node name,
99 // indicate a stashed node. Normally, stashed nodes are not returned by a
100 // find (but see the special flags, below), but a stashed node may be found if
101 // it is explicitly named with its leading @@ characters. By extension, "@@*"
102 // may be used to identify any stashed node.
103 //
104 // Examples:
105 //
106 // "room//graph" will look for a node named "graph", which is a child of an
107 // unnamed node, which is a child of a node named "room", which is a child of
108 // the starting path.
109 //
110 // "**/red*" will look for any node anywhere in the tree (below the starting
111 // path) with a name that begins with "red".
112 //
113 // "**/+PartBundleNode/**/head" will look for a node named "head", somewhere
114 // below a PartBundleNode anywhere in the tree.
115 //
116 //
117 // The search is always potentially ambiguous, even if the special wildcard
118 // operators are not used, because there may be multiple nodes in the tree
119 // with the same name. In general, in the case of an ambiguity, the shortest
120 // path is preferred; when a method (such as extend_by) must choose only only
121 // one of several possible paths, it will choose the shortest available; on
122 // the other hand, when a method (such as find_all_matches) is to return all
123 // of the matching paths, it will sort them so that the shortest paths appear
124 // first in the output.
125 //
126 //
127 // Special flags. The entire string may optionally be followed by the ";"
128 // character, followed by one or more of the following special control flags,
129 // with no intervening spaces or punctuation:
130 //
131 // -h Do not return hidden nodes.
132 // +h Do return hidden nodes.
133 // -s Do not return stashed nodes unless explicitly referenced with @@.
134 // +s Return stashed nodes even without any explicit @@ characters.
135 // -i Node name comparisons are not case insensitive: case must match
136 // exactly.
137 // +i Node name comparisons are case insensitive: case is not important.
138 // This affects matches against the node name only; node type and tag
139 // strings are always case sensitive.
140 //
141 // The default flags are +h-s-i.
142 //
143 
144 /**
145  * NodePath is the fundamental system for disambiguating instances, and also
146  * provides a higher-level interface for manipulating the scene graph.
147  *
148  * A NodePath is a list of connected nodes from the root of the graph to any
149  * sub-node. Each NodePath therefore uniquely describes one instance of a
150  * node.
151  *
152  * NodePaths themselves are lightweight objects that may easily be copied and
153  * passed by value. Their data is stored as a series of NodePathComponents
154  * that are stored on the nodes. Holding a NodePath will keep a reference
155  * count to all the nodes in the path. However, if any node in the path is
156  * removed or reparented (perhaps through a different NodePath), the NodePath
157  * will automatically be updated to reflect the changes.
158  */
159 class EXPCL_PANDA_PGRAPH NodePath {
160 PUBLISHED:
161  // This enumeration is returned by get_error_type() for an empty NodePath to
162  // report the reason it's empty.
163  enum ErrorType {
164  ET_ok = 0, // i.e. not empty, or never assigned to anything.
165  ET_not_found, // returned from a failed find() or similar function.
166  ET_removed, // remove_node() was previously called on this NodePath.
167  ET_fail, // general failure return from some function.
168  };
169 
170  INLINE NodePath();
171  INLINE explicit NodePath(const std::string &top_node_name, Thread *current_thread = Thread::get_current_thread());
172  INLINE explicit NodePath(PandaNode *node, Thread *current_thread = Thread::get_current_thread());
173  INLINE static NodePath any_path(PandaNode *node, Thread *current_thread = Thread::get_current_thread());
174  explicit NodePath(const NodePath &parent, PandaNode *child_node,
175  Thread *current_thread = Thread::get_current_thread());
176 
177  INLINE NodePath(const NodePath &copy);
178  INLINE NodePath(NodePath &&from) noexcept;
179 
180  INLINE void operator = (const NodePath &copy);
181  INLINE void operator = (NodePath &&from) noexcept;
182 
183  INLINE void clear();
184 
185  EXTENSION(NodePath __copy__() const);
186  EXTENSION(PyObject *__deepcopy__(PyObject *self, PyObject *memo) const);
187  EXTENSION(PyObject *__reduce__(PyObject *self) const);
188  EXTENSION(PyObject *__reduce_persist__(PyObject *self, PyObject *pickler) const);
189 
190  INLINE static NodePath not_found();
191  INLINE static NodePath removed();
192  INLINE static NodePath fail();
193 
194  INLINE static void set_max_search_depth(int max_search_depth);
195  INLINE static int get_max_search_depth();
196 
197  // Methods to query a NodePath's contents.
198  INLINE bool is_empty() const;
199  operator bool () const;
200 
201  INLINE bool is_singleton(Thread *current_thread = Thread::get_current_thread()) const;
202  int get_num_nodes(Thread *current_thread = Thread::get_current_thread()) const;
203  PandaNode *get_node(int index, Thread *current_thread = Thread::get_current_thread()) const;
204  MAKE_SEQ(get_nodes, get_num_nodes, get_node);
205  MAKE_SEQ_PROPERTY(nodes, get_num_nodes, get_node);
206  NodePath get_ancestor(int index, Thread *current_thread = Thread::get_current_thread()) const;
207  MAKE_SEQ(get_ancestors, get_num_nodes, get_ancestor);
208  MAKE_SEQ_PROPERTY(ancestors, get_num_nodes, get_ancestor);
209 
210  INLINE ErrorType get_error_type() const;
211  MAKE_PROPERTY(error_type, get_error_type);
212 
213  INLINE PandaNode *get_top_node(Thread *current_thread = Thread::get_current_thread()) const;
214  NodePath get_top(Thread *current_thread = Thread::get_current_thread()) const;
215 
216  INLINE PandaNode *node() const;
217 
218  INLINE int get_key() const;
219  INLINE size_t add_hash(size_t hash) const;
220 
221  INLINE bool is_same_graph(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
222  INLINE bool is_ancestor_of(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
223  INLINE NodePath get_common_ancestor(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
224 
225  // Methods that return collections of NodePaths derived from or related to
226  // this one.
227 
228  NodePathCollection get_children(Thread *current_thread = Thread::get_current_thread()) const;
229  INLINE int get_num_children(Thread *current_thread = Thread::get_current_thread()) const;
230  INLINE NodePath get_child(int n, Thread *current_thread = Thread::get_current_thread()) const;
231  NodePathCollection get_stashed_children(Thread *current_thread = Thread::get_current_thread()) const;
232 
233  MAKE_PROPERTY(children, get_children);
234  MAKE_PROPERTY(stashed_children, get_stashed_children);
235 
236  INLINE int count_num_descendants() const;
237 
238  INLINE bool has_parent(Thread *current_thread = Thread::get_current_thread()) const;
239  INLINE NodePath get_parent(Thread *current_thread = Thread::get_current_thread()) const;
240  int get_sort(Thread *current_thread = Thread::get_current_thread()) const;
241 
242  MAKE_PROPERTY2(parent, has_parent, get_parent);
243  MAKE_PROPERTY(sort, get_sort);
244 
245  NodePath find(const std::string &path) const;
246  NodePath find_path_to(PandaNode *node) const;
247  NodePathCollection find_all_matches(const std::string &path) const;
248  NodePathCollection find_all_paths_to(PandaNode *node) const;
249 
250  // Methods that actually move nodes around in the scene graph. The optional
251  // "sort" parameter can be used to force a particular ordering between
252  // sibling nodes, useful when dealing with LOD's and similar switch nodes.
253  // If the sort value is the same, nodes will be arranged in the order they
254  // were added.
255  void reparent_to(const NodePath &other, int sort = 0,
256  Thread *current_thread = Thread::get_current_thread());
257  void stash_to(const NodePath &other, int sort = 0,
258  Thread *current_thread = Thread::get_current_thread());
259  void wrt_reparent_to(const NodePath &other, int sort = 0,
260  Thread *current_thread = Thread::get_current_thread());
261  NodePath instance_to(const NodePath &other, int sort = 0,
262  Thread *current_thread = Thread::get_current_thread()) const;
263  NodePath instance_under_node(const NodePath &other, const std::string &name,
264  int sort = 0,
265  Thread *current_thread = Thread::get_current_thread()) const;
266  NodePath copy_to(const NodePath &other, int sort = 0,
267  Thread *current_thread = Thread::get_current_thread()) const;
268  NodePath attach_new_node(PandaNode *node, int sort = 0,
269  Thread *current_thread = Thread::get_current_thread()) const;
270  INLINE NodePath attach_new_node(const std::string &name, int sort = 0,
271  Thread *current_thread = Thread::get_current_thread()) const;
272  void remove_node(Thread *current_thread = Thread::get_current_thread());
273  void detach_node(Thread *current_thread = Thread::get_current_thread());
274 
275  // Handy ways to look at what's there, and other miscellaneous operations.
276 
277  void output(std::ostream &out) const;
278 
279  INLINE void ls() const;
280  INLINE void ls(std::ostream &out, int indent_level = 0) const;
281  INLINE void reverse_ls() const;
282  int reverse_ls(std::ostream &out, int indent_level = 0) const;
283 
284  // Aggregate transform and state information.
285  const RenderState *get_state(Thread *current_thread = Thread::get_current_thread()) const;
286  INLINE void set_state(const RenderState *state, Thread *current_thread = Thread::get_current_thread());
287  CPT(RenderState) get_state(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
288  void set_state(const NodePath &other, const RenderState *state, Thread *current_thread = Thread::get_current_thread());
289  INLINE CPT(RenderState) get_net_state(Thread *current_thread = Thread::get_current_thread()) const;
290 
291  INLINE void set_attrib(const RenderAttrib *attrib, int priority = 0);
292  INLINE const RenderAttrib *get_attrib(TypeHandle type) const;
293  INLINE bool has_attrib(TypeHandle type) const;
294  INLINE void clear_attrib(TypeHandle type);
295 
296  INLINE void set_effect(const RenderEffect *effect);
297  INLINE const RenderEffect *get_effect(TypeHandle type) const;
298  INLINE bool has_effect(TypeHandle type) const;
299  INLINE void clear_effect(TypeHandle type);
300 
301  INLINE void set_effects(const RenderEffects *effects);
302  INLINE const RenderEffects *get_effects() const;
303  INLINE void clear_effects();
304 
305  const TransformState *get_transform(Thread *current_thread = Thread::get_current_thread()) const;
306  INLINE void clear_transform(Thread *current_thread = Thread::get_current_thread());
307  INLINE void set_transform(const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
308  CPT(TransformState) get_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
309  INLINE void clear_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread());
310  void set_transform(const NodePath &other, const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
311  INLINE CPT(TransformState) get_net_transform(Thread *current_thread = Thread::get_current_thread()) const;
312 
313  const TransformState *get_prev_transform(Thread *current_thread = Thread::get_current_thread()) const;
314  INLINE void set_prev_transform(const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
315  CPT(TransformState) get_prev_transform(const NodePath &other, Thread *current_thread = Thread::get_current_thread()) const;
316  void set_prev_transform(const NodePath &other, const TransformState *transform, Thread *current_thread = Thread::get_current_thread());
317  INLINE CPT(TransformState) get_net_prev_transform(Thread *current_thread = Thread::get_current_thread()) const;
318 
319 
320  // Methods that get and set the matrix transform: pos, hpr, scale, in the
321  // local coordinate system.
322 
323  INLINE void set_pos(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
324  void set_pos(const LVecBase3 &pos);
325  void set_x(PN_stdfloat x);
326  void set_y(PN_stdfloat y);
327  void set_z(PN_stdfloat z);
328  INLINE void set_fluid_pos(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
329  void set_fluid_pos(const LVecBase3 &pos);
330  void set_fluid_x(PN_stdfloat x);
331  void set_fluid_y(PN_stdfloat y);
332  void set_fluid_z(PN_stdfloat z);
333  LPoint3 get_pos() const;
334  INLINE PN_stdfloat get_x() const;
335  INLINE PN_stdfloat get_y() const;
336  INLINE PN_stdfloat get_z() const;
337 
338  LVector3 get_pos_delta() const;
339 
340  INLINE void set_hpr(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
341  void set_hpr(const LVecBase3 &hpr);
342  void set_h(PN_stdfloat h);
343  void set_p(PN_stdfloat p);
344  void set_r(PN_stdfloat r);
345  LVecBase3 get_hpr() const;
346  INLINE PN_stdfloat get_h() const;
347  INLINE PN_stdfloat get_p() const;
348  INLINE PN_stdfloat get_r() const;
349 
350  void set_quat(const LQuaternion &quat);
351  LQuaternion get_quat() const;
352 
353  INLINE void set_scale(PN_stdfloat scale);
354  INLINE void set_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
355  void set_scale(const LVecBase3 &scale);
356  void set_sx(PN_stdfloat sx);
357  void set_sy(PN_stdfloat sy);
358  void set_sz(PN_stdfloat sz);
359  LVecBase3 get_scale() const;
360  INLINE PN_stdfloat get_sx() const;
361  INLINE PN_stdfloat get_sy() const;
362  INLINE PN_stdfloat get_sz() const;
363 
364  INLINE void set_shear(PN_stdfloat shxy, PN_stdfloat shxz, PN_stdfloat shyz);
365  void set_shear(const LVecBase3 &shear);
366  void set_shxy(PN_stdfloat shxy);
367  void set_shxz(PN_stdfloat shxz);
368  void set_shyz(PN_stdfloat shyz);
369  LVecBase3 get_shear() const;
370  INLINE PN_stdfloat get_shxy() const;
371  INLINE PN_stdfloat get_shxz() const;
372  INLINE PN_stdfloat get_shyz() const;
373 
374  INLINE void set_pos_hpr(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
375  PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
376  void set_pos_hpr(const LVecBase3 &pos,
377  const LVecBase3 &hpr);
378  void set_pos_quat(const LVecBase3 &pos,
379  const LQuaternion &quat);
380 
381  INLINE void set_hpr_scale(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
382  PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
383  void set_hpr_scale(const LVecBase3 &hpr,
384  const LVecBase3 &scale);
385  void set_quat_scale(const LQuaternion &quat,
386  const LVecBase3 &scale);
387  INLINE void set_pos_hpr_scale(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
388  PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
389  PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
390  void set_pos_hpr_scale(const LVecBase3 &pos,
391  const LVecBase3 &hpr,
392  const LVecBase3 &scale);
393  void set_pos_quat_scale(const LVecBase3 &pos,
394  const LQuaternion &quat,
395  const LVecBase3 &scale);
396  void set_pos_hpr_scale_shear(const LVecBase3 &pos,
397  const LVecBase3 &hpr,
398  const LVecBase3 &scale,
399  const LVecBase3 &shear);
400  void set_pos_quat_scale_shear(const LVecBase3 &pos,
401  const LQuaternion &quat,
402  const LVecBase3 &scale,
403  const LVecBase3 &shear);
404 
405  void set_mat(const LMatrix4 &mat);
406  INLINE void clear_mat();
407  INLINE bool has_mat() const;
408  INLINE const LMatrix4 &get_mat() const;
409 
410  INLINE void look_at(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
411  void look_at(const LPoint3 &point, const LVector3 &up = LVector3::up());
412  INLINE void heads_up(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
413  void heads_up(const LPoint3 &point, const LVector3 &up = LVector3::up());
414 
415  // Methods that get and set the matrix transforms relative to some other
416  // node in the scene graph. These perform an implicit wrt().
417 
418  INLINE void set_pos(const NodePath &other, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
419  void set_pos(const NodePath &other, const LVecBase3 &pos);
420  void set_x(const NodePath &other, PN_stdfloat x);
421  void set_y(const NodePath &other, PN_stdfloat y);
422  void set_z(const NodePath &other, PN_stdfloat z);
423  INLINE void set_fluid_pos(const NodePath &other, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
424  void set_fluid_pos(const NodePath &other, const LVecBase3 &pos);
425  void set_fluid_x(const NodePath &other, PN_stdfloat x);
426  void set_fluid_y(const NodePath &other, PN_stdfloat y);
427  void set_fluid_z(const NodePath &other, PN_stdfloat z);
428  LPoint3 get_pos(const NodePath &other) const;
429  INLINE PN_stdfloat get_x(const NodePath &other) const;
430  INLINE PN_stdfloat get_y(const NodePath &other) const;
431  INLINE PN_stdfloat get_z(const NodePath &other) const;
432 
433  LVector3 get_pos_delta(const NodePath &other) const;
434 
435  INLINE void set_hpr(const NodePath &other, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
436  void set_hpr(const NodePath &other, const LVecBase3 &hpr);
437  void set_h(const NodePath &other, PN_stdfloat h);
438  void set_p(const NodePath &other, PN_stdfloat p);
439  void set_r(const NodePath &other, PN_stdfloat r);
440  LVecBase3 get_hpr(const NodePath &other) const;
441  INLINE PN_stdfloat get_h(const NodePath &other) const;
442  INLINE PN_stdfloat get_p(const NodePath &other) const;
443  INLINE PN_stdfloat get_r(const NodePath &other) const;
444 
445  void set_quat(const NodePath &other, const LQuaternion &quat);
446  LQuaternion get_quat(const NodePath &other) const;
447 
448  INLINE void set_scale(const NodePath &other, PN_stdfloat scale);
449  INLINE void set_scale(const NodePath &other, PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
450  void set_scale(const NodePath &other, const LVecBase3 &scale);
451  void set_sx(const NodePath &other, PN_stdfloat sx);
452  void set_sy(const NodePath &other, PN_stdfloat sy);
453  void set_sz(const NodePath &other, PN_stdfloat sz);
454  LVecBase3 get_scale(const NodePath &other) const;
455  INLINE PN_stdfloat get_sx(const NodePath &other) const;
456  INLINE PN_stdfloat get_sy(const NodePath &other) const;
457  INLINE PN_stdfloat get_sz(const NodePath &other) const;
458 
459  INLINE void set_shear(const NodePath &other, PN_stdfloat shxy, PN_stdfloat shxz, PN_stdfloat shyz);
460  void set_shear(const NodePath &other, const LVecBase3 &shear);
461  void set_shxy(const NodePath &other, PN_stdfloat shxy);
462  void set_shxz(const NodePath &other, PN_stdfloat shxz);
463  void set_shyz(const NodePath &other, PN_stdfloat shyz);
464  LVecBase3 get_shear(const NodePath &other) const;
465  INLINE PN_stdfloat get_shxy(const NodePath &other) const;
466  INLINE PN_stdfloat get_shxz(const NodePath &other) const;
467  INLINE PN_stdfloat get_shyz(const NodePath &other) const;
468 
469  INLINE void set_pos_hpr(const NodePath &other,
470  PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
471  PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
472  void set_pos_hpr(const NodePath &other,
473  const LVecBase3 &pos,
474  const LVecBase3 &hpr);
475  void set_pos_quat(const NodePath &other,
476  const LVecBase3 &pos,
477  const LQuaternion &quat);
478  INLINE void set_hpr_scale(const NodePath &other,
479  PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
480  PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
481  void set_hpr_scale(const NodePath &other,
482  const LVecBase3 &hpr,
483  const LVecBase3 &scale);
484  void set_quat_scale(const NodePath &other,
485  const LQuaternion &quat,
486  const LVecBase3 &scale);
487  INLINE void set_pos_hpr_scale(const NodePath &other,
488  PN_stdfloat x, PN_stdfloat y, PN_stdfloat z,
489  PN_stdfloat h, PN_stdfloat p, PN_stdfloat r,
490  PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz);
491  void set_pos_hpr_scale(const NodePath &other,
492  const LVecBase3 &pos,
493  const LVecBase3 &hpr,
494  const LVecBase3 &scale);
495  void set_pos_quat_scale(const NodePath &other,
496  const LVecBase3 &pos,
497  const LQuaternion &quat,
498  const LVecBase3 &scale);
499  void set_pos_hpr_scale_shear(const NodePath &other,
500  const LVecBase3 &pos,
501  const LVecBase3 &hpr,
502  const LVecBase3 &scale,
503  const LVecBase3 &shear);
504  void set_pos_quat_scale_shear(const NodePath &other,
505  const LVecBase3 &pos,
506  const LQuaternion &quat,
507  const LVecBase3 &scale,
508  const LVecBase3 &shear);
509 
510  LMatrix4 get_mat(const NodePath &other) const;
511  void set_mat(const NodePath &other, const LMatrix4 &mat);
512 
513  LPoint3 get_relative_point(const NodePath &other, const LVecBase3 &point) const;
514  LVector3 get_relative_vector(const NodePath &other, const LVecBase3 &vec) const;
515 
516  INLINE void look_at(const NodePath &other,
517  PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
518  void look_at(const NodePath &other,
519  const LPoint3 &point = LPoint3(0.0, 0.0, 0.0),
520  const LVector3 &up = LVector3::up());
521  INLINE void heads_up(const NodePath &other,
522  PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
523  void heads_up(const NodePath &other,
524  const LPoint3 &point = LPoint3(0.0, 0.0, 0.0),
525  const LVector3 &up = LVector3::up());
526 
527  INLINE PN_stdfloat get_distance(const NodePath &other) const;
528 
529 
530  // Methods that affect appearance of geometry: color, texture, etc. These
531  // affect the state at the bottom level only.
532 
533  void set_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a = 1.0,
534  int priority = 0);
535  void set_color(const LColor &color, int priority = 0);
536  void set_color_off(int priority = 0);
537  void clear_color();
538  bool has_color() const;
539  LColor get_color() const;
540 
541  bool has_color_scale() const;
542  void clear_color_scale();
543  void set_color_scale(const LVecBase4 &scale,
544  int priority = 0);
545  INLINE void set_color_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz, PN_stdfloat sa,
546  int priority = 0);
547  void compose_color_scale(const LVecBase4 &scale,
548  int priority = 0);
549  INLINE void compose_color_scale(PN_stdfloat sx, PN_stdfloat sy, PN_stdfloat sz, PN_stdfloat sa,
550  int priority = 0);
551  void set_color_scale_off(int priority = 0);
552 
553  void set_alpha_scale(PN_stdfloat scale, int priority = 0);
554  void set_all_color_scale(PN_stdfloat scale, int priority = 0);
555  INLINE void set_sr(PN_stdfloat sr);
556  INLINE void set_sg(PN_stdfloat sg);
557  INLINE void set_sb(PN_stdfloat sb);
558  INLINE void set_sa(PN_stdfloat sa);
559 
560  const LVecBase4 &get_color_scale() const;
561  INLINE PN_stdfloat get_sr() const;
562  INLINE PN_stdfloat get_sg() const;
563  INLINE PN_stdfloat get_sb() const;
564  INLINE PN_stdfloat get_sa() const;
565 
566  void set_light(const NodePath &light, int priority = 0);
567  void set_light_off(int priority = 0);
568  void set_light_off(const NodePath &light, int priority = 0);
569  void clear_light();
570  void clear_light(const NodePath &light);
571  bool has_light(const NodePath &light) const;
572  bool has_light_off() const;
573  bool has_light_off(const NodePath &light) const;
574 
575  void set_clip_plane(const NodePath &clip_plane, int priority = 0);
576  void set_clip_plane_off(int priority = 0);
577  void set_clip_plane_off(const NodePath &clip_plane, int priority = 0);
578  void clear_clip_plane();
579  void clear_clip_plane(const NodePath &clip_plane);
580  bool has_clip_plane(const NodePath &clip_plane) const;
581  bool has_clip_plane_off() const;
582  bool has_clip_plane_off(const NodePath &clip_plane) const;
583 
584  void set_scissor(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top);
585  void set_scissor(const LPoint3 &a, const LPoint3 &b);
586  void set_scissor(const LPoint3 &a, const LPoint3 &b,
587  const LPoint3 &c, const LPoint3 &d);
588  void set_scissor(const NodePath &other,
589  const LPoint3 &a, const LPoint3 &b);
590  void set_scissor(const NodePath &other,
591  const LPoint3 &a, const LPoint3 &b,
592  const LPoint3 &c, const LPoint3 &d);
593  void clear_scissor();
594  bool has_scissor() const;
595 
596  void set_occluder(const NodePath &occluder);
597  void clear_occluder();
598  void clear_occluder(const NodePath &occluder);
599  bool has_occluder(const NodePath &occluder) const;
600 
601  void set_bin(const std::string &bin_name, int draw_order, int priority = 0);
602  void clear_bin();
603  bool has_bin() const;
604  std::string get_bin_name() const;
605  int get_bin_draw_order() const;
606 
607  void set_texture(Texture *tex, int priority = 0);
608  void set_texture(TextureStage *stage, Texture *tex, int priority = 0);
609  void set_texture(Texture *tex, const SamplerState &sampler, int priority = 0);
610  void set_texture(TextureStage *stage, Texture *tex, const SamplerState &sampler, int priority = 0);
611  void set_texture_off(int priority = 0);
612  void set_texture_off(TextureStage *stage, int priority = 0);
613  void clear_texture();
614  void clear_texture(TextureStage *stage);
615  bool has_texture() const;
616  bool has_texture(TextureStage *stage) const;
617  bool has_texture_off() const;
618  bool has_texture_off(TextureStage *stage) const;
619  Texture *get_texture() const;
620  Texture *get_texture(TextureStage *stage) const;
621  void replace_texture(Texture *tex, Texture *new_tex);
622  const SamplerState &get_texture_sampler() const;
623  const SamplerState &get_texture_sampler(TextureStage *stage) const;
624 
625  void set_shader(const Shader *sha, int priority = 0);
626  void set_shader_off(int priority = 0);
627  void set_shader_auto(int priority = 0);
628  void set_shader_auto(BitMask32 shader_switch, int priority=0);
629  void clear_shader();
630 
631  void set_shader_input(const ShaderInput &input);
632  void set_shader_input(ShaderInput &&input);
633 
634  INLINE void set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, int priority=0);
635  INLINE void set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z=-1, int n=0, int priority=0);
636 
637 public:
638  INLINE void set_shader_input(CPT_InternalName id, Texture *tex, int priority=0);
639  INLINE void set_shader_input(CPT_InternalName id, ShaderBuffer *buf, int priority=0);
640  INLINE void set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0);
641  INLINE void set_shader_input(CPT_InternalName id, const PTA_float &v, int priority=0);
642  INLINE void set_shader_input(CPT_InternalName id, const PTA_double &v, int priority=0);
643  INLINE void set_shader_input(CPT_InternalName id, const PTA_int &v, int priority=0);
644  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority=0);
645  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority=0);
646  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority=0);
647  INLINE void set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority=0);
648  INLINE void set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority=0);
649  INLINE void set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority=0);
650  INLINE void set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority=0);
651  INLINE void set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority=0);
652  INLINE void set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority=0);
653  INLINE void set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority=0);
654  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase4i &v, int priority=0);
655  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase3i &v, int priority=0);
656  INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase2i &v, int priority=0);
657  INLINE void set_shader_input(CPT_InternalName id, const LVecBase4i &v, int priority=0);
658  INLINE void set_shader_input(CPT_InternalName id, const LVecBase3i &v, int priority=0);
659  INLINE void set_shader_input(CPT_InternalName id, const LVecBase2i &v, int priority=0);
660 PUBLISHED:
661  INLINE void set_shader_input(CPT_InternalName id, int n1, int n2, int n3=0,
662  int n4=0, int priority=0);
663  INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2,
664  PN_stdfloat n3=0, PN_stdfloat n4=0, int priority=0);
665 
666  EXTENSION(void set_shader_input(CPT_InternalName, PyObject *, int priority=0));
667  EXTENSION(void set_shader_inputs(PyObject *args, PyObject *kwargs));
668 
669  void clear_shader_input(CPT_InternalName id);
670  void set_instance_count(int instance_count);
671 
672  const Shader *get_shader() const;
673  ShaderInput get_shader_input(CPT_InternalName id) const;
674  int get_instance_count() const;
675 
676  void set_tex_transform(TextureStage *stage, const TransformState *transform);
677  void clear_tex_transform();
678  void clear_tex_transform(TextureStage *stage);
679  bool has_tex_transform(TextureStage *stage) const;
680  CPT(TransformState) get_tex_transform(TextureStage *stage) const;
681 
682  INLINE void set_tex_offset(TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
683  INLINE void set_tex_offset(TextureStage *stage, const LVecBase2 &uv);
684  INLINE void set_tex_rotate(TextureStage *stage, PN_stdfloat r);
685  INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat scale);
686  INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
687  INLINE void set_tex_scale(TextureStage *stage, const LVecBase2 &scale);
688  INLINE LVecBase2 get_tex_offset(TextureStage *stage) const;
689  INLINE PN_stdfloat get_tex_rotate(TextureStage *stage) const;
690  INLINE LVecBase2 get_tex_scale(TextureStage *stage) const;
691 
692  INLINE void set_tex_pos(TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
693  INLINE void set_tex_pos(TextureStage *stage, const LVecBase3 &uvw);
694  INLINE void set_tex_hpr(TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
695  INLINE void set_tex_hpr(TextureStage *stage, const LVecBase3 &hpr);
696  INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
697  INLINE void set_tex_scale(TextureStage *stage, const LVecBase3 &scale);
698  INLINE LVecBase3 get_tex_pos(TextureStage *stage) const;
699  INLINE LVecBase3 get_tex_hpr(TextureStage *stage) const;
700  INLINE LVecBase3 get_tex_scale_3d(TextureStage *stage) const;
701 
702  void set_tex_transform(const NodePath &other, TextureStage *stage, const TransformState *transform);
703  CPT(TransformState) get_tex_transform(const NodePath &other, TextureStage *stage) const;
704 
705  INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
706  INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, const LVecBase2 &uv);
707  INLINE void set_tex_rotate(const NodePath &other, TextureStage *stage, PN_stdfloat r);
708  INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat scale);
709  INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
710  INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase2 &scale);
711  INLINE LVecBase2 get_tex_offset(const NodePath &other, TextureStage *stage) const;
712  INLINE PN_stdfloat get_tex_rotate(const NodePath &other, TextureStage *stage) const;
713  INLINE LVecBase2 get_tex_scale(const NodePath &other, TextureStage *stage) const;
714 
715  INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
716  INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, const LVecBase3 &uvw);
717  INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
718  INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, const LVecBase3 &hpr);
719  INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
720  INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase3 &scale);
721  INLINE LVecBase3 get_tex_pos(const NodePath &other, TextureStage *stage) const;
722  INLINE LVecBase3 get_tex_hpr(const NodePath &other, TextureStage *stage) const;
723  INLINE LVecBase3 get_tex_scale_3d(const NodePath &other, TextureStage *stage) const;
724 
725  void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority = 0);
726  void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
727  const LTexCoord3 &constant_value,
728  int priority = 0);
729  void clear_tex_gen();
730  void clear_tex_gen(TextureStage *stage);
731  bool has_tex_gen(TextureStage *stage) const;
732  RenderAttrib::TexGenMode get_tex_gen(TextureStage *stage) const;
733 
734  void set_tex_projector(TextureStage *stage, const NodePath &from, const NodePath &to,
735  int lens_index = 0);
736  void clear_tex_projector(TextureStage *stage);
737  void clear_tex_projector();
738  bool has_tex_projector(TextureStage *stage) const;
739  NodePath get_tex_projector_from(TextureStage *stage) const;
740  NodePath get_tex_projector_to(TextureStage *stage) const;
741 
742  void project_texture(TextureStage *stage, Texture *tex, const NodePath &projector);
743  INLINE void clear_project_texture(TextureStage *stage);
744 
745  INLINE bool has_texcoord(const std::string &texcoord_name) const;
746  bool has_vertex_column(const InternalName *name) const;
747  InternalNameCollection find_all_vertex_columns() const;
748  InternalNameCollection find_all_vertex_columns(const std::string &name) const;
749  InternalNameCollection find_all_texcoords() const;
750  InternalNameCollection find_all_texcoords(const std::string &name) const;
751 
752  Texture *find_texture(const std::string &name) const;
753  Texture *find_texture(TextureStage *stage) const;
754  TextureCollection find_all_textures() const;
755  TextureCollection find_all_textures(const std::string &name) const;
756  TextureCollection find_all_textures(TextureStage *stage) const;
757 
758  TextureStage *find_texture_stage(const std::string &name) const;
759  TextureStageCollection find_all_texture_stages() const;
760  TextureStageCollection find_all_texture_stages(const std::string &name) const;
761 
762  void unify_texture_stages(TextureStage *stage);
763 
764  Material *find_material(const std::string &name) const;
765  MaterialCollection find_all_materials() const;
766  MaterialCollection find_all_materials(const std::string &name) const;
767 
768  void set_material(Material *tex, int priority = 0);
769  void set_material_off(int priority = 0);
770  void clear_material();
771  bool has_material() const;
772  PT(Material) get_material() const;
773  void replace_material(Material *mat, Material *new_mat);
774 
775  void set_fog(Fog *fog, int priority = 0);
776  void set_fog_off(int priority = 0);
777  void clear_fog();
778  bool has_fog() const;
779  bool has_fog_off() const;
780  Fog *get_fog() const;
781 
782  void set_render_mode_wireframe(int priority = 0);
783  void set_render_mode_filled(int priority = 0);
784  void set_render_mode_filled_wireframe(const LColor &wireframe_color, int priority = 0);
785  void set_render_mode_thickness(PN_stdfloat thickness, int priority = 0);
786  void set_render_mode_perspective(bool perspective, int priority = 0);
787  void set_render_mode(RenderModeAttrib::Mode mode, PN_stdfloat thickness, int priority = 0);
788  void clear_render_mode();
789  bool has_render_mode() const;
790  RenderModeAttrib::Mode get_render_mode() const;
791  PN_stdfloat get_render_mode_thickness() const;
792  bool get_render_mode_perspective() const;
793 
794  void set_two_sided(bool two_sided, int priority = 0);
795  void clear_two_sided();
796  bool has_two_sided() const;
797  bool get_two_sided() const;
798 
799  void set_depth_test(bool depth_test, int priority = 0);
800  void clear_depth_test();
801  bool has_depth_test() const;
802  bool get_depth_test() const;
803 
804  void set_depth_write(bool depth_write, int priority = 0);
805  void clear_depth_write();
806  bool has_depth_write() const;
807  bool get_depth_write() const;
808 
809  void set_depth_offset(int bias, int priority = 0);
810  void clear_depth_offset();
811  bool has_depth_offset() const;
812  int get_depth_offset() const;
813 
814  void do_billboard_axis(const NodePath &camera, PN_stdfloat offset);
815  void do_billboard_point_eye(const NodePath &camera, PN_stdfloat offset);
816  void do_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
817  INLINE void set_billboard_axis(PN_stdfloat offset = 0.0);
818  INLINE void set_billboard_point_eye(PN_stdfloat offset = 0.0, bool fixed_depth = false);
819  INLINE void set_billboard_point_world(PN_stdfloat offset = 0.0);
820  void set_billboard_axis(const NodePath &camera, PN_stdfloat offset);
821  void set_billboard_point_eye(const NodePath &camera, PN_stdfloat offset, bool fixed_depth = false);
822  void set_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
823  void clear_billboard();
824  bool has_billboard() const;
825 
826  void set_compass(const NodePath &reference = NodePath());
827  void clear_compass();
828  bool has_compass() const;
829 
830  void set_transparency(TransparencyAttrib::Mode mode, int priority = 0);
831  void clear_transparency();
832  bool has_transparency() const;
833  TransparencyAttrib::Mode get_transparency() const;
834 
835  void set_logic_op(LogicOpAttrib::Operation op, int priority = 0);
836  void clear_logic_op();
837  bool has_logic_op() const;
838  LogicOpAttrib::Operation get_logic_op() const;
839 
840  void set_antialias(unsigned short mode, int priority = 0);
841  void clear_antialias();
842  bool has_antialias() const;
843  unsigned short get_antialias() const;
844 
845  bool has_audio_volume() const;
846  void clear_audio_volume();
847  void set_audio_volume(PN_stdfloat volume,
848  int priority = 0);
849  void set_audio_volume_off(int priority = 0);
850  PN_stdfloat get_audio_volume() const;
851  PN_stdfloat get_net_audio_volume() const;
852 
853  INLINE void adjust_all_priorities(int adjustment);
854 
855  // Variants on show and hide
856  INLINE void show();
857  INLINE void show(DrawMask camera_mask);
858  INLINE void show_through();
859  INLINE void show_through(DrawMask camera_mask);
860  INLINE void hide();
861  INLINE void hide(DrawMask camera_mask);
862  INLINE bool is_hidden(DrawMask camera_mask = PandaNode::get_overall_bit()) const;
863  NodePath get_hidden_ancestor(DrawMask camera_mask = PandaNode::get_overall_bit(),
864  Thread *current_thread = Thread::get_current_thread()) const;
865 
866  void stash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
867  void unstash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
868  void unstash_all(Thread *current_thread = Thread::get_current_thread());
869  INLINE bool is_stashed() const;
870  NodePath get_stashed_ancestor(Thread *current_thread = Thread::get_current_thread()) const;
871 
872  INLINE CollideMask get_collide_mask() const;
873  INLINE void set_collide_mask(CollideMask new_mask, CollideMask bits_to_change = CollideMask::all_on(),
874  TypeHandle node_type = TypeHandle::none());
875 
876  // Comparison methods
877  INLINE bool operator == (const NodePath &other) const;
878  INLINE bool operator != (const NodePath &other) const;
879  INLINE bool operator < (const NodePath &other) const;
880  INLINE int compare_to(const NodePath &other) const;
881 
882  bool operator == (const WeakNodePath &other) const;
883  bool operator != (const WeakNodePath &other) const;
884  bool operator < (const WeakNodePath &other) const;
885  int compare_to(const WeakNodePath &other) const;
886 
887  // Miscellaneous
888  bool verify_complete(Thread *current_thread = Thread::get_current_thread()) const;
889 
890  void premunge_scene(GraphicsStateGuardianBase *gsg = nullptr);
891  void prepare_scene(GraphicsStateGuardianBase *gsg);
892 
893  void show_bounds();
894  void show_tight_bounds();
895  void hide_bounds();
896  PT(BoundingVolume) get_bounds(Thread *current_thread = Thread::get_current_thread()) const;
897  void force_recompute_bounds();
898  void write_bounds(std::ostream &out) const;
899  bool calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point,
900  const NodePath &other = NodePath(),
901  Thread *current_thread = Thread::get_current_thread()) const;
902 
903  EXTENSION(PyObject *get_tight_bounds(const NodePath &other = NodePath()) const);
904 
905  // void analyze() const;
906 
907  int flatten_light();
908  int flatten_medium();
909  int flatten_strong();
910  void apply_texture_colors();
911  INLINE int clear_model_nodes();
912 
913  INLINE void set_tag(const std::string &key, const std::string &value);
914  INLINE std::string get_tag(const std::string &key) const;
915  INLINE void get_tag_keys(vector_string &keys) const;
916  INLINE bool has_tag(const std::string &key) const;
917  INLINE void clear_tag(const std::string &key);
918  INLINE std::string get_net_tag(const std::string &key) const;
919  INLINE bool has_net_tag(const std::string &key) const;
920  NodePath find_net_tag(const std::string &key) const;
921 
922  MAKE_MAP_PROPERTY(net_tags, has_net_tag, get_net_tag);
923 
924  EXTENSION(INLINE PyObject *get_tags() const);
925  EXTENSION(INLINE PyObject *get_tag_keys() const);
926  MAKE_PROPERTY(tags, get_tags);
927 
928  EXTENSION(PyObject *get_python_tags());
929  EXTENSION(INLINE void set_python_tag(PyObject *keys, PyObject *value));
930  EXTENSION(INLINE PyObject *get_python_tag(PyObject *keys) const);
931  EXTENSION(INLINE PyObject *get_python_tag_keys() const);
932  EXTENSION(INLINE bool has_python_tag(PyObject *keys) const);
933  EXTENSION(INLINE void clear_python_tag(PyObject *keys));
934  EXTENSION(INLINE PyObject *get_net_python_tag(PyObject *keys) const);
935  EXTENSION(INLINE bool has_net_python_tag(PyObject *keys) const);
936  EXTENSION(NodePath find_net_python_tag(PyObject *keys) const);
937  MAKE_PROPERTY(python_tags, get_python_tags);
938 
939  EXTENSION(int __traverse__(visitproc visit, void *arg));
940 
941  INLINE void list_tags() const;
942 
943  INLINE void set_name(const std::string &name);
944  INLINE std::string get_name() const;
945  MAKE_PROPERTY(name, get_name, set_name);
946 
947  BLOCKING bool write_bam_file(const Filename &filename) const;
948  BLOCKING bool write_bam_stream(std::ostream &out) const;
949 
950  INLINE vector_uchar encode_to_bam_stream() const;
951  bool encode_to_bam_stream(vector_uchar &data, BamWriter *writer = nullptr) const;
952  static NodePath decode_from_bam_stream(vector_uchar data, BamReader *reader = nullptr);
953 
954 private:
955  static NodePathComponent *
956  find_common_ancestor(const NodePath &a, const NodePath &b,
957  int &a_count, int &b_count,
958  Thread *current_thread);
959 
960  CPT(RenderState) r_get_net_state(NodePathComponent *comp,
961  Thread *current_thread) const;
962  CPT(RenderState) r_get_partial_state(NodePathComponent *comp, int n,
963  Thread *current_thread) const;
964  CPT(TransformState) r_get_net_transform(NodePathComponent *comp,
965  Thread *current_thread) const;
966  CPT(TransformState) r_get_partial_transform(NodePathComponent *comp, int n,
967  Thread *current_thread) const;
968  CPT(TransformState) r_get_net_prev_transform(NodePathComponent *comp,
969  Thread *current_thread) const;
970  CPT(TransformState) r_get_partial_prev_transform(NodePathComponent *comp,
971  int n, Thread *current_thread) const;
972 
973  void find_matches(NodePathCollection &result,
974  const std::string &approx_path_str,
975  int max_matches) const;
976  void find_matches(NodePathCollection &result,
977  FindApproxPath &approx_path,
978  int max_matches) const;
979  void find_matches(NodePathCollection &result,
980  FindApproxLevelEntry *level,
981  int max_matches) const;
982 
983  int r_clear_model_nodes(PandaNode *node);
984  void r_adjust_all_priorities(PandaNode *node, int adjustment);
985 
986  void r_force_recompute_bounds(PandaNode *node);
987 
988  void r_set_collide_mask(PandaNode *node,
989  CollideMask and_mask, CollideMask or_mask,
990  TypeHandle node_type);
991 
992  typedef phash_set<const InternalName *, pointer_hash> InternalNames;
993  bool r_has_vertex_column(PandaNode *node, const InternalName *name) const;
994  void r_find_all_vertex_columns(PandaNode *node,
995  InternalNames &vertex_columns) const;
996 
997  typedef phash_set<Texture *, pointer_hash> Textures;
998  Texture *r_find_texture(PandaNode *node, const RenderState *state,
999  const GlobPattern &glob) const;
1000  void r_find_all_textures(PandaNode *node, const RenderState *state,
1001  Textures &textures) const;
1002  Texture *r_find_texture(PandaNode *node, TextureStage *stage) const;
1003  void r_find_all_textures(PandaNode *node, TextureStage *stage,
1004  Textures &textures) const;
1005  static void r_replace_texture(PandaNode *node, Texture *tex, Texture *new_tex);
1006 
1007  typedef phash_set<TextureStage *, pointer_hash> TextureStages;
1008  TextureStage *r_find_texture_stage(PandaNode *node, const RenderState *state,
1009  const GlobPattern &glob) const;
1010  void r_find_all_texture_stages(PandaNode *node, const RenderState *state,
1011  TextureStages &texture_stages) const;
1012 
1013  void r_unify_texture_stages(PandaNode *node, TextureStage *stage);
1014 
1015  typedef phash_set<Material *, pointer_hash> Materials;
1016  Material *r_find_material(PandaNode *node, const RenderState *state,
1017  const GlobPattern &glob) const;
1018  void r_find_all_materials(PandaNode *node, const RenderState *state,
1019  Materials &materials) const;
1020  static void r_replace_material(PandaNode *node, Material *mat,
1021  const MaterialAttrib *new_attrib);
1022 
1023  PT(NodePathComponent) _head;
1024  int _backup_key;
1025  ErrorType _error_type;
1026  static int _max_search_depth;
1027 
1028  static PStatCollector _get_transform_pcollector;
1029  static PStatCollector _verify_complete_pcollector;
1030 
1031 public:
1032  void write_datagram(BamWriter *manager, Datagram &dg) const;
1033  int complete_pointers(TypedWritable **plist, BamReader *manager);
1034  void fillin(DatagramIterator &scan, BamReader *manager);
1035 
1036 public:
1037  static TypeHandle get_class_type() {
1038  return _type_handle;
1039  }
1040  static void init_type() {
1041  register_type(_type_handle, "NodePath");
1042  }
1043 
1044 private:
1045  static TypeHandle _type_handle;
1046 
1047  friend class NodePathCollection;
1048  friend class WorkingNodePath;
1049  friend class WeakNodePath;
1050  friend class CullTraverserData;
1051 };
1052 
1053 INLINE std::ostream &operator << (std::ostream &out, const NodePath &node_path);
1054 
1055 #include "nodePathCollection.h"
1056 
1057 #include "nodePath.I"
1058 
1059 #endif
PreparedGraphicsObjects
A table of objects that are saved within the graphics context for reference by handle later.
Definition: preparedGraphicsObjects.h:58
pta_double.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandaNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
RenderEffects
This represents a unique collection of RenderEffect objects that correspond to a particular renderabl...
Definition: renderEffects.h:41
stl_compares.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TextureCollection
Manages a list of Texture objects, as returned by TexturePool::find_all_textures().
Definition: textureCollection.h:25
Shader
Definition: shader.h:49
pta_float.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
RenderEffect
This is the base class for a number of special render effects that may be set on scene graph nodes to...
Definition: renderEffect.h:48
TextureStageCollection
Definition: textureStageCollection.h:24
DatagramIterator
A class to retrieve the individual data elements previously stored in a Datagram.
Definition: datagramIterator.h:27
register_type
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition: register_type.I:22
BamReader
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
materialCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
compare_to
An STL function object class, this is intended to be used on any ordered collection of class objects ...
Definition: stl_compares.h:73
Material
Defines the way an object appears in the presence of lighting.
Definition: material.h:43
nodePathComponent.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
BamWriter
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
ShaderBuffer
This is a generic buffer object that lives in graphics memory.
Definition: shaderBuffer.h:33
RenderAttrib
This is the base class for a number of render attributes (other than transform) that may be set on sc...
Definition: renderAttrib.h:51
shaderInput.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
InternalName
Encodes a string name in a hash table, mapping it to a pointer.
Definition: internalName.h:38
BitMask< uint32_t, 32 >
Texture
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
Definition: texture.h:71
pta_LMatrix4.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Light
The abstract interface to all kinds of lights.
Definition: light.h:38
TypedWritable
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
Datagram
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
RenderState
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
Definition: renderState.h:47
pnotify.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
textureCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Thread::get_current_thread
get_current_thread
Returns a pointer to the currently-executing Thread object.
Definition: thread.h:109
MaterialCollection
Definition: materialCollection.h:24
renderState.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
pta_LMatrix3.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
SamplerState
Represents a set of settings that indicate how a texture is sampled.
Definition: samplerState.h:36
renderModeAttrib.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pta_LVecBase3.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
transformState.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
WorkingNodePath
This is a class designed to support low-overhead traversals of the complete scene graph,...
Definition: workingNodePath.h:39
Fog
Specifies how atmospheric fog effects are applied to geometry.
Definition: fog.h:41
TransformState
Indicates a coordinate-system transform on vertices.
Definition: transformState.h:54
typedObject.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pta_LVecBase4.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PStatCollector
A lightweight class that represents a single element that may be timed and/or counted via stats.
Definition: pStatCollector.h:43
CullTraverserData
This collects together the pieces of data that are accumulated for each node while walking the scene ...
Definition: cullTraverserData.h:40
transparencyAttrib.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
CPT_InternalName
This is a const pointer to an InternalName, and should be used in lieu of a CPT(InternalName) in func...
Definition: internalName.h:193
MaterialAttrib
Indicates which, if any, material should be applied to geometry.
Definition: materialAttrib.h:27
plist
This is our own Panda specialization on the default STL list.
Definition: plist.h:35
textureStageCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
FindApproxPath
This class is local to this package only; it doesn't get exported.
Definition: findApproxPath.h:31
NodePath
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition: nodePath.h:159
NodePathComponent
This is one component of a NodePath.
Definition: nodePathComponent.h:42
referenceCount.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PolylightNode
A PolylightNode.
Definition: polylightNode.h:29
nodePathCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
FindApproxLevelEntry
This class is local to this package only; it doesn't get exported.
Definition: findApproxLevelEntry.h:29
internalNameCollection.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
GraphicsStateGuardianBase
This is a base class for the GraphicsStateGuardian class, which is itself a base class for the variou...
Definition: graphicsStateGuardianBase.h:110
pta_LVecBase2.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
InternalNameCollection
Definition: internalNameCollection.h:24
BoundingVolume
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
Definition: boundingVolume.h:41
WeakNodePath
This class is a wrapper around a NodePath that, unlike the actual NodePath class, doesn't hold a refe...
Definition: weakNodePath.h:32
PandaNode
A basic node of the scene graph or data graph.
Definition: pandaNode.h:64
BitMask::all_on
static BitMask< WType, nbits > all_on()
Returns a BitMask whose bits are all on.
Definition: bitMask.I:32
Thread
A thread; that is, a lightweight process.
Definition: thread.h:46
nodePath.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TextureStage
Defines the properties of a named stage of the multitexture pipeline.
Definition: textureStage.h:35
GlobPattern
This class can be used to test for string matches against standard Unix- shell filename globbing conv...
Definition: globPattern.h:32
Filename
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
ShaderInput
This is a small container class that can hold any one of the value types that can be passed as input ...
Definition: shaderInput.h:40
NodePathCollection
This is a set of zero or more NodePaths.
Definition: nodePathCollection.h:26