Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://bitbucket.org/Coin3D/
http://www.kongsberg.com/kogt/
Element Classes

The element classes in Coin are the containers of state information during action traversals of scene graphs. More...

Classes

class  SoGLCacheContextElement
 The SoGLCacheContextElement class handles the OpenGL cache for a context. More...
 
class  SoGLClipPlaneElement
 The SoGLClipPlaneElement class is yet to be documented. More...
 
class  SoGLColorIndexElement
 The SoGLColorIndexElement class sets the current OpenGL color. More...
 
class  SoGLCoordinateElement
 The SoGLCoordinateElement class is yet to be documented. More...
 
class  SoGLDepthBufferElement
 The SoGLDepthBufferElement controls the OpenGL depth buffer. More...
 
class  SoGLDrawStyleElement
 The SoGLDrawStyleElement updates the current draw style in OpenGL. More...
 
class  SoGLEnvironmentElement
 The SoGLEnvironmentElement class is for setting GL fog etc. More...
 
class  SoGLLazyElement
 The SoGLLazyElement class is meant to optimize GL rendering. More...
 
class  SoGLLightIdElement
 The SoGLLightIdElement class is yet to be documented. More...
 
class  SoGLLinePatternElement
 The SoGLLinePatternElement class changes the line stipple pattern of the OpenGL render state. More...
 
class  SoGLLineWidthElement
 The SoGLLineWidthElement class changes the linewidth setting of the OpenGL render state. More...
 
class  SoGLModelMatrixElement
 The SoGLModelMatrixElement class is yet to be documented. More...
 
class  SoGLMultiTextureCoordinateElement
 The SoGLMultiTextureCoordinateElement class stores the current gltexture coordinates for several units. More...
 
class  SoGLMultiTextureMatrixElement
 The SoGLMultiTextureMatrixElement class is used to update the OpenGL texture matrix. More...
 
class  SoGLMultiTextureImageElement
 The SoGLMultiTextureImageElement is used to control the current GL texture for texture units. More...
 
class  SoGLNormalElement
 The SoGLNormalElement class is yet to be documented. More...
 
class  SoGLPointSizeElement
 The SoGLPointSizeElement class changes the pointsize setting of the OpenGL render state. More...
 
class  SoGLPolygonOffsetElement
 The SoGLPolygonOffsetElement class is yet to be documented. More...
 
class  SoGLProjectionMatrixElement
 The SoGLProjectionMatrixElement class is yet to be documented. More...
 
class  SoGLRenderPassElement
 The SoGLRenderPassElement class is yet to be documented. More...
 
class  SoGLShapeHintsElement
 The SoGLShapeHintsElement class is yet to be documented. More...
 
class  SoGLUpdateAreaElement
 The SoGLUpdateAreaElement class is yet to be documented. More...
 
class  SoGLVBOElement
 The SoGLVBOElement class is used to store VBO state. More...
 
class  SoGLViewingMatrixElement
 The SoGLViewingMatrixElement class is used to store the current viewing matrix. More...
 
class  SoGLViewportRegionElement
 The SoGLViewportRegionElement class is yet to be documented. More...
 
class  SoGLDisplayList
 The SoGLDisplayList class stores and manages OpenGL display lists. More...
 
class  SoAccumulatedElement
 The SoAccumulatedElement class is an abstract class for storing accumulated state. More...
 
class  SoAmbientColorElement
 The SoAmbientColorElement class is yet to be documented. More...
 
class  SoAnnoText3CharOrientElement
 The SoAnnoText3CharOrientElement class is yet to be documented. More...
 
class  SoAnnoText3FontSizeHintElement
 The SoAnnoText3FontSizeHintElement class is yet to be documented. More...
 
class  SoAnnoText3RenderPrintElement
 The SoAnnoText3RenderPrintElement class is yet to be documented. More...
 
class  SoBBoxModelMatrixElement
 The SoBBoxModelMatrixElement class keeps track of the current model matrix during a scene graph traversal. It is used by amongst others the SoGetBoundingBoxAction class. More...
 
class  SoBumpMapElement
 The SoBumpMapElement class is yet to be documented. More...
 
class  SoBumpMapCoordinateElement
 The SoBumpMapCoordinateElement class is yet to be documented. More...
 
class  SoBumpMapMatrixElement
 The SoBumpMapMatrixElement class is used to manage the bump map matrix stack. More...
 
class  SoCacheElement
 The SoCacheElement class stores and manages the open caches. More...
 
class  SoClipPlaneElement
 The SoClipPlaneElement class is used to manage the clip plane stack. More...
 
class  SoComplexityElement
 The SoComplexityElement class contains the current shape complexity for a graph traverser. More...
 
class  SoComplexityTypeElement
 The SoComplexityTypeElement class is yet to be documented. More...
 
class  SoCoordinateElement
 The SoCoordinateElement class is yet to be documented. More...
 
class  SoCreaseAngleElement
 The SoCreaseAngleElement class stores the crease angle during a scene graph traversal. More...
 
class  SoCullElement
 The SoCullElement class is used internally for render and pick culling. More...
 
class  SoDecimationPercentageElement
 The SoDecimationPercentageElement class is yet to be documented. More...
 
class  SoDecimationTypeElement
 The SoDecimationTypeElement class is yet to be documented. More...
 
class  SoDepthBufferElement
 The SoDepthBufferElement controls the depth buffer settings. More...
 
class  SoDiffuseColorElement
 The SoDiffuseColorElement class is yet to be documented. More...
 
class  SoDrawStyleElement
 The SoDrawStyleElement class is yet to be documented. More...
 
class  SoElement
 SoElement is the abstract base class for all elements. More...
 
class  SoEmissiveColorElement
 The SoEmissiveColorElement class is yet to be documented. More...
 
class  SoEnvironmentElement
 The SoEnvironmentElement class is yet to be documented. More...
 
class  SoFloatElement
 SoFloatElement is an abstract base class for elements that consists of a single float value. More...
 
class  SoFocalDistanceElement
 The SoFocalDistanceElement class is yet to be documented. More...
 
class  SoFontNameElement
 The SoFontNameElement class is yet to be documented. More...
 
class  SoFontSizeElement
 The SoFontSizeElement class is yet to be documented. More...
 
class  SoInt32Element
 The SoInt32Element class is the base class for elements that simply store a 32-bit integer. More...
 
class  SoLazyElement
 The SoLazyElement class is used to handle material and shape properties. More...
 
class  SoLightAttenuationElement
 The SoLightAttenuationElement class is yet to be documented. More...
 
class  SoLightElement
 The SoLightElement class manages the currently active light sources. More...
 
class  SoLightModelElement
 The SoLightModelElement class is yet to be documented. More...
 
class  SoLinePatternElement
 The SoLinePatternElement class defines the line stipple pattern. More...
 
class  SoLineWidthElement
 The SoLineWidthElement class changes the linewidth setting of the render state. More...
 
class  SoLocalBBoxMatrixElement
 The SoLocalBBoxMatrixElement class is yet to be documented. More...
 
class  SoMaterialBindingElement
 The SoMaterialBindingElement class is yet to be documented. More...
 
class  SoVertexAttributeBindingElement
 The SoVertexAttributeBindingElement class is yet to be documented. More...
 
class  SoMultiTextureCoordinateElement
 The SoMultiTextureCoordinateElement class is yet to be documented. More...
 
class  SoMultiTextureEnabledElement
 The SoMultiTextureEnabledElement class is an element which stores whether texturing is enabled or not. More...
 
class  SoMultiTextureMatrixElement
 The SoMultiTextureMatrixElement class is used to manage the texture matrix stack for texture units > 0. More...
 
class  SoMultiTextureImageElement
 The SoMultiTextureImageElement class is yet to be documented. More...
 
class  SoModelMatrixElement
 The SoModelMatrixElement class is used to manage the current transformation. More...
 
class  SoNormalBindingElement
 The SoNormalBindingElement is yet to be documented. More...
 
class  SoNormalElement
 The SoNormalElement class is yet to be documented. More...
 
class  SoOverrideElement
 The SoOverrideElement maintains a list of overridable elements and a list over which elements should be overridden. More...
 
class  SoPickRayElement
 The SoPickRayElement class is yet to be documented. More...
 
class  SoPickStyleElement
 The SoPickStyleElement is yet to be documented. More...
 
class  SoPointSizeElement
 The SoPointSizeElement changes the pointsize setting of the render state. More...
 
class  SoPolygonOffsetElement
 The SoPolygonOffsetElement class is yet to be documented. More...
 
class  SoProfileCoordinateElement
 The SoProfileCoordinateElement class is yet to be documented. More...
 
class  SoProfileElement
 The SoProfileElement class is yet to be documented. More...
 
class  SoReplacedElement
 The SoReplacedElement class is an abstract element superclass. More...
 
class  SoShapeStyleElement
 The SoShapeStyleElement class is yet to be documented. More...
 
class  SoShininessElement
 The SoShininessElement class is yet to be documented. More...
 
class  SoSpecularColorElement
 The SoSpecularColorElement is yet to be documented. More...
 
class  SoSwitchElement
 The SoSwitchElement class is yet to be documented. More...
 
class  SoTextOutlineEnabledElement
 The SoTextOutlineEnabledElement class is yet to be documented. More...
 
class  SoTextureCombineElement
 The SoTextureCombineElement class is yet to be documented. More...
 
class  SoTextureCoordinateBindingElement
 The SoTextureCoordinateBindingElement class is yet to be documented. More...
 
class  SoTextureOverrideElement
 The SoTextureOverrideElement makes it possible to override texture elements. More...
 
class  SoTextureUnitElement
 The SoTextureUnitElement class is yet to be documented. More...
 
class  SoTextureQualityElement
 The SoTextureQualityElement is yet to be documented. More...
 
class  SoTransparencyElement
 The SoTransparencyElement is yet to be documented. More...
 
class  SoUnitsElement
 The SoUnitsElement class is yet to be documented. More...
 
class  SoViewVolumeElement
 The SoViewVolumeElement class is yet to be documented. More...
 
class  SoViewingMatrixElement
 The SoViewingMatrixElement class stores the world-to-camera transformation. More...
 
class  SoViewportRegionElement
 The SoViewportRegionElement class is yet to be documented. More...
 
class  SoWindowElement
 The SoWindowElement class is used to store current window attributes. More...
 
class  SoListenerPositionElement
 The SoListenerPositionElement holds the position of the current listener. More...
 
class  SoListenerOrientationElement
 The SoListenerOrientationElement holds the orientation of the current listener. More...
 
class  SoListenerGainElement
 The SoListenerGainElement class stores the SoListener gain during a scene graph traversal. More...
 
class  SoListenerDopplerElement
 The SoListenerDopplerElement holds the doppler velocity and factor of the current listener. More...
 
class  SoSoundElement
 The SoSoundElement is used for optimizing audio rendering and for turning off inactive SoVRMLSound nodes. More...
 
class  SoShadowStyleElement
 The SoShadowStyleElement class is yet to be documented. More...
 
class  SoGLShadowCullingElement
 The SoGLShadowCullingElement class is yet to be documented. More...
 
class  SoGeoElement
 The SoGeoElement class is yet to be documented. More...
 

Detailed Description

The element classes in Coin are the containers of state information during action traversals of scene graphs.

One element usually corresponds to one item of information, or sometimes a group of related information values. The elements work like a stack that is pushed and popped as the action traverses in and out of SoSeparator nodes, and the action will always just inspect the top of the stack when it needs to know a value.

Elements are internal implementation details of the workings of nodes and actions, and is not something one needs to worry about before writing ones own extension nodes. Writing extension elements is even more removed from plain Open Inventor usage, but is fully possible for the experienced Open Inventor developer.

The Element Classes

Elements are mostly internal to Coin, unless you create new extension nodes over Coin. Then you will probably need to know about them.Elements are part of the design for scenegraph traversal in Coin.It works like this: any traversal action instantiates and keeps a single SoState instance during traversal. The SoState instance uses SoElement objects as "memory units" to keep track of the current state for any feature of the scenegraph nodes.As an example, consider the SoPointSize node: when the SoPointSize node is traversed by for instance a SoGLRenderAction, it will itself push a SoPointSizeElement onto the SoGLRenderAction's SoState stack. Later, when a SoPointSet node occurs in the scenegraph, it will request the current pointsize value from the SoState by reading off the value of it's SoPointSizeElement.SoSeparator nodes will push and pop elements on and off the state stack, so anything that changes state below a SoSeparator node will not influence anything above the SoSeparator.For more information on the theoretical underpinnings of this traversal design, you should consider reading available literature on the so-called "Visitor pattern". We recommend "Design Patterns", by Gamma, Helm, Johnson, Vlissides (aka the "Gang Of Four"). This book actually uses the Inventor API traversal mechanism as the case study for explaining the Visitor pattern.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 source code of the built-in classes in Coin should also prove very helpful.
The following is a complete example on how to extend Coin with your own traversal elements. First, the class declaration of the new element (ie the header include file):
// [texturefilenameelement.h]
#ifndef TEXTUREFILENAMEELEMENT_H
#define TEXTUREFILENAMEELEMENT_H
#include <Inventor/elements/SoReplacedElement.h>
#include <Inventor/SbString.h>
class TextureFilenameElement : public SoReplacedElement {
typedef SoReplacedElement inherited;
SO_ELEMENT_HEADER(TextureFilenameElement);
public:
static void initClass(void);
virtual void init(SoState * state);
static void set(SoState * const state, SoNode * const node,
const SbString & filename);
static const SbString & get(SoState * const state);
static const TextureFilenameElement * getInstance(SoState * state);
protected:
virtual ~TextureFilenameElement();
virtual void setElt(const SbString & filename);
private:
SbString filename;
};
#endif // !TEXTUREFILENAMEELEMENT_H
The implementation of the element:
// [texturefilenameelement.cpp]
//
// The purpose of the code in this file is to demonstrate how you can
// make your own elements for scene graph traversals.
//
// Code by Peder Blekken <pederb@sim.no>. Copyright (C)
// Kongsberg Oil & Gas Technologies.
#include "texturefilenameelement.h"
SO_ELEMENT_SOURCE(TextureFilenameElement);
void
TextureFilenameElement::initClass(void)
{
SO_ELEMENT_INIT_CLASS(TextureFilenameElement, inherited);
}
void
TextureFilenameElement::init(SoState * state)
{
this->filename = "<none>";
}
TextureFilenameElement::~TextureFilenameElement()
{
}
void
TextureFilenameElement::set(SoState * const state, SoNode * const node,
const SbString & filename)
{
TextureFilenameElement * elem = (TextureFilenameElement *)
SoReplacedElement::getElement(state, classStackIndex, node);
elem->setElt(filename);
}
const SbString &
TextureFilenameElement::get(SoState * const state)
{
return TextureFilenameElement::getInstance(state)->filename;
}
void
TextureFilenameElement::setElt(const SbString & filename)
{
this->filename = filename;
}
const TextureFilenameElement *
TextureFilenameElement::getInstance(SoState * state)
{
return (const TextureFilenameElement *)
SoElement::getConstElement(state, classStackIndex);
}
And a small, stand-alone test application putting the new element to use:
// [lstextures.cpp]
//
// The purpose of this file is to make a small wrapper "tool" around
// the TextureFilenameElement extension element, just for showing
// example code on how to make use of a user-defined custom element.
//
// The code goes like this:
//
// We initialize the element, enable it for the SoCallbackAction, read
// a scene graph file, set callbacks on SoTexture2 and all shape nodes
// and applies the SoCallbackAction. The callbacks will then print out
// the texture filename information from the TextureFilenameElement
// each time an interesting node is hit.
//
//
// Code by Peder Blekken <pederb@sim.no>. Cleaned up, integrated in
// Coin distribution and commented by Morten Eriksen
// <mortene@sim.no>. Copyright (C) Kongsberg Oil & Gas Technologies.
#include <Inventor/SoDB.h>
#include <Inventor/SoInput.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoTexture2.h>
#include <Inventor/nodes/SoShape.h>
#include <Inventor/misc/SoState.h>
#include <cstdio>
#include "texturefilenameelement.h"
pre_tex2_cb(void * data, SoCallbackAction * action, const SoNode * node)
{
const SbString & filename = ((SoTexture2 *)node)->filename.getValue();
TextureFilenameElement::set(action->getState(), (SoNode *)node, filename);
(void)fprintf(stdout, "=> New texture: %s\n",
filename.getLength() == 0 ?
"<inlined>" : filename.getString());
}
pre_shape_cb(void * data, SoCallbackAction * action, const SoNode * node)
{
const SbString & filename =
TextureFilenameElement::get(action->getState());
(void)fprintf(stdout, " Texturemap on %s: %s\n",
filename.getLength() == 0 ?
"<inlined>" : filename.getString());
}
void
usage(const char * appname)
{
(void)fprintf(stderr, "\n\tUsage: %s <modelfile.iv>\n\n", appname);
(void)fprintf(stderr,
"\tLists all texture filenames in the model file,\n"
"\tand on which shape nodes they are used.\n\n"
"\tThe purpose of this example utility is simply to\n"
"\tshow how to create and use an extension element for\n"
"\tscene graph traversal.\n\n");
}
int
main(int argc, char ** argv)
{
if (argc != 2) {
usage(argv[0]);
exit(1);
}
TextureFilenameElement::initClass();
SO_ENABLE(SoCallbackAction, TextureFilenameElement);
SoInput input;
if (!input.openFile(argv[1])) {
(void)fprintf(stderr, "ERROR: couldn't open file ``%s''.\n", argv[1]);
exit(1);
}
SoSeparator * root = SoDB::readAll(&input);
if (root) {
root->ref();
SoCallbackAction cbaction;
cbaction.addPreCallback(SoTexture2::getClassTypeId(), pre_tex2_cb, NULL);
cbaction.addPreCallback(SoShape::getClassTypeId(), pre_shape_cb, NULL);
cbaction.apply(root);
root->unref();
return 0;
}
return 1;
}