SoBaseKit(3)

๐Ÿ“ฆ version 3.1.3, in fedora 43, fedora 44

โœจ NAME โœจ

SoBaseKit โ€” okay so bestie, this is the toplevel superclass for nodekits. ๐Ÿ‘‘ That's the whole vibe.

Oh and also hiii, you're reading SoBaseKit(3) out of the Library Functions Manual ๐Ÿ’– grab a snack, this one's a chonker.


๐Ÿฆ‹ SYNOPSIS ๐Ÿฆ‹

#include <Inventor/nodekits/SoBaseKit.h>

Inherits</purl> SoNode.

Inherited by SoAppearanceKit, SoCameraKit, SoForeignFileKit, SoInteractionKit, SoLightKit, , and .

not me pointing out that the original literally trails off with , , and . ๐Ÿ’€ verbatim, no edits, we respect the source

๐Ÿ’– Public Member Functions ๐Ÿ’–

virtual SoType getTypeId (void) const
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)

๐ŸŒธ Public Member Functions inherited from SoNode ๐ŸŒธ

void setOverride (const SbBool state)
SbBool isOverride (void) const
void setNodeType (const NodeType type)
NodeType getNodeType (void) const
virtual SoNode * copy (SbBool copyconnections=FALSE) const
virtual SbBool affectsState (void) const
virtual void GLRenderBelowPath (SoGLRenderAction *action)
virtual void GLRenderInPath (SoGLRenderAction *action)
virtual void GLRenderOffPath (SoGLRenderAction *action)
virtual void pick (SoPickAction *action)
virtual void audioRender (SoAudioRenderAction *action)
virtual void grabEventsSetup (void)
virtual void grabEventsCleanup (void)
virtual void startNotify (void)
virtual void notify (SoNotList *l)
uint32_t getNodeId (void) const
virtual void writeInstance (SoOutput *out)
virtual SoFieldContainer * copyThroughConnection (void) const

๐ŸŽ€ Public Member Functions inherited from SoFieldContainer ๐ŸŽ€

void setToDefaults (void)
SbBool hasDefaultValues (void) const
SbBool fieldsAreEqual (const SoFieldContainer *container) const
void copyFieldValues (const SoFieldContainer *container, SbBool
    copyconnections=FALSE)
SbBool set (const char *const fielddata)
void get (SbString &fielddata)
virtual int getFields (SoFieldList &l) const
virtual int getAllFields (SoFieldList &l) const
virtual SoField * getField (const SbName &name) const
virtual SoField * getEventIn (const SbName &name) const
virtual SoField * getEventOut (const SbName &name) const
SbBool getFieldName (const SoField *const field, SbName &name) const
SbBool enableNotify (const SbBool flag)
SbBool isNotifyEnabled (void) const
SbBool set (const char *fielddata, SoInput *input)
void get (SbString &fielddata, SoOutput *out)
virtual SbBool validateNewFieldValue (SoField *field, void *newval)
SbBool getIsBuiltIn (void) const
virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged)
    const
void setUserData (void *userdata) const
void * getUserData (void) const

๐Ÿฆ‹ Public Member Functions inherited from SoBase ๐Ÿฆ‹

void ref (void) const
void unref (void) const
void unrefNoDelete (void) const
int32_t getRefCount (void) const
void touch (void)
SbBool isOfType (SoType type) const
virtual SbName getName (void) const
virtual void setName (const SbName &newname)
void addAuditor (void *const auditor, const SoNotRec::Type type)
void removeAuditor (void *const auditor, const SoNotRec::Type type)
const SoAuditorList & getAuditors (void) const
SbBool shouldWrite (void)
void assertAlive (void) const

โญ Static Public Member Functions โญ

static SoType getClassTypeId (void)
static void initClass (void)
static const SoNodekitCatalog * getClassNodekitCatalog (void)
static SbBool isSearchingChildren (void)
static void setSearchingChildren (const SbBool newval)

๐ŸŒˆ Static Public Member Functions inherited from SoNode ๐ŸŒˆ

static uint32_t getCompatibilityTypes (const SoType &nodetype)
static SoType getClassTypeId (void)
static SoNode * getByName (const SbName &name)
static int getByName (const SbName &name, SoNodeList &l)
static void initClass (void)
static void initClasses (void)
static uint32_t getNextNodeId (void)
static int getActionMethodIndex (const SoType type)
static void getBoundingBoxS (SoAction *action, SoNode *node)
static void GLRenderS (SoAction *action, SoNode *node)
static void callbackS (SoAction *action, SoNode *node)
static void getMatrixS (SoAction *action, SoNode *node)
static void handleEventS (SoAction *action, SoNode *node)
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 void audioRenderS (SoAction *action, SoNode *node)
static void getPrimitiveCountS (SoAction *action, SoNode *node)

๐Ÿ’œ Static Public Member Functions inherited from SoFieldContainer ๐Ÿ’œ

static void initClass (void)
static SoType getClassTypeId (void)
static void cleanupClass (void)
static void initCopyDict (void)
static void addCopy (const SoFieldContainer *orig, const
    SoFieldContainer *copy)
static SoFieldContainer * checkCopy (const SoFieldContainer *orig)
static SoFieldContainer * findCopy (const SoFieldContainer *orig, const
    SbBool copyconnections)
static void copyDone (void)

๐Ÿ“ Static Public Member Functions inherited from SoBase ๐Ÿ“

static void initClass (void)
static SoType getClassTypeId (void)
static void addName (SoBase *const base, const char *const name)
static void removeName (SoBase *const base, const char *const name)
static void incrementCurrentWriteCounter (void)
static void decrementCurrentWriteCounter (void)
static SoBase * getNamedBase (const SbName &name, SoType type)
static int getNamedBases (const SbName &name, SoBaseList &baselist,
    SoType type)
static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype)
static void setInstancePrefix (const SbString &c)
static void setTraceRefs (SbBool trace)
static SbBool getTraceRefs (void)
static SbBool connectRoute (SoInput *input, const SbName &fromnodename,
    const SbName &fromfieldname, const SbName &tonodename, const SbName
    &tofieldname)
static SbBool readRoute (SoInput *input)

๐Ÿงš Protected Member Functions ๐Ÿงš

virtual const SoFieldData * getFieldData (void) const
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)

๐ŸŒท 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 void destroy (void)
SbBool hasMultipleWriteRefs (void) const
SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine)
    const
void writeFooter (SoOutput *out) const
virtual const char * getFileFormatName (void) const

๐Ÿ‘‘ Static Protected Member Functions ๐Ÿ‘‘

static const SoFieldData ** getFieldDataPtr (void)
static const SoNodekitCatalog ** getClassNodekitCatalogPtr (void)

โœจ Static Protected Member Functions inherited from SoNode โœจ

static const SoFieldData ** getFieldDataPtr (void)
static void setNextActionMethodIndex (int index)
static int getNextActionMethodIndex (void)
static void incNextActionMethodIndex (void)
static void setCompatibilityTypes (const SoType &nodetype, const
    uint32_t bitmask)

๐Ÿ’ซ Static Protected Member Functions inherited from SoBase ๐Ÿ’ซ

static uint32_t getCurrentWriteCounter (void)
static void staticDataLock (void)
static void staticDataUnlock (void)

๐ŸŒบ Protected Attributes ๐ŸŒบ

SoSFNode callbackList
SoChildList * children
SbBool connectionsSetUp

๐Ÿฌ Protected Attributes inherited from SoNode ๐Ÿฌ

uint32_t 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 }

๐ŸŽ€ Protected Types inherited from SoBase ๐ŸŽ€

enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 }

โญ Static Protected Attributes inherited from SoNode โญ

static uint32_t nextUniqueId = 1
static int nextActionMethodIndex = 0

๐ŸŒธ Detailed Description ๐ŸŒธ

The SoBaseKit class is the toplevel superclass for nodekits.


okay that's part 1, bestie โ€” the rest is coming, don't go anywhere ๐Ÿ’–

Okay so, node kits are literally just collections of nodes and other node kits โ€” and real quick, from here on out, any node kit that's part of some other node kit is only ever gonna get called a node or a part (peep catalogs and parts if you wanna go deeper) โ€” all organized in a way that's convenient for actually using them. A node kit inherits SoNode, so bestie, you can insert it into a scenegraph exactly like any other node. No special treatment, no drama. โœจ

The whole organizing sitch is handled through catalogs. A node kit's catalog describes the nodes that are allowed to be members of the node kit. Those members? They're called parts. So basically: a node kit has a catalog, and that catalog describes the parts it's offering up to you. ๐Ÿ’…

Every part in the catalog carries some values saying stuff about the part itself and about the role that part plays in the scenegraph. 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 holds the default subclass that this part uses.

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 gets set by one of the applicable means.

Parent Name ๐Ÿ‘‘

The name of the part that is this part's parent.

Right Sibling ๐Ÿ’–

The name of the part that sits immediately to the right of this part in the node kit scenegraph.

Is it a List? ๐Ÿ“

Holds TRUE if the part is a list, otherwise it's FALSE. See SoNodeKitListPart for more info on node kit lists.

List Cointainer Type ๐Ÿงš

The type of group node used to hold the items if the part is a list.

bestie yes, it really says "Cointainer" โ€” that's how it's written, and we respect the lore. ๐Ÿ’€

List Element Type ๐ŸŒˆ

The types of nodes that are allowed to be held by this part if the part is a list.

Is It Public? ๐Ÿ™ˆ

Holds TRUE if the part should be publically available, otherwise it holds FALSE.


So here's the tea: node kits use lazy instantiation when they create their parts. Translation? The nodes that make up the parts of the node kit only get created when they're actually needed. If "Created by Default?" holds TRUE, then the part gets created the moment the node kit itself is instantiated. If not, parts get created when they're requested through SoBaseKit::getPart() or the SO_GET_PART() macro, or created with SoBaseKit::set(). And also โ€” if a part is set with SoBaseKit::setPart() or the SO_SET_PART() macro, then any previously uncreated parts above the set part in the hierarchy get created automatically. She's efficient like that. ๐Ÿ˜Œ

The advantages of using node kits to represent a scenegraph are, honestly, a lot:

  • Since a node kit collects nodes into a single unit, it becomes an extra abstraction layer for the application programmer. That layer can represent a model of a human being as one single unit, with subunits like arms, legs, textures, etc. all contained inside it. So we can instantiate a model of a human just by creating an instance of the node kit, instead of having to create a possibly huge amount of nodes needed for a model like that. Iconic behavior tbh.
  • A part of the node kit doesn't have one specific setup. A shape part can, for example, be swapped with any other shape, since they're the same type. If the node kit of a human has a part called "head" that's of type SoShape, it might default to a sphere. But if the programmer thinks a cube might fit better, you can set the "head" part to a cube instead, or maybe a face set representing a complex model of a head. Your call, bestie. โœจ
  • 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, which makes it possible to create hierarchies of node kits. Have a node kit of a human? It might be totally feasible to have sub node kits describing the different body parts. ๐Ÿ‘‘
  • Node kits are an efficient way of creating scenegraphs. If some part of it isn't needed at the moment the node kit is instantiated, it doesn't get created. So parts only get created when needed โ€” either by the application or by some other part. Not a single wasted node. ๐Ÿ’…
  • The application code becomes smaller and easier to read, because the node kits provide simple routines for creating and setting parts. Clean code? We love her.
  • New node kits can be created through subclassing, to get simple setups of scenegraphs that are 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]);

  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");
SoSeparator * root = new SoSeparator;
SoMaterial * material = new SoMaterial;
material->diffuseColor.setValue(1,0,0);
root->addChild(material);
root->addChild(new SoCube);

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-2010 by 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 {
  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-2010 by 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.
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, 0, FALSE);
  SO_KIT_ADD_CATALOG_ABSTRACT_ENTRY(shape, SoNode, SoCube, TRUE, topSeparator, 0, 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();

...and bestie, we are right in the middle of that render function, so hold that thought ๐Ÿซถ

โ€ฆand the whole thing wraps up like this, bestie ๐Ÿ’…

  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 here's a whole complete example of how you'd actually use this node kit in real life ๐Ÿฆ‹ โ€” and yes, the copyright header stays in the code, because that's the law โœจ

// Copyright (C) 1998-2010 by 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 <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;
}

๐ŸŽ€ Constructor & Destructor Documentation ๐ŸŽ€

SoBaseKit::SoBaseKit(void)

okay so this is the constructor, and it's lowkey the mom of the entire family ๐Ÿ’–

This is the top-level superclass of all node kit and dragger classes, periodt. 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.)

So like, as you can literally see from the catalog up there ๐Ÿ‘† every single node kit can have a callback node sitting in front of all the other nodes in the kit. And that is so handy for catching events that should go to application processing. It's giving "bouncer at the club door" energy ngl ๐Ÿซถ

SoBaseKit::~SoBaseKit(void) โ€” [protected], [virtual]

Destructor. That's the whole thing, bestie ๐Ÿ™ˆ๐Ÿ’€


โœจ๐Ÿ’– Member Function Documentation ๐Ÿ’–โœจ

SoType SoBaseKit::getTypeId(void) const โ€” [virtual]

Returns the type identification of an object derived from a class inheriting SoBase. This is what gets used for run-time type checking and for "downward" casting (iykyk ๐Ÿ‘‘).

Usage example:

void foo(SoNode * node)
{
  if (node->getTypeId() == SoFile::getClassTypeId()) {
    SoFile * filenode = (SoFile *)node;  // safe downward cast, knows the type
  }
}

Now listen, for all my application programmers out there who wanna extend the library with new nodes, engines, nodekits, draggers or whatever else ๐Ÿ”ฅ โ€” this method needs to be overridden in all subclasses. That's typically done as part of setting up the full type system for extension classes, which is usually accomplished by using the pre-defined macros available through for instance Inventor/nodes/SoSubNode.h (SO_NODE_INIT_CLASS and SO_NODE_CONSTRUCTOR for node classes), Inventor/engines/SoSubEngine.h (for engine classes) and so on.

For more info on writing Coin extensions, go check the class documentation of the toplevel superclasses for the various class groups ๐Ÿ“š

Implements SoBase.

Reimplemented in SoAppearanceKit, SoCameraKit, SoCenterballDragger, SoDirectionalLightDragger, SoDragger, SoDragPointDragger, SoForeignFileKit, SoHandleBoxDragger, SoInteractionKit, SoJackDragger, SoLightKit, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSceneKit, SoSeparatorKit, SoShapeKit, SoSpotLightDragger, SoSTLFileKit, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, SoTranslate2Dragger, and SoWrapperKit. (yes, the whole squad showed up ๐Ÿ’…)

const SoFieldData * SoBaseKit::getFieldData(void) const โ€” [protected], [virtual]

Hands you back a pointer to the class-wide field data storage object for this instance. And if there are literally no fields present? It returns NULL. No fields, no pointer, simple as that ๐Ÿ“

Reimplemented from SoFieldContainer.

Reimplemented in SoAppearanceKit, SoCameraKit, SoCenterballDragger, SoDirectionalLightDragger, SoDragger, SoDragPointDragger, SoForeignFileKit, SoHandleBoxDragger, SoInteractionKit, SoJackDragger, SoLightKit, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSceneKit, SoSeparatorKit, SoShapeKit, SoSpotLightDragger, SoSTLFileKit, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, SoTranslate2Dragger, and SoWrapperKit.

const SoNodekitCatalog * SoBaseKit::getClassNodekitCatalog(void) โ€” [static]

Returns the nodekit catalog which defines the layout of this class' kit. Static edition โœจ

const SoNodekitCatalog * SoBaseKit::getNodekitCatalog(void) const โ€” [virtual]

Returns the nodekit catalog which defines the layout of this class' kit. Same energy as the one above, just not static, bestie ๐ŸŒธ

Reimplemented in SoAppearanceKit, SoCameraKit, SoCenterballDragger, SoDirectionalLightDragger, SoDragger, SoDragPointDragger, SoForeignFileKit, SoHandleBoxDragger, SoInteractionKit, SoJackDragger, SoLightKit, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSceneKit, SoSeparatorKit, SoShapeKit, SoSpotLightDragger, SoSTLFileKit, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, SoTranslate2Dragger, and SoWrapperKit.

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.

For the full tea on how to use partname and makeifneeded, and what you can actually expect to get handed back from this method, go read the documentation of SoBaseKit::getAnyPart() ๐Ÿ‘‘

SbString SoBaseKit::getPartString(const SoBase * part)

Returns the full path name to a catalog part, given the part's current item pointer. Very "give me the address" of it all ๐Ÿ’…

SoNodeKitPath * SoBaseKit::createPathToPart(const SbName & partname, SbBool makeifneeded, const SoPath * pathtoextend = NULL) โ€” [virtual]

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

See SoBaseKit::createPathToAnyPart() for documentation ๐Ÿ“–

SbBool SoBaseKit::setPart(const SbName & partname, SoNode * from) โ€” [virtual]

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

Reimplemented in SoInteractionKit.


๐Ÿ’– SbBool SoBaseKit::set (const char * namevaluepairliststring)

Okay so this one is literally the "fill in all the parts at once" button โ€” it sets nodekit part field values from one big string. The input argument string is formatted like this:

partname {
  fieldname fieldval
  fieldname fieldval
  [...]
}
partname {
  fieldname fieldval
  fieldname fieldval
  [...]
}
[...]

(Whitespace layout is ignored, as always for Inventor format input strings. So go ahead and indent however your heart desires, bestie, it truly does not care. ๐Ÿ’…)

Here's an example that changes several values of the camera part of an SoCameraKit instance:

kit->set("camera { heightAngle 0.3927  nearDistance 1.1  farDistance 999.9 }");

๐Ÿฆ‹ 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. So like, same energy, different packaging. โœจ

๐Ÿ‘‘ void SoBaseKit::doAction (SoAction * action) [virtual]

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

Reimplemented from SoNode.

๐ŸŒธ 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.

๐Ÿ”ฅ 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.

๐ŸŽ€ 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.

๐ŸŒˆ 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.

๐Ÿ’œ 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.

โญ 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.

๐Ÿงš 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. No partial credit, babes. ๐Ÿ˜ญ

See also

SoSearchAction

Reimplemented from SoNode.

Reimplemented in SoDragger.

๐Ÿ“ 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.

๐Ÿ’– 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.

๐ŸŒธ SoChildList * SoBaseKit::getChildren (void ) const [virtual]

Returns list of children for this node. That's it, that's the whole vibe check. ๐Ÿซถ

Reimplemented from SoNode.

โœจ void SoBaseKit::printDiagram (void )

Print out the full nodekit catalog structure. Just invokes SoBaseKit::printSubDiagram() on the catalog root. Useful for debugging โ€” like a little family tree for your nodekit. ๐ŸŒณ

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

๐Ÿฆ‹ 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()

๐Ÿ‘‘ 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).

๐Ÿ”ฅ 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.

๐Ÿ’œ 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.

๐ŸŒˆ 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()

โญ 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. So by default it's a no, but you can absolutely change that. ๐Ÿ’…

๐Ÿงš const SoNodekitCatalog ** SoBaseKit::getClassNodekitCatalogPtr (void ) [static], [protected]

Returns the pointer to the pointer of the nodekit catalog for this class. Double pointer, double the drama. ๐Ÿ˜Œ

๐Ÿ“ 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.

๐Ÿ’– 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:
SoNode * mynewnode = templatenode->copy();

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 SoInteractionKit, SoRotateCylindricalDragger, and SoRotateSphericalDragger.

๐ŸŒธ 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).

๐Ÿฆ‹ 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

createPathToAnyPart() ๐Ÿ›ค๏ธ

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

Returns a path with nested SoNodeKit instances down in the catalog hierarchy that partname points to. โœจ

If the trailing part hasn't been made yet and makeifneeded is TRUE, it'll make an instance of the part type and insert it into the catalog, just like setAnyPart() does. ๐Ÿซถ

If leafcheck is TRUE, non-leaf catalog node entries get ignored. If publiccheck is TRUE, private catalog entries get ignored. ๐Ÿ™ˆ

pathtoextend is a path through the nodekit instance catalog hierarchy where we should pick up and keep building the path from where pathtoextend ends. If pathtoextend is NULL, we just 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 it refers to non-existing catalog entries). ๐Ÿ˜ญ


setAnyPart() ๐Ÿงฉ

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. ๐Ÿคซ


createNodekitPartsList() ๐Ÿ“‹

void SoBaseKit::createNodekitPartsList (void ) [protected]

Not part of the Coin API. ๐Ÿšซ

It was 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. ๐Ÿคทโ€โ™€๏ธ


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. โœจ


createDefaultParts() ๐Ÿงธ

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. ๐Ÿซถ


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


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. ๐Ÿคซ


catalogError() ๐Ÿ’€

void SoBaseKit::catalogError (void ) [protected]

Obsoleted from the API in Coin. ๐Ÿšซ


setUpConnections() ๐Ÿ”—

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, SoInteractionKit, SoJackDragger, SoPointLightDragger, SoRotateCylindricalDragger, SoRotateDiscDragger, SoRotateSphericalDragger, SoScale1Dragger, SoScale2Dragger, SoScale2UniformDragger, SoScaleUniformDragger, SoSeparatorKit, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, SoTransformerDragger, SoTranslate1Dragger, and SoTranslate2Dragger. ๐Ÿ‘‘


readInstance() ๐Ÿ“–

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. ๐Ÿ”


setDefaultOnNonWritingFields() ๐Ÿšซโœ๏ธ

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:

  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'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, SoDragger, SoDragPointDragger, SoHandleBoxDragger, SoInteractionKit, SoJackDragger, SoPointLightDragger, SoSeparatorKit, SoShapeKit, SoSpotLightDragger, SoTabBoxDragger, SoTabPlaneDragger, SoTrackballDragger, SoTransformBoxDragger, and SoTransformerDragger. ๐Ÿ‘‘


countMyFields() ๐Ÿ”ข

void SoBaseKit::countMyFields (SoOutput * out) [protected]

Reference count the write connections to nodes in the catalog. ๐Ÿงฎ


setPart() ๐Ÿงฉ

SbBool SoBaseKit::setPart (const int partnum, SoNode * node) [protected],
    [virtual]

Sets parts, updates the nodekit scene graph, and makes sure the 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. ๐Ÿ”


Member Data Documentation ๐Ÿ“ฆ

  • 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. ๐Ÿคซ
  • 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. ๐Ÿคซ

Author โœ๏ธ

Generated automatically by Doxygen for Coin from the source code. ๐Ÿค–


Okay bestie, that's the whole SoBaseKit(3) page! ๐Ÿ’– Footer energy: Coin, Version 3.1.3, SoBaseKit(3). That's the source/version vibe, periodt. ๐Ÿ’…โœจ

๐Ÿ“ฆ where this page comes from