Panda3D
sceneGraphReducer.I
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 sceneGraphReducer.I
10  * @author drose
11  * @date 2002-03-14
12  */
13 
14 /**
15  *
16  */
17 INLINE SceneGraphReducer::
18 SceneGraphReducer(GraphicsStateGuardianBase *gsg) :
19  _combine_radius(0.0f)
20 {
21  set_gsg(gsg);
22 }
23 
24 /**
25  *
26  */
27 INLINE SceneGraphReducer::
28 ~SceneGraphReducer() {
29 }
30 
31 /**
32  * Returns the particular GraphicsStateGuardian that this object will attempt
33  * to optimize to. See set_gsg().
34  */
36 get_gsg() const {
37  return _gsg;
38 }
39 
40 
41 /**
42  * Specifies the radius that is used in conjunction with CS_within_radius to
43  * decide whether a subgraph's siblings should be combined into a single node
44  * or not.
45  *
46  * If the CS_within_radius bit is included in the combine_siblings_bits
47  * parameter passed to flatten, than any nodes whose bounding volume is
48  * smaller than the indicated radius will be combined together (as if CS_other
49  * were set).
50  */
51 INLINE void SceneGraphReducer::
52 set_combine_radius(PN_stdfloat combine_radius) {
53  _combine_radius = combine_radius;
54 }
55 
56 /**
57  * Returns the radius that is used in conjunction with CS_within_radius. See
58  * set_combine_radius().
59  */
60 INLINE PN_stdfloat SceneGraphReducer::
62  return _combine_radius;
63 }
64 
65 
66 /**
67  * Walks the scene graph, accumulating attribs of the indicated types,
68  * applying them to the vertices, and removing them from the scene graph.
69  * This has a performance optimization benefit in itself, but is especially
70  * useful to pave the way for a call to flatten() and greatly improve the
71  * effectiveness of the flattening operation.
72  *
73  * Multiply instanced geometry is duplicated before the attribs are applied.
74  *
75  * Of course, this operation does make certain dynamic operations impossible.
76  */
77 INLINE void SceneGraphReducer::
78 apply_attribs(PandaNode *node, int attrib_types) {
79  nassertv(check_live_flatten(node));
80  nassertv(node != nullptr);
81  PStatTimer timer(_apply_collector);
82  AccumulatedAttribs attribs;
83  r_apply_attribs(node, attribs, attrib_types, _transformer);
84  _transformer.finish_apply();
85 }
86 
87 /**
88  * This flavor of apply_attribs() can be called recursively from within
89  * another flatten process (e.g. from
90  * PandaNode::apply_attribs_to_vertices()). The parameters were presumably
91  * received from a parent SceneGraphReducer object.
92  */
93 INLINE void SceneGraphReducer::
95  int attrib_types, GeomTransformer &transformer) {
96  nassertv(node != nullptr);
97  r_apply_attribs(node, attribs, attrib_types, transformer);
98 }
99 
100 /**
101  * Walks through the tree at this node and below and unifies the
102  * GeomVertexFormat for any GeomVertexData objects that are found, so that all
103  * eligible vdatas (according to collect_bits; see collect_vertex_data) will
104  * share the same vertex format.
105  *
106  * This will add unused columns where necessary to match formats. It can
107  * result in suboptimal performance if used needlessly.
108  *
109  * There is usually no reason to call this explicitly, since
110  * collect_vertex_data() will do this anyway if it has not been done already.
111  * However, calling it ahead of time can make that future call to
112  * collect_vertex_data() run a little bit faster.
113  *
114  * The return value is the number of vertex datas modified.
115  */
116 INLINE int SceneGraphReducer::
117 make_compatible_format(PandaNode *root, int collect_bits) {
118  nassertr(root != nullptr, 0);
119  nassertr(check_live_flatten(root), 0);
120  PStatTimer timer(_collect_collector);
121  int count = 0;
122  count += r_collect_vertex_data(root, collect_bits, _transformer, true);
123  count += _transformer.finish_collect(true);
124  return count;
125 }
126 
127 /**
128  * Collects all different GeomVertexData blocks that have compatible formats
129  * at this node and below into a single, unified block (or at least multiple
130  * larger blocks). This is intended to reduce rendering overhead incurred by
131  * switching vertex buffers. It can also make a subsequent call to unify()
132  * much more effective than it would have been otherwise.
133  *
134  * The set of bits passed in collect_bits indicates which properties are used
135  * to differentiate GeomVertexData blocks. If it is 0, then more blocks will
136  * be combined together than if it is nonzero.
137  */
138 INLINE int SceneGraphReducer::
139 collect_vertex_data(PandaNode *root, int collect_bits) {
140  nassertr(root != nullptr, 0);
141  nassertr(check_live_flatten(root), 0);
142  PStatTimer timer(_collect_collector);
143  int count = 0;
144  count += r_collect_vertex_data(root, collect_bits, _transformer, false);
145  count += _transformer.finish_collect(false);
146  return count;
147 }
148 
149 /**
150  * Converts indexed geometry to nonindexed geometry at the indicated node and
151  * below, by duplicating vertices where necessary. The parameter
152  * nonindexed_bits is a union of bits defined in
153  * SceneGraphReducer::MakeNonindexed, which specifes which types of geometry
154  * to avoid making nonindexed.
155  */
156 INLINE int SceneGraphReducer::
157 make_nonindexed(PandaNode *root, int nonindexed_bits) {
158  nassertr(root != nullptr, 0);
159  nassertr(check_live_flatten(root), 0);
160  PStatTimer timer(_make_nonindexed_collector);
161  return r_make_nonindexed(root, nonindexed_bits);
162 }
163 
164 /**
165  * Walks the scene graph rooted at this node and below, and uses the indicated
166  * GSG to premunge every Geom found to optimize it for eventual rendering on
167  * the indicated GSG. If there is no GSG indicated for the SceneGraphReducer,
168  * this is a no-op.
169  *
170  * This operation will also apply to stashed children.
171  */
172 INLINE void SceneGraphReducer::
173 premunge(PandaNode *root, const RenderState *initial_state) {
174  nassertv(root != nullptr);
175  nassertv(check_live_flatten(root));
176  if (_gsg != nullptr) {
177  PStatTimer timer(_premunge_collector);
178  r_premunge(root, initial_state);
179  }
180 }
A basic node of the scene graph or data graph.
Definition: pandaNode.h:64
int collect_vertex_data(PandaNode *root, int collect_bits=~0)
Collects all different GeomVertexData blocks that have compatible formats at this node and below into...
int make_compatible_format(PandaNode *root, int collect_bits=~0)
Walks through the tree at this node and below and unifies the GeomVertexFormat for any GeomVertexData...
void set_combine_radius(PN_stdfloat combine_radius)
Specifies the radius that is used in conjunction with CS_within_radius to decide whether a subgraph's...
A lightweight class that can be used to automatically start and stop a PStatCollector around a sectio...
Definition: pStatTimer.h:30
GraphicsStateGuardianBase * get_gsg() const
Returns the particular GraphicsStateGuardian that this object will attempt to optimize to.
void set_gsg(GraphicsStateGuardianBase *gsg)
Specifies the particular GraphicsStateGuardian that this object will attempt to optimize to.
int finish_collect(bool format_only)
This should be called after a call to collect_vertex_data() to finalize the changes and apply them to...
This class is used by the SceneGraphReducer to maintain and accumulate the set of attributes we have ...
int make_nonindexed(PandaNode *root, int nonindexed_bits=~0)
Converts indexed geometry to nonindexed geometry at the indicated node and below, by duplicating vert...
PN_stdfloat get_combine_radius() const
Returns the radius that is used in conjunction with CS_within_radius.
void premunge(PandaNode *root, const RenderState *initial_state)
Walks the scene graph rooted at this node and below, and uses the indicated GSG to premunge every Geo...
bool check_live_flatten(PandaNode *node)
In a non-release build, returns false if the node is correctly not in a live scene graph.
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
Definition: renderState.h:47
void apply_attribs(PandaNode *node, int attrib_types=~(TT_clip_plane|TT_cull_face|TT_apply_texture_color))
Walks the scene graph, accumulating attribs of the indicated types, applying them to the vertices,...
void finish_apply()
Should be called after performing any operations–particularly PandaNode::apply_attribs_to_vertices()–...
This is a base class for the GraphicsStateGuardian class, which is itself a base class for the variou...
An object specifically designed to transform the vertices of a Geom without disturbing indexing or af...