Open Inventor 9.0

Open Inventor 9.0 (January 2012)


This new version of Open Inventor contains several new features targeting different advanced usages as well as many improvements of basic features.

VolumeViz benefits from a new rendering engine using raycasting and also from several performance enhancements.

ReservoirViz has been removed from the Open Inventor distribution. This product is deprecated and is replaced by MeshViz XLM.

Make sure to read the Compatibility Notes as well. They contain news about important changes in this release.
Finally, check the System Requirements topic for important news about Open Inventor platform support changes in this release.


The management of software licenses has changed in this version. Node-locked licenses for both development and run-time are now delivered using FLEXNet licenses. For node-locked run-time licenses, an additional control has been added to disable the execution on remote clients. Thus running an Open Inventor application on a remote display is no more allowed with this type of license. Floating licenses should be used instead of node-locked licenses for this type of usage. Contact your sales representative for more information.

Open Inventor

Inventor Shaders management

  • A new field SoShaderProgram::generateTransparency allows Inventor to enable blending if a shader generates transparent fragments.
  • Inventor GLSL shaders can use the new oiv_include<> directive which is similar to the C/C++ language #include directive.
    Example: //!oiv_include <VolumeViz/vvizCombine_frag.h>
  • In order to reduce on the fly compilation impact on interactivity, a binary disk shader cache is now used.
  • Inventor internal shaders are now integrated as resources in the library and no longer need to be redistributed.

Transparency management

  • Transparency management has been greatly improved.


  • SoRayPickAction now supports two different picking modes (see SoRayPickAction::PickingMode enum).
    In the new POINT_PICKING mode, Open Inventor efficiently finds all the vertices inside the pick volume.


  • SoBufferedShape::generatePrimitives is now available and provides SoCallbackAction support (for triangle export as an example).
  • SoBufferedShape::rayPick is now fully supported with all picking and details support (including Point picking).
    See demos in $OIVHOME/examples/Features/bufferobjects/bufferedShapePicking
  • Rendering performance has been greatly improved when SoDrawStyle is set to POINTS or LINES mode.
    • The optimization applies on LINES, LINE_STRIP, LINE_LOOP, TRIANGLES, TRIANGLE_STRIP and QUADS SoBufferedShape primitive types.
    • POINTS, TRIANGLE_FAN and QUAD_STRIP types are not optimized.
    • The optimization does not apply to primitiveRestart formatted shape definitions.


SoBufferObject class now inherits from SoRefCounter:

  • This allows applications to correctly manage data sharing and avoid data copying in many cases.
  • This creates a major incompatibility in the API (see Compatibility Notes).

Viewer snapshot

The viewer classes now provide a convenience method to save a snapshot of the rendering area to an image file, see new So[Qt/Xt/Win/Wx]GLWidget::saveSnapshot() method.


The IvShapeBenchmark tool has been updated to include testing of:

  • Picking (including point picking)
  • Animation in buffered shape mode

New scene graph Switch mechanisms

  • New SoInteractiveSwitch node allows selecting a different scenegraph to traverse depending on interactive mode.
    see demo in $OIVHOME/src/Inventor/examples/features/InteractiveSwitch
    NB: new related SoInteractiveSwitchElement class
  • New SoMultiPathsSwitch node traverses its children only if the current traversal path matches one of the SoPath specified in the #paths field.
    see demo in $OIVHOME/src/Inventor/examples/features/Switch/MultiPathsSwitch
  • New SoMultiSwitch node allows traversal of multiple children (specified in a list).
    see demo in $OIVHOME/src/Inventor/examples/features/Switch/MultiSwitch
  • A new demo for SoPathSwitch node has been added
    see demo in $OIVHOME/src/Inventor/examples/features/Switch/PathSwitch


LDM file format changes

LDM files with overlapping tiles (border > 0) are no longer supported.  All such files must be converted to LDM files with no overlap. The LDMconverter has been enhanced to easily do this conversion using the new "-update" option:

$OIVHOME/$OIVARCH/bin/demos/VolumeViz/LDMConverter -update <input_filename> -o <output_filename>

Multi-resolution management

Multi-resolution data management is now available at the GPU level. VolumeViz/LDM now uses a Virtual Texturing technology to address out-of-GPU data. So the VolumeViz rendering pipeline now works on a virtually full dataset:

  • VolumeViz Shader pipeline can now virtually access any neighboring data.
    Previously only data in the same tile was accessible.
  • The tile overlap (border) that was previously managed at the data level (and required LDM conversion with an explicit overlap value) is now managed transparently at GPU level.
    Note that depending on the graphics card capability the performance cost of managing overlap at the GPU level might be important.  This is why it is deactivated when interacting by default but can be activated through the SoVolumeShader::interpolateOnMove field.
  • Volume GLSL pipeline has been greatly enhanced and reworked (see VolumeViz GLSL Shaders section).


VolumeViz now uses raycasting rendering engine by default for the SoVolumeRender node:

  • This method provides better performance or quality in most cases.
    Raycasting can be enabled or disabled per SoVolumeRender node using the raycasting field in SoVolumeShader or SoVolumeRenderingQuality. Raycasting can be globally enabled or disabled using the IVVR_FORCE_RAYCASTING SoPreferences environment variable (default is TRUE).
  • Raycasting mode avoids the previous need for a 32-bit floating point color buffer to get precise color accumulation when the number of slices is high.
  • Raycasting reduces the slicing artifacts at clipping probe borders (SoROI, SoClippingPlane, SoVolumeClippingGroup)

Voxelized rendering (sugarcube)

  • New voxelized (sugarcube) rendering mode for SoVolumeRender that can be enabled through SoVolumerenderingQuality’s voxelizedRendering field.
  • Voxel outlines can also now be enabled using the voxelOutline field.

Sugarcube rendering with outlines

Volume Editing

  • New methods are provided to edit a VolumeData using a 3D closed surface, a 2D surface with thickness or a list of voxels.
  • Undo/redo supports multiple levels now.
  • No more limitations on the resolution level to edit.
  • Performance improvement.
    See examples:
  • Saving edited VolumeData is no longer limited to LDM files.
  • It is now supported for LDM and inMemory reader, and can be customized by reimplementing a new SoVolumeWriter class.
    See example:

Volume Geometry (e.g. SoVolumeIndexedFaceSet)

  • Now supports projection (see SoProjection).
  • Better performance when animating the geometry
  • Loading priority enhancements

Spherical Projection

SoVolumeClipping and SoUniformGridClipping

  • SoVolumeClipping and SoUniformGridClipping are now supported by all VolumeViz shapes.
  • SoVolumeClipping and SoUniformGridClipping can now be combined together.
  • SoUniformGridClipping now supports an "undefined" value.


  • 2x Performance improvement.
  • Reduced requirement on GPU OpenGL support level (Geometry shader is no longer required).

VolumeViz GLSL Shaders

  • VolumeViz internal shaders are now integrated as resources in the library and do not need to be redistributed anymore.
  • The environment variable IVVR_SHADERS_PATH is no longer taken into account.


  • The class SoVRDicomData is now supported and documented.  This class allows an application to get information from the header of a DICOM file, including querying any value by its hex tag numbers using getDicomInfo().
  • The application can now get an instance of SoVRDicomData for a DICOM file opened by VolumeViz, using the new reader method SoVRDicomFileReader::getDicomData().
  • A new method SoVRDicomFileReader::setFilenameList() allows the application to specify a list of DICOM files to load as a single volume and specifies the order of the individual slice files.

MeshViz XLM (C++ api only)

Rendering enhancement of non-linear mesh and polyhedral mesh

Improved line drawstyle: when an MoTessellator is inserted in the scene graph with an MoDrawStyle enabling the field displayEdges, the surface rendering is enhanced by removing edges of the tessellation process. This enhancement applies to MoMeshSurface, MoMeshIsosurface and MoMeshPlaneSlice.

Rendering enhancement of non-linear mesh

Improved clip line and isoline rendering. The sub triangles of a non-linear cell are now taken into account by the MoMeshIsoline and MoMeshClipLine nodes.

New progress bar capability

The interface MiExtractorCallback has been modified to allow the application to implement a progress bar during the extraction process. This feature is only available for MoMeshIsosurface and MoMeshSkin. However, MoMeshSkin  does update the progress bar only for MiVolumeMeshUnstructured and for MiVolumeMeshHexahedronIjk mesh type. 
Attention: This change to MiExtractorCallback is not compatible with previous release (see Compatibility Notes)

Legend enhancement

The previous version of MoLegend displayed legends with only two white ticks and a white title. The number of ticks can now be defined using the new field numValues. The color of these ticks can be defined by the new field valuesColor. The color of the legend's title can be defined by the new field titleColor.

MoScalarSet node

This new node allows the application to create a more generic scene graph to handle mesh types with either I, IJ or IJK dataset. This node avoids having to insert two different scalar set nodes (one MoScalarSetI and one MoScalarSetIJK) if an appplication visualizes both MiVolumeMeshUnstructured and MiVolumeMeshHexahedronIjk. Furthermore, the node MoDataBinding is no longer necessary when visualizing an MiVolumeMeshHexahedronIjk if the new node MoScalarSet is used. This node applies only to MoMeshSkin, MoMeshIsosurface, MoMeshPlaneSlice and MoMeshCellShape.

Performance enhancement of MoMeshSkin

The skin extraction on MiVolumeMeshHexahedronIjk has been drasticaly improved.


Open Inventor 9 introduces new capabilities for IvTune. With the new IvtuneExtender API is it possible to extend IvTune using a plugin mechanism. Custom panels can be added to the IvTune user interface and the services provided by IvTune can be accessed by extensions.

The IvtTutorial and IvtTools demos provide some example of IvTune extensions such as a shader editor, a custom navigation toolbar, a log console.

MCADReaders import

Import of CAD model structure

When importing a CAD file, the generated scene graph keeps the structure of the CAD models. It is organized as Product/Part/Body/Lump/Shell/Face object herarchy. To ease the mapping between the CAD model and the scene graph, all nodes are named based on the imported model name.

Import of edges and vertices

It is now possible to import edges and vertices from the CAD model. See the SoCadReaderInputParameters for selecting which item to import.

Multi-instance import

During import, assemblies, products and parts are instantiated. If a product or a part appears several times in the CAD model, a single instance of the associated scene graph is used. This can reduce significantly the amount of memory necessaryto import and display a large CAD model containing many instanes of the same object. It is also easier to edit or select such item.

Tuning CAD import parameters

Using the new class SoCadReaderInputParameters, you can specify how the CAD model should be imported. You can specify tessellation level, what is imported or how the scene graph is built.


API Specific

C++ API Specific

$OIVHOME/include/inttypes.h has been renamed $OIVHOME/include/SbTypes.h
On some platforms, the inttypes.h file was conflicting with a system file having the same name.

.NET API Specific

New generic Open Inventor enum fields

SoSFEnum, SoMFEnum, SoSFBitMask and SoMFBitMask fields are now generic and typed with the relevant enum type.
That enables the auto completion mechanism in Visual Studio and automatic links to the reference manual between a field and its possible enumerated values.
Read the Compatibily Note Specific section for more details.

New property Value in SoSFfield to set/get its value.

Read the Compatibily Note Specific section for more details.

New indexer property in SoMFField to set/get one value of a multiple field.

This allows writing the following code:

myMField[i] = myValue;

Read the Compatibily Note Specific section for more details.

Enhancement in class SbNativeArray<T>

Indexer may now throw NotSupportedException if the array cannot be read or written.

New method CanGetBuffer() that indicates if the buffer can be gotten.

New method ToString() in SbXXX classes, SoMField classes and SoBase classes.

For SbBox, SbColor, SbCylinder, SbLine, SbPlane, SbRotation, SbSphere and SbVecXXX, ToString() returns each component as string.
For SoMField ToString() returns the number of elements as string.
For SoBase ToString() returns the native getName() as string.

New ArgumentOutOfRange checking for some methods having invalid index argument as input.

Read the Compatibily Note Specific section for more details.

New mechanism to hide deprecated methods to class browsers

A new attribute System::ComponentModel::EditorBrowsableState::Advanced is added for most deprecated methods, enum and properties. Thus deprecated member can be hidden to IntelliSense in order to enhance the auto code completion. See the MSDN documentation for how to configure Visual C# in order to hide EditorBrowsableState attribute.

Prebuilt project files

The Premake tool can be used to generate all Visual Studio projects of OpenInventor demonstration programs. Read the Installation Guide section for more details.

Java API Specific

Java 1.7

Open Inventor Java now supports Java 1.7 on Linux and Windows.

New interface com.openinventor.inventor.SafeDisposable.

The new interface SafeDisposable has been introduced for node classes, to be able to determine if it is safe to call dispose(). Calling dispose() on nodes that are still referenced in the scene graph may produce errors. The method isDisposable() returns true when it is safe to call the dispose() method. Furthermore, the dispose() method will raise a java.lang.IllegalStateException when the node is still referenced by a scene graph or is already disposed. If isDisposable() returns true, dispose() will not raise any exception.
The method com.openinventor.inventor.dispose() is now deprecated.

New recursive dispose behaviour for SoGroup nodes.

When calling dispose() on an SoGroup instance, the method will try to dispose all its children recursively. If some children are referenced by other root nodes, they are kept unchanged. This improvement insures that native resources of nodes only referenced by the root group will be freed when calling the method on the root. For instance, this is particularly useful when the root contains several volume data nodes, or when it contains a lot of nodes with multiple fields containing large arrays. Of course and as decribed above, isDisposable() should be called to check that this scene graph can be safely disposed.

New method dispose() in NCallback

This method allows to dispose native resources of a NCallback object

See New elements in API for details