Panda3D
Loading...
Searching...
No Matches
Public Types | Public Member Functions | List of all members
SceneGraphReducer Class Reference

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

#include "sceneGraphReducer.h"

Public Types

enum  AttribTypes {
  TT_transform = 0x001 , TT_color = 0x002 , TT_color_scale = 0x004 , TT_tex_matrix = 0x008 ,
  TT_clip_plane = 0x010 , TT_cull_face = 0x020 , TT_apply_texture_color = 0x040 , TT_other = 0x080
}
 
enum  CollectVertexData {
  CVD_name = 0x001 , CVD_model = 0x002 , CVD_transform = 0x004 , CVD_avoid_dynamic = 0x008 ,
  CVD_one_node_only = 0x010 , CVD_format = 0x020 , CVD_usage_hint = 0x040 , CVD_animation_type = 0x080
}
 
enum  CombineSiblings { CS_geom_node = 0x001 , CS_within_radius = 0x002 , CS_other = 0x004 , CS_recurse = 0x008 }
 
enum  MakeNonindexed { MN_composite_only = 0x001 , MN_avoid_animated = 0x002 , MN_avoid_dynamic = 0x004 }
 

Public Member Functions

 SceneGraphReducer (GraphicsStateGuardianBase *gsg=nullptr)
 
void apply_attribs (PandaNode *node, const AccumulatedAttribs &attribs, int attrib_types, GeomTransformer &transformer)
 This flavor of apply_attribs() can be called recursively from within another flatten process (e.g.
 
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, and removing them from the scene graph.
 
bool check_live_flatten (PandaNode *node)
 In a non-release build, returns false if the node is correctly not in a live scene graph.
 
void clear_gsg ()
 Specifies that no particular GraphicsStateGuardian will be used to guide the optimization.
 
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 a single, unified block (or at least multiple larger blocks).
 
void decompose (PandaNode *root)
 Calls decompose() on every GeomNode at this level and below.
 
int flatten (PandaNode *root, int combine_siblings_bits)
 Simplifies the graph by removing unnecessary nodes and nodes.
 
PN_stdfloat get_combine_radius () const
 Returns the radius that is used in conjunction with CS_within_radius.
 
GraphicsStateGuardianBaseget_gsg () const
 Returns the particular GraphicsStateGuardian that this object will attempt to optimize to.
 
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 objects that are found, so that all eligible vdatas (according to collect_bits; see collect_vertex_data) will share the same vertex format.
 
int make_compatible_state (PandaNode *root)
 Searches for GeomNodes that contain multiple Geoms that differ only in their ColorAttribs.
 
int make_nonindexed (PandaNode *root, int nonindexed_bits=~0)
 Converts indexed geometry to nonindexed geometry at the indicated node and below, by duplicating vertices where necessary.
 
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 Geom found to optimize it for eventual rendering on the indicated GSG.
 
int remove_column (PandaNode *root, const InternalName *column)
 Removes the indicated data column from any GeomVertexDatas found at the indicated root and below.
 
void remove_unused_vertices (PandaNode *root)
 Removes any vertices in GeomVertexDatas that are no longer used at this level and below.
 
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 siblings should be combined into a single node or not.
 
void set_gsg (GraphicsStateGuardianBase *gsg)
 Specifies the particular GraphicsStateGuardian that this object will attempt to optimize to.
 
void unify (PandaNode *root, bool preserve_order)
 Calls unify() on every GeomNode at this level and below.
 

Detailed Description

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.

Definition at line 39 of file sceneGraphReducer.h.

Member Enumeration Documentation

◆ AttribTypes

enum SceneGraphReducer::AttribTypes

Definition at line 44 of file sceneGraphReducer.h.

◆ CollectVertexData

enum SceneGraphReducer::CollectVertexData

Definition at line 62 of file sceneGraphReducer.h.

◆ CombineSiblings

enum SceneGraphReducer::CombineSiblings

Definition at line 55 of file sceneGraphReducer.h.

◆ MakeNonindexed

enum SceneGraphReducer::MakeNonindexed

Definition at line 100 of file sceneGraphReducer.h.

Constructor & Destructor Documentation

◆ SceneGraphReducer()

SceneGraphReducer::SceneGraphReducer ( GraphicsStateGuardianBase * gsg = nullptr)
inlineexplicit

Definition at line 17 of file sceneGraphReducer.I.

◆ ~SceneGraphReducer()

SceneGraphReducer::~SceneGraphReducer ( )
inline

Definition at line 27 of file sceneGraphReducer.I.

Member Function Documentation

◆ apply_attribs() [1/2]

void SceneGraphReducer::apply_attribs ( PandaNode * node,
const AccumulatedAttribs & attribs,
int attrib_types,
GeomTransformer & transformer )
inline

This flavor of apply_attribs() 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.

Definition at line 93 of file sceneGraphReducer.I.

◆ apply_attribs() [2/2]

void SceneGraphReducer::apply_attribs ( PandaNode * node,
int attrib_types = ~(TT_clip_plane | TT_cull_face | TT_apply_texture_color) )
inline

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.

Definition at line 77 of file sceneGraphReducer.I.

References check_live_flatten(), and GeomTransformer::finish_apply().

Referenced by TextNode::apply_attribs_to_vertices(), NodePath::apply_texture_colors(), RigidBodyCombiner::collect(), NodePath::flatten_light(), NodePath::flatten_medium(), and NodePath::flatten_strong().

◆ check_live_flatten()

bool SceneGraphReducer::check_live_flatten ( PandaNode * node)

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.

Definition at line 214 of file sceneGraphReducer.cxx.

References PandaNode::is_under_scene_root().

Referenced by apply_attribs(), collect_vertex_data(), decompose(), flatten(), make_compatible_format(), make_compatible_state(), make_nonindexed(), premunge(), remove_column(), remove_unused_vertices(), and unify().

◆ clear_gsg()

void SceneGraphReducer::clear_gsg ( )

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.

Definition at line 65 of file sceneGraphReducer.cxx.

References GeomTransformer::set_max_collect_vertices().

◆ collect_vertex_data()

int SceneGraphReducer::collect_vertex_data ( PandaNode * root,
int collect_bits = ~0 )
inline

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.

Definition at line 138 of file sceneGraphReducer.I.

References check_live_flatten(), and GeomTransformer::finish_collect().

Referenced by RigidBodyCombiner::collect(), NodePath::flatten_medium(), and NodePath::flatten_strong().

◆ decompose()

void SceneGraphReducer::decompose ( PandaNode * root)

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.

Definition at line 162 of file sceneGraphReducer.cxx.

References check_live_flatten().

◆ flatten()

int SceneGraphReducer::flatten ( PandaNode * root,
int combine_siblings_bits )

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.

Definition at line 84 of file sceneGraphReducer.cxx.

References check_live_flatten(), PandaNode::Children::get_child(), PandaNode::get_children, PandaNode::get_num_children, PandaNode::Children::get_num_children(), and PandaNode::safe_to_combine_children().

Referenced by NodePath::flatten_medium(), and NodePath::flatten_strong().

◆ get_combine_radius()

PN_stdfloat SceneGraphReducer::get_combine_radius ( ) const
inline

Returns the radius that is used in conjunction with CS_within_radius.

See set_combine_radius().

Definition at line 60 of file sceneGraphReducer.I.

◆ get_gsg()

GraphicsStateGuardianBase * SceneGraphReducer::get_gsg ( ) const
inline

Returns the particular GraphicsStateGuardian that this object will attempt to optimize to.

See set_gsg().

Definition at line 35 of file sceneGraphReducer.I.

◆ make_compatible_format()

int SceneGraphReducer::make_compatible_format ( PandaNode * root,
int collect_bits = ~0 )
inline

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 collect_vertex_data() will do this anyway if it has not been done already. However, calling it ahead of time can make that future call to collect_vertex_data() run a little bit faster.

The return value is the number of vertex datas modified.

Definition at line 116 of file sceneGraphReducer.I.

References check_live_flatten(), and GeomTransformer::finish_collect().

◆ make_compatible_state()

int SceneGraphReducer::make_compatible_state ( PandaNode * root)

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.

Definition at line 142 of file sceneGraphReducer.cxx.

References check_live_flatten(), and GeomTransformer::finish_apply().

Referenced by NodePath::flatten_medium(), and NodePath::flatten_strong().

◆ make_nonindexed()

int SceneGraphReducer::make_nonindexed ( PandaNode * root,
int nonindexed_bits = ~0 )
inline

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 SceneGraphReducer::MakeNonindexed, which specifes which types of geometry to avoid making nonindexed.

Definition at line 156 of file sceneGraphReducer.I.

References check_live_flatten().

◆ premunge()

void SceneGraphReducer::premunge ( PandaNode * root,
const RenderState * initial_state )
inline

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.

Definition at line 172 of file sceneGraphReducer.I.

References check_live_flatten().

Referenced by NodePath::premunge_scene().

◆ remove_column()

int SceneGraphReducer::remove_column ( PandaNode * root,
const InternalName * column )

Removes the indicated data column from any GeomVertexDatas found at the indicated root and below.

Returns the number of GeomNodes modified.

Definition at line 126 of file sceneGraphReducer.cxx.

References check_live_flatten(), and GeomTransformer::finish_apply().

◆ remove_unused_vertices()

void SceneGraphReducer::remove_unused_vertices ( PandaNode * root)

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.

Definition at line 195 of file sceneGraphReducer.cxx.

References check_live_flatten(), Thread::consider_yield(), and GeomTransformer::finish_apply().

◆ set_combine_radius()

void SceneGraphReducer::set_combine_radius ( PN_stdfloat combine_radius)
inline

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).

Definition at line 51 of file sceneGraphReducer.I.

◆ set_gsg()

void SceneGraphReducer::set_gsg ( GraphicsStateGuardianBase * gsg)

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().

Definition at line 43 of file sceneGraphReducer.cxx.

References GraphicsStateGuardianBase::get_default_gsg(), and GeomTransformer::set_max_collect_vertices().

◆ unify()

void SceneGraphReducer::unify ( PandaNode * root,
bool preserve_order )

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().

Definition at line 177 of file sceneGraphReducer.cxx.

References check_live_flatten().

Referenced by RigidBodyCombiner::collect(), NodePath::flatten_medium(), and NodePath::flatten_strong().


The documentation for this class was generated from the following files: