Inventor logo

Known Bugs, Fixes, and Workarounds in Inventor

Open Inventor Release 2.0

IRIS Inventor Release 1.1.2

All of the following problems and bugs have been fixed in Inventor 2.0. If you can, we strongly suggest you convert your applications to Inventor 2.0 for the many bug fixes, performance enhancements, and added portability of that release.

IRIS Inventor Release 1.0.1

IRIS Inventor 1.0.1 shares all of the problems listed for release 1.1.2 above, plus: Note: If you are using IRIS Inventor 1.0, we strongly suggest you upgrade to 1.0.1, which contains several important bug fixes.

Open Inventor Release 2.0

Path sensors core dump
Path sensors can core dump during notification, when something underneath them changes. Workaround: A corrected routine is available.

Wrong aspect ratio in stereo viewing
When viewing objects in stereo mode on Indy/Indigo/Indigo2, the aspect ratio is wrong. Loading a sphere into Inventor and switching to stereo mode will show a sphere twice as tall as it is wide.

Workaround: Add the following three nodes to any file when you want to see correct stereo on machine other than RE (RealityEngine doesn't have this distortion problem).

Note that SceneViewer will strip cameras from file, so this will NOT work in SceneViewer (ivview is ok). You can however change the SceneViewer to add those nodes when in stereo mode (use SoXtViewer::isStereoViewing() to check the mode of the viewer). Also because the camera is supplied in the scene, you will need to do a viewAll to see the entire scene.

#Inventor V2.0 ascii

Separator {
    # 
    # The scale node will stretch the objects by 2 no matter 
    # what the camera aspect ratio will be (accomplished by 
    # scaling the view volume, but not the objects).
    # 
    TransformSeparator {
	Scale { scaleFactor 1 2 1 }
	PerspectiveCamera {}
    }
    
    [... rest of your scene..]
}

Core dump in SoMFNode
Deleting values of an SoMFNode field can cause core dumps. Workaround: A corrected routine is available.

Core dump when using textures
The Inventor 2.0 texture code sends an uninitialized variable to OpenGL as a display list. This can cause core dumps in the OpenGL display list code. Workaround: A corrected routine is available.

Real-time clock jumpiness:
Sometimes when the realTime global field is used for the first time, it contains an out-of-date value. This can be noticeable when using an SoOneShot engine, for example. The cause is that realTime is not updated when nothing is connected from it; when the first connection is made, the (out-of-date) value in the field is used as is before update occurs. Workaround: to make sure realTime is always correct, make a connection from it to some field. (The field does not ever have to be used. For example, you could connect it to the field of an SoLabel node under a disabled SoSwitch).

SoRotor node weirdness:
The SoRotor node can exhibit strange behavior when it represents a rotation by 0 radians. If the initial rotation has a zero angle, the SoRotor node will not be able to correctly deduce the axis of rotation. Workaround: specify any non-zero angle for the initial rotation value.

A rotor can also become confused if it updates the rotation field based on the current time, and the new value represents a rotation by a multiple of 2*PI radians. When this happens, the SoRotor again cannot correctly figure out the axis of rotation, and the rotation may proceed about a different (probably undesired) axis.

Bad precedence for Calculator expressions:
The ternary ?: operator of the SoCalculator engine is not parsed with the correct precedence. For example, the expression "oa = a < b ? a : b" is incorrectly interpreted as "oa = a < (b ? a : b)" instead of "oa = (a < b) ? a : b". Workaround: Use parentheses to force the parser to parse the expression correctly.

Calculator does not allow a[b]=c expressions
The SoCalculator engine does not support assigning to one part of an array (SGI bug #222734). If using the debug library, a syntax error will be reported. Workaround: Use a ComposeVec3f engine to do this operation.

SoField::enableConnection() core dumps
Calling SoField::enableConnection() on a field that is not connected to anything will result in a core dump (SGI bug #203988). Workaround: Either make sure the field is connected (call SoField::isConnected()) before calling the enableConnection method, or temporarily connect the field to something, call enableConnection() and then disconnect the field (if you wish the connection to be disabled the next time it is connected).

SoPath::getLength() and SoPath::getTail() errors
SoPath::getLength() and SoPath::getTail() can return the wrong answer if the path contains nodekits and/or hidden children. This happens if nodes are appended between subsequent calls to getLength or getTail. The returned value can be too large or too far down the path. This error should never cause a core dump because in the worst case returned length will be the full path length and the returned tail will be the tail of the full path. Workaround: A patched routine is available.

SoPickedPoint::getMatrix() error
SoPickedPath::getMatrix() can return the wrong answer if the path contains nodekits and/or hidden children. This happens because the method checks if the input node is at the tail of the pick path. If so, getMatrix applies an SoGetMatrixAction to the entire pick path. Otherwise it builds a partial path down to the given node. The method should cast the pick path to an SoFullPath when calling getTail; otherwise if there is a nodekit along the path it will incorrectly apply the action to the full path. Workaround: A patched routine is available.

Textures don't show up when printing
Textured objects are not textured when rendered to by the SoOffScreenRenderer (sgi bug #214492). Workaround: A corrected routine is available.

Core dumps with empty primitives
Several shape nodes will dump core if given empty coordinates and/or indices. Workaround: Do not create empty coordinates or shapes.

Level of Detail slowness with culling
A bug in Inventor 2.0 causes bounding boxes to be invalidated when both SoSeparator renderCulling and SoLevelOfDetail nodes are being used. This causes an object's bounding box to be recalculated every time a cull or level of detail test is done, resulting in poor rendering performance. Workaround: There is a lighter weight level of detail node available from SGI that does not need to compute bounding boxes.

replaceManip with NULL argument
A bug in Inventor 2.0 causes replaceManip to do the wrong thing when a nodekit lies along the path to the manip. Each type of manipulator has a method replaceManip which takes two arguments. The second argument is a node to install at the end of the path (given as the first argument). This new node replaces the manipulator. An argument of NULL is supposed to cause the method to create a new node for you. If a nodekit lies along the path, this does not occur and the manipulator does not get removed. However, if you pass in a non-NULL argument, the method will behave correctly. Workaround: Always pass a non-NULL second argument. For example, use:
myTrackballManip->replaceManip(myPath, new SoTransform);
instead of
myTrackballManip->replaceManip(myPath, NULL);

ivquicken breaks animating scenes
The ivquicken utility can incorrectly transform scenes that contain animating nodes or engines (SGI bug #212773). The bug shows up in cases where: The objects affected by the transformation node and not by the engine/ animation node will be transformed incorrectly. For example, in the following scene graph, the translation affects both the cube and the cone, but the rotor only affects the cube. The bug will make the cone transform incorrectly:
Separator {
    DEF CULPRIT Translation { translation 10 10 10 }
    Separator { 
	Rotor {}
	Cube {}
    }
    Cone {}
}
Workaround: Rearrange the scene graph such that all transformation nodes that affect objects with engines/animations affect only those objects. For example, rearrange the above scene graph as follows:
Separator {
    Separator {
    	DEF CULPRIT Translation { translation 10 10 10 }
        Rotor {}
        Cube {}
    }
    Separator {
	USE CULPRIT
        Cone {}
    }
}

SoPointSet with startIndex problems
An SoPointSet node with a startIndex field that is not zero will return incorrect normals when generating primitives or picking. If using the Inventor debugging library (setenv LD_LIBRARY_PATH /usr/lib/InventorDebug), warnings will be printed. Workaround: A corrected SoPointSet::generatePrimitives() routine is available.


IRIS Inventor Release 1.1.2

Slow rendering animating in a viewer
By default, IRIS Inventor's viewers turn on render caching at the top of the scene graph given to them with the setSceneGraph() method. This can cause a severe performance hit due to IRIS GL display lists being created and destroyed every frame if the scene graph is being changed every frame. Most commonly, this is due to a timer or idle sensor that periodically changes the scene to perform animation. Workaround: Call setRenderCaching(FALSE) on the viewer to prevent it from building a cache at the top of the scene. For best performance, see the Inventor 1 Performance Tips guide for more information on how to determine which parts of your scene can be safely cached.

Gradual application slowdown
SoPath objects in Inventor 1 slow down changes to the scene, because Inventor does some work to find out if the change affects the path. This can cause some simple algorithms to become N^2 algorithms; for example, applying an SoSearchAction to the scene and then changing the node at the tail of every path found is an N^2 algorithm in Inventor 1, because each of the N changes causes all of the N paths to decide whether or not the change affects them. This can also cause problems if your applications does not free up SoPaths or SoSearchActions after it has used them. Workaround: If you are modifying all of the objects found by an SoSearchAction, first add them all to an SoNodeList, then delete the SoSearchAction (freeing up the SoPaths), and then modify the nodes. Also, be sure to delete any SoSearchActions or SoPath objects after you are finished using them.

Memory leak, application slowdown using SoDetail methods
Several methods of SoDetail subclasses call an internal routine that creates a SoSearchAction but fails to delete it. This causes a large memory leak (the searchAction, all of the paths it finds, and all of the nodes on those paths will never be deleted) and will cause the application to slow down because of the extra paths (SGI bug #213257). Workaround: Correct routines for both Inventor 1.0 and Inventor 1.1 are available.

Bad normals picking IndexedTriangleMesh
The picking code for the IndexedTriangleMesh object returns incorrect normal indices for PER_VERTEX, PER_VERTEX_INDEXED, NONE or DEFAULT bindings, which can cause a core dump (SGI bug #184448). Workaround: If you are getting a core dump, pad the normal's vector field with as many extra normals as the maximum value in the coordIndex array. In any case, ignore the normal index or normal returned from picking and figure out the correct normal from the coordinate index returned along with the normal binding.

Memory leak rendering drawstyle LINES Text3
The SoText3 node leaks memory every time a renderAction traverses it and the SoDrawStyle is LINES (SGI bug #162251). Workaround: Put the SoText3 node underneath a SoSeparator, call setRenderCaching(TRUE) for that SoSeparator, and do not change the Text3 node. This will cause the memory leak to occur only once, instead of every time the Text3 node is rendered. If the Text3 node must be changed, or you are frequently changing in and out of LINES drawStyles, this workaround will not work, in which case you must either switch to SoText2, upgrade to Inventor 2, or write your own text node.

Empty string for Text3 core dump
An empty string field for SoText3 nodes will cause them to core dump (SGI bug #178687). Workaround: Remove Text3 objects with empty string fields from the scene.

DGL errors remote-rendering Text2
When rendering remotely (by setting the DISPLAY environment variable), SoText2 nodes will not be rendered and DGL errors will be displayed (SGI bug #107024). Workaround: There is no workaround for this problem; if you expect your application to display across the network, you must not use Text2 nodes in your scenes (but this is fixed in Inventor 2, of course).

Non-printing characters in Text nodes
Non-printing characters in Text nodes (e.g. carriage returns) can cause either bad rendering or, in extreme cases, core dumps (SGI bug #114139). Workaround: Don't put non-ASCII or control characters in the string fields of the text nodes.

Picking Text3 with RIGHT/CENTER justification
The picking code for Text3 does not take into account RIGHT/CENTER justification (SGI bug #140499). Workaround: Get the bounding box of the text with an SoGetBoundingBoxAction, and put an invisible cube around the text to be used for picking instead of the text (put an SoPickStyle node before the text so it isn't picked also).

RIGHT/CENTER justification with non-default size Font
The justification code for Text3 assumes that a default sized font (size 10) is being used. Other sizes will cause the justification to be incorrect (SGI bug #179412). Workaround: Use an SoScale node to change the size of 3D text instead of the SoFont node's size field.

2-component textures do not render correctly
Two-component (intensity-alpha) textures do not render correctly due to a bug in the Texture2 node (SGI bug #148707). Workaround: Convert your 2-component images to 4-component (RGBA) images.

Texture2 node memory leak
IRIS GL display lists allocated by Texture2 nodes are never freed, causing memory to be lost. This is only a major problem for applications that are constantly reading in new textures, either by deleting and recreating Texture2 nodes with different filenames, or by changing the filename field of the Texture2 node (SGI bug #149535). Workaround: See this file for a workaround if you cannot upgrade to Inventor 2.

Incorrect model/blendColor for cached textures
The Texture2 node will blindly try to insert tevdef/tevbind calls into an open IRIS GL display list; however, IRIS GL does not allow those commands in a display list, so they will be executed immediately instead of compiled into the list. This can cause incorrect rendering of future frames (SGI bug #153695). Workaround: There is no good workaround for this bug; turning off caching for textured objects can cause an unacceptable performance decrease, but it will result in correct rendering.

Texture model BLEND with 3/4 component images
Blended texturing with 3 or 4 component textures is illegal in both IRIS GL and Open GL. The Inventor 1 Texture2 node silently does nothing. The Inventor 2 Texture2 node will issue a warning if the application is linked with the debugging library (SGI bug #175588). Workaround: Only use 1 or 2 component textures with BLEND.

Texture model DECAL with 1/2 component images
Decal texturing with 1 or 2 component textures is illegal in both IRIS GL and Open GL. The Inventor 1 Texture2 node silently does nothing. The Inventor 2 Texture2 node will issue a warning if the application is linked with the debugging library (SGI bug #175588). Workaround: Only use 3 or 4 component textures with DECAL.

SbRotation::slerp() incorrect interpolation
The SbRotation::slerp() routine can interpolate incorrectly for some sets of rotations (SGI bug #164588). Workaround: This code, from the Inventor 2 slerp routine, can be used instead:
SbRotation
slerp(const SbRotation &rot0, const SbRotation &rot1, float t)
{
    const float*    r1q = rot1.getValue();
    SbRotation      rot;
    float       rot1q[4];
    double      omega, cosom, sinom;
    double      scalerot0, scalerot1;
    int         i;
    // Calculate the cosine
    cosom = rot0.quat[0]*rot1.quat[0] + rot0.quat[1]*rot1.quat[1]
        + rot0.quat[2]*rot1.quat[2] + rot0.quat[3]*rot1.quat[3];
    // adjust signs if necessary
    if ( cosom < 0.0 ) {
        cosom = -cosom;
        for ( int j = 0; j < 4; j++ )
            rot1q[j] = -r1q[j];
    } else  {
        for ( int j = 0; j < 4; j++ )
            rot1q[j] = r1q[j];
    }
    // calculate interpolating coeffs
    if ( (1.0 - cosom) > 0.00001 ) { // standard case
        omega = acos(cosom);
        sinom = sin(omega);
        scalerot0 = sin((1.0 - t) * omega) / sinom;
        scalerot1 = sin(t * omega) / sinom;
    } else { // rot0 and rot1 very close - just do linear interp.
        scalerot0 = 1.0 - t;
        scalerot1 = t;
    }
    for (i = 0; i < 4; i++) // build the new quarternion
        rot.quat[i] = scalerot0 * rot0.quat[i] + scalerot1 * rot1q[i];
    return rot;
}

LayerGroup problems
Object under multiple SoLayerGroup nodes are not highlighted correctly. The selection node renders all of its children. It then runs through its list of selected objects, and renders highlights for each object. If there is a layer group beneath the selection node, the layer group will be doing zclears between children. So when the selection node goes to render the highlights, the z buffer has been cleared, and the highlight will show up on top of everything (SGI bug #96025). Workaround: Pass a NULL highlight style to the selection node, and register object selected/deselected callbacks. Then when an object is selected, insert highlight geometry directly into the scene right next to the selected object. Then the highlight will be rendered in the same layer as the object. NOTE: SoLayerGroup was removed from Inventor 2 and replaced with the SoAnnotation node for this reason.


IRIS Inventor Release 1.0.1

Writing File nodes corrupting files
If a file "a.iv" has an SoFile node in it that refers to file "b.iv" (i.e. SoFile { filename "b.iv" }), and either a or b is ASCII and the other is binary format, then file "b.iv" can be corrupted or can become completely empty when writing out "a.iv" (SGI bug #146859). Workaround: When using SoFile nodes, make sure all of your files are either ASCII or binary; do not mix the two.