class SceneGraphReducer

An interface for simplifying (“flattening”) scene graphs by eliminating unneeded nodes and collapsing out unneeded state changes and transforms.

This class is designed so that it may be inherited from and specialized, if needed, to fine-tune the flattening behavior, but normally the default behavior is sufficient.

Inheritance diagram

Inheritance diagram of SceneGraphReducer

enum AttribTypes
enumerator TT_transform = 1
enumerator TT_color = 2
enumerator TT_color_scale = 4
enumerator TT_tex_matrix = 8
enumerator TT_clip_plane = 16
enumerator TT_cull_face = 32
enumerator TT_apply_texture_color = 64
enumerator TT_other = 128
enum CollectVertexData
enumerator CVD_name = 1

If set, two GeomVertexDatas with different names will not be collected together.

enumerator CVD_model = 2

If set, a ModelNode begins a subgraph of nodes whose GeomVertexDatas will not be collected with nodes outside the subgraph.

enumerator CVD_transform = 4

If set, a non-identity transform begins a subgraph of nodes whose GeomVertexDatas will not be collected with nodes outside the subgraph.

enumerator CVD_avoid_dynamic = 8

If set, GeomVertexDatas with any usage_hint other than UH_static will not be collected with any other Geoms in a different GeomNode. However, two different dynamic Geoms within the same node might still be collected together.

enumerator CVD_one_node_only = 16

If set, only those GeomVertexDatas within the same node might be collected together.

enumerator CVD_format = 32

If set, two GeomVertexDatas with different formats will not be collected together. If not set, GeomVertexDatas of different formats may be combined by expanding all GeomVertexDatas to the union of all defined columns.

enumerator CVD_usage_hint = 64

If set, two GeomVertexDatas with different usage hints (for instance, UH_static vs. UH_dynamic) will not be collected together.

enumerator CVD_animation_type = 128

If set, GeomVertexDatas with unanimated vertices will not be combined with GeomVertexDatas with animated vertices.

enum CombineSiblings
enumerator CS_geom_node = 1
enumerator CS_within_radius = 2
enumerator CS_other = 4
enumerator CS_recurse = 8
enum MakeNonindexed
enumerator MN_composite_only = 1

If set, only composite primitives such as tristrips and trifans will be made nonindexed; simple primitives such as triangles will be left indexed.

enumerator MN_avoid_animated = 2

If set any GeomVertexData with any animation indication will not be adjusted, whether the animation is to be performed on the CPU or on the graphics pipe.

enumerator MN_avoid_dynamic = 4

If set, any GeomVertexData or Geom with a usage_hint other than UH_static will not be made nonindexed.

__init__(gsg: GraphicsStateGuardianBase) → None
__init__(param0: SceneGraphReducer) → None
applyAttribs(node: PandaNode, attribs: AccumulatedAttribs, attrib_types: int, transformer: GeomTransformer) → None

This flavor of applyAttribs() can be called recursively from within another flatten process (e.g. from PandaNode::apply_attribs_to_vertices()). The parameters were presumably received from a parent SceneGraphReducer object.

applyAttribs(node: PandaNode, attrib_types: int) → None

Walks the scene graph, accumulating attribs of the indicated types, applying them to the vertices, and removing them from the scene graph. This has a performance optimization benefit in itself, but is especially useful to pave the way for a call to flatten() and greatly improve the effectiveness of the flattening operation.

Multiply instanced geometry is duplicated before the attribs are applied.

Of course, this operation does make certain dynamic operations impossible.

checkLiveFlatten(node: PandaNode) → bool

In a non-release build, returns false if the node is correctly not in a live scene graph. (Calling flatten on a node that is part of a live scene graph, for instance, a node somewhere under render, can cause problems in a multithreaded environment.)

If allow_live_flatten is true, or in a release build, this always returns true.

clearGsg() → None

Specifies that no particular GraphicsStateGuardian will be used to guide the optimization. The SceneGraphReducer will instead use config variables such as max-collect-vertices and max-collect-indices.

collectVertexData(root: PandaNode, collect_bits: int) → int

Collects all different GeomVertexData blocks that have compatible formats at this node and below into a single, unified block (or at least multiple larger blocks). This is intended to reduce rendering overhead incurred by switching vertex buffers. It can also make a subsequent call to unify() much more effective than it would have been otherwise.

The set of bits passed in collect_bits indicates which properties are used to differentiate GeomVertexData blocks. If it is 0, then more blocks will be combined together than if it is nonzero.

decompose(root: PandaNode) → None

Calls decompose() on every GeomNode at this level and below.

There is usually no reason to call this explicitly, since unify() will do this anyway if it needs to be done. However, calling it ahead of time can make that future call to unify() run a little bit faster.

This operation has no effect if the config variable preserve-triangle- strips has been set true.

flatten(root: PandaNode, combine_siblings_bits: int) → int

Simplifies the graph by removing unnecessary nodes and nodes.

In general, a node (and its parent node) is a candidate for removal if the node has no siblings and the node has no special properties.

If combine_siblings_bits is nonzero, some sibling nodes (according to the bits set in combine_siblings_bits) may also be collapsed into a single node. This will further reduce scene graph complexity, sometimes substantially, at the cost of reduced spatial separation.

Returns the number of nodes removed from the graph.

getCombineRadius() → float

Returns the radius that is used in conjunction with CS_within_radius. See setCombineRadius().

getGsg() → GraphicsStateGuardianBase

Returns the particular GraphicsStateGuardian that this object will attempt to optimize to. See setGsg().

Return type


makeCompatibleFormat(root: PandaNode, collect_bits: int) → int

Walks through the tree at this node and below and unifies the GeomVertexFormat for any GeomVertexData objects that are found, so that all eligible vdatas (according to collect_bits; see collect_vertex_data) will share the same vertex format.

This will add unused columns where necessary to match formats. It can result in suboptimal performance if used needlessly.

There is usually no reason to call this explicitly, since collectVertexData() will do this anyway if it has not been done already. However, calling it ahead of time can make that future call to collectVertexData() run a little bit faster.

The return value is the number of vertex datas modified.

makeCompatibleState(root: PandaNode) → int

Searches for GeomNodes that contain multiple Geoms that differ only in their ColorAttribs. If such a GeomNode is found, then all the colors are pushed down into the vertices. This makes it feasible for the geoms to be unified later.

makeNonindexed(root: PandaNode, nonindexed_bits: int) → int

Converts indexed geometry to nonindexed geometry at the indicated node and below, by duplicating vertices where necessary. The parameter nonindexed_bits is a union of bits defined in SceneGraphReducerMakeNonindexed, which specifes which types of geometry to avoid making nonindexed.

premunge(root: PandaNode, initial_state: RenderState) → None

Walks the scene graph rooted at this node and below, and uses the indicated GSG to premunge every Geom found to optimize it for eventual rendering on the indicated GSG. If there is no GSG indicated for the SceneGraphReducer, this is a no-op.

This operation will also apply to stashed children.

removeColumn(root: PandaNode, column: InternalName) → int

Removes the indicated data column from any GeomVertexDatas found at the indicated root and below. Returns the number of GeomNodes modified.

removeUnusedVertices(root: PandaNode) → None

Removes any vertices in GeomVertexDatas that are no longer used at this level and below. This requires remapping vertex indices in all of the GeomPrimitives, to remove holes in the GeomVertexDatas. It is normally not necessary to call this explicitly.

setCombineRadius(combine_radius: float) → None

Specifies the radius that is used in conjunction with CS_within_radius to decide whether a subgraph’s siblings should be combined into a single node or not.

If the CS_within_radius bit is included in the combine_siblings_bits parameter passed to flatten, than any nodes whose bounding volume is smaller than the indicated radius will be combined together (as if CS_other were set).

setGsg(gsg: GraphicsStateGuardianBase) → None

Specifies the particular GraphicsStateGuardian that this object will attempt to optimize to. The GSG may specify parameters such as maximum number of vertices per vertex data, max number of vertices per primitive, and whether triangle strips are preferred. It also affects the types of vertex column data that is created by premunge().

unify(root: PandaNode, preserve_order: bool) → None

Calls unify() on every GeomNode at this level and below. This attempts to reduce the total number of individual Geoms and GeomPrimitives by combining these objects wherever possible. See GeomNode.unify().