NAME
SoSurroundScale -
The SoSurroundScale class is used to automatically scale geometry to
surround other geometry.
This node calculates a transformation (a translation and a scale) which
will, when the node is traversed, be appended to the current model
matrix, making a default cube placed directly to the right of this node
in the graph surround geometry to the right of the container branch
this node is on. The container is specified by the field
SoSurroundScale::numNodesUpToContainer.
SYNOPSIS
#include <Inventor/nodes/SoSurroundScale.h>
Inherits SoTransformation.
Public Member Functions
SoSurroundScale (void)
void invalidate (void)
virtual void doAction (SoAction *action)
void setDoingTranslations (const SbBool val)
SbBool isDoingTranslations (void)
Static Public Member Functions
static void initClass (void)
Public Attributes
SoSFInt32 numNodesUpToContainer
SoSFInt32 numNodesUpToReset
Protected Member Functions
virtual ~SoSurroundScale ()
virtual void callback (SoCallbackAction *action)
virtual void GLRender (SoGLRenderAction *action)
virtual void getBoundingBox (SoGetBoundingBoxAction *action)
virtual void getMatrix (SoGetMatrixAction *action)
virtual void pick (SoPickAction *action)
void updateMySurroundParams (SoAction *action, const SbMatrix &inv)
void setIgnoreInBbox (const SbBool val)
SbBool isIgnoreInBbox (void)
Protected Attributes
SbVec3f cachedScale
SbVec3f cachedInvScale
SbVec3f cachedTranslation
SbBool cacheOK
SbBool doTranslations
Detailed Description
The SoSurroundScale class is used to automatically scale geometry to
surround other geometry.
This node calculates a transformation (a translation and a scale) which
will, when the node is traversed, be appended to the current model
matrix, making a default cube placed directly to the right of this node
in the graph surround geometry to the right of the container branch
this node is on. The container is specified by the field
SoSurroundScale::numNodesUpToContainer.
When calculating the bounding box to be surrounded, the bounding box
action will be applied to the container node, and the bounding box
calculations will be reset after traversing the node specified by the
field SoSurroundScale::numNodesUpToReset.
A way of thinking of the container node is that there exists a path
from the root-node to the SoSurroundScale node. This path has a number
of nodes in it. numNodesUpToContainer is the number of nodes in the
path from the SoSurroundScale node towards the root node. When having
counted numNodesUpToContainer from the SoSurroundScale node, you will
have reached the container node. The container node is the seed-node
that the bounding box is calculated from. All nodes lower than the
seed-node will be a part of the bounding box unless they are closer to
the SoSurroundScale node than numNodesUpToReset.
To make sure the node(s) that are to be scaled by the SoSurroundScale
node aren’t a part of the bounding box, the numNodesUpToReset is used.
It is also the number of nodes up from the SoSurroundScale node towards
the root node. The meaning of numNodesUpToReset is that nodes that are
closer to the SoSurroundNode than the node at position
numNodesUpToReset are not to be used for bounding box calculations.
Here’s a complete, stand-alone example which sets up an
SoTrackballDragger (connected to a cube), and uses an SoSurroundScale
node to make it auto-scale to the size of the high cube and translates
it an offset to one side of the cube:
#include <Inventor/Qt/SoQt.h>
#include <Inventor/Qt/viewers/SoQtExaminerViewer.h>
#include <Inventor/draggers/SoTrackballDragger.h>
#include <Inventor/nodes/SoAntiSquish.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoCube.h>
#include <Inventor/nodes/SoSurroundScale.h>
#include <Inventor/nodes/SoRotation.h>
#include <Inventor/nodes/SoTranslation.h>
int
main(int argc, char **argv)
{
QWidget * window = SoQt::init(argv[0]);
if (window == NULL) exit(1);
SoSeparator * root = new SoSeparator;
root->ref();
SoSeparator * surroundsep = new SoSeparator;
root->addChild(surroundsep);
SoTranslation * translation = new SoTranslation;
translation->translation = SbVec3f(12, 0, 0);
surroundsep->addChild(translation);
SoSurroundScale * ss = new SoSurroundScale;
ss->numNodesUpToReset = 1;
ss->numNodesUpToContainer = 2;
surroundsep->addChild(ss);
SoAntiSquish * antisquish = new SoAntiSquish;
antisquish->sizing = SoAntiSquish::BIGGEST_DIMENSION;
surroundsep->addChild(antisquish);
SoTrackballDragger * dragger = new SoTrackballDragger;
surroundsep->addChild(dragger);
SoRotation * rotation = new SoRotation;
rotation->rotation.connectFrom(& dragger->rotation);
root->addChild(rotation);
SoCube * cube = new SoCube;
cube->height = 10.0f;
root->addChild(cube);
SoQtExaminerViewer * viewer = new SoQtExaminerViewer(window);
viewer->setSceneGraph(root);
viewer->setViewing(FALSE);
viewer->setDecoration(FALSE);
viewer->show();
SoQt::show(window);
SoQt::mainLoop();
delete viewer;
root->unref();
return 0;
}
It might be easier to see how the SoSurroundScale node works in the
above example by looking at the actual scenegraph:
#Inventor V2.1 ascii
Separator {
Separator {
Translation {
translation 12 0 0
}
SurroundScale {
numNodesUpToContainer 2
numNodesUpToReset 1
}
AntiSquish {
sizing BIGGEST_DIMENSION
}
DEF mydragger TrackballDragger {
}
}
Rotation {
rotation 0 0 1 0 =
USE mydragger . rotation
}
Cube {
height 10
}
}
This node is internally used by manipulators to make it possible for
them to scale their dragger’s geometry to match the scenegraph geometry
it is modifying, as is demonstrated above (but outside of the context
of a manipulator).
It is also generally useful for application programmers who want any
particular piece of geometry surround other geometry of unknown or
changing extent.
SoSurroundScale nodes in the scenegraph are often paired up with
SoAntiSquish nodes to get uniform scaling along all three principal
axes, as has also been done in the above example.
FILE FORMAT/DEFAULTS:
SurroundScale {
numNodesUpToContainer 0
numNodesUpToReset 0
}
See also:
SoAntiSquish
Constructor & Destructor Documentation
SoSurroundScale::SoSurroundScale (void) Constructor.
SoSurroundScale::~SoSurroundScale () [protected, virtual] Destructor.
Member Function Documentation
void SoSurroundScale::initClass (void) [static] Sets up initialization for
data common to all instances of this class, like submitting necessary
information to the Coin type system.
Reimplemented from SoTransformation.
void SoSurroundScale::invalidate (void) Invalidates the cached
transformation, forcing a recalculation to be done the next time this
node is traversed.
void SoSurroundScale::doAction (SoAction * action) [virtual] This function
performs the typical operation of a node for any action.
Reimplemented from SoNode.
void SoSurroundScale::setDoingTranslations (const SbBool val) Sets whether
the translation part of the transformation should be ignored or not.
Default behavior is to translate.
SbBool SoSurroundScale::isDoingTranslations (void) Returns whether the
translation part of the transformation should be ignored or not.
See also:
setDoingTranslations()
void SoSurroundScale::callback (SoCallbackAction * action) [protected,
virtual] Action method for SoCallbackAction.
Simply updates the state according to how the node behaves for the
render action, so the application programmer can use the
SoCallbackAction for extracting information about the scene graph.
Reimplemented from SoNode.
void SoSurroundScale::GLRender (SoGLRenderAction * action) [protected,
virtual] Action method for the SoGLRenderAction.
This is called during rendering traversals. Nodes influencing the
rendering state in any way or who wants to throw geometry primitives at
OpenGL overrides this method.
Reimplemented from SoNode.
void SoSurroundScale::getBoundingBox (SoGetBoundingBoxAction * action)
[protected, virtual] Action method for the SoGetBoundingBoxAction.
Calculates bounding box and center coordinates for node and modifies
the values of the action to encompass the bounding box for this node
and to shift the center point for the scene more towards the one for
this node.
Nodes influencing how geometry nodes calculates their bounding box also
overrides this method to change the relevant state variables.
Reimplemented from SoNode.
void SoSurroundScale::getMatrix (SoGetMatrixAction * action) [protected,
virtual] Action method for SoGetMatrixAction.
Updates action by accumulating with the transformation matrix of this
node (if any).
Reimplemented from SoNode.
void SoSurroundScale::pick (SoPickAction * action) [protected, virtual]
Action method for SoPickAction.
Does common processing for SoPickAction action instances.
Reimplemented from SoNode.
void SoSurroundScale::updateMySurroundParams (SoAction * action, const
SbMatrix & inv) [protected] Calculates the translation and scale needed
to make a default cube surround geometry to the right of the branch
this node is on.
void SoSurroundScale::setIgnoreInBbox (const SbBool val) [protected] Sets
whether bounding box calculations in SoGetBoundingBoxAction should be
affected by this node.
Default is to ignore our bounding box calculations.
SbBool SoSurroundScale::isIgnoreInBbox (void) [protected] Returns the value
of the flag that decides whether bounding box calculations in
SoGetBoundingBoxAction should be affected by this node.
See also:
setIgnoreInBbox()
Member Data Documentation
SoSFInt32 SoSurroundScale::numNodesUpToContainer Number of nodes in the
path counting from this and ’upwards’ to the container node.
SoSFInt32 SoSurroundScale::numNodesUpToReset Number of nodes in the path
counting from this and ’upwards’ to the node where we will reset the
bounding box value.
SoSurroundScale::cachedScale [protected] This API member is considered
internal to the library, as it is not likely to be of interest to the
application programmer.
SoSurroundScale::cachedInvScale [protected] This API member is considered
internal to the library, as it is not likely to be of interest to the
application programmer.
SoSurroundScale::cachedTranslation [protected] This API member is
considered internal to the library, as it is not likely to be of
interest to the application programmer.
SoSurroundScale::cacheOK [protected] This API member is considered internal
to the library, as it is not likely to be of interest to the
application programmer.
SoSurroundScale::doTranslations [protected] This API member is considered
internal to the library, as it is not likely to be of interest to the
application programmer.
Author
Generated automatically by Doxygen for Coin from the source code.