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"
45#include "materialCollection.h"
46#include "textureCollection.h"
48
50class FindApproxPath;
52class Light;
53class PolylightNode;
54class Texture;
55class TextureStage;
56class Material;
57class Fog;
58class GlobPattern;
60class SamplerState;
61class Shader;
62class ShaderBuffer;
63class ShaderInput;
64class 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 */
159class EXPCL_PANDA_PGRAPH NodePath {
160PUBLISHED:
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
637public:
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);
660PUBLISHED:
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
954private:
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,
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
1035public:
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
1040public:
1041 static TypeHandle get_class_type() {
1042 return _type_handle;
1043 }
1044 static void init_type() {
1045 register_type(_type_handle, "NodePath");
1046 }
1047
1048private:
1049 static TypeHandle _type_handle;
1050
1051 friend class NodePathCollection;
1052 friend class WorkingNodePath;
1053 friend class WeakNodePath;
1054 friend class CullTraverserData;
1055};
1056
1057INLINE 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.