elements(3)

πŸ“¦ version 3.1.3, in fedora 43, fedora 44

πŸ’– elements(3) πŸ’–

okay bestie, welcome to the manual page for elements β€” part of the Library Functions Manual, section 3 (that's the "these are library functions, go write some code" section, iykyk 🫢).

This is a long one, so it's coming at you in three parts. You're reading part 1 right now. Buckle up, hydrate, and let's get into it. ✨


🌸 NAME 🌸

  • elements β€” Element Classes πŸ’…

that's the whole vibe of this page: it's about Element Classes. Element classes. Classes for elements. The way that naming is so straightforward, honestly iconic of them. πŸ‘‘</pinky>

no cap, that's literally it for this bit β€” the rest of the good stuff is coming in the next parts, so keep scrolling when they arrive. πŸ¦‹

✨ SYNOPSIS ✨

πŸŽ€ Classes πŸŽ€

okay bestie, buckle up, this is the full roster of element classes and it's a lot πŸ’…

  • class SoGLClipPlaneElement β€” soooo this one is yet to be documented, we literally have nothing else, it's giving mysterious 🫢
  • class SoGLColorIndexElement β€” this one sets the current OpenGL color, slay ✨
  • class SoGLCoordinateElement β€” yet to be documented, no cap πŸ’€
  • class SoGLDepthBufferElement β€” controls the OpenGL depth buffer πŸŽ€
  • class SoGLDisplayList β€” stores and manages OpenGL display lists, iconic behavior πŸ‘‘
  • class SoGLDrawStyleElement β€” updates the current draw style in OpenGL 🌈
  • class SoGLEnvironmentElement β€” this one's for setting GL fog etc., lowkey atmospheric 🌸
  • class SoGLLazyElement β€” meant to optimize GL rendering, the efficiency queen ✨
  • class SoGLLightIdElement β€” yet to be documented πŸ’€
  • class SoGLLinePatternElement β€” yet to be documented πŸ¦‹
  • class SoGLLineWidthElement β€” changes the linewidth setting of the OpenGL render state πŸ“
  • class SoGLModelMatrixElement β€” yet to be documented πŸ™ˆ
  • class SoGLMultiTextureCoordinateElement β€” stores the current gltexture coordinates for several units, multi-tasking main character πŸ’…
  • class SoGLTextureEnabledElement β€” an element which controls whether texturing is enabled or not πŸŽ€
  • class SoGLMultiTextureImageElement β€” used to control the current GL texture for texture units πŸ–ΌοΈ
  • class SoGLMultiTextureMatrixElement β€” used to update the OpenGL texture matrix πŸ”₯
  • class SoGLNormalElement β€” yet to be documented πŸ’€
  • class SoGLPointSizeElement β€” changes the pointsize setting of the OpenGL render state ⭐
  • class SoGLPolygonOffsetElement β€” yet to be documented πŸ¦‹
  • class SoGLProjectionMatrixElement β€” yet to be documented πŸ™ˆ
  • class SoGLRenderPassElement β€” yet to be documented πŸ’€
  • class SoGLShapeHintsElement β€” yet to be documented 🌸
  • class SoGLTexture3EnabledElement β€” an element which controls whether 3D texturing is enabled or not πŸŽ€
  • class SoGLTextureCoordinateElement β€” stores the current gltexture coordinates πŸ’…
  • class SoGLTextureImageElement β€” used to control the current GL texture πŸ–ΌοΈ
  • class SoGLTextureMatrixElement β€” used to update the OpenGL texture matrix πŸ”₯
  • class SoGLUpdateAreaElement β€” yet to be documented πŸ’€
  • class SoGLVBOElement β€” used to store VBO state πŸ“¦
  • class SoGLViewingMatrixElement β€” used to store the current viewing matrix πŸ‘€
  • class SoGLViewportRegionElement β€” yet to be documented πŸ¦‹
  • class SoAccumulatedElement β€” an abstract class for storing accumulated state, the blueprint vibes πŸŽ€
  • class SoAmbientColorElement β€” yet to be documented πŸ’€
  • class SoAnnoText3CharOrientElement β€” yet to be documented πŸ™ˆ
  • class SoAnnoText3FontSizeHintElement β€” yet to be documented 🌸
  • class SoAnnoText3RenderPrintElement β€” yet to be documented πŸ’€
  • class SoBBoxModelMatrixElement β€” keeps track of the current model matrix during a scene graph traversal. It is used by amongst others the SoGetBoundingBoxAction class, bestie's little helper 🫢
  • class SoBumpMapCoordinateElement β€” yet to be documented πŸ’€
  • class SoTextureImageElement β€” yet to be documented πŸ¦‹
  • class SoBumpMapMatrixElement β€” used to manage the bump map matrix stack πŸŽ€
  • class SoCacheElement β€” stores and manages the open caches πŸ“¦
  • class SoClipPlaneElement β€” used to manage the clip plane stack βœ‚οΈ
  • class SoComplexityElement β€” contains the current shape complexity for a graph traverser 🌈
  • class SoComplexityTypeElement β€” yet to be documented πŸ’€
  • class SoCoordinateElement β€” yet to be documented πŸ™ˆ
  • class SoCreaseAngleElement β€” stores the crease angle during a scene graph traversal πŸ“
  • class SoCullElement β€” used internally for render and pick culling πŸ‘‘
  • class SoDecimationPercentageElement β€” yet to be documented πŸ’€
  • class SoDecimationTypeElement β€” yet to be documented πŸ¦‹
  • class SoDepthBufferElement β€” controls the depth buffer settings πŸŽ€
  • class SoDiffuseColorElement β€” yet to be documented πŸ’€
  • class SoDrawStyleElement β€” yet to be documented 🌸
  • class SoElement β€” SoElement is the abstract base class for all elements, the literal mother of them all πŸ‘‘
  • class SoEmissiveColorElement β€” yet to be documented πŸ’€
  • class SoEnvironmentElement β€” yet to be documented πŸ™ˆ
  • class SoFloatElement β€” SoFloatElement is an abstract base class for elements that consists of a single float value πŸŽ€
  • class SoFocalDistanceElement β€” yet to be documented πŸ’€
  • class SoFontNameElement β€” yet to be documented πŸ¦‹
  • class SoFontSizeElement β€” yet to be documented 🌸
  • class SoInt32Element β€” the base class for elements that simply store a 32-bit integer πŸ”’
  • class SoLazyElement β€” used to handle material and shape properties ✨
  • class SoLightAttenuationElement β€” yet to be documented πŸ’€
  • class SoLightElement β€” manages the currently active light sources πŸ’‘
  • class SoLightModelElement β€” yet to be documented πŸ™ˆ
  • class SoLinePatternElement β€” yet to be documented πŸ¦‹
  • class SoLineWidthElement β€” changes the linewidth setting of the render state πŸ“
  • class SoListenerDopplerElement β€” holds the doppler velocity and factor of the current listener 🎧
  • class SoListenerGainElement β€” stores the SoListener gain during a scene graph traversal πŸ”Š
  • class SoListenerOrientationElement β€” holds the orientation of the current listener 🧭
  • class SoListenerPositionElement β€” holds the position of the current listener πŸ“
  • class SoLocalBBoxMatrixElement β€” yet to be documented πŸ’€
  • class SoMaterialBindingElement β€” yet to be documented πŸ¦‹
  • class SoModelMatrixElement β€” used to manage the current transformation πŸŽ€
  • class SoTextureCoordinateElement β€” yet to be documented πŸ’€
  • class SoMultiTextureEnabledElement β€” an element which stores whether texturing is enabled or not 🌸
  • class SoMultiTextureImageElement β€” yet to be documented πŸ’€
  • class SoMultiTextureMatrixElement β€” used to manage the texture matrix stack for texture units > 0 πŸ”₯
  • class SoNormalBindingElement β€” yet to be documented πŸ™ˆ
  • class SoNormalElement β€” yet to be documented πŸ’€
  • class SoOverrideElement β€” maintains a list of overridable elements and a list over which elements should be overridden, the bossy one πŸ’…
  • class SoPickRayElement β€” yet to be documented πŸ¦‹
  • class SoPickStyleElement β€” yet to be documented πŸ’€
  • class SoPointSizeElement β€” changes the pointsize setting of the render state ⭐
  • class SoPolygonOffsetElement β€” yet to be documented 🌸
  • class SoProfileCoordinateElement β€” yet to be documented πŸ’€
  • class SoProfileElement β€” yet to be documented πŸ™ˆ
  • class SoReplacedElement β€” an abstract element superclass πŸŽ€
  • class SoShapeStyleElement β€” yet to be documented πŸ’€
  • class SoShininessElement β€” yet to be documented ✨
  • class SoSoundElement β€” used for optimizing audio rendering and for turning off inactive SoVRMLSound nodes πŸ”‡
  • class SoSpecularColorElement β€” yet to be documented πŸ’€
  • class SoSwitchElement β€” yet to be documented πŸ¦‹
  • class SoTextOutlineEnabledElement β€” yet to be documented 🌸
  • class SoTextureCombineElement β€” yet to be documented πŸ’€
  • class SoTextureCoordinateBindingElement β€” yet to be documented πŸ™ˆ
  • class SoTextureEnabledElement β€” an element which stores whether texturing is enabled or not πŸŽ€
  • class SoTextureMatrixElement β€” used to manage the texture matrix stack πŸ”₯
  • class SoTextureOverrideElement β€” makes it possible to override texture elements πŸ‘‘
  • class SoTextureQualityElement β€” yet to be documented πŸ’€
  • class SoTextureUnitElement β€” yet to be documented πŸ¦‹
  • class SoTransparencyElement β€” yet to be documented πŸ’€
  • class SoUnitsElement β€”
  • SoUnitsElement β€” bestie, this class is yet to be documented πŸ™ˆ (yes, really, that's the whole tea)
  • SoVertexAttributeBindingElement β€” also yet to be documented πŸ’€
  • SoViewVolumeElement β€” yet to be documented, we stay guessing πŸŽ€
  • SoViewingMatrixElement β€” ok this one actually has lore: it stores the world-to-camera transformation ✨
  • SoViewportRegionElement β€” yet to be documented πŸ¦‹
  • SoWindowElement β€” this icon is used to store the current window attributes πŸ‘‘
  • SoGeoElement β€” yet to be documented 🌸
  • SoGLShadowCullingElement β€” yet to be documented 🫢
  • SoShadowStyleElement β€” yet to be documented πŸ’…

πŸ’– DETAILED DESCRIPTION πŸ’–

okay so here's the vibe: 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 whole group of related information values. The elements work like a stack that gets 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. no cap. πŸ“š

Elements are internal implementation details of the workings of nodes and actions, and it's not something one needs to worry about before writing one's own extension nodes. Writing extension elements is even more removed from plain Open Inventor usage, but it 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, bestie: 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 its SoPointSizeElement. the way that just works is so satisfying fr fr πŸ’…

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. it's giving boundaries. 🚧

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, 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 sourcecode of the built-in classes in Coin should also provide 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>, 1999-12-09. Copyright
// 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>. 1999-12-09. Copyright Kongsberg Oil & Gas Technologies.

#include <Inventor/SoDB.h>
#include <Inventor/SoInput.h>
#include <Inventor/actions/SoCallbackAction.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"

SoCallbackAction::Response
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());

  return SoCallbackAction::CONTINUE;
}

SoCallbackAction::Response
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",
                node->getTypeId().getName().getString(),
                filename.getLength() == 0 ?
                "<inlined>" : filename.getString());

  return SoCallbackAction::CONTINUE;
}

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

  SoDB::init();

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

🫢 AUTHOR 🫢

Generated automatically by Doxygen for Coin from the source code. πŸ€–βœ¨


and that's a wrap on part 3, bestie πŸ’– this page was served up by Coin Version 3.1.3, page elements(3), and yeah the author line is literally Doxygen auto-generating the whole thing from the source code β€” iconic behavior tbh πŸŽ€βœ¨ slay, go write your extension elements, ily πŸ¦‹

πŸ“¦ where this page comes from