SoReorganizeAction(3)

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

SoReorganizeAction(3) 🌈

Bestie, this is the SoReorganizeAction(3) page from the Library Functions Manual. She's a whole class that reorganizes your scene graph to optimize traversal/rendering. It's giving "clean up, organize, slay" energy. Let's go. πŸ’…βœ¨


NAME 🌸

SoReorganizeAction β€” the SoReorganizeAction class reorganizes your scene graph to optimize traversal/rendering. No cap, she's here to make your graph pretty and fast. πŸ¦‹


SYNOPSIS ✨

Inherits SoSimplifyAction.

Public Member Functions πŸ’–

  • virtual SoType getTypeId (void) const β€” type ID getter, iconic.
  • SoReorganizeAction (SoSimplifier *simplifier=NULL) β€” constructor with optional simplifier.
  • virtual ~SoReorganizeAction (void) β€” destructor.
  • SoSeparator * getSimplifiedSceneGraph (void) const β€” returns the simplified scene graph.
  • void generateNormals (SbBool onoff) β€” turn normal generation on/off.
  • SbBool areNormalGenerated (void) const β€” check if normals are generated.
  • void generateTriangleStrips (SbBool onoff) β€” turn triangle strip generation on/off.
  • SbBool areTriangleStripGenerated (void) const β€” check if triangle strips are generated.
  • void generateTexCoords (SbBool onoff) β€” turn tex coord generation on/off.
  • SbBool areTexCoordsGenerated (void) const β€” check if tex coords are generated.
  • void generateVPNodes (SbBool onoff) β€” turn VP node generation on/off.
  • SbBool areVPNodesGenerated (void) β€” check if VP nodes are generated.
  • void matchIndexArrays (SbBool onoff) β€” turn index array matching on/off.
  • SbBool areIndexArraysMatched (void) const β€” check if index arrays are matched.
  • SoSimplifier * getSimplifier (void) const β€” returns the simplifier.
  • virtual void apply (SoNode *root) β€” apply to a node.
  • virtual void apply (SoPath *path) β€” apply to a path.
  • virtual void apply (const SoPathList &pathlist, SbBool obeysrules=0) β€” apply to a path list.

Public Member Functions inherited from SoSimplifyAction πŸ’œ

  • SoSimplifyAction (void)
  • virtual ~SoSimplifyAction (void)

Public Member Functions inherited from SoAction πŸ’œ

  • virtual ~SoAction ()
  • virtual SbBool isOfType (SoType type) const
  • void apply (SoAction *beingApplied)
  • virtual void invalidateState (void)
  • AppliedCode getWhatAppliedTo (void) const
  • SoNode * getNodeAppliedTo (void) const
  • SoPath * getPathAppliedTo (void) const
  • const SoPathList * getPathListAppliedTo (void) const
  • const SoPathList * getOriginalPathListAppliedTo (void) const
  • SbBool isLastPathListAppliedTo (void) const
  • PathCode getPathCode (int &numindices, const int *&indices)
  • void traverse (SoNode *const node)
  • SbBool hasTerminated (void) const
  • const SoPath * getCurPath (void)
  • SoState * getState (void) const
  • PathCode getCurPathCode (void) const
  • virtual SoNode * getCurPathTail (void)
  • void usePathCode (int &numindices, const int *&indices)
  • void pushCurPath (const int childindex, SoNode *node=NULL)
  • void popCurPath (const PathCode prevpathcode)
  • void pushCurPath (void)
  • void popPushCurPath (const int childindex, SoNode *node=NULL)
  • void popCurPath (void)
  • void switchToPathTraversal (SoPath *path)
  • void switchToNodeTraversal (SoNode *node)

Static Public Member Functions 🌟

  • static SoType getClassTypeId (void)
  • static void addMethod (const SoType type, SoActionMethod method)
  • static void enableElement (const SoType type, const int stackindex)
  • static void initClass (void)
  • static void startReport (const char *msg)
  • static void finishReport (void)

Static Public Member Functions inherited from SoSimplifyAction 🌟

  • static SoType getClassTypeId (void)
  • static void addMethod (const SoType type, SoActionMethod method)
  • static void enableElement (const SoType type, const int stackindex)
  • static void initClass (void)

Static Public Member Functions inherited from SoAction 🌟

  • static void initClass (void)
  • static void initClasses (void)
  • static SoType getClassTypeId (void)
  • static void nullAction (SoAction *action, SoNode *node)

Protected Member Functions πŸ›‘οΈ

  • virtual const SoEnabledElementsList & getEnabledElements (void) const
  • virtual void beginTraversal (SoNode *node)

Protected Member Functions inherited from SoAction πŸ›‘οΈ

  • SoAction (void)
  • virtual void endTraversal (SoNode *node)
  • void setTerminated (const SbBool flag)
  • virtual SbBool shouldCompactPathList (void) const

Static Protected Member Functions πŸ”’

  • static SoEnabledElementsList * getClassEnabledElements (void)
  • static SoActionMethodList * getClassActionMethods (void)

Static Protected Member Functions inherited from SoSimplifyAction πŸ”’

  • static SoEnabledElementsList * getClassEnabledElements (void)
  • static SoActionMethodList * getClassActionMethods (void)

Static Protected Member Functions inherited from SoAction πŸ”’

  • static SoEnabledElementsList * getClassEnabledElements (void)
  • static SoActionMethodList * getClassActionMethods (void)

Additional Inherited Members πŸŽ€

Public Types inherited from SoAction

  • enum AppliedCode { NODE = 0, PATH = 1, PATH_LIST = 2 }
  • enum PathCode { NO_PATH = 0, IN_PATH = 1, BELOW_PATH = 2, OFF_PATH = 3 }

Protected Attributes inherited from SoAction

  • SoState * state
  • SoActionMethodList * traversalMethods

Detailed Description πŸ”₯

The SoReorganizeAction class reorganizes your scene graph to optimize traversal/rendering. It's the main character of this whole page, honestly. πŸ‘‘

Note. This is work-in-progress. pederb, 2005-04-05.

Okay so the code below is an example of a program that applies an SoReorganizeAction on a scene graph, converting all shapes into shapes that can be rendered using vertex array or VBO rendering. She's long but she's worth it. 🫢

#include <Inventor/SoDB.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoCoordinate4.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoTextureCoordinate2.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/actions/SoWriteAction.h>
#include <Inventor/actions/SoSearchAction.h>
#include <Inventor/errors/SoDebugError.h>
#include <Inventor/nodes/SoShapeHints.h>
#include <Inventor/SoInput.h>
#include <Inventor/SoOutput.h>
#include <Inventor/SoInteraction.h>
#include <Inventor/actions/SoReorganizeAction.h>
#include <assert.h>
#include <stdio.h>

static void strip_node(SoType type, SoNode * root)
{
  SoSearchAction sa;
  sa.setType(type);
  sa.setSearchingAll(TRUE);
  sa.setInterest(SoSearchAction::ALL);
  sa.apply(root);

  SoPathList & pl = sa.getPaths();
  for (int i = 0; i < pl.getLength(); i++) {
    SoFullPath * p = (SoFullPath*) pl[i];
      if (p->getTail()->isOfType(type)) {
        SoGroup * g = (SoGroup*) p->getNodeFromTail(1);
        g->removeChild(p->getIndexFromTail(0));
      }
    }
  sa.reset();
}

int
main(int argc, char ** argv )
{
  if (argc < 3) {
    fprintf(stderr,"Usage: reorganize <infile> <outfile> [nostrip]\n");
    return -1;
  }

  SbBool strip = TRUE;
  if (argc > 3) {
    if (strcmp(argv[3], "nostrip") == 0) strip = FALSE;
    else {
      fprintf(stderr,"Usage: reorganize <infile> <outfile> [nostrip]\n");
      return -1;
    }
  }

  SoDB::init();
  SoInteraction::init();

  SoInput input;
  SbBool ok = input.openFile(argv[1]);
  if (!ok) {
    fprintf(stderr,"Unable to open file.\n");
    return -1;
  }
  SoSeparator * root = SoDB::readAll(&input);

  SbBool vrml1 = input.isFileVRML1();
  SbBool vrml2 = input.isFileVRML2();

  if (vrml2) {
    fprintf(stderr,"VRML2 not supported yet\n");
    return -1;
  }

  if (!root) {
    fprintf(stderr,"Unable to read file.\n");
    return -1;
  }
  root->ref();

  fprintf(stderr,"Applying SoReorganizeAction...");
  SoReorganizeAction reorg;
  reorg.apply(root);
  fprintf(stderr,"done\n");

  SoOutput out;
  if (out.openFile(argv[2])) {
    if (strip) { // strip coord3, texcoord and normal nodes
      fprintf(stderr,"stripping old nodes from scene graph\n");
      strip_node(SoCoordinate3::getClassTypeId(), root);
      strip_node(SoCoordinate4::getClassTypeId(), root);
      strip_node(SoNormal::getClassTypeId(), root);
      strip_node(SoTextureCoordinate2::getClassTypeId(), root);
    }
    fprintf(stderr,"writing target\n");
    SoWriteAction wa(&out);
    wa.apply(root);
  }
  root->unref();
  return 0;
} // main()

Since 🌈

Coin 2.5


Constructor & Destructor Documentation πŸ’…

SoReorganizeAction::SoReorganizeAction (SoSimplifier * simplifier = NULL) πŸŽ€

A constructor. She's the one who makes the magic happen. ✨

References SoReorganizeAction().

Referenced by addMethod(), and SoReorganizeAction().

SoReorganizeAction::~SoReorganizeAction (void ) [virtual] πŸŽ€

The destructor. She cleans up the whole vibe. πŸ§ΉπŸ’–

πŸ’– Member Function Documentation πŸ’–


🌟 SoType SoReorganizeAction::getTypeId (void ) const [virtual]

Okay bestie, this one hands you the type identification of any action that descends from a class inheriting SoAction. What's it for? Run-time type checking and "downward" casting β€” i.e. the moment you need to figure out what a generic action pointer actually is before you go touching it. πŸ‘‘

Usage example, straight from the source, no cap:

void bar(SoAction * action)
{
  if (action->getTypeId() == SoGLRenderAction::getClassTypeId()) {
    // safe downward cast, know the type
    SoGLRenderAction * glrender = (SoGLRenderAction *)action;
  }
  return; // ignore if not renderaction
}

Now for the app devs out there who wanna extend the library with brand new actions: this method needs to be overridden in all subclasses. Literally all of them. This is usually done as part of setting up the whole type system for your extension classes, which is normally accomplished by using the pre-defined macros you can grab through Inventor/nodes/SoSubAction.h: SO_ACTION_SOURCE, SO_ACTION_INIT_CLASS and SO_ACTION_CONSTRUCTOR. The full toolkit, babes. ✨

Want more info on writing Coin extensions? Go read the SoAction class documentation, it's giving encyclopedia but make it useful.

Returns the actual type id of an object derived from a class inheriting SoAction. And yeah β€” it needs to be overridden in all subclasses. Not optional, fr fr.

Reimplemented from SoSimplifyAction.


🌸 void SoReorganizeAction::addMethod (const SoType type, SoActionMethod method) [static]

So this API member is considered internal to the library β€” it's not likely to be of interest to the application programmer. That's the whole vibe. Nothing for you here, move along, it's fine. πŸ™ˆ

References SoReorganizeAction(), and SoSimplifyAction::SoSimplifyAction().


πŸ¦‹ void SoReorganizeAction::enableElement (const SoType type, const int stackindex) [static]

Same energy as above, bestie: this API member is considered internal to the library, as it is not likely to be of interest to the application programmer. Internal. Library. Not for you. πŸŽ€


✨ const SoEnabledElementsList & SoReorganizeAction::getEnabledElements (void ) const [protected], [virtual]

This one returns a list of the elements used by action instances of this class when they do traversal operations. That's it, that's the tea. πŸ“

Reimplemented from SoSimplifyAction.


πŸ”₯ void SoReorganizeAction::apply (SoNode * root) [virtual]

Applies the action to the scene graph rooted at root. Slay, it just does the thing. πŸ’…

⚠️ Important caveat, bestie, listen up: you should not apply an action to a node with a zero reference count. The behavior in that case is undefined. Undefined. We don't do that here. 😭

Reimplemented from SoSimplifyAction.

References apply(), and SbPList::getLength().

Referenced by apply(), and apply().


🌈 void SoReorganizeAction::apply (SoPath * path) [virtual]

Applies the action to the parts of the graph defined by path. Selective. Targeted. Iconic. πŸ‘‘

And here's the lore you need: note that an SoPath will <highkey>also contain all nodes that may influence e.g. geometry nodes in the path</highkey>. So for instance, applying an SoGLRenderAction on an SoPath will render that path as expected in the view, where geometry will get its materials, textures, and other appearance settings correctly. It's all connected, iykyk. 🧚

Also: if the path ends in an SoGroup node, the action will also traverse the tail node's children. Surprise bonus traversal.

Reimplemented from SoSimplifyAction.


πŸ’œ void SoReorganizeAction::apply (const SoPathList & pathlist, SbBool obeysrules = 0) [virtual]

Applies action to the graphs defined by pathlist. And now, the fine print β€” because there's always fine print.

If obeysrules is set to TRUE, then pathlist must obey the following four conditions (which is the case for path lists returned from search actions for non-group nodes and path lists returned from picking actions):

  1. All paths must start at the same head node.
  2. All paths must be sorted in traversal order.
  3. The paths must be unique.
  4. No path can continue through the end point of another path.

Four rules. Non-negotiable. That's the vibe check. πŸ’€

See also

  • SoAction::apply(SoPath * path)

Reimplemented from SoSimplifyAction.

References apply(), and SbPList::getLength().


πŸŽ€ void SoReorganizeAction::beginTraversal (SoNode * node) [protected], [virtual]

This virtual method is called from SoAction::apply(), and it's the entry point for the actual scenegraph traversal. The main character of traversal moments. 🌟

It can be overridden to initialize the action at traversal start, for specific initializations in the action subclasses inheriting SoAction. Customize away, babes.

The default method just calls traverse(), which any overridden implementation of the method must do too (or call SoAction::beginTraversal()) to trigger the scenegraph traversal. So like β€” if you override it, don't forget the traversal actually has to happen. No skipping steps. 🫢

Reimplemented from SoSimplifyAction.


✍️ Author ✍️

Generated automatically by Doxygen for Coin from the source code.


and that's a wrap bestie!! πŸ’– This lil page came from the Coin source, Version 2.5.0, and it lives at SoReorganizeAction(3). Go forth and reorganize those scene graphs, you absolute legend πŸ‘‘βœ¨πŸ¦‹

πŸ“¦ where this page comes from