![]() |
http://www.sim.no http://www.coin3d.org |
The SoBaseKit class is the toplevel superclass for nodekits.Node kits are collections of nodes and other node kits (from here on node kits which is part of some other node kit, will only be referred to as nodes or parts, see catalogs and parts), organized in a way that is convenient for its use. A node kit inherits SoNode and can thus be inserted into a scenegraph as any other node. More...
#include <Inventor/nodekits/SoBaseKit.h>
Public Member Functions | |
SoBaseKit (void) | |
virtual const SoNodekitCatalog * | getNodekitCatalog (void) const |
virtual SoNode * | getPart (const SbName &partname, SbBool makeifneeded) |
SbString | getPartString (const SoBase *part) |
virtual SoNodeKitPath * | createPathToPart (const SbName &partname, SbBool makeifneeded, const SoPath *pathtoextend=NULL) |
virtual SbBool | setPart (const SbName &partname, SoNode *from) |
SbBool | set (const char *namevaluepairliststring) |
SbBool | set (const char *partnamestring, const char *parameterstring) |
virtual void | doAction (SoAction *action) |
virtual void | callback (SoCallbackAction *action) |
virtual void | GLRender (SoGLRenderAction *action) |
virtual void | getBoundingBox (SoGetBoundingBoxAction *action) |
virtual void | getMatrix (SoGetMatrixAction *action) |
virtual void | handleEvent (SoHandleEventAction *action) |
virtual void | rayPick (SoRayPickAction *action) |
virtual void | search (SoSearchAction *action) |
virtual void | write (SoWriteAction *action) |
virtual void | getPrimitiveCount (SoGetPrimitiveCountAction *action) |
virtual SoChildList * | getChildren (void) const |
void | printDiagram (void) |
void | printSubDiagram (const SbName &rootname, int level) |
void | printTable (void) |
virtual void | addWriteReference (SoOutput *out, SbBool isfromfield=FALSE) |
SbBool | forceChildDrivenWriteRefs (SoOutput *out) |
Static Public Member Functions | |
static void | initClass (void) |
static const SoNodekitCatalog * | getClassNodekitCatalog (void) |
static SbBool | isSearchingChildren (void) |
static void | setSearchingChildren (const SbBool newval) |
static SoNode * | typeCheck (const SbName &partname, const SoType &parttype, SoNode *node) |
Protected Member Functions | |
virtual | ~SoBaseKit () |
virtual SoNode * | addToCopyDict (void) const |
virtual void | copyContents (const SoFieldContainer *fromfc, SbBool copyconnections) |
SoGroup * | getContainerNode (const SbName &listname, SbBool makeifneeded=TRUE) |
virtual SoNode * | getAnyPart (const SbName &partname, SbBool makeifneeded, SbBool leafcheck=FALSE, SbBool publiccheck=FALSE) |
virtual SoNodeKitPath * | createPathToAnyPart (const SbName &partname, SbBool makeifneeded, SbBool leafcheck=FALSE, SbBool publiccheck=FALSE, const SoPath *pathtoextend=NULL) |
virtual SbBool | setAnyPart (const SbName &partname, SoNode *from, SbBool anypart=TRUE) |
void | createNodekitPartsList (void) |
void | createFieldList (void) |
virtual void | createDefaultParts (void) |
const SoNodekitParts * | getNodekitPartsList (void) const |
const SbList< SoSFNode * > & | getCatalogInstances (void) const |
void | catalogError (void) |
virtual SbBool | setUpConnections (SbBool onoff, SbBool doitalways=FALSE) |
virtual SbBool | readInstance (SoInput *in, unsigned short flags) |
virtual void | setDefaultOnNonWritingFields (void) |
void | countMyFields (SoOutput *out) |
virtual SbBool | setPart (const int partNum, SoNode *node) |
Static Protected Member Functions | |
static const SoNodekitCatalog ** | getClassNodekitCatalogPtr (void) |
Protected Attributes | |
SoChildList * | children |
SbBool | connectionsSetUp |
Friends | |
class | SoInteractionKit |
class | SoBaseKitP |
The SoBaseKit class is the toplevel superclass for nodekits.
Node kits are collections of nodes and other node kits (from here on node kits which is part of some other node kit, will only be referred to as nodes or parts, see catalogs and parts), organized in a way that is convenient for its use. A node kit inherits SoNode and can thus be inserted into a scenegraph as any other node.
The organizing of the nodes and node kits of some node kit, is done through catalogs. A node kit's catalog describes the nodes that can be members of the node kit. These members are called parts. Thus a node kit has a catalog describing the parts that it offers to the user.
Each part in the catalog has some values saying something about the part itself and about the role the part plays in the scenegraph. Those values are:
TRUE
if the part should be instantiated when the node kit is instantiated, otherwise the part is kept empty until it is set by some of the means applicable. TRUE
if the part is a list, otherwise it is FALSE
. See SoNodeKitListPart for more info on node kit lists. TRUE
if the part should be publically available, otherwise it holds FALSE
. Node kits use lazy instantiation when it creates it's parts. This means that the nodes making up the parts of the nodekit only are created when they are needed. If the "Created by Default?" holds TRUE, then the part is created when the node kit itself is instantiated. If not, parts are created when they are requested through SoBaseKit::getPart() or the SO_GET_PART() macro, or created with SoBaseKit::set(). Also, if a part is set with SoBaseKit::setPart() or the SO_SET_PART() macro, any previously uncreated parts above the set part in the hierarchy, is created automatically.
The advantages of using node kits to represent a scenegraph are many.
The usage of a node kit is straightforward. Below follows a code example showing some simple SoShapeKit usage.
#include <Inventor/Qt/SoQt.h> #include <Inventor/Qt/viewers/SoQtExaminerViewer.h> #include <Inventor/nodekits/SoShapeKit.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/nodes/SoCube.h> int main(int argc, char ** argv) { QWidget * window = SoQt::init(argv[0]); SoQtExaminerViewer * viewer = new SoQtExaminerViewer(window); // Instantiating a shape kit, by default creating a simple sphere. SoShapeKit * shapekit = new SoShapeKit; // Swapping the sphere with a cube. shapekit->setPart("shape", new SoCube); // Setting the cube to be rendered in the color red. The shape kit // has a SoAppearanceKit as one of it's parts. The "material" part // used to set the color of the shape, really belongs the // appearance kit. If the SoShapeKit::set() is used, it will // check if some of its sub kits has a part with the name given, // and delegate the setting to the correct kit. shapekit->set("material", "diffuseColor 1 0 0"); SoSeparator * newroot = new SoSeparator; newroot->ref(); newroot->addChild(shapekit); viewer->setSceneGraph(newroot); viewer->show(); SoQt::show(window); SoQt::mainLoop(); delete viewer; newroot->unref(); return 0; }
The above code snippet will produce a viewer with a side view to the scene shown below:
Notice that the code needed for creating this simple shape using a shape kit, amounts to this:
SoShapeKit * shapekit = new SoShapeKit; shapekit->setPart("shape", new SoCube); shapekit->set("material", "diffuseColor 1 0 0");
..while doing it without shape kits amounts to this:
SoSeparator * root = new SoSeparator; SoMaterial * material = new SoMaterial; material->diffuseColor.setValue(1,0,0); root->addChild(material); root->addChild(new SoCube);
..so even for this miniscule mock-up example, you save on code verbosity and complexity.
For extending the Coin library with your own classes, we strongly recommend that you make yourself acquainted with the excellent «The Inventor Toolmaker» book (ISBN 0-201-62493-1), which describes the tasks involved in detail. This book was written by the original SGI Inventor designers and explains many of the underlying design ideas, aswell as having lots of hands-on examples on how to extend the Coin toolkit in ways that are true to the fundamental design ideas. («The Inventor Toolmaker» is also available at SGI's online library, at no cost. See Download The Inventor Toolmaker.) Reading the sourcecode of the built-in classes in Coin should also provide very helpful.
Following is a complete example of a node kit extension. The node kit is a kit which automatically scales a shape so it will be the same size in screen-pixels, no matter which distance it is from the camera. This is useful for marker graphics. The shape defaults to a cube, but can be set by the programmer to any shape or scene sub-graph.
The header file:
// Copyright (C) 1998-2007 by Systems in Motion. All rights reserved. #ifndef COIN_SHAPESCALE_H #define COIN_SHAPESCALE_H #include <Inventor/nodekits/SoSubKit.h> #include <Inventor/nodekits/SoBaseKit.h> #include <Inventor/fields/SoSFFloat.h> class SbViewport; class SoState; class SbColor; class SbVec2s; class ShapeScale : public SoBaseKit { typedef SoBaseKit inherited; SO_KIT_HEADER(ShapeScale); SO_KIT_CATALOG_ENTRY_HEADER(topSeparator); SO_KIT_CATALOG_ENTRY_HEADER(scale); SO_KIT_CATALOG_ENTRY_HEADER(shape); public: ShapeScale(void); static void initClass(void); SoSFFloat active; SoSFFloat projectedSize; protected: virtual void GLRender(SoGLRenderAction * action); virtual ~ShapeScale(); }; #endif // ! SHAPESCALE_H
The source code for the example:
// Copyright (C) 1998-2007 by Systems in Motion. All rights reserved. // The ShapeScale class is used for scaling a shape based on // projected size. // // This nodekit can be inserted in your scene graph to add for // instance 3D markers that will be of a constant projected size. // // The marker shape is stored in the "shape" part. Any kind of node // can be used, even group nodes with several shapes, but the // marker shape should be approximately of unit size, and with a // center position in (0, 0, 0). // SoSFFloat ShapeScale::active // Turns the scaling on/off. Default value is TRUE. // SoSFFloat ShapeScale::projectedSize // The requested projected size of the shape. Default value is 5.0. #include "ShapeScale.h" #include <Inventor/actions/SoGLRenderAction.h> #include <Inventor/nodes/SoShape.h> #include <Inventor/nodes/SoScale.h> #include <Inventor/nodes/SoCube.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/elements/SoViewVolumeElement.h> #include <Inventor/elements/SoViewportRegionElement.h> #include <Inventor/elements/SoModelMatrixElement.h> SO_KIT_SOURCE(ShapeScale); // Constructor. ShapeScale::ShapeScale(void) { SO_KIT_CONSTRUCTOR(ShapeScale); SO_KIT_ADD_FIELD(active, (TRUE)); SO_KIT_ADD_FIELD(projectedSize, (5.0f)); SO_KIT_ADD_CATALOG_ENTRY(topSeparator, SoSeparator, FALSE, this, \x0, FALSE); SO_KIT_ADD_CATALOG_ABSTRACT_ENTRY(shape, SoNode, SoCube, TRUE, topSeparator, \x0, TRUE); SO_KIT_ADD_CATALOG_ENTRY(scale, SoScale, FALSE, topSeparator, shape, FALSE); SO_KIT_INIT_INSTANCE(); } // Destructor. ShapeScale::~ShapeScale() { } // Initializes this class. Call before using it. void ShapeScale::initClass(void) { SO_KIT_INIT_CLASS(ShapeScale, SoBaseKit, "BaseKit"); } static void update_scale(SoScale * scale, const SbVec3f & v) { // only write to field when scaling has changed. if (scale->scaleFactor.getValue() != v) { scale->scaleFactor = v; } } // Overridden to (re)initialize scaling before rendering marker. void ShapeScale::GLRender(SoGLRenderAction * action) { SoState * state = action->getState(); SoScale * scale = (SoScale*) this->getAnyPart(SbName("scale"), TRUE); if (!this->active.getValue()) { update_scale(scale, SbVec3f(1.0f, 1.0f, 1.0f)); } else { const SbViewportRegion & vp = SoViewportRegionElement::get(state); const SbViewVolume & vv = SoViewVolumeElement::get(state); SbVec3f center(0.0f, 0.0f, 0.0f); float nsize = this->projectedSize.getValue() / float(vp.getViewportSizePixels()[1]); SoModelMatrixElement::get(state).multVecMatrix(center, center); // transform to WCS float scalefactor = vv.getWorldToScreenScale(center, nsize); update_scale(scale, SbVec3f(scalefactor, scalefactor, scalefactor)); } inherited::GLRender(action); }
And a complete example showing how one can use this node kit:
// Copyright (C) 1998-2007 by Systems in Motion. All rights reserved. #include <Inventor/Qt/SoQt.h> #include <Inventor/Qt/viewers/SoQtExaminerViewer.h> #include <Inventor/SoInput.h> #include <Inventor/SoOutput.h> #include <Inventor/SoPickedPoint.h> #include <Inventor/actions/SoRayPickAction.h> #include <Inventor/events/SoMouseButtonEvent.h> #include <Inventor/nodes/SoBaseColor.h> #include <Inventor/nodes/SoCube.h> #include <Inventor/nodes/SoEventCallback.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/nodes/SoSwitch.h> #include <Inventor/nodes/SoTranslation.h> #include <assert.h> #include <stdlib.h> #include <time.h> #include "ShapeScale.h" // Returns random value between 0.0f and 1.0f. static float normalized_rand(void) { return float(rand())/float(RAND_MAX); } static SoSeparator * construct_new_marker(const SbVec3f & v) { SoSeparator * markerroot = new SoSeparator; SoTranslation * t = new SoTranslation; t->translation = v; markerroot->addChild(t); ShapeScale * kit = new ShapeScale; kit->active = TRUE; kit->projectedSize = 5.0f; // create the marker SoSeparator * markersep = new SoSeparator; SoBaseColor * mat = new SoBaseColor; mat->rgb.setValue(normalized_rand(), normalized_rand(), normalized_rand()); markersep->addChild(mat); // marker shape should be unit size, with center in (0.0f, 0.0f, 0.0f) SoCube * cube = new SoCube; cube->width = 1.0f; cube->height = 1.0f; cube->depth = 1.0f; markersep->addChild(cube); kit->setPart("shape", markersep); markerroot->addChild(kit); return markerroot; } static void event_cb(void * ud, SoEventCallback * n) { const SoMouseButtonEvent * mbe = (SoMouseButtonEvent *)n->getEvent(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::DOWN) { SoQtExaminerViewer * viewer = (SoQtExaminerViewer *)ud; SoRayPickAction rp(viewer->getViewportRegion()); rp.setPoint(mbe->getPosition()); rp.apply(viewer->getSceneManager()->getSceneGraph()); SoPickedPoint * point = rp.getPickedPoint(); if (point == NULL) { (void)fprintf(stderr, "\n** miss! **\n\n"); return; } n->setHandled(); const SoPath * p = rp.getCurPath(); for (int i = 0; i < p->getLength(); i++) { SoNode * n = p->getNodeFromTail(i); if (n->isOfType(SoGroup::getClassTypeId())) { SoGroup * g = (SoGroup *)n; g->addChild(construct_new_marker(point->getPoint())); break; } } } } void show_instructions(void) { (void)fprintf(stdout, "\nThis example program demonstrates the use of the ShapeScale nodekit.\n" "\nQuick instructions:\n\n" " * place the marker by clicking on a shape with the left mouse button\n" " * hit ESC to toggle back and forth to view mode\n" " * zoom back and forth to see how the markers stay the same size\n\n"); } int main(int argc, char ** argv) { if (argc != 2) { (void) fprintf(stderr,"\nSpecify an Inventor file as argument.\n"); return -1; } QWidget * window = SoQt::init(argv[0]); ShapeScale::initClass(); // init our extension nodekit SoQtExaminerViewer * ex1 = new SoQtExaminerViewer(window); SoInput input; SbBool ok = input.openFile(argv[1]); if (!ok) { (void) fprintf(stderr, "Unable to open file: %s\n", argv[1]); return -1; } SoSeparator * root = SoDB::readAll(&input); if (root == NULL) { (void) fprintf(stderr, "Unable to read file: %s\n", argv[1]); return -1; } show_instructions(); SoSeparator * newroot = new SoSeparator; newroot->ref(); newroot->addChild(root); // create event callback and marker nodes SoSeparator * sep = new SoSeparator; newroot->addChild(sep); SoEventCallback * ecb = new SoEventCallback; ecb->addEventCallback(SoMouseButtonEvent::getClassTypeId(), event_cb, ex1); sep->addChild(ecb); ex1->setSceneGraph(newroot); ex1->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_BLEND); ex1->setViewing(FALSE); ex1->show(); SoQt::show(window); SoQt::mainLoop(); delete ex1; newroot->unref(); return 0; }
SoBaseKit::SoBaseKit | ( | void | ) |
Constructor.
This is the top-level superclass of all node kit and dragger classes. The catalog structure of SoBaseKit is as follows:
CLASS SoBaseKit -->"this" --> "callbackList"
(See SoBaseKit::printDiagram() for information about the output formatting.)
Detailed information on catalog parts:
CLASS SoBaseKit PVT "this", SoBaseKit --- "callbackList", SoNodeKitListPart [ SoCallback, SoEventCallback ]
(See SoBaseKit::printTable() for information about the output formatting.)
As can be seen from the catalog, all node kits can have a callback node in front of all other nodes in the kit. This is handy for catching events that should go to application processing.
References SoNodekitCatalog::addEntry(), SoType::badType(), children, connectionsSetUp, and SoNode::getClassTypeId().
SoBaseKit::~SoBaseKit | ( | ) | [protected, virtual] |
Destructor.
References children.
void SoBaseKit::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 SoNode.
Reimplemented in SoCenterballDragger, SoDirectionalLightDragger, SoDragPointDragger, SoDragger, SoHandleBoxDragger, SoJackDragger, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, SoTranslate2Dragger, SoAppearanceKit, SoCameraKit, SoInteractionKit, SoLightKit, SoSceneKit, SoSeparatorKit, SoShapeKit, and SoWrapperKit.
References SoNode::getClassTypeId(), and SoNode::rayPickS().
Referenced by SoNodeKit::init().
const SoNodekitCatalog * SoBaseKit::getClassNodekitCatalog | ( | void | ) | [static] |
Returns the nodekit catalog which defines the layout of this class' kit.
const SoNodekitCatalog * SoBaseKit::getNodekitCatalog | ( | void | ) | const [virtual] |
Returns the nodekit catalog which defines the layout of this class' kit.
Referenced by countMyFields(), createDefaultParts(), createFieldList(), createPathToAnyPart(), forceChildDrivenWriteRefs(), getAnyPart(), getPartString(), printSubDiagram(), printTable(), readInstance(), SoNodekitCatalog::recursiveSearch(), setAnyPart(), SoInteractionKit::setAnySurrogatePath(), SoInteractionKit::setDefaultOnNonWritingFields(), setDefaultOnNonWritingFields(), SoInteractionKit::setPart(), and setPart().
Returns a pointer to the node part with partname.
This method calls SoBaseKit::getAnyPart() with leafcheck and publiccheck both set to TRUE
.
See the documentation of SoBaseKit::getAnyPart() for information on how to use partname and makeifneeded, and what you can expect to get returned from this method.
References getAnyPart().
Referenced by SoSpotLightManip::fieldSensorCB(), SoPointLightManip::fieldSensorCB(), SoDirectionalLightManip::fieldSensorCB(), SoCenterballDragger::getBoundingBox(), SoCenterballDragger::getMatrix(), SoCenterballDragger::kidFinishCB(), SoCenterballDragger::kidStartCB(), SoTransformManip::replaceNode(), SoSpotLightManip::replaceNode(), SoPointLightManip::replaceNode(), SoDirectionalLightManip::replaceNode(), SoClipPlaneManip::replaceNode(), SoCenterballManip::SoCenterballManip(), SoHandleBoxManip::SoHandleBoxManip(), SoJackManip::SoJackManip(), SoTabBoxManip::SoTabBoxManip(), SoTrackballManip::SoTrackballManip(), SoTransformBoxManip::SoTransformBoxManip(), and SoTransformerManip::SoTransformerManip().
Returns the full path name to a catalog part, given the part's current item pointer.
References SbString::addIntString(), SoPath::findNode(), SoPath::getClassTypeId(), SoNode::getClassTypeId(), SoFullPath::getLength(), SoNodekitCatalog::getName(), SoPath::getNode(), getNodekitCatalog(), SbName::getString(), SoFullPath::getTail(), SoNodekitCatalog::isLeaf(), SoBase::isOfType(), and SoDebugError::postWarning().
Referenced by SoTransformManip::replaceNode(), SoSpotLightManip::replaceNode(), SoPointLightManip::replaceNode(), SoDirectionalLightManip::replaceNode(), and SoClipPlaneManip::replaceNode().
SoNodeKitPath * SoBaseKit::createPathToPart | ( | const SbName & | partname, |
SbBool | makeifneeded, | ||
const SoPath * | pathtoextend = NULL |
||
) | [virtual] |
Calls SoBaseKit::createPathToAnyPart() with leafcheck FALSE
, and publiccheck FALSE
(and other arguments as given to this function).
See SoBaseKit::createPathToAnyPart() for documentation.
References createPathToAnyPart().
Sets the catalog part given by partname to the from node pointer.
Reimplemented in SoInteractionKit.
References setAnyPart().
Referenced by readInstance(), SoTransformManip::replaceNode(), SoSpotLightManip::replaceNode(), SoPointLightManip::replaceNode(), SoDirectionalLightManip::replaceNode(), SoClipPlaneManip::replaceNode(), setAnyPart(), SoInteractionKit::setAnyPartAsDefault(), SoInteractionKit::setAnySurrogatePath(), and SoInteractionKit::setPart().
SbBool SoBaseKit::set | ( | const char * | namevaluepairliststring | ) |
Sets nodekit part field values. The input argument string is of the format:
partname { fieldname fieldval fieldname fieldval [...] } partname { fieldname fieldval fieldname fieldval [...] } [...]
(Whitespace layout is ignored, as always for Inventor format input strings.)
Here's an example, changing several values of the camera part of an SoCameraKit instance:
kit->set("camera { heightAngle 0.3927 nearDistance 1.1 farDistance 999.9 }");
Reimplemented from SoFieldContainer.
References SoNodeKitListPart::getChild(), SoFieldContainer::getFieldData(), SoInput::getNumBytesRead(), SoNodeKitListPart::getNumChildren(), SbString::getString(), SoDebugError::postWarning(), SoFieldData::read(), and SoInput::setBuffer().
SbBool SoBaseKit::set | ( | const char * | partnamestring, |
const char * | parameterstring | ||
) |
This just overloads the other SoBaseKit::set() method, and provides a way to set a part value by using a separate input argument for the name of the part and the name of the field (i.e. parameter) settings.
References SoNode::getClassTypeId(), SoFieldContainer::getFieldData(), SbString::getString(), SoBase::isOfType(), SoDebugError::postWarning(), SoFieldData::read(), and SoInput::setBuffer().
void SoBaseKit::doAction | ( | SoAction * | action | ) | [virtual] |
This function performs the typical operation of a node for any action.
Reimplemented from SoNode.
References children, SoAction::getPathCode(), SoChildList::traverse(), and SoChildList::traverseInPath().
Referenced by callback(), getPrimitiveCount(), GLRender(), handleEvent(), rayPick(), and search().
void SoBaseKit::callback | ( | SoCallbackAction * | action | ) | [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.
Reimplemented in SoDragger.
References doAction().
Referenced by SoDragger::callback().
void SoBaseKit::GLRender | ( | SoGLRenderAction * | action | ) | [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.
Reimplemented in SoDragger, and SoTabPlaneDragger.
References doAction().
Referenced by SoDragger::GLRender().
void SoBaseKit::getBoundingBox | ( | SoGetBoundingBoxAction * | action | ) | [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.
Reimplemented in SoCenterballDragger, and SoDragger.
References children, SoGetBoundingBoxAction::getCenter(), SbPList::getLength(), SoAction::getPathCode(), SoGetBoundingBoxAction::isCenterSet(), SoGetBoundingBoxAction::resetCenter(), SoGetBoundingBoxAction::setCenter(), and SoChildList::traverse().
Referenced by SoDragger::getBoundingBox().
void SoBaseKit::getMatrix | ( | SoGetMatrixAction * | action | ) | [virtual] |
Action method for SoGetMatrixAction.
Updates action by accumulating with the transformation matrix of this node (if any).
Reimplemented from SoNode.
Reimplemented in SoCenterballDragger, and SoDragger.
References children, SoAction::getPathCode(), SoChildList::traverse(), and SoChildList::traverseInPath().
Referenced by SoDragger::getMatrix().
void SoBaseKit::handleEvent | ( | SoHandleEventAction * | action | ) | [virtual] |
Action method for SoHandleEventAction.
Inspects the event data from action, and processes it if it is something which this node should react to.
Nodes influencing relevant state variables for how event handling is done also overrides this method.
Reimplemented from SoNode.
Reimplemented in SoDragger.
References doAction().
Referenced by SoDragger::handleEvent().
void SoBaseKit::rayPick | ( | SoRayPickAction * | action | ) | [virtual] |
Action method for SoRayPickAction.
Checks the ray specification of the action and tests for intersection with the data of the node.
Nodes influencing relevant state variables for how picking is done also overrides this method.
Reimplemented from SoNode.
Reimplemented in SoDragger.
References SoPath::containsNode(), doAction(), SoPickedPoint::getDetail(), SbPList::getLength(), and SoPickedPoint::getPath().
Referenced by SoDragger::rayPick().
void SoBaseKit::search | ( | SoSearchAction * | action | ) | [virtual] |
Action method for SoSearchAction.
Compares the search criteria from the action to see if this node is a match. Searching is done by matching up all criteria set up in the SoSearchAction -- if any of the requested criteria is a miss, the search is not deemed successful for the node.
Reimplemented from SoNode.
Reimplemented in SoDragger.
References doAction(), SoSearchAction::isFound(), and SoNode::search().
Referenced by SoDragger::search().
void SoBaseKit::write | ( | SoWriteAction * | action | ) | [virtual] |
Action method for SoWriteAction.
Writes out a node object, and any connected nodes, engines etc, if necessary.
Reimplemented from SoNode.
Reimplemented in SoDragger.
References addWriteReference(), children, SoWriteAction::getOutput(), SoOutput::getStage(), SoChildList::traverse(), SoBase::writeFooter(), and SoBase::writeHeader().
Referenced by SoDragger::write().
void SoBaseKit::getPrimitiveCount | ( | SoGetPrimitiveCountAction * | action | ) | [virtual] |
Action method for the SoGetPrimitiveCountAction.
Calculates the number of triangle, line segment and point primitives for the node and adds these to the counters of the action.
Nodes influencing how geometry nodes calculates their primitive count also overrides this method to change the relevant state variables.
Reimplemented from SoNode.
Reimplemented in SoDragger.
References doAction().
Referenced by SoDragger::getPrimitiveCount().
SoChildList * SoBaseKit::getChildren | ( | void | ) | const [virtual] |
Returns list of children for this node.
Reimplemented from SoNode.
References children.
Referenced by copyContents(), and readInstance().
void SoBaseKit::printDiagram | ( | void | ) |
Print out the full nodekit catalog structure. Just invokes SoBaseKit::printSubDiagram() on the catalog root. Useful for debugging.
Example output:
CLASS SoWrapperKit -->"this" "callbackList" "topSeparator" "pickStyle" "appearance" "units" "transform" "texture2Transform" "childList" --> "localTransform" --> "contents"
The arrows denote new entries in the catalog for the particular class versus it's superclass. (Apart from the root entry, of course.)
For a more detailed catalog dump, see SoBaseKit::printTable().
References SoBase::getName(), SoBase::getTypeId(), and printSubDiagram().
void SoBaseKit::printSubDiagram | ( | const SbName & | rootname, |
int | level | ||
) |
Print out the nodekit catalog structure from rootname and downwards in the catalog tree, with indentation starting at level.
References SoType::createInstance(), SoNode::getClassTypeId(), SoNodekitCatalog::getName(), getNodekitCatalog(), SoNodekitCatalog::getNumEntries(), SoType::getParent(), SoNodekitCatalog::getParentName(), SoNodekitCatalog::getPartNumber(), SbName::getString(), SoNodekitCatalog::getType(), SoBase::getTypeId(), SoBase::ref(), and SoBase::unref().
Referenced by printDiagram().
void SoBaseKit::printTable | ( | void | ) |
Write the complete nodekit catalog in table form.
Example output:
CLASS SoWrapperKit PVT "this", SoWrapperKit --- "callbackList", SoNodeKitListPart [ SoCallback, SoEventCallback ] PVT "topSeparator", SoSeparator --- "pickStyle", SoPickStyle --- "appearance", SoAppearanceKit --- "units", SoUnits --- "transform", SoTransform --- "texture2Transform", SoTexture2Transform --- "childList", SoNodeKitListPart [ SoShapeKit, SoSeparatorKit ] "localTransform", SoTransform --- "contents", SoSeparator ---
PVT
denotes that it's a private entry in the catalog, then follows the part name and the part type. If the part is a list, the allowed node types for the list is given in square brackets, and if not there's a triple hyphen. If the part type is abstract, the default part type will be listed last (not shown in the example output above).
References SoNodekitCatalog::getDefaultType(), SbPList::getLength(), SoNodekitCatalog::getListItemTypes(), SoType::getName(), SoNodekitCatalog::getName(), SoBase::getName(), getNodekitCatalog(), SoNodekitCatalog::getNumEntries(), SbName::getString(), SoNodekitCatalog::getType(), SoBase::getTypeId(), SoNodekitCatalog::isList(), and SoNodekitCatalog::isPublic().
void SoBaseKit::addWriteReference | ( | SoOutput * | out, |
SbBool | isfromfield = FALSE |
||
) | [virtual] |
This method is used during the first write pass of a write action to count the number of references to this object in the scene graph.
Reimplemented from SoFieldContainer.
References countMyFields(), and SoBase::hasMultipleWriteRefs().
Referenced by countMyFields(), forceChildDrivenWriteRefs(), and write().
SbBool SoBaseKit::forceChildDrivenWriteRefs | ( | SoOutput * | out | ) |
Returns TRUE
if kit should write. This happens if shouldWrite() returns TRUE
, or if any of the children (recursively) should write.
References addWriteReference(), forceChildDrivenWriteRefs(), SoNode::getClassTypeId(), getNodekitCatalog(), SoNodekitCatalog::getPartNumber(), SoField::isDefault(), SoBase::isOfType(), and SoBase::shouldWrite().
Referenced by countMyFields(), and forceChildDrivenWriteRefs().
SbBool SoBaseKit::isSearchingChildren | ( | void | ) | [static] |
Returns the value of the flag indicating whether or not the kit parts are searched during SoSearchAction traversal.
Referenced by SoNodeKitPath::append().
void SoBaseKit::setSearchingChildren | ( | const SbBool | newval | ) | [static] |
Set whether or not the kit parts should be searched during SoSearchAction traversal. The default value is FALSE
.
Referenced by SoNodeKitPath::append().
SoNode * SoBaseKit::typeCheck | ( | const SbName & | partname, |
const SoType & | parttype, | ||
SoNode * | node | ||
) | [static] |
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
This is a private method in the original SGI Inventor 2.1 API. Consider it obsolete -- it will be removed from Coin v3.0.
References SoType::getName(), SbName::getString(), SoBase::getTypeId(), SoBase::isOfType(), and SoDebugError::postInfo().
const SoNodekitCatalog ** SoBaseKit::getClassNodekitCatalogPtr | ( | void | ) | [static, protected] |
Returns the pointer to the pointer of the nodekit catalog for this class.
SoNode * SoBaseKit::addToCopyDict | ( | void | ) | const [protected, virtual] |
Add a copy of this node and (recursively) all children to the copy dictionary of SoFieldContainer if this has not already been done.
Used internally during copy operations.
Reimplemented from SoNode.
References SoFieldContainer::addCopy(), SoNode::addToCopyDict(), SoFieldContainer::checkCopy(), SoType::createInstance(), SoBase::getTypeId(), SoBase::ref(), and SoBase::unrefNoDelete().
void SoBaseKit::copyContents | ( | const SoFieldContainer * | from, |
SbBool | copyconnections | ||
) | [protected, virtual] |
Makes a deep copy of all data of from into this instance, except external scenegraph references if copyconnections is FALSE
.
This is the protected method that should be overridden by extension node / engine / dragger / whatever subclasses which needs to account for internal data that are not handled automatically.
For copying nodes from application code, you should not invoke this function directly, but rather call the SoNode::copy() function:
The same also goes for engines.
Make sure that when you override the copyContents() method in your extension class that you also make it call upwards to it's parent superclass in the inheritance hierarchy, as copyContents() in for instance SoNode and SoFieldContainer does important work. It should go something like this:
void MyCoinExtensionNode::copyContents(const SoFieldContainer * from, SbBool copyconnections) { // let parent superclasses do their thing (copy fields, copy // instance name, etc etc) SoNode::copyContents(from, copyconnections); // [..then copy internal data..] }
Reimplemented from SoNode.
Reimplemented in SoRotateCylindricalDragger, SoRotateSphericalDragger, and SoInteractionKit.
References SbList< Type >::append(), SoNode::copyContents(), getCatalogInstances(), getChildren(), setUpConnections(), and SoChildList::truncate().
Referenced by SoInteractionKit::copyContents().
SoGroup * SoBaseKit::getContainerNode | ( | const SbName & | listname, |
SbBool | makeifneeded = TRUE |
||
) | [protected] |
Returns a pointer to the group node above an SoNodeKitListPart in the catalog given by listname.
If the list part (and its container) was not yet constructed, they will be so if makeifneeded is TRUE
(otherwise, NULL
will be returned).
References SoNode::getClassTypeId(), SbName::getString(), and SoBase::isOfType().
Referenced by SoSceneKit::getCameraNumber(), and SoSceneKit::setCameraNumber().
SoNode * SoBaseKit::getAnyPart | ( | const SbName & | partname, |
SbBool | makeifneeded, | ||
SbBool | leafcheck = FALSE , |
||
SbBool | publiccheck = FALSE |
||
) | [protected, virtual] |
Returns catalog part of the given partname.
If the partname part is not in the nodekit's catalog, return NULL
.
If the part is specified in the catalog, but has not yet been made, the function will either construct the part (if makeifneeded is TRUE
) or just return NULL
(if makeifneeded is FALSE
).
If leafcheck is TRUE
, a pointer to the part will only be returned if it's a leaf in the catalog (otherwise NULL
is returned).
If publiccheck is TRUE
, a pointer to the part will only be returned if it's a public catalog part (otherwise NULL
is returned).
The partname input argument should be given as a "path" of catalog part names down to the wanted leaf part. The syntax for specifiying partname "paths" is as follows (given in Backus-Naur Form (BNF)):
BNF: partname = singlename | compoundname compoundname = singlename | compoundname.singlename singlename = singlepartname | singlelistelementname singlelistelementname = singlelistname[idx] singlepartname is name of a part ("ordinary", nodekit or list) singlelistname is name of a part which is a list idx is an integer value
References SoNode::getClassTypeId(), SoType::getName(), getNodekitCatalog(), SbName::getString(), SoBase::getTypeId(), SoNodekitCatalog::isLeaf(), SoBase::isOfType(), SoNodekitCatalog::isPublic(), and SoDebugError::postWarning().
Referenced by SoTransformerDragger::dragStart(), getPart(), SoInteractionKit::readInstance(), SoTrackballDragger::setDefaultOnNonWritingFields(), SoTransformBoxDragger::setUpConnections(), SoTabBoxDragger::setUpConnections(), SoSpotLightDragger::setUpConnections(), SoPointLightDragger::setUpConnections(), SoJackDragger::setUpConnections(), SoDragPointDragger::setUpConnections(), SoDirectionalLightDragger::setUpConnections(), and SoCenterballDragger::setUpConnections().
SoNodeKitPath * SoBaseKit::createPathToAnyPart | ( | const SbName & | partname, |
SbBool | makeifneeded, | ||
SbBool | leafcheck = FALSE , |
||
SbBool | publiccheck = FALSE , |
||
const SoPath * | pathtoextend = NULL |
||
) | [protected, virtual] |
Return path with nested SoNodeKit instances down in the catalog hierarchy given by partname.
If the trailing part has not been made and makeifneeded is TRUE
, make an instance of the part type and insert into the catalog, as done in setAnyPart().
If leafcheck is TRUE
, ignore non-leaf catalog node entries. If publiccheck is TRUE
, ignore private catalog entries.
pathtoextend is a path through the nodekit instance catalog hierarchy, where we should pick up and continue to create the path from where pathtoextend terminates. If pathtoextend is NULL
, we simply start at the "this" toplevel node.
Returns NULL
on failure, for any of the possible reasons described above (part ends in non-leaf or private catalog entry, part is not syntactically valid or refers to non-existing catalog entries).
References SoPath::append(), SoPath::containsNode(), SoPath::copy(), SbPList::find(), SoNodeKitListPart::getChild(), SoNode::getChildren(), SoNodeKitListPart::getContainerNode(), SoFullPath::getLength(), getNodekitCatalog(), SoNodeKitListPart::getNumChildren(), SbName::getString(), SoFullPath::getTail(), SoNodekitCatalog::isLeaf(), SoNodekitCatalog::isPublic(), SoFullPath::pop(), SoDebugError::postWarning(), SoBase::ref(), SoBase::unref(), and SoBase::unrefNoDelete().
Referenced by createPathToPart(), and SoDragger::getPartToLocalMatrix().
SbBool SoBaseKit::setAnyPart | ( | const SbName & | partname, |
SoNode * | from, | ||
SbBool | anypart = TRUE |
||
) | [protected, virtual] |
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
References SoNode::getClassTypeId(), SoType::getName(), getNodekitCatalog(), SbName::getString(), SoBase::getTypeId(), SoBase::isOfType(), SoNodekitCatalog::isPublic(), SoDebugError::postWarning(), and setPart().
Referenced by readInstance(), and setPart().
void SoBaseKit::createNodekitPartsList | ( | void | ) | [protected] |
Not part of the Coin API.
It is supposed to create the SoNodekitParts class instance. Since this class can only be used by SoBaseKit (all members are private, with SoBaseKit as friend), we decided to not support this class, and solve the problem of recording which parts are created in an alternative way.
void SoBaseKit::createFieldList | ( | void | ) | [protected] |
Replaces the createNodekitPartsList() method.
Sets up the list of SoSFNode fields with node pointers to the instances in our catalog.
References SoFieldContainer::getField(), SoNodekitCatalog::getName(), getNodekitCatalog(), and SoNodekitCatalog::getNumEntries().
void SoBaseKit::createDefaultParts | ( | void | ) | [protected, virtual] |
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
References getNodekitCatalog(), and SoNodekitCatalog::isNullByDefault().
const SoNodekitParts * SoBaseKit::getNodekitPartsList | ( | void | ) | const [protected] |
In Open Inventor, this method returns a pointer to a private class. It will always return NULL
in Coin.
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
Referenced by copyContents(), SoInteractionKit::setAnyPartAsDefault(), SoInteractionKit::setAnySurrogatePath(), and SoInteractionKit::setDefaultOnNonWritingFields().
void SoBaseKit::catalogError | ( | void | ) | [protected] |
Obsoleted from the API in Coin.
SbBool SoBaseKit::setUpConnections | ( | SbBool | onoff, |
SbBool | doitalways = FALSE |
||
) | [protected, virtual] |
Sets up all internal connections for instances of this class.
(This method will usually not be of interest to the application programmer, unless you want to extend the library with new custom nodekits or dragger classes. If so, see the SoBaseKit class documentation.)
Reimplemented in SoCenterballDragger, SoDirectionalLightDragger, SoDragPointDragger, SoHandleBoxDragger, SoJackDragger, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, SoTranslate2Dragger, SoInteractionKit, and SoSeparatorKit.
References connectionsSetUp.
Referenced by copyContents(), readInstance(), SoSeparatorKit::setUpConnections(), and SoInteractionKit::setUpConnections().
SbBool SoBaseKit::readInstance | ( | SoInput * | in, |
unsigned short | flags | ||
) | [protected, virtual] |
This method is mainly intended for internal use during file import operations.
It reads a definition of an instance from the input stream in. The input stream state points to the start of a serialized / persistant representation of an instance of this class type.
TRUE
or FALSE
is returned, depending on if the instantiation and configuration of the new object of this class type went ok or not. The import process should be robust and handle corrupted input streams by returning FALSE
.
flags is used internally during binary import when reading user extension nodes, group nodes or engines.
Reimplemented from SoNode.
Reimplemented in SoInteractionKit.
References SbList< Type >::append(), SoNodeList::append(), SoFieldContainer::enableNotify(), getChildren(), SoNode::getClassTypeId(), SoFieldData::getField(), SoFieldData::getFieldName(), getNodekitCatalog(), SoFieldData::getNumFields(), SoNodekitCatalog::isLeaf(), SoBase::isOfType(), SoGroup::removeAllChildren(), SoBaseList::set(), setAnyPart(), setPart(), setUpConnections(), and SoChildList::truncate().
Referenced by SoInteractionKit::readInstance().
void SoBaseKit::setDefaultOnNonWritingFields | ( | void | ) | [protected, virtual] |
(Be aware that this method is unlikely to be of interest to the application programmer who does not want to extend the library with new custom nodekits or draggers. If you indeed are writing extensions, see the information in the SoBaseKit class documentation.)
This is a virtual method, and the code in it should call SoField::setDefault() with argument TRUE
on part fields that should not be written upon scenegraph export operations.
This is typically done when:
field value is NULL
and part is NULL
by default
it is a leaf SoGroup or SoSeparator node with no children
it is a leaf listpart with no children and an SoGroup or SoSeparator container
it is a non-leaf part and it's of SoGroup type and all fields are at their default values
Subclasses should usually override this to do additional settings for new member fields. From the subclass, do remember to call "upwards" to your superclass' setDefaultOnNonWritingFields() method.
Reimplemented in SoCenterballDragger, SoDirectionalLightDragger, SoDragPointDragger, SoDragger, SoHandleBoxDragger, SoJackDragger, SoPointLightDragger, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoInteractionKit, SoSeparatorKit, and SoShapeKit.
References SoNode::getClassTypeId(), SoNodeKitListPart::getContainerNode(), getNodekitCatalog(), SoNodeKitListPart::getNumChildren(), SoBase::getTypeId(), SoField::isDefault(), SoNodekitCatalog::isLeaf(), SoNodekitCatalog::isNullByDefault(), SoBase::isOfType(), and SoField::setDefault().
Referenced by countMyFields(), SoSeparatorKit::setDefaultOnNonWritingFields(), and SoInteractionKit::setDefaultOnNonWritingFields().
void SoBaseKit::countMyFields | ( | SoOutput * | out | ) | [protected] |
Reference count the write connections to nodes in the catalog.
References addWriteReference(), countMyFields(), forceChildDrivenWriteRefs(), SoNode::getClassTypeId(), getNodekitCatalog(), SoNodekitCatalog::getPartNumber(), SoOutput::getStage(), SoField::isDefault(), SoBase::isOfType(), SoField::setDefault(), setDefaultOnNonWritingFields(), SoField::shouldWrite(), and SoField::write().
Referenced by addWriteReference(), and countMyFields().
SbBool SoBaseKit::setPart | ( | const int | partnum, |
SoNode * | node | ||
) | [protected, virtual] |
Sets parts, updates nodekit scene graph, and makes sure graph is valid with respect to right siblings and parent. This method is virtual to enable subclasses to detect when a part changes value.
This method is not part of the original SGI Open Inventor API, but is an extension specific to Coin.
Reimplemented in SoInteractionKit.
References SoGroup::addChild(), SoChildList::append(), SbPList::find(), SoNode::getClassTypeId(), SoBase::getName(), SoType::getName(), getNodekitCatalog(), SbName::getString(), SoBase::getTypeId(), SoChildList::insert(), SoGroup::insertChild(), SoType::isDerivedFrom(), SoDebugError::postWarning(), SoChildList::remove(), SoGroup::removeChild(), SoGroup::replaceChild(), and SoChildList::set().
SoChildList * SoBaseKit::children [protected] |
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
Referenced by doAction(), getBoundingBox(), getChildren(), getMatrix(), SoBaseKit(), write(), and ~SoBaseKit().
SbBool SoBaseKit::connectionsSetUp [protected] |
This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.
Referenced by SoTranslate2Dragger::setUpConnections(), SoTranslate1Dragger::setUpConnections(), SoTransformerDragger::setUpConnections(), SoTransformBoxDragger::setUpConnections(), SoTrackballDragger::setUpConnections(), SoTabPlaneDragger::setUpConnections(), SoTabBoxDragger::setUpConnections(), SoSpotLightDragger::setUpConnections(), SoSeparatorKit::setUpConnections(), SoScaleUniformDragger::setUpConnections(), SoScale2UniformDragger::setUpConnections(), SoScale2Dragger::setUpConnections(), SoScale1Dragger::setUpConnections(), SoRotateSphericalDragger::setUpConnections(), SoRotateDiscDragger::setUpConnections(), SoRotateCylindricalDragger::setUpConnections(), SoPointLightDragger::setUpConnections(), SoJackDragger::setUpConnections(), SoInteractionKit::setUpConnections(), SoHandleBoxDragger::setUpConnections(), SoDragPointDragger::setUpConnections(), SoDirectionalLightDragger::setUpConnections(), SoCenterballDragger::setUpConnections(), setUpConnections(), and SoBaseKit().
Copyright © 1998-2007 by Systems in Motion AS. All rights reserved.
Generated on Mon Feb 28 2011 10:12:06 for Coin by Doxygen. 1.7.3