SoFenceSlice Class |
Fence slice shape node.
Namespace: OIV.VolumeViz.Nodes
The SoFenceSlice type exposes the following members.
Name | Description | |
---|---|---|
SoFenceSlice | Constructor. |
Name | Description | |
---|---|---|
AffectsState | Overrides default method on OIV.Inventor.Nodes.SoNode. | |
BeginShape(SoAction, SoShapeTriangleShapes) | Calls BeginShape(action, shapeType, (OIV.Inventor.Details.SoFaceDetail ^)nullptr). (Inherited from SoShape.) | |
BeginShape(SoAction, SoShapeTriangleShapes, SoFaceDetail) | These methods can be used by subclasses to generate triangles more easily when those triangles are part of a larger structure, such as a triangle strip, triangle fan, or triangulated polygon, according to the TriangleShape enumerated type. | |
Callback | Implements primitive generation for all shapes. | |
ComputeBBox(SoAction, SbBox3f, SbVec3f) | Compute the bounding box. | |
ComputeBBox(SoAction, SbXfBox3d, SbVec3d) | Compute object oriented bounding box (OOB) for subclass using information in the given action (which may not necessarily be an OIV.Inventor.Actions.SoGetBoundingBoxAction). | |
Copy | Calls Copy(false). (Inherited from SoNode.) | |
Copy(Boolean) | Creates and returns an exact copy of the node. | |
CopyFieldValues(SoFieldContainer) | Calls CopyFieldValues(fc, false). (Inherited from SoFieldContainer.) | |
CopyFieldValues(SoFieldContainer, Boolean) | Copies the contents of fc's fields into this object's fields. | |
Dispose |
Releases all resources used by SoDisposable.
(Inherited from SoDisposable.) | |
Distribute | (Inherited from SoNode.) | |
DoAction | (Overrides SoNodeDoAction(SoAction).) | |
EnableNotify | Notification at this Field Container is enabled (if flag == true) or disabled (if flag == false). | |
EndShape | end shape previously started with OIV.Inventor.Nodes.SoShape.BeginShape(OIV.Inventor.Actions.SoAction, OIV.Inventor.Nodes.SoShape.TriangleShapes, OIV.Inventor.Details.SoFaceDetail). | |
Equals | Determines whether the specified Object is equal to the current Object. (Inherited from Object.) | |
FieldsAreEqual | Returns true if this object's fields are exactly equal to fc's fields. | |
Get | Returns the values of the fields of this object in the Open Inventor ASCII file format in the given string. | |
GetAllFields | Returns a list of fields, including the eventIn's and eventOut's. | |
GetAlternateRep | This method is called by actions to allow the node to provide an "alternate representation" when appropriate (typically depending on the action type). | |
GetBoundingBox | Implements bounding box method using virtual OIV.VolumeViz.Nodes.SoFenceSlice.ComputeBBox(OIV.Inventor.Actions.SoAction, OIV.Inventor.SbBox3f@, OIV.Inventor.SbVec3f@) method. | |
GetEventIn | Returns a the eventIn with the given name. | |
GetEventOut | Returns the eventOut with the given name. | |
GetField | Returns a the field of this object whose name is fieldName. | |
GetFieldName | Returns the name of the given field in the fieldName argument. | |
GetFields | Appends references to all of this object's fields to resultList, and returns the number of fields appended. | |
GetHashCode |
Overrides GetHashCode().
(Inherited from SoNetBase.) | |
GetMatrix | (Inherited from SoNode.) | |
GetName | Returns the name of an instance. | |
GetPrimitiveCount | Counts number of primitives produced by this shape. | |
GetRenderEngineMode | Returns the supported Render engine mode. | |
GetRenderUnitID | (Inherited from SoVolumeShape.) | |
GetShapeType | Gets the current shape Full Scene Antialiasing type. | |
GetStringName | (Inherited from SoBase.) | |
GetType | Gets the Type of the current instance. (Inherited from Object.) | |
GLRender | (Overrides SoSliceGLRender(SoGLRenderAction).) | |
GLRenderBelowPath | (Inherited from SoNode.) | |
GLRenderInPath | (Inherited from SoNode.) | |
GLRenderOffPath | (Inherited from SoNode.) | |
GrabEventsCleanup | (Inherited from SoNode.) | |
GrabEventsSetup | (Inherited from SoNode.) | |
HandleEvent | (Inherited from SoNode.) | |
HasDefaultValues | Returns true if all of the object's fields have their default values. | |
IntersectGeometry | Return true if the given tile has geometry. | |
IsBoundingBoxIgnoring | Used by BoundingBoxAction to know if bounding box computation should be ignored or not. | |
IsNotifyEnabled | Notification is the process of telling interested objects that this object has changed. | |
IsOverride | Returns the state of the override flag. | |
IsSupported | Calls IsSupported((OIV.Inventor.Misc.SoState ^)nullptr). | |
IsSupported(SoState) | Returns true if graphic card can render an OIV.VolumeViz.Nodes.SoFenceSlice. | |
IsSynchronizable | Gets the ScaleViz synchronizable state of this object. | |
Pick | (Inherited from SoNode.) | |
RayPick | Implements picking along a ray by intersecting the ray with each primitive generated by subclass. | |
Search | (Inherited from SoNode.) | |
Set | Sets one or more fields in this object to the values specified in the given string, which should be a string in the Open Inventor file format. | |
SetName | (Inherited from SoBase.) | |
SetOverride | Turns the override flag on or off. | |
SetShapeType | set the antialiasing type for this shape. | |
SetSynchronizable | Sets this to be a ScaleViz synchronizable object. | |
SetToDefaults | Sets all fields in this object to their default values. | |
ShapeVertex | add a primitive vertex to the shape prevously started with OIV.Inventor.Nodes.SoShape.BeginShape(OIV.Inventor.Actions.SoAction, OIV.Inventor.Nodes.SoShape.TriangleShapes, OIV.Inventor.Details.SoFaceDetail). | |
ToString |
Converts this SoBase structure to a human readable string.
(Inherited from SoBase.) | |
Touch | Marks an instance as modified, simulating a change to it. | |
Write | (Inherited from SoNode.) |
Name | Description | |
---|---|---|
alphaUse | Specifies how to use the alpha component of each voxel's RGBA value. | |
alternateRep | This field optionally holds a subgraph containing only core Open Inventor nodes that can be used for rendering when VolumeViz is not available. | |
axis | Extrusion axis: X, Y, or Z. | |
boundingBoxIgnoring | Whether to ignore this node during bounding box traversal. | |
bumpScale | Specifies the intensity of the bump mapping effect. | |
composition | Obsolete. Specifies color composition mode. | |
dataSetId | Specifies the OIV.VolumeViz.Nodes.SoVolumeData node to use. | |
enableBumpMapping | Specifies if a bump mapping effect will be applied to the slice. | |
interpolation | Interpolation mode. | |
IsDisposable | ISafeDisposable interface implementation.
(Inherited from SoDisposable.) | |
largeSliceSupport | Activate/deactivate direct loading of full resolution slice data. | |
points | Set of points defining a lineset. | |
UserData |
Gets or sets the user data to be contained by the field container.
(Inherited from SoFieldContainer.) | |
useRGBA | Specifies whether to create RGBA textures. |
This node renders a strip (connected series) of slices. The strip is defined by a set of 2D vertices that form a polyline. Each segment of the polyline is extruded along the axis specified in the OIV.VolumeViz.Nodes.SoFenceSlice.axis field to form (in effect) an oblique slice. The default axis is Z, so the 2D points are treated as (X,Y) values. The points may be outside the 3D extent of the volume, but only the portion of the slice inside the volume will be drawn (subject to region of interest and other clipping nodes).
The OIV.VolumeViz.Nodes.SoVolumeData node on which this shape is applied can be specified with OIV.VolumeViz.Nodes.SoFenceSlice.dataSetId. When this field is set to 0, the last OIV.VolumeViz.Nodes.SoVolumeData node on state is used.
A similar effect could be obtained using volume geometry (e.g. OIV.VolumeViz.Nodes.SoVolumeFaceSet), but OIV.VolumeViz.Nodes.SoFenceSlice is more convenient and is optimized for this specific case.
The 2D coordinates are interpreted according to the following table. See the code example below.
Fence axis | Coordinate axes |
X | Y , Z |
Y | Z , X |
Z | X , Y |
The interpolation field controls how the texture is interpolated.
The alphaUse field (OIV.VolumeViz.Nodes.SoSlice) controls how the voxel's alpha component is used when drawing the fence slice.
Optionally a bump mapping effect may be applied. Normal vectors are automatically computed from the data value gradient. The enableBumpMapping and bumpScale fields (OIV.VolumeViz.Nodes.SoSlice) control whether bump mapping is active and the intensity of the effect.
Notes:
Transformation matrices: The volume size and orientation (like geometry) can be modified by transformation nodes in the scene graph and this in turn modifies the appearance of volume visualization nodes. However the same transformation must be applied to the volume data node and all volume visualization nodes associated with that volume. So effectively any transformation nodes that affect the volume must be placed before the volume data node.
Picking: The entire slice is pickable, even where it is transparent as a result of the current transfer function. Currently OIV.VolumeViz.Nodes.SoFenceSlice does not provide an OIV.Inventor.Details.SoDetail object.
Interpolation: Interpolation is specified using the interpolation field. The default (LINEAR) does bi-linear interpolation between voxel values. The NEAREST value can be used to display individual voxels. For best image quality we recommend using the MULTISAMPLE_12 value.
Data range: By default VolumeViz maps the entire range of the voxel's data type (e.g. 0..65535 for unsigned short) into the colormap. This is often correct for byte (8 bit) voxels, but seldom correct for 16 bit voxels and never correct for floating point voxels. Use an OIV.LDM.Nodes.SoDataRange node to specify the actual (or desired) range of data values to be mapped. Also use an OIV.LDM.Nodes.SoDataRange node to implement brightness/contrast control like the Window/Level setting commonly used with medical images.
Clipping: Volume primitives can be clipped using a region of interest (OIV.LDM.Nodes.SoROI), geometry (OIV.VolumeViz.Nodes.SoVolumeClippingGroup) and/or height fields (OIV.VolumeViz.Nodes.SoUniformGridClipping). They are also clipped by OpenGL clipping planes (OIV.Inventor.Nodes.SoClipPlane), but we recommend using the VolumeViz clipping nodes instead.
Material: The color of each voxel is modulated by the current diffuse color in the traversal state. The default diffuse color is 0.8,0.8,0.8. This results in full intensity values in the color map being displayed as 80% intensity. Therefore we recommend adding an OIV.Inventor.Nodes.SoMaterial node before the slice and setting its diffuseColor field to full white (1,1,1).
Transparency:
Typically the color map (OIV.LDM.Nodes.SoTransferFunction) used for volume rendering (OIV.VolumeViz.Nodes.SoVolumeRender) assigns transparency (alpha < 1) to some voxel values. If you want to use the same color map for slice rendering, but render the slice completely opaque, set the alphaUse field to ALPHA_OPAQUE. This overrides the alpha values in the color map (or an RGBA volume). However it does not affect transparency assigned using an OIV.Inventor.Nodes.SoMaterial node.
If you want to adjust the overall transparency of the slice, add an OIV.Inventor.Nodes.SoMaterial node and set its transparency field (keeping alphaUse set to ALPHA_AS_IS). Effectively a scale factor 1-transparency is applied to each voxel's alpha value.
Intersecting transparent slices cannot be rendered correctly by the basic blending transparency algorithms. To render this case correctly, set the transparency algorithm to SORTED_PIXEL using the viewer class or OIV.Inventor.Actions.SoGLRenderAction.
Voxel edges: The edges of the voxels can also be rendered. See options in the OIV.VolumeViz.Nodes.SoVolumeRenderingQuality node.
Custom shaders: The current OIV.VolumeViz.Nodes.SoVolumeShader node, if any, allows custom shaders to be defined for special computation or rendering effects, including blending multiple volumes.
Composition with Multiple Data: It is possible to compose datasets that have different dimensions, tile sizes and transformations. In order to help fetch the correct data values in custom shaders, texture coordinates conversion functions are provided in the VolumeViz/vvizStructure.h shader include. For instance,
vec3 VVizTextureToTextureVec(in VVizDataSetId datasetSrc, in VVizDataSetId datasetDst, in vec3 texCoord);
Performance:
Tile size: For backward compatibility, the default tile size is still only 64. This is quite small for modern CPU/GPU hardware. The smaller the tile size, the larger the total number of tiles that must be managed by VolumeViz. This overhead can be significant, especially for operations that require reloading the data textures on the GPU, for example, changing the data range (OIV.LDM.Nodes.SoDataRange). For smaller volumes, like 512^3, it can be efficient to set the tile size large enough to contain the entire volume. For very large volumes, larger tile sizes are efficient for OIV.VolumeViz.Nodes.SoVolumeRender but somewhat inefficient for slice rendering because complete tiles must be loaded even though the slice only uses part of the data. Applications should experiment. For volumes stored in LDM file format, the tile size must be specified when the volume is converted to LDM (see OIV.LDM.Converters.SoConverter and the "-t" option). For other data data formats the tile size can be specified using the OIV.VolumeViz.Nodes.SoVolumeData node's ldmResourceParameters field, but only after setting the filename field or calling the SetReader()method.
LDM_USE_IN_MEM_COMPRESSION VolumeViz always manages data as "tiles", regardless of the data format. In many cases VolumeViz must create (or uncompress) the tiles at run time. These cases include in-memory volumes, any volume reader that does not implement the readTile() method (this includes all built-in formats except LDM, e.g. DICOM, SEGY, ...) and compressed LDM format files. If this variable is true (the default), VolumeViz only keeps a small cache of created/uncompressed tiles in CPU memory. If a tile's data is needed and that tile is not in the cache, the tile must be recreated. This overhead can be significant, especially for operations that require recreating all the data textures on the GPU, for example changing the data range (OIV.LDM.Nodes.SoDataRange). We recommend setting this variable to false (see OIV.Inventor.SoPreferences) unless saving CPU memory is critical.
Hardware requirements: This node needs a graphic card with support for GLSL shader, vertex buffer objects (VBO) and framebuffer object (FBO). Use the OIV.VolumeViz.Nodes.SoFenceSlice.IsSupported(OIV.Inventor.Misc.SoState) method to check if the current graphics board can render a FenceSlice.
Please see OIV.VolumeViz.Nodes.SoObliqueSlice for a complete code example. The following shows how to set up the OIV.VolumeViz.Nodes.SoFenceSlice.axis and OIV.VolumeViz.Nodes.SoFenceSlice.points fields of OIV.VolumeViz.Nodes.SoFenceSlice.
SoFenceSlice fenceSlice = new SoFenceSlice(); fenceSlice.axis.Value = SoFenceSlice.AxisType.Y; fenceSlice.points[0] = new SbVec2f(-0.2f, -0.66f); fenceSlice.points[1] = new SbVec2f(0.2f, -0.4f); fenceSlice.points[2] = new SbVec2f(-0.2f, 0.4f); fenceSlice.points[3] = new SbVec2f(0.2f, 0.66f);
Fence slice on Y axis (Colt example data set): |
Fence slice on X axis (Colt example data set): |
Fence slice on Z axis (Colt example data set): |
FenceSlice {
dataSetId | 0 |
points | [ ] |
axis | Z |
interpolation | LINEAR |
alphaUse | ALPHA_BINARY |
useRGBA | false |
alternateRep | NULL |
enableBumpMapping | false |
bumpScale | 1.0 |
OIV.Inventor.Actions.SoGLRenderAction Draws a textured shape based on current OIV.VolumeViz.Nodes.SoVolumeData, OIV.LDM.Nodes.SoTransferFunction, and OIV.LDM.Nodes.SoROI nodes.
OIV.Inventor.Actions.SoGetBoundingBoxAction Computes the bounding box that encloses the fence slice.