Panda3D
Loading...
Searching...
No Matches
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#ifdef CPPPARSER // Let interrogate know this also accepts None
623 void replace_texture(Texture *tex, std::nullptr_t new_tex);
624#endif
625 const SamplerState &get_texture_sampler() const;
626 const SamplerState &get_texture_sampler(TextureStage *stage) const;
627
628 void set_shader(const Shader *sha, int priority = 0);
629 void set_shader_off(int priority = 0);
630 void set_shader_auto(int priority = 0);
631 void set_shader_auto(BitMask32 shader_switch, int priority=0);
632 void clear_shader();
633
634 void set_shader_input(const ShaderInput &input);
635 void set_shader_input(ShaderInput &&input);
636
637 INLINE void set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, int priority=0);
638 INLINE void set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z=-1, int n=0, int priority=0);
639
640public:
641 INLINE void set_shader_input(CPT_InternalName id, Texture *tex, int priority=0);
642 INLINE void set_shader_input(CPT_InternalName id, ShaderBuffer *buf, int priority=0);
643 INLINE void set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0);
644 INLINE void set_shader_input(CPT_InternalName id, const PTA_float &v, int priority=0);
645 INLINE void set_shader_input(CPT_InternalName id, const PTA_double &v, int priority=0);
646 INLINE void set_shader_input(CPT_InternalName id, const PTA_int &v, int priority=0);
647 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority=0);
648 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority=0);
649 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority=0);
650 INLINE void set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority=0);
651 INLINE void set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority=0);
652 INLINE void set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority=0);
653 INLINE void set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority=0);
654 INLINE void set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority=0);
655 INLINE void set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority=0);
656 INLINE void set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority=0);
657 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase4i &v, int priority=0);
658 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase3i &v, int priority=0);
659 INLINE void set_shader_input(CPT_InternalName id, const PTA_LVecBase2i &v, int priority=0);
660 INLINE void set_shader_input(CPT_InternalName id, const LVecBase4i &v, int priority=0);
661 INLINE void set_shader_input(CPT_InternalName id, const LVecBase3i &v, int priority=0);
662 INLINE void set_shader_input(CPT_InternalName id, const LVecBase2i &v, int priority=0);
663PUBLISHED:
664 INLINE void set_shader_input(CPT_InternalName id, int n1, int n2, int n3=0,
665 int n4=0, int priority=0);
666 INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2,
667 PN_stdfloat n3=0, PN_stdfloat n4=0, int priority=0);
668
669 EXTENSION(void set_shader_input(CPT_InternalName, PyObject *, int priority=0));
670 EXTENSION(void set_shader_inputs(PyObject *args, PyObject *kwargs));
671
672 void clear_shader_input(CPT_InternalName id);
673 void set_instance_count(int instance_count);
674
675 const Shader *get_shader() const;
676 ShaderInput get_shader_input(CPT_InternalName id) const;
677 int get_instance_count() const;
678
679 void set_tex_transform(TextureStage *stage, const TransformState *transform);
680 void clear_tex_transform();
681 void clear_tex_transform(TextureStage *stage);
682 bool has_tex_transform(TextureStage *stage) const;
683 CPT(TransformState) get_tex_transform(TextureStage *stage) const;
684
685 INLINE void set_tex_offset(TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
686 INLINE void set_tex_offset(TextureStage *stage, const LVecBase2 &uv);
687 INLINE void set_tex_rotate(TextureStage *stage, PN_stdfloat r);
688 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat scale);
689 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
690 INLINE void set_tex_scale(TextureStage *stage, const LVecBase2 &scale);
691 INLINE LVecBase2 get_tex_offset(TextureStage *stage) const;
692 INLINE PN_stdfloat get_tex_rotate(TextureStage *stage) const;
693 INLINE LVecBase2 get_tex_scale(TextureStage *stage) const;
694
695 INLINE void set_tex_pos(TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
696 INLINE void set_tex_pos(TextureStage *stage, const LVecBase3 &uvw);
697 INLINE void set_tex_hpr(TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
698 INLINE void set_tex_hpr(TextureStage *stage, const LVecBase3 &hpr);
699 INLINE void set_tex_scale(TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
700 INLINE void set_tex_scale(TextureStage *stage, const LVecBase3 &scale);
701 INLINE LVecBase3 get_tex_pos(TextureStage *stage) const;
702 INLINE LVecBase3 get_tex_hpr(TextureStage *stage) const;
703 INLINE LVecBase3 get_tex_scale_3d(TextureStage *stage) const;
704
705 void set_tex_transform(const NodePath &other, TextureStage *stage, const TransformState *transform);
706 CPT(TransformState) get_tex_transform(const NodePath &other, TextureStage *stage) const;
707
708 INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v);
709 INLINE void set_tex_offset(const NodePath &other, TextureStage *stage, const LVecBase2 &uv);
710 INLINE void set_tex_rotate(const NodePath &other, TextureStage *stage, PN_stdfloat r);
711 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat scale);
712 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv);
713 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase2 &scale);
714 INLINE LVecBase2 get_tex_offset(const NodePath &other, TextureStage *stage) const;
715 INLINE PN_stdfloat get_tex_rotate(const NodePath &other, TextureStage *stage) const;
716 INLINE LVecBase2 get_tex_scale(const NodePath &other, TextureStage *stage) const;
717
718 INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, PN_stdfloat u, PN_stdfloat v, PN_stdfloat w);
719 INLINE void set_tex_pos(const NodePath &other, TextureStage *stage, const LVecBase3 &uvw);
720 INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
721 INLINE void set_tex_hpr(const NodePath &other, TextureStage *stage, const LVecBase3 &hpr);
722 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, PN_stdfloat su, PN_stdfloat sv, PN_stdfloat sw);
723 INLINE void set_tex_scale(const NodePath &other, TextureStage *stage, const LVecBase3 &scale);
724 INLINE LVecBase3 get_tex_pos(const NodePath &other, TextureStage *stage) const;
725 INLINE LVecBase3 get_tex_hpr(const NodePath &other, TextureStage *stage) const;
726 INLINE LVecBase3 get_tex_scale_3d(const NodePath &other, TextureStage *stage) const;
727
728 void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode, int priority = 0);
729 void set_tex_gen(TextureStage *stage, RenderAttrib::TexGenMode mode,
730 const LTexCoord3 &constant_value,
731 int priority = 0);
732 void clear_tex_gen();
733 void clear_tex_gen(TextureStage *stage);
734 bool has_tex_gen(TextureStage *stage) const;
735 RenderAttrib::TexGenMode get_tex_gen(TextureStage *stage) const;
736
737 void set_tex_projector(TextureStage *stage, const NodePath &from, const NodePath &to,
738 int lens_index = 0);
739 void clear_tex_projector(TextureStage *stage);
740 void clear_tex_projector();
741 bool has_tex_projector(TextureStage *stage) const;
742 NodePath get_tex_projector_from(TextureStage *stage) const;
743 NodePath get_tex_projector_to(TextureStage *stage) const;
744
745 void project_texture(TextureStage *stage, Texture *tex, const NodePath &projector);
746 INLINE void clear_project_texture(TextureStage *stage);
747
748 INLINE bool has_texcoord(const std::string &texcoord_name) const;
749 bool has_vertex_column(const InternalName *name) const;
750 InternalNameCollection find_all_vertex_columns() const;
751 InternalNameCollection find_all_vertex_columns(const std::string &name) const;
752 InternalNameCollection find_all_texcoords() const;
753 InternalNameCollection find_all_texcoords(const std::string &name) const;
754
755 Texture *find_texture(const std::string &name) const;
756 Texture *find_texture(TextureStage *stage) const;
757 TextureCollection find_all_textures() const;
758 TextureCollection find_all_textures(const std::string &name) const;
759 TextureCollection find_all_textures(TextureStage *stage) const;
760
761 TextureStage *find_texture_stage(const std::string &name) const;
762 TextureStageCollection find_all_texture_stages() const;
763 TextureStageCollection find_all_texture_stages(const std::string &name) const;
764
765 void unify_texture_stages(TextureStage *stage);
766
767 Material *find_material(const std::string &name) const;
768 MaterialCollection find_all_materials() const;
769 MaterialCollection find_all_materials(const std::string &name) const;
770
771 void set_material(Material *tex, int priority = 0);
772 void set_material_off(int priority = 0);
773 void clear_material();
774 bool has_material() const;
775 PT(Material) get_material() const;
776 void replace_material(Material *mat, Material *new_mat);
777#ifdef CPPPARSER // Let interrogate know this also accepts None
778 void replace_material(Material *mat, std::nullptr_t new_mat);
779#endif
780
781 void set_fog(Fog *fog, int priority = 0);
782 void set_fog_off(int priority = 0);
783 void clear_fog();
784 bool has_fog() const;
785 bool has_fog_off() const;
786 Fog *get_fog() const;
787
788 void set_render_mode_wireframe(int priority = 0);
789 void set_render_mode_filled(int priority = 0);
790 void set_render_mode_filled_wireframe(const LColor &wireframe_color, int priority = 0);
791 void set_render_mode_thickness(PN_stdfloat thickness, int priority = 0);
792 void set_render_mode_perspective(bool perspective, int priority = 0);
793 void set_render_mode(RenderModeAttrib::Mode mode, PN_stdfloat thickness, int priority = 0);
794 void clear_render_mode();
795 bool has_render_mode() const;
796 RenderModeAttrib::Mode get_render_mode() const;
797 PN_stdfloat get_render_mode_thickness() const;
798 bool get_render_mode_perspective() const;
799
800 void set_two_sided(bool two_sided, int priority = 0);
801 void clear_two_sided();
802 bool has_two_sided() const;
803 bool get_two_sided() const;
804
805 void set_depth_test(bool depth_test, int priority = 0);
806 void clear_depth_test();
807 bool has_depth_test() const;
808 bool get_depth_test() const;
809
810 void set_depth_write(bool depth_write, int priority = 0);
811 void clear_depth_write();
812 bool has_depth_write() const;
813 bool get_depth_write() const;
814
815 void set_depth_offset(int bias, int priority = 0);
816 void clear_depth_offset();
817 bool has_depth_offset() const;
818 int get_depth_offset() const;
819
820 void do_billboard_axis(const NodePath &camera, PN_stdfloat offset);
821 void do_billboard_point_eye(const NodePath &camera, PN_stdfloat offset);
822 void do_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
823 INLINE void set_billboard_axis(PN_stdfloat offset = 0.0);
824 INLINE void set_billboard_point_eye(PN_stdfloat offset = 0.0, bool fixed_depth = false);
825 INLINE void set_billboard_point_world(PN_stdfloat offset = 0.0);
826 void set_billboard_axis(const NodePath &camera, PN_stdfloat offset);
827 void set_billboard_point_eye(const NodePath &camera, PN_stdfloat offset, bool fixed_depth = false);
828 void set_billboard_point_world(const NodePath &camera, PN_stdfloat offset);
829 void clear_billboard();
830 bool has_billboard() const;
831
832 void set_compass(const NodePath &reference = NodePath());
833 void clear_compass();
834 bool has_compass() const;
835
836 void set_transparency(TransparencyAttrib::Mode mode, int priority = 0);
837 void clear_transparency();
838 bool has_transparency() const;
839 TransparencyAttrib::Mode get_transparency() const;
840
841 void set_logic_op(LogicOpAttrib::Operation op, int priority = 0);
842 void clear_logic_op();
843 bool has_logic_op() const;
844 LogicOpAttrib::Operation get_logic_op() const;
845
846 void set_antialias(unsigned short mode, int priority = 0);
847 void clear_antialias();
848 bool has_antialias() const;
849 unsigned short get_antialias() const;
850
851 bool has_audio_volume() const;
852 void clear_audio_volume();
853 void set_audio_volume(PN_stdfloat volume,
854 int priority = 0);
855 void set_audio_volume_off(int priority = 0);
856 PN_stdfloat get_audio_volume() const;
857 PN_stdfloat get_net_audio_volume() const;
858
859 INLINE void adjust_all_priorities(int adjustment);
860
861 // Variants on show and hide
862 INLINE void show();
863 INLINE void show(DrawMask camera_mask);
864 INLINE void show_through();
865 INLINE void show_through(DrawMask camera_mask);
866 INLINE void hide();
867 INLINE void hide(DrawMask camera_mask);
868 INLINE bool is_hidden(DrawMask camera_mask = PandaNode::get_overall_bit()) const;
869 NodePath get_hidden_ancestor(DrawMask camera_mask = PandaNode::get_overall_bit(),
870 Thread *current_thread = Thread::get_current_thread()) const;
871
872 void stash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
873 void unstash(int sort = 0, Thread *current_thread = Thread::get_current_thread());
874 void unstash_all(Thread *current_thread = Thread::get_current_thread());
875 INLINE bool is_stashed() const;
876 NodePath get_stashed_ancestor(Thread *current_thread = Thread::get_current_thread()) const;
877
878 INLINE CollideMask get_collide_mask() const;
879 INLINE void set_collide_mask(CollideMask new_mask, CollideMask bits_to_change = CollideMask::all_on(),
880 TypeHandle node_type = TypeHandle::none());
881
882 // Comparison methods
883 INLINE bool operator == (const NodePath &other) const;
884 INLINE bool operator != (const NodePath &other) const;
885 INLINE bool operator < (const NodePath &other) const;
886 INLINE int compare_to(const NodePath &other) const;
887
888 bool operator == (const WeakNodePath &other) const;
889 bool operator != (const WeakNodePath &other) const;
890 bool operator < (const WeakNodePath &other) const;
891 int compare_to(const WeakNodePath &other) const;
892
893 // Miscellaneous
894 bool verify_complete(Thread *current_thread = Thread::get_current_thread()) const;
895
896 void premunge_scene(GraphicsStateGuardianBase *gsg = nullptr);
897 void prepare_scene(GraphicsStateGuardianBase *gsg);
898
899 void show_bounds();
900 void show_tight_bounds();
901 void hide_bounds();
902 PT(BoundingVolume) get_bounds(Thread *current_thread = Thread::get_current_thread()) const;
903 void force_recompute_bounds();
904 void write_bounds(std::ostream &out) const;
905 bool calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point,
906 const NodePath &other = NodePath(),
907 Thread *current_thread = Thread::get_current_thread()) const;
908
909 EXTENSION(PyObject *get_tight_bounds(const NodePath &other = NodePath()) const);
910
911 // void analyze() const;
912
913 int flatten_light();
914 int flatten_medium();
915 int flatten_strong();
916 void apply_texture_colors();
917 INLINE int clear_model_nodes();
918
919 INLINE void set_tag(const std::string &key, const std::string &value);
920 INLINE std::string get_tag(const std::string &key) const;
921 INLINE void get_tag_keys(vector_string &keys) const;
922 INLINE bool has_tag(const std::string &key) const;
923 INLINE void clear_tag(const std::string &key);
924 INLINE std::string get_net_tag(const std::string &key) const;
925 INLINE bool has_net_tag(const std::string &key) const;
926 NodePath find_net_tag(const std::string &key) const;
927
928 MAKE_MAP_PROPERTY(net_tags, has_net_tag, get_net_tag);
929
930 EXTENSION(INLINE PyObject *get_tags() const);
931 EXTENSION(INLINE PyObject *get_tag_keys() const);
932 MAKE_PROPERTY(tags, get_tags);
933
934 EXTENSION(PyObject *get_python_tags());
935 EXTENSION(INLINE void set_python_tag(PyObject *keys, PyObject *value));
936 EXTENSION(INLINE PyObject *get_python_tag(PyObject *keys) const);
937 EXTENSION(INLINE PyObject *get_python_tag_keys() const);
938 EXTENSION(INLINE bool has_python_tag(PyObject *keys) const);
939 EXTENSION(INLINE void clear_python_tag(PyObject *keys));
940 EXTENSION(INLINE PyObject *get_net_python_tag(PyObject *keys) const);
941 EXTENSION(INLINE bool has_net_python_tag(PyObject *keys) const);
942 EXTENSION(NodePath find_net_python_tag(PyObject *keys) const);
943 MAKE_PROPERTY(python_tags, get_python_tags);
944
945 EXTENSION(int __traverse__(visitproc visit, void *arg));
946
947 INLINE void list_tags() const;
948
949 INLINE void set_name(const std::string &name);
950 INLINE std::string get_name() const;
951 MAKE_PROPERTY(name, get_name, set_name);
952
953 BLOCKING bool write_bam_file(const Filename &filename) const;
954 BLOCKING bool write_bam_stream(std::ostream &out) const;
955
956 INLINE vector_uchar encode_to_bam_stream() const;
957 bool encode_to_bam_stream(vector_uchar &data, BamWriter *writer = nullptr) const;
958 static NodePath decode_from_bam_stream(vector_uchar data, BamReader *reader = nullptr);
959
960private:
961 bool replace_copied_nodes(const NodePath &source, const NodePath &dest,
962 const PandaNode::InstanceMap &inst_map,
963 Thread *current_thread);
964
965 static NodePathComponent *
966 find_common_ancestor(const NodePath &a, const NodePath &b,
967 int &a_count, int &b_count,
968 Thread *current_thread);
969
970 CPT(RenderState) r_get_net_state(NodePathComponent *comp,
971 Thread *current_thread) const;
972 CPT(RenderState) r_get_partial_state(NodePathComponent *comp, int n,
973 Thread *current_thread) const;
974 CPT(TransformState) r_get_net_transform(NodePathComponent *comp,
975 Thread *current_thread) const;
976 CPT(TransformState) r_get_partial_transform(NodePathComponent *comp, int n,
977 Thread *current_thread) const;
978 CPT(TransformState) r_get_net_prev_transform(NodePathComponent *comp,
979 Thread *current_thread) const;
980 CPT(TransformState) r_get_partial_prev_transform(NodePathComponent *comp,
981 int n, Thread *current_thread) const;
982
983 void find_matches(NodePathCollection &result,
984 const std::string &approx_path_str,
985 int max_matches) const;
986 void find_matches(NodePathCollection &result,
987 FindApproxPath &approx_path,
988 int max_matches) const;
989 void find_matches(NodePathCollection &result,
991 int max_matches) const;
992
993 int r_clear_model_nodes(PandaNode *node);
994 void r_adjust_all_priorities(PandaNode *node, int adjustment);
995
996 void r_force_recompute_bounds(PandaNode *node);
997
998 void r_set_collide_mask(PandaNode *node,
999 CollideMask and_mask, CollideMask or_mask,
1000 TypeHandle node_type);
1001
1002 typedef phash_set<const InternalName *, pointer_hash> InternalNames;
1003 bool r_has_vertex_column(PandaNode *node, const InternalName *name) const;
1004 void r_find_all_vertex_columns(PandaNode *node,
1005 InternalNames &vertex_columns) const;
1006
1007 typedef phash_set<Texture *, pointer_hash> Textures;
1008 Texture *r_find_texture(PandaNode *node, const RenderState *state,
1009 const GlobPattern &glob) const;
1010 void r_find_all_textures(PandaNode *node, const RenderState *state,
1011 Textures &textures) const;
1012 Texture *r_find_texture(PandaNode *node, TextureStage *stage) const;
1013 void r_find_all_textures(PandaNode *node, TextureStage *stage,
1014 Textures &textures) const;
1015 static void r_replace_texture(PandaNode *node, Texture *tex, Texture *new_tex);
1016
1017 typedef phash_set<TextureStage *, pointer_hash> TextureStages;
1018 TextureStage *r_find_texture_stage(PandaNode *node, const RenderState *state,
1019 const GlobPattern &glob) const;
1020 void r_find_all_texture_stages(PandaNode *node, const RenderState *state,
1021 TextureStages &texture_stages) const;
1022
1023 void r_unify_texture_stages(PandaNode *node, TextureStage *stage);
1024
1025 typedef phash_set<Material *, pointer_hash> Materials;
1026 Material *r_find_material(PandaNode *node, const RenderState *state,
1027 const GlobPattern &glob) const;
1028 void r_find_all_materials(PandaNode *node, const RenderState *state,
1029 Materials &materials) const;
1030 static void r_replace_material(PandaNode *node, Material *mat,
1031 const MaterialAttrib *new_attrib);
1032
1033 PT(NodePathComponent) _head;
1034 int _backup_key;
1035 ErrorType _error_type;
1036 static int _max_search_depth;
1037
1038 static PStatCollector _get_transform_pcollector;
1039 static PStatCollector _verify_complete_pcollector;
1040
1041public:
1042 void write_datagram(BamWriter *manager, Datagram &dg) const;
1043 int complete_pointers(TypedWritable **plist, BamReader *manager);
1044 void fillin(DatagramIterator &scan, BamReader *manager);
1045
1046public:
1047 static TypeHandle get_class_type() {
1048 return _type_handle;
1049 }
1050 static void init_type() {
1051 register_type(_type_handle, "NodePath");
1052 }
1053
1054private:
1055 static TypeHandle _type_handle;
1056
1057 friend class NodePathCollection;
1058 friend class WorkingNodePath;
1059 friend class WeakNodePath;
1060 friend class CullTraverserData;
1061};
1062
1063INLINE std::ostream &operator << (std::ostream &out, const NodePath &node_path);
1064
1065#include "nodePathCollection.h"
1066
1067#include "nodePath.I"
1068
1069#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...
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:44
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.
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.
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...
This is the base class for a number of special render effects that may be set on scene graph nodes to...
This represents a unique collection of RenderEffect objects that correspond to a particular renderabl...
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.
This is a generic buffer object that lives in graphics memory.
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
Manages a list of Texture objects, as returned by TexturePool::find_all_textures().
Defines the properties of a named stage of the multitexture pipeline.
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
Definition texture.h:72
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.
This class is a wrapper around a NodePath that, unlike the actual NodePath class, doesn't hold a refe...
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 ...
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(),...
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.