Coin  4.0.3
Coin3D core library
Loading...
Searching...
No Matches
SoBaseKit Class Reference

The SoBaseKit class is the top level superclass for nodekits. More...

#include <Inventor/nodekits/SoBaseKit.h>

Inheritance diagram for SoBaseKit:
SoNode SoFieldContainer SoBase SoAppearanceKit SoCameraKit SoForeignFileKit SoInteractionKit SoLightKit SoNodeVisualize SoProfilerOverlayKit SoProfilerVisualizeKit SoSceneKit SoScrollingGraphKit SoSeparatorKit

Public Member Functions

 SoBaseKit (void)
 
virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE)
 
virtual void callback (SoCallbackAction *action)
 
virtual SoNodeKitPathcreatePathToPart (const SbName &partname, SbBool makeifneeded, const SoPath *pathtoextend=NULL)
 
virtual void doAction (SoAction *action)
 
SbBool forceChildDrivenWriteRefs (SoOutput *out)
 
virtual void getBoundingBox (SoGetBoundingBoxAction *action)
 
virtual SoChildListgetChildren (void) const
 
virtual void getMatrix (SoGetMatrixAction *action)
 
virtual const SoNodekitCataloggetNodekitCatalog (void) const
 
virtual SoNodegetPart (const SbName &partname, SbBool makeifneeded)
 
SbString getPartString (const SoBase *part)
 
virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)
 
virtual SoType getTypeId (void) const
 
virtual void GLRender (SoGLRenderAction *action)
 
virtual void handleEvent (SoHandleEventAction *action)
 
void printDiagram (void)
 
void printSubDiagram (const SbName &rootname, int level)
 
void printTable (void)
 
virtual void rayPick (SoRayPickAction *action)
 
virtual void search (SoSearchAction *action)
 
SbBool set (const char *namevaluepairliststring)
 
SbBool set (const char *partnamestring, const char *parameterstring)
 
virtual SbBool setPart (const SbName &partname, SoNode *from)
 
virtual void write (SoWriteAction *action)
 
- Public Member Functions inherited from SoNode
virtual SbBool affectsState (void) const
 
virtual void audioRender (SoAudioRenderAction *action)
 
virtual SoNodecopy (SbBool copyconnections=FALSE) const
 
virtual SoFieldContainercopyThroughConnection (void) const
 
SbUniqueId getNodeId (void) const
 
NodeType getNodeType (void) const
 
virtual void GLRenderBelowPath (SoGLRenderAction *action)
 
virtual void GLRenderInPath (SoGLRenderAction *action)
 
virtual void GLRenderOffPath (SoGLRenderAction *action)
 
virtual void grabEventsCleanup (void)
 
virtual void grabEventsSetup (void)
 
SbBool isOverride (void) const
 
virtual void notify (SoNotList *l)
 
virtual void pick (SoPickAction *action)
 
void setNodeType (const NodeType type)
 
void setOverride (const SbBool state)
 
virtual void startNotify (void)
 
virtual void writeInstance (SoOutput *out)
 
- Public Member Functions inherited from SoFieldContainer
void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=FALSE)
 
SbBool enableNotify (const SbBool flag)
 
SbBool fieldsAreEqual (const SoFieldContainer *container) const
 
void get (SbString &fielddata)
 
void get (SbString &fielddata, SoOutput *out)
 
virtual int getAllFields (SoFieldList &l) const
 
virtual SoFieldgetEventIn (const SbName &name) const
 
virtual SoFieldgetEventOut (const SbName &name) const
 
virtual SoFieldgetField (const SbName &name) const
 
SbBool getFieldName (const SoField *const field, SbName &name) const
 
virtual int getFields (SoFieldList &l) const
 
virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged) const
 
SbBool getIsBuiltIn (void) const
 
voidgetUserData (void) const
 
SbBool hasDefaultValues (void) const
 
SbBool isNotifyEnabled (void) const
 
SbBool set (const char *const fielddata)
 
SbBool set (const char *fielddata, SoInput *input)
 
void setToDefaults (void)
 
void setUserData (void *userdata) const
 
virtual SbBool validateNewFieldValue (SoField *field, void *newval)
 
- Public Member Functions inherited from SoBase
void addAuditor (void *const auditor, const SoNotRec::Type type)
 
void assertAlive (void) const
 
const SoAuditorListgetAuditors (void) const
 
virtual SbName getName (void) const
 
int32_t getRefCount (void) const
 
SbBool isOfType (SoType type) const
 Returns TRUE if the type of this object is either of the same type or inherited from type.
 
void ref (void) const
 
void removeAuditor (void *const auditor, const SoNotRec::Type type)
 
virtual void setName (const SbName &newname)
 
SbBool shouldWrite (void)
 
void touch (void)
 
void unref (void) const
 
void unrefNoDelete (void) const
 

Static Public Member Functions

static const SoNodekitCataloggetClassNodekitCatalog (void)
 
static SoType getClassTypeId (void)
 
static void initClass (void)
 
static SbBool isSearchingChildren (void)
 
static void setSearchingChildren (const SbBool newval)
 
- Static Public Member Functions inherited from SoNode
static void audioRenderS (SoAction *action, SoNode *node)
 
static void callbackS (SoAction *action, SoNode *node)
 
static int getActionMethodIndex (const SoType type)
 
static void getBoundingBoxS (SoAction *action, SoNode *node)
 
static SoNodegetByName (const SbName &name)
 
static int getByName (const SbName &name, SoNodeList &l)
 
static SoType getClassTypeId (void)
 
static uint32_t getCompatibilityTypes (const SoType &nodetype)
 
static void getMatrixS (SoAction *action, SoNode *node)
 
static SbUniqueId getNextNodeId (void)
 
static void getPrimitiveCountS (SoAction *action, SoNode *node)
 
static void GLRenderS (SoAction *action, SoNode *node)
 
static void handleEventS (SoAction *action, SoNode *node)
 
static void initClass (void)
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
 
static void initClasses (void)
 
static void pickS (SoAction *action, SoNode *node)
 
static void rayPickS (SoAction *action, SoNode *node)
 
static void searchS (SoAction *action, SoNode *node)
 
static void writeS (SoAction *action, SoNode *node)
 
- Static Public Member Functions inherited from SoFieldContainer
static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy)
 
static SoFieldContainercheckCopy (const SoFieldContainer *orig)
 
static void cleanupClass (void)
 
static void copyDone (void)
 
static SoFieldContainerfindCopy (const SoFieldContainer *orig, const SbBool copyconnections)
 
static SoType getClassTypeId (void)
 This static method returns the SoType object associated with objects of this class.
 
static void initClass (void)
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
 
static void initCopyDict (void)
 
- Static Public Member Functions inherited from SoBase
static void addName (SoBase *const base, const char *const name)
 
static SbBool connectRoute (SoInput *input, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname)
 
static void decrementCurrentWriteCounter (void)
 
static SoType getClassTypeId (void)
 This static method returns the SoType object associated with objects of this class.
 
static SoBasegetNamedBase (const SbName &name, SoType type)
 
static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type)
 
static SbBool getTraceRefs (void)
 
static void incrementCurrentWriteCounter (void)
 
static void initClass (void)
 Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
 
static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype)
 
static SbBool readRoute (SoInput *input)
 
static void removeName (SoBase *const base, const char *const name)
 
static void setInstancePrefix (const SbString &c)
 
static void setTraceRefs (SbBool trace)
 

Protected Member Functions

virtual ~SoBaseKit ()
 
virtual SoNodeaddToCopyDict (void) const
 
void catalogError (void)
 
virtual void copyContents (const SoFieldContainer *fromfc, SbBool copyconnections)
 
void countMyFields (SoOutput *out)
 
virtual void createDefaultParts (void)
 
void createFieldList (void)
 
void createNodekitPartsList (void)
 
virtual SoNodeKitPathcreatePathToAnyPart (const SbName &partname, SbBool makeifneeded, SbBool leafcheck=FALSE, SbBool publiccheck=FALSE, const SoPath *pathtoextend=NULL)
 
virtual SoNodegetAnyPart (const SbName &partname, SbBool makeifneeded, SbBool leafcheck=FALSE, SbBool publiccheck=FALSE)
 
const SbList< SoSFNode * > & getCatalogInstances (void) const
 
SoGroupgetContainerNode (const SbName &listname, SbBool makeifneeded=TRUE)
 
virtual const SoFieldDatagetFieldData (void) const
 
const SoNodekitPartsgetNodekitPartsList (void) const
 
virtual SbBool readInstance (SoInput *in, unsigned short flags)
 
virtual SbBool setAnyPart (const SbName &partname, SoNode *from, SbBool anypart=TRUE)
 
virtual void setDefaultOnNonWritingFields (void)
 
virtual SbBool setPart (const int partNum, SoNode *node)
 
virtual SbBool setUpConnections (SbBool onoff, SbBool doitalways=FALSE)
 
- Protected Member Functions inherited from SoNode
 SoNode (void)
 
virtual ~SoNode ()
 
- Protected Member Functions inherited from SoFieldContainer
 SoFieldContainer (void)
 
virtual ~SoFieldContainer ()
 
- Protected Member Functions inherited from SoBase
 SoBase (void)
 
virtual ~SoBase ()
 
virtual SoNotRec createNotRec (void)
 
virtual void destroy (void)
 
virtual const char * getFileFormatName (void) const
 
SbBool hasMultipleWriteRefs (void) const
 
void writeFooter (SoOutput *out) const
 
SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const
 

Static Protected Member Functions

static const SoNodekitCatalog ** getClassNodekitCatalogPtr (void)
 
static const SoFieldData ** getFieldDataPtr (void)
 
- Static Protected Member Functions inherited from SoNode
static const SoFieldData ** getFieldDataPtr (void)
 
static int getNextActionMethodIndex (void)
 
static void incNextActionMethodIndex (void)
 
static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask)
 
static void setNextActionMethodIndex (int index)
 
- Static Protected Member Functions inherited from SoBase
static uint32_t getCurrentWriteCounter (void)
 
static void staticDataLock (void)
 
static void staticDataUnlock (void)
 

Protected Attributes

SoSFNode callbackList
 
SoChildListchildren
 
SbBool connectionsSetUp
 
- Protected Attributes inherited from SoNode
SbUniqueId uniqueId
 
- Protected Attributes inherited from SoFieldContainer
SbBool isBuiltIn
 

Additional Inherited Members

- Public Types inherited from SoNode
enum  NodeType {
  INVENTOR = 0x0000 , VRML1 = 0x0001 , VRML2 = 0x0002 , INVENTOR_1 = 0x0004 ,
  INVENTOR_2_0 = 0x0008 , INVENTOR_2_1 = 0x0010 , INVENTOR_2_5 = 0x0020 , INVENTOR_2_6 = 0x0040 ,
  COIN_1_0 = 0x0080 , COIN_2_0 = 0x0100 , EXTENSION = 0x0200 , COIN_2_2 = 0x0400 ,
  COIN_2_3 = 0x0800 , COIN_2_4 = 0x1000 , INVENTOR_5_0 = 0x2000 , COIN_2_5 = 0x4000 ,
  COIN_3_0 = 0x8000 , INVENTOR_6_0 = 0x10000 , COIN_4_0 = 0x20000
}
 
- Protected Types inherited from SoBase
enum  BaseFlags { IS_ENGINE = 0x01 , IS_GROUP = 0x02 }
 
- Static Protected Attributes inherited from SoNode
static int nextActionMethodIndex = 0
 
static SbUniqueId nextUniqueId = 1
 

Detailed Description

The SoBaseKit class is the top level superclass for nodekits.

Node kits are collections of nodes and other node kits (from here on node kits which are 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 scene graph 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 scene graph. Those values are:

Name
The name of the part.
Type
The part's node type.
Default Type
If the part's type is an abstract superclass, this value will hold the default subclass used by this part.
Created by default?
Holds 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.
Parent Name
The name of the part that is this part's parent.
Right Sibling
The name of the part that is the part immediately to the right of this part in the node kit scene graph.
Is it a list?
Holds TRUE if the part is a list, otherwise it is FALSE. See SoNodeKitListPart for more info on node kit lists.
List Container Type
The type of group node used to hold the items if the part is a list.
List Element Type
The types of nodes that is allowed to be held by this part if the part is a list.
Is it public?
Holds TRUE if the part should be publicly available, otherwise it holds FALSE.

Node kits use lazy instantiation when it creates its 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, are created automatically.

The advantages of using node kits to represent a scene graph are many.

  • Since a node kit collects nodes into a single unit, it becomes an extra abstraction layer for the application programmer. Such a layer can represent a model of a human being as one unit where subunits as arms, legs, textures, etc. are contained within. Thus we can instantiate a model of a human by creating an instance of the node kit, instead of having to create a possibly large amount of nodes needed for such a model.
  • A part of the node kit doesn't have one specific setup. A shape part can e.g. be swapped with any other shape, since they are of the same type. If the node kit of a human has a part called "head" which is of type SoShape, it might default to a sphere. But if the programmer thinks that a cube might fit better, one can set the "head" part to a cube instead, or maybe a face set representing a complex model of a head.
  • Node kits can have as simple or as complex catalogs as needed. The nodes included in the node kit can, if needed, represent the whole range of Inventor features. One part can as easily be of a node kit type, making it possible to create hierarchies of node kits. Having a node kit of a human, it might be feasible to have sub node kits describing the different body parts.
  • Node kits are an efficient way of creating scene graphs. If some part of it isn't needed at the moment of node kit instantiation, they aren't created. Thus parts are only created when needed, either by the application or some other part.
  • The application code becomes smaller and easier to read, as the node kits provides simple routines for creating and setting parts.
  • New node kits can be created through subclassing to obtain simple setups of scene graphs best fitted to the application.

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]);
// Instantiating a shape kit, by default creating a simple sphere.
// 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 its 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 have a part with the name given,
// and delegate the setting to the correct kit.
shapekit->set("material", "diffuseColor 1 0 0");
newroot->ref();
newroot->addChild(shapekit);
viewer->setSceneGraph(newroot);
viewer->show();
SoQt::show(window);
delete viewer;
newroot->unref();
return 0;
}
The SbList class is a template container class for lists.
Definition SbList.h:70
SbList(const int sizehint=DEFAULTSIZE)
Definition SbList.h:78
The SoCube class is for rendering cubes.
Definition SoCube.h:42
The SoSeparator class is a state-preserving group node.
Definition SoSeparator.h:44
The SoShapeKit class provides templates to insert what is usually needed for shape nodes.
Definition SoShapeKit.h:38

The above code snippet will produce a viewer with a side view to the scene shown below:

Rendering of Example Scenegraph

Notice that the code needed for creating this simple shape using a shape kit, amounts to this:

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);
virtual void addChild(SoNode *node)
Definition SoGroup.cpp:453
The SoMaterial class is a node type for setting up material values for scene geometry.
Definition SoMaterial.h:44
SoMFColor diffuseColor
Definition SoMaterial.h:54

..so even for this minuscule 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, as well 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 source code of the built-in classes in Coin should also prove 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 subgraph.

The header file:

// Copyright (C) Kongsberg Oil & Gas Technologies. 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 {
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;
protected:
virtual void GLRender(SoGLRenderAction * action);
virtual ~ShapeScale();
};
#endif // ! SHAPESCALE_H
The SbColor class contains the red, green and blue components which make up a color value.
Definition SbColor.h:39
The SbVec2s class is a 2 dimensional vector with short integer coordinates.
Definition SbVec2s.h:51
The SoBaseKit class is the top level superclass for nodekits.
Definition SoBaseKit.h:66
The SoGLRenderAction class renders the scene graph with OpenGL calls.
Definition SoGLRenderAction.h:50
The SoNode class is the base class for nodes used in scene graphs.
Definition SoNode.h:56
The SoSFFloat class is a container for a floating point value.
Definition SoSFFloat.h:39
The SoState class manages the Coin scene graph traversal state data.
Definition SoState.h:44

The source code for the example:

// Copyright (C) Kongsberg Oil & Gas Technologies. 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.
{
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.
{
}
// 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 {
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
}
}
The SbName class stores strings by reference.
Definition SbName.h:40
The SbVec3f class is a 3 dimensional vector with floating point coordinates.
Definition SbVec3f.h:51
The SbViewVolume class is a viewing volume in 3D space.
Definition SbViewVolume.h:50
float getWorldToScreenScale(const SbVec3f &worldCenter, float normRadius) const
Definition SbViewVolume.cpp:365
The SbViewportRegion class is a viewport within a full window.
Definition SbViewportRegion.h:40
SoState * getState(void) const
Definition SoAction.cpp:1084
virtual SoNode * getAnyPart(const SbName &partname, SbBool makeifneeded, SbBool leafcheck=FALSE, SbBool publiccheck=FALSE)
Definition SoBaseKit.cpp:1696
static const SbMatrix & get(SoState *const state)
Definition SoModelMatrixElement.cpp:310
virtual void GLRender(SoGLRenderAction *action)
Definition SoNode.cpp:1003
The SoScale class is a node type for scaling scene graph geometry.
Definition SoScale.h:40
SoSFVec3f scaleFactor
Definition SoScale.h:49
static const SbViewVolume & get(SoState *const state)
FIXME: write doc.
Definition SoViewVolumeElement.cpp:93
static const SbViewportRegion & get(SoState *const state)
FIXME: write doc.
Definition SoViewportRegionElement.cpp:121

And a complete example showing how one can use this node kit:

// Copyright (C) Kongsberg Oil & Gas Technologies. 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 <cassert>
#include <cstdlib>
#include <ctime>
#include "ShapeScale.h"
// Returns random value between 0.0f and 1.0f.
static float
{
return float(rand())/float(RAND_MAX);
}
static SoSeparator *
{
t->translation = v;
markerroot->addChild(t);
ShapeScale * kit = new ShapeScale;
kit->active = TRUE;
kit->projectedSize = 5.0f;
// create the marker
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
{
const SoMouseButtonEvent * mbe = (SoMouseButtonEvent *)n->getEvent();
if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 &&
mbe->getState() == SoButtonEvent::DOWN) {
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;
break;
}
}
}
}
void
{
"\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
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;
}
newroot->ref();
newroot->addChild(root);
// create event callback and marker nodes
newroot->addChild(sep);
sep->addChild(ecb);
ex1->setSceneGraph(newroot);
ex1->setViewing(FALSE);
ex1->show();
SoQt::show(window);
delete ex1;
newroot->unref();
return 0;
}
int getLength(void) const
Definition SbList.h:168
The SoBaseColor class provides a node type for convenient setting of the base material color.
Definition SoBaseColor.h:41
@ DOWN
Definition SoButtonEvent.h:52
static SoSeparator * readAll(SoInput *input)
Definition SoDB.cpp:682
The SoEventCallback class provides functionality for catching events.
Definition SoEventCallback.h:52
@ SORTED_OBJECT_BLEND
Definition SoGLRenderAction.h:64
The SoGroup class is a node which managed other node instances.
Definition SoGroup.h:40
static SoType getClassTypeId(void)
Definition SoGroup.cpp:244
The SoInput class is an abstraction of file import functionality.
Definition SoInput.h:61
virtual SbBool openFile(const char *fileName, SbBool okIfNotFound=FALSE)
Definition SoInput.cpp:495
The SoMouseButtonEvent class contains information about mouse button interaction.
Definition SoMouseButtonEvent.h:44
@ BUTTON1
Definition SoMouseButtonEvent.h:56
static SoType getClassTypeId(void)
Definition SoMouseButtonEvent.cpp:100
The SoPath class is a container class for traversal path descriptions.
Definition SoPath.h:52
The SoPickedPoint class is used for specifying picked points.
Definition SoPickedPoint.h:48
const SbVec3f & getPoint() const
Definition SoPickedPoint.cpp:155
The SoRayPickAction class does ray intersection with scene graphs.
Definition SoRayPickAction.h:50
The SoTranslation class is a node type for specifying geometry translations.
Definition SoTranslation.h:40
SoSFVec3f translation
Definition SoTranslation.h:49

Constructor & Destructor Documentation

◆ SoBaseKit()

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.

◆ ~SoBaseKit()

SoBaseKit::~SoBaseKit ( )
protectedvirtual

Destructor.

Member Function Documentation

◆ addToCopyDict()

SoNode * SoBaseKit::addToCopyDict ( void ) const
protectedvirtual

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.

◆ addWriteReference()

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.

◆ callback()

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.

◆ catalogError()

void SoBaseKit::catalogError ( void )
protected

Obsoleted from the API in Coin.

◆ copyContents()

void SoBaseKit::copyContents ( const SoFieldContainer * from,
SbBool copyconnections )
protectedvirtual

Makes a deep copy of all data of from into this instance, except external scene graph references if copyconnections is FALSE.

This is the method that should be overridden by extension node / engine / dragger / whatever subclasses which need 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:

void copy(const SbList< Type > &l)
Definition SbList.h:92

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 its 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,
{
// let parent superclasses do their thing (copy fields, copy
// instance name, etc.)
// [..then copy internal data..]
}
The SoFieldContainer class is a base class for all classes that contain fields.
Definition SoFieldContainer.h:43
virtual void copyContents(const SoFieldContainer *from, SbBool copyconnections)
Definition SoNode.cpp:1483

Reimplemented from SoNode.

Reimplemented in SoRotateCylindricalDragger, SoRotateSphericalDragger, and SoInteractionKit.

◆ countMyFields()

void SoBaseKit::countMyFields ( SoOutput * out)
protected

Reference count the write connections to nodes in the catalog.

◆ createDefaultParts()

void SoBaseKit::createDefaultParts ( void )
protectedvirtual

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

◆ createFieldList()

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.

◆ createNodekitPartsList()

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.

◆ createPathToAnyPart()

SoNodeKitPath * SoBaseKit::createPathToAnyPart ( const SbName & partname,
SbBool makeifneeded,
SbBool leafcheck = FALSE,
SbBool publiccheck = FALSE,
const SoPath * pathtoextend = NULL )
protectedvirtual

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" top level 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).

◆ createPathToPart()

SoNodeKitPath * SoBaseKit::createPathToPart ( const SbName & partname,
SbBool makeifneeded,
const SoPath * pathtoextend = NULL )
virtual

Calls SoBaseKit::createPathToAnyPart() with leafcheck TRUE, and publiccheck TRUE (and other arguments as given to this function).

See SoBaseKit::createPathToAnyPart() for documentation.

◆ doAction()

void SoBaseKit::doAction ( SoAction * action)
virtual

This function performs the typical operation of a node for any action.

Reimplemented from SoNode.

◆ forceChildDrivenWriteRefs()

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.

◆ getAnyPart()

SoNode * SoBaseKit::getAnyPart ( const SbName & partname,
SbBool makeifneeded,
SbBool leafcheck = FALSE,
SbBool publiccheck = FALSE )
protectedvirtual

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 is a leaf in the catalog (otherwise NULL is returned).

If publiccheck is TRUE, a pointer to the part will only be returned if it is 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 specifying 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

◆ getBoundingBox()

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 calculate their bounding box also override this method to change the relevant state variables.

Reimplemented from SoNode.

Reimplemented in SoCenterballDragger, and SoDragger.

◆ getCatalogInstances()

const SbList< SoSFNode * > & SoBaseKit::getCatalogInstances ( void ) const
protected

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

◆ getChildren()

SoChildList * SoBaseKit::getChildren ( void ) const
virtual

Returns list of children for this node.

Reimplemented from SoNode.

◆ getClassNodekitCatalog()

const SoNodekitCatalog * SoBaseKit::getClassNodekitCatalog ( void )
static

Returns the nodekit catalog which defines the layout of this class' kit.

◆ getClassNodekitCatalogPtr()

const SoNodekitCatalog ** SoBaseKit::getClassNodekitCatalogPtr ( void )
staticprotected

Returns the pointer to the pointer of the nodekit catalog for this class.

◆ getClassTypeId()

SoType SoBaseKit::getClassTypeId ( void )
static

This static method returns the SoType object associated with objects of this class.

◆ getContainerNode()

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

◆ getFieldData()

◆ getFieldDataPtr()

const SoFieldData ** SoBaseKit::getFieldDataPtr ( void )
staticprotected

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

Returns the SoFieldData class which holds information about fields in this node.

◆ getMatrix()

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.

◆ getNodekitCatalog()

◆ getNodekitPartsList()

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.

See also
createNodekitPartsList()

◆ getPart()

SoNode * SoBaseKit::getPart ( const SbName & partname,
SbBool makeifneeded )
virtual

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.

◆ getPartString()

SbString SoBaseKit::getPartString ( const SoBase * part)

Returns the full path name to a catalog part, given the part's current item pointer.

◆ getPrimitiveCount()

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 calculate their primitive count also override this method to change the relevant state variables.

Reimplemented from SoNode.

Reimplemented in SoDragger.

◆ getTypeId()

◆ GLRender()

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 want to throw geometry primitives at OpenGL override this method.

Reimplemented from SoNode.

Reimplemented in SoDragger, and SoTabPlaneDragger.

◆ handleEvent()

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 override this method.

Reimplemented from SoNode.

Reimplemented in SoNodeVisualize, and SoDragger.

◆ initClass()

void SoBaseKit::initClass ( void )
static

◆ isSearchingChildren()

SbBool SoBaseKit::isSearchingChildren ( void )
static

Returns the value of the flag indicating whether or not the kit parts are searched during SoSearchAction traversal.

See also
SoBaseKit::setSearchingChildren()

◆ printDiagram()

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 its superclass. (Apart from the root entry, of course.)

For a more detailed catalog dump, see SoBaseKit::printTable().

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

See also
printDiagram()

◆ printTable()

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

◆ rayPick()

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 override this method.

Reimplemented from SoNode.

Reimplemented in SoDragger.

◆ readInstance()

SbBool SoBaseKit::readInstance ( SoInput * in,
unsigned short flags )
protectedvirtual

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 / persistent 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.

◆ search()

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.

See also
SoSearchAction

Reimplemented from SoNode.

Reimplemented in SoDragger.

◆ set() [1/2]

SbBool SoBaseKit::set ( const char * namevaluepairliststring)

Sets nodekit part field values. The input argument string is of the format:

(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 }");

◆ set() [2/2]

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.

◆ setAnyPart()

SbBool SoBaseKit::setAnyPart ( const SbName & partname,
SoNode * from,
SbBool anypart = TRUE )
protectedvirtual

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

◆ setDefaultOnNonWritingFields()

void SoBaseKit::setDefaultOnNonWritingFields ( void )
protectedvirtual

(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 scene graph export operations.

This is typically done when:

  1. field value is NULL and part is NULL by default

  2. it is a leaf SoGroup or SoSeparator node with no children

  3. it is a leaf listpart with no children and an SoGroup or SoSeparator container

  4. it is a non-leaf part and it is 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 SoInteractionKit, SoCenterballDragger, SoDirectionalLightDragger, SoDragger, SoDragPointDragger, SoHandleBoxDragger, SoJackDragger, SoPointLightDragger, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoSeparatorKit, and SoShapeKit.

◆ setPart() [1/2]

SbBool SoBaseKit::setPart ( const int partnum,
SoNode * node )
protectedvirtual

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.

◆ setPart() [2/2]

SbBool SoBaseKit::setPart ( const SbName & partname,
SoNode * from )
virtual

Sets the catalog part given by partname to the from node pointer.

Reimplemented in SoInteractionKit.

◆ setSearchingChildren()

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.

◆ setUpConnections()

SbBool SoBaseKit::setUpConnections ( SbBool onoff,
SbBool doitalways = FALSE )
protectedvirtual

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.

◆ write()

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.

Member Data Documentation

◆ children

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.

◆ connectionsSetUp

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.


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