Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://coin3d.github.io
https://www.kongsberg.com/en/kogt/
SoGetBoundingBoxAction Class Reference

The SoGetBoundingBoxAction class calculates bounding boxes for nodes and subgraphs. More...

#include <Inventor/actions/SoGetBoundingBoxAction.h>

Inheritance diagram for SoGetBoundingBoxAction:
SoAction

Public Types

enum  ResetType { TRANSFORM = 0x1, BBOX = 0x2, ALL = TRANSFORM | BBOX }
 
- Public Types inherited from SoAction
enum  AppliedCode { NODE = 0, PATH = 1, PATH_LIST = 2 }
 
enum  PathCode { NO_PATH = 0, IN_PATH = 1, BELOW_PATH = 2, OFF_PATH = 3 }
 

Public Member Functions

virtual SoType getTypeId (void) const
 
 SoGetBoundingBoxAction (const SbViewportRegion &vp)
 
virtual ~SoGetBoundingBoxAction (void)
 
void setViewportRegion (const SbViewportRegion &newregion)
 
const SbViewportRegiongetViewportRegion (void) const
 
SbBox3f getBoundingBox (void) const
 
SbXfBox3fgetXfBoundingBox (void)
 
const SbVec3fgetCenter (void) const
 
void setInCameraSpace (const SbBool flag)
 
SbBool isInCameraSpace (void) const
 
void setResetPath (const SoPath *path, const SbBool resetbefore=TRUE, const ResetType what=ALL)
 
const SoPathgetResetPath (void) const
 
SbBool isResetPath (void) const
 
SbBool isResetBefore (void) const
 
SoGetBoundingBoxAction::ResetType getWhatReset (void) const
 
void checkResetBefore (void)
 
void checkResetAfter (void)
 
void extendBy (const SbBox3f &box)
 
void extendBy (const SbXfBox3f &box)
 
void setCenter (const SbVec3f &center, const SbBool transformcenter)
 
SbBool isCenterSet (void) const
 
void resetCenter (void)
 
- Public Member Functions inherited from SoAction
virtual ~SoAction (void)
 
virtual SbBool isOfType (SoType type) const
 
virtual void apply (SoNode *root)
 
virtual void apply (SoPath *path)
 
virtual void apply (const SoPathList &pathlist, SbBool obeysrules=FALSE)
 
void apply (SoAction *beingApplied)
 
virtual void invalidateState (void)
 
AppliedCode getWhatAppliedTo (void) const
 
SoNodegetNodeAppliedTo (void) const
 
SoPathgetPathAppliedTo (void) const
 
const SoPathListgetPathListAppliedTo (void) const
 
const SoPathListgetOriginalPathListAppliedTo (void) const
 
SbBool isLastPathListAppliedTo (void) const
 
PathCode getPathCode (int &numindices, const int *&indices)
 
void traverse (SoNode *const node)
 
SbBool hasTerminated (void) const
 
const SoPathgetCurPath (void)
 
SoStategetState (void) const
 
PathCode getCurPathCode (void) const
 
virtual SoNodegetCurPathTail (void)
 
void usePathCode (int &numindices, const int *&indices)
 
void pushCurPath (const int childindex, SoNode *node=NULL)
 
void popCurPath (const PathCode prevpathcode)
 
void pushCurPath (void)
 
void popPushCurPath (const int childindex, SoNode *node=NULL)
 
void popCurPath (void)
 
void switchToPathTraversal (SoPath *path)
 
void switchToNodeTraversal (SoNode *node)
 

Static Public Member Functions

static SoType getClassTypeId (void)
 
static void addMethod (const SoType type, SoActionMethod method)
 
static void enableElement (const SoType type, const int stackindex)
 
static void initClass (void)
 
- Static Public Member Functions inherited from SoAction
static void initClass (void)
 
static void initClasses (void)
 
static SoType getClassTypeId (void)
 
static void nullAction (SoAction *action, SoNode *node)
 

Protected Member Functions

virtual const SoEnabledElementsListgetEnabledElements (void) const
 
virtual void beginTraversal (SoNode *node)
 
- Protected Member Functions inherited from SoAction
 SoAction (void)
 
virtual void endTraversal (SoNode *node)
 
void setTerminated (const SbBool flag)
 
virtual SbBool shouldCompactPathList (void) const
 

Static Protected Member Functions

static SoEnabledElementsListgetClassEnabledElements (void)
 
static SoActionMethodListgetClassActionMethods (void)
 
- Static Protected Member Functions inherited from SoAction
static SoEnabledElementsListgetClassEnabledElements (void)
 
static SoActionMethodListgetClassActionMethods (void)
 

Additional Inherited Members

- Protected Attributes inherited from SoAction
SoStatestate
 
SoActionMethodListtraversalMethods
 

Detailed Description

The SoGetBoundingBoxAction class calculates bounding boxes for nodes and subgraphs.

If this action is applied to a path or scene graph root, it will calculate the bounding box and the center point of the geometry contained within the scene.

You don't have to apply an SoGetBoundingBoxAction to the root of a scene. When using the action, you will get the bounding box of the node you are applying it to and that node's sub-tree in the scene graph (if any).

The calculated bounding box will be in the local coordinates of that sub-tree. If applying it to a scene graph root node, the calculated bounding box will be in global coordinates.

The use of bounding boxes is ubiquitous within the Coin library. It is needed for the correct execution of and for performance enhancements during rendering, picking, caching, culling, etc.

SoSeparator nodes are aggressively caching the results of bounding box calculations, so that they are really only re-calculated whenever the scene graph rooted below any SoSeparator node has been modified. This means that applying this action to scene graphs, or parts of scene graphs, should be very quick on successive runs for "static" parts of the scene.

Note that the algorithm used is not guaranteed to always give an exact bounding box: it combines bounding boxes in pairs and extends one of them to contain the other. Since the boxes need not be parallel to the principal axes the new box might not be a perfect fit for the box not extended (its coordinate system has been changed).

Note also that what is returned from getBoundingBox() will be projected so as to be oriented along the principal axes, which can often cause it to become quite a lot larger than what it was before projection. For client code to obtain the best bounding box that Coin can calculate (and which will usually be exact), you need to use the getXfBoundingBox() method after having applied the SoGetBoundingBoxAction.

See also
SoSeparator::boundingBoxCaching

Member Enumeration Documentation

◆ ResetType

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Constructor & Destructor Documentation

◆ SoGetBoundingBoxAction()

SoGetBoundingBoxAction::SoGetBoundingBoxAction ( const SbViewportRegion vp)

Constructor.

It might seem unnecessary to have to pass in a viewport region argument to calculate bounding boxes, but there is a good reason for this: a few shape nodes needs to know the viewport region to calculate their bounding box – these include SoText2 and SoImage, among others.

What is particular about these shapes is that they are fundamentally 2D shapes, but they are being rendered on the screen "surface" as if they were in a 3D scene. (This is possible because we can match each pixel's depth value against the 3D shapes in the scene.)

To compute an accurate 3D bounding box of a shape rendered in 2D on the screen "surface", you need to "de-project" the screen space area it occupies to a 2D rectangle placed at some depth in the scene. This "de-projecting" operation needs to know about the dimensions of the viewport.

Also, some 3D shapes like for instance SoNurbsSurface, get slightly distorted if there's an SoComplexity node in the scene graph with the SoComplexity::value field set to SCREEN_SPACE. Then it is also necessary to know the viewport region to find out how to accurately calculate the bounding box of those shapes.

You would usually want to pass in a viewport region equal to the layout of the current render area canvas. If you have a viewer or So@Gui@RenderArea available, you can get hold of the viewport region data simply by doing

const SbViewportRegion & vpreg = viewer->getViewportRegion();

(If you don't have a viewer or render area available in your application at the point where you want to get the bounding box, it probably doesn't matter much what you set it to. The accuracy of the bounding box calculation might be slightly wrong versus the actual rendered appearance of the scene, but this is usually not noticeable.)

◆ ~SoGetBoundingBoxAction()

SoGetBoundingBoxAction::~SoGetBoundingBoxAction ( void  )
virtual

Destructor.

Member Function Documentation

◆ getTypeId()

SoType SoGetBoundingBoxAction::getTypeId ( void  ) const
virtual

Returns the type identification of an action derived from a class inheriting SoAction. This is used for runtime type checking and "downward" casting.

Usage example:

void bar(SoAction * action)
{
if (action->getTypeId() == SoGLRenderAction::getClassTypeId()) {
// safe downward cast, know the type
SoGLRenderAction * glrender = (SoGLRenderAction *)action;
}
return; // ignore if not render action
}

For application programmers wanting to extend the library with new actions: this method needs to be overridden in all subclasses. This is typically done as part of setting up the full type system for extension classes, which is usually accomplished by using the predefined macros available through Inventor/nodes/SoSubAction.h: SO_ACTION_SOURCE, SO_ACTION_INIT_CLASS and SO_ACTION_CONSTRUCTOR.

For more information on writing Coin extensions, see the SoAction class documentation.

Returns the actual type id of an object derived from a class inheriting SoAction. Needs to be overridden in all subclasses.

Implements SoAction.

◆ addMethod()

void SoGetBoundingBoxAction::addMethod ( const SoType  type,
SoActionMethod  method 
)
static

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

◆ enableElement()

void SoGetBoundingBoxAction::enableElement ( const SoType  type,
const int  stackindex 
)
static

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

◆ getEnabledElements()

const SoEnabledElementsList & SoGetBoundingBoxAction::getEnabledElements ( void  ) const
protectedvirtual

Returns a list of the elements used by action instances of this class upon traversal operations.

Reimplemented from SoAction.

◆ setViewportRegion()

void SoGetBoundingBoxAction::setViewportRegion ( const SbViewportRegion newregion)

Set a new viewport region with this method, if it has changed from the one passed in with the constructor.

◆ getViewportRegion()

const SbViewportRegion & SoGetBoundingBoxAction::getViewportRegion ( void  ) const

Returns the viewport region used by the action instance.

◆ getBoundingBox()

SbBox3f SoGetBoundingBoxAction::getBoundingBox ( void  ) const

Returns the projected bounding box after (or during) traversal.

◆ getXfBoundingBox()

SbXfBox3f & SoGetBoundingBoxAction::getXfBoundingBox ( void  )

Returns the bounding box and transformation matrix to global coordinates. Use after (or during) traversal.

◆ getCenter()

const SbVec3f & SoGetBoundingBoxAction::getCenter ( void  ) const

Returns center point of scene after the action has been applied.

This might differ from the geometric center of the bounding box, as shape nodes may "weight" the center point according to various criteria (i.e. a faceset could for instance weight the center point according to the area within its bounding box where there are more polygons).

◆ setInCameraSpace()

void SoGetBoundingBoxAction::setInCameraSpace ( const SbBool  on)

Sets whether the returned bounding box should be calculated in the coordinate system of the camera space or not.

◆ isInCameraSpace()

SbBool SoGetBoundingBoxAction::isInCameraSpace ( void  ) const

Returns whether the bounding box returned is to be in camera space.

◆ setResetPath()

void SoGetBoundingBoxAction::setResetPath ( const SoPath path,
const SbBool  resetbefore = TRUE,
const ResetType  what = ALL 
)

Forces the computed bounding box to be reset and the transformation to be identity before or after the tail node of path, depending on the resetbefore argument. NULL can be specified for the path argument to disable this behavior.

See also
getResetPath(), isResetPath(), isResetBefore(), getWhatReset()

◆ getResetPath()

const SoPath * SoGetBoundingBoxAction::getResetPath ( void  ) const

Returns the reset path (or NULL).

See also
setResetPath(), isResetPath(), isResetBefore(), getWhatReset()

◆ isResetPath()

SbBool SoGetBoundingBoxAction::isResetPath ( void  ) const

Returns whether a reset path is set or not.

See also
setResetPath(), getResetPath(), isResetBefore(), getWhatReset()

◆ isResetBefore()

SbBool SoGetBoundingBoxAction::isResetBefore ( void  ) const

Returns whether the bounding box and transformation is reset before or after the tail node of the reset path.

See also
setResetPath(), getResetPath(), isResetPath(), getWhatReset()

◆ getWhatReset()

SoGetBoundingBoxAction::ResetType SoGetBoundingBoxAction::getWhatReset ( void  ) const

Returns what type of reset has been specified for the reset path.

See also
setResetPath(), getResetPath(), isResetPath(), isResetBefore()

◆ checkResetBefore()

void SoGetBoundingBoxAction::checkResetBefore ( void  )

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Called before node traversal of each node (from SoNode action method).

◆ checkResetAfter()

void SoGetBoundingBoxAction::checkResetAfter ( void  )

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Called after node traversal of each node (from SoNode action method).

◆ extendBy() [1/2]

void SoGetBoundingBoxAction::extendBy ( const SbBox3f box)

Extend bounding box by the given box. Called from nodes during traversal.

Should usually not be of interest to application programmers, unless you're extending Coin with your own shapenode extension classes.

◆ extendBy() [2/2]

void SoGetBoundingBoxAction::extendBy ( const SbXfBox3f box)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ setCenter()

void SoGetBoundingBoxAction::setCenter ( const SbVec3f centerarg,
const SbBool  transformcenter 
)

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Set a new center point during traversal.

◆ isCenterSet()

SbBool SoGetBoundingBoxAction::isCenterSet ( void  ) const

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Query about the center point during traversal.

◆ resetCenter()

void SoGetBoundingBoxAction::resetCenter ( void  )

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Reset the scene center point during traversal.

◆ beginTraversal()

void SoGetBoundingBoxAction::beginTraversal ( SoNode node)
protectedvirtual

This virtual method is called from SoAction::apply(), and is the entry point for the actual scene graph traversal.

It can be overridden to initialize the action at traversal start, for specific initializations in the action subclasses inheriting SoAction.

Default method just calls traverse(), which any overridden implementation of the method must do too (or call SoAction::beginTraversal()) to trigger the scene graph traversal.

Reimplemented from SoAction.


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