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  bool replace_copied_nodes(const NodePath &source, const NodePath &dest,
956  const PandaNode::InstanceMap &inst_map,
957  Thread *current_thread);
958 
959  static NodePathComponent *
960  find_common_ancestor(const NodePath &a, const NodePath &b,
961  int &a_count, int &b_count,
962  Thread *current_thread);
963 
964  CPT(RenderState) r_get_net_state(NodePathComponent *comp,
965  Thread *current_thread) const;
966  CPT(RenderState) r_get_partial_state(NodePathComponent *comp, int n,
967  Thread *current_thread) const;
968  CPT(TransformState) r_get_net_transform(NodePathComponent *comp,
969  Thread *current_thread) const;
970  CPT(TransformState) r_get_partial_transform(NodePathComponent *comp, int n,
971  Thread *current_thread) const;
972  CPT(TransformState) r_get_net_prev_transform(NodePathComponent *comp,
973  Thread *current_thread) const;
974  CPT(TransformState) r_get_partial_prev_transform(NodePathComponent *comp,
975  int n, Thread *current_thread) const;
976 
977  void find_matches(NodePathCollection &result,
978  const std::string &approx_path_str,
979  int max_matches) const;
980  void find_matches(NodePathCollection &result,
981  FindApproxPath &approx_path,
982  int max_matches) const;
983  void find_matches(NodePathCollection &result,
984  FindApproxLevelEntry *level,
985  int max_matches) const;
986 
987  int r_clear_model_nodes(PandaNode *node);
988  void r_adjust_all_priorities(PandaNode *node, int adjustment);
989 
990  void r_force_recompute_bounds(PandaNode *node);
991 
992  void r_set_collide_mask(PandaNode *node,
993  CollideMask and_mask, CollideMask or_mask,
994  TypeHandle node_type);
995 
996  typedef phash_set<const InternalName *, pointer_hash> InternalNames;
997  bool r_has_vertex_column(PandaNode *node, const InternalName *name) const;
998  void r_find_all_vertex_columns(PandaNode *node,
999  InternalNames &vertex_columns) const;
1000 
1001  typedef phash_set<Texture *, pointer_hash> Textures;
1002  Texture *r_find_texture(PandaNode *node, const RenderState *state,
1003  const GlobPattern &glob) const;
1004  void r_find_all_textures(PandaNode *node, const RenderState *state,
1005  Textures &textures) const;
1006  Texture *r_find_texture(PandaNode *node, TextureStage *stage) const;
1007  void r_find_all_textures(PandaNode *node, TextureStage *stage,
1008  Textures &textures) const;
1009  static void r_replace_texture(PandaNode *node, Texture *tex, Texture *new_tex);
1010 
1011  typedef phash_set<TextureStage *, pointer_hash> TextureStages;
1012  TextureStage *r_find_texture_stage(PandaNode *node, const RenderState *state,
1013  const GlobPattern &glob) const;
1014  void r_find_all_texture_stages(PandaNode *node, const RenderState *state,
1015  TextureStages &texture_stages) const;
1016 
1017  void r_unify_texture_stages(PandaNode *node, TextureStage *stage);
1018 
1019  typedef phash_set<Material *, pointer_hash> Materials;
1020  Material *r_find_material(PandaNode *node, const RenderState *state,
1021  const GlobPattern &glob) const;
1022  void r_find_all_materials(PandaNode *node, const RenderState *state,
1023  Materials &materials) const;
1024  static void r_replace_material(PandaNode *node, Material *mat,
1025  const MaterialAttrib *new_attrib);
1026 
1027  PT(NodePathComponent) _head;
1028  int _backup_key;
1029  ErrorType _error_type;
1030  static int _max_search_depth;
1031 
1032  static PStatCollector _get_transform_pcollector;
1033  static PStatCollector _verify_complete_pcollector;
1034 
1035 public:
1036  void write_datagram(BamWriter *manager, Datagram &dg) const;
1037  int complete_pointers(TypedWritable **plist, BamReader *manager);
1038  void fillin(DatagramIterator &scan, BamReader *manager);
1039 
1040 public:
1041  static TypeHandle get_class_type() {
1042  return _type_handle;
1043  }
1044  static void init_type() {
1045  register_type(_type_handle, "NodePath");
1046  }
1047 
1048 private:
1049  static TypeHandle _type_handle;
1050 
1051  friend class NodePathCollection;
1052  friend class WorkingNodePath;
1053  friend class WeakNodePath;
1054  friend class CullTraverserData;
1055 };
1056 
1057 INLINE std::ostream &operator << (std::ostream &out, const NodePath &node_path);
1058 
1059 #include "nodePathCollection.h"
1060 
1061 #include "nodePath.I"
1062 
1063 #endif
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
static BitMask< uint32_t, nbits > all_on()
Returns a BitMask whose bits are all on.
Definition: bitMask.I:32
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
This is a const pointer to an InternalName, and should be used in lieu of a CPT(InternalName) in func...
Definition: internalName.h:193
This collects together the pieces of data that are accumulated for each node while walking the scene ...
A class to retrieve the individual data elements previously stored in a Datagram.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
This class is local to this package only; it doesn't get exported.
This class is local to this package only; it doesn't get exported.
Specifies how atmospheric fog effects are applied to geometry.
Definition: fog.h:41
This class can be used to test for string matches against standard Unix- shell filename globbing conv...
Definition: globPattern.h:32
This is a base class for the GraphicsStateGuardian class, which is itself a base class for the variou...
Encodes a string name in a hash table, mapping it to a pointer.
Definition: internalName.h:38
The abstract interface to all kinds of lights.
Definition: light.h:38
Indicates which, if any, material should be applied to geometry.
Defines the way an object appears in the presence of lighting.
Definition: material.h:43
This is a set of zero or more NodePaths.
This is one component of a NodePath.
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition: nodePath.h:159
A lightweight class that represents a single element that may be timed and/or counted via stats.
A basic node of the scene graph or data graph.
Definition: pandaNode.h:65
A PolylightNode.
Definition: polylightNode.h:29
A table of objects that are saved within the graphics context for reference by handle later.
This is the base class for a number of render attributes (other than transform) that may be set on sc...
Definition: renderAttrib.h:51
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
This represents a unique collection of RenderEffect objects that correspond to a particular renderabl...
Definition: renderEffects.h:41
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
Definition: renderState.h:47
Represents a set of settings that indicate how a texture is sampled.
Definition: samplerState.h:36
This is a generic buffer object that lives in graphics memory.
Definition: shaderBuffer.h:33
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
Definition: shader.h:49
Manages a list of Texture objects, as returned by TexturePool::find_all_textures().
Defines the properties of a named stage of the multitexture pipeline.
Definition: textureStage.h:35
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
A thread; that is, a lightweight process.
Definition: thread.h:46
get_current_thread
Returns a pointer to the currently-executing Thread object.
Definition: thread.h:109
Indicates a coordinate-system transform on vertices.
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
This class is a wrapper around a NodePath that, unlike the actual NodePath class, doesn't hold a refe...
Definition: weakNodePath.h:32
This is a class designed to support low-overhead traversals of the complete scene graph,...
An STL function object class, this is intended to be used on any ordered collection of class objects ...
Definition: stl_compares.h:73
This is our own Panda specialization on the default STL list.
Definition: plist.h:35
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
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
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.