Open Inventor Release 2025.2.0
 
Loading...
Searching...
No Matches
SoVolumeRender.h
1/*=======================================================================
2 *** THE CONTENT OF THIS WORK IS PROPRIETARY TO FEI S.A.S, (FEI S.A.S.), ***
3 *** AND IS DISTRIBUTED UNDER A LICENSE AGREEMENT. ***
4 *** ***
5 *** REPRODUCTION, DISCLOSURE, OR USE, IN WHOLE OR IN PART, OTHER THAN AS ***
6 *** SPECIFIED IN THE LICENSE ARE NOT TO BE UNDERTAKEN EXCEPT WITH PRIOR ***
7 *** WRITTEN AUTHORIZATION OF FEI S.A.S. ***
8 *** ***
9 *** RESTRICTED RIGHTS LEGEND ***
10 *** USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT OF THE CONTENT OF THIS ***
11 *** WORK OR RELATED DOCUMENTATION IS SUBJECT TO RESTRICTIONS AS SET FORTH IN ***
12 *** SUBPARAGRAPH (C)(1) OF THE COMMERCIAL COMPUTER SOFTWARE RESTRICTED RIGHT ***
13 *** CLAUSE AT FAR 52.227-19 OR SUBPARAGRAPH (C)(1)(II) OF THE RIGHTS IN ***
14 *** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 52.227-7013. ***
15 *** ***
16 *** COPYRIGHT (C) 1996-2025 BY FEI S.A.S, ***
17 *** BORDEAUX, FRANCE ***
18 *** ALL RIGHTS RESERVED ***
19**=======================================================================*/
20/*=======================================================================
21** Author : P. ESTRADE (Mar 2000)
22**=======================================================================*/
23#pragma once
24
25#include <Inventor/caches/SoCache.h>
26#include <Inventor/nodes/SoShape.h>
27#include <Inventor/nodes/SoShaderParameter.h>
28#include <Inventor/nodes/SoGroup.h>
29#include <Inventor/nodes/SoTextureUnit.h>
30#include <Inventor/fields/SoSFBool.h>
31#include <Inventor/fields/SoSFBitMask.h>
32#include <Inventor/fields/SoSFEnum.h>
33#include <Inventor/fields/SoSFFloat.h>
34#include <Inventor/fields/SoSFVec3f.h>
35#include <Inventor/fields/SoSFInt32.h>
36#include <Inventor/SbBox.h>
37
38#include <Inventor/STL/vector>
39#include <Inventor/STL/map>
40
41#include <VolumeViz/nodes/SoVolumeShape.h>
42
43#include <VolumeViz/LDM/SoLDMTileID.h>
44
45class SbProjection;
46class SoFrameBufferObject;
47class SoGLProgramGLSL;
48class SoGLTexture;
49class SoVRImageSpaceEffects;
50class SoLDMTileID;
51class SoLdmSubDivisionIsosurfacePolicy;
52class SoLdmSubDivisionPolicy;
53class SoLdmSubDivisionTransferFunctionPolicy;
54class SoShaderProgram;
55class SoVolumeGroup;
57class SoVolumeRenderInterface;
58class SoVolumeRenderRaycast;
59class SoVolumeRenderLdm;
60class SoVolumeRenderLdm;
61class SoVolumeRenderPaging;
63class SoVolumeStateVr;
65class SoNodeSensor;
66class SoVolumeOffscreenImpl;
67
758class SoVolumeRender : public SoVolumeShape {
759 SO_NODE_HEADER( SoVolumeRender );
760
761 public:
762
785
786
831
863
877
887
906
915
916
934
946
964
975
1047
1055
1089
1118
1136
1141
1146
1165
1169 typedef AbortCode SoVolumeRenderAbortCB(int totalElems, int thisElem, void *userData);
1170
1190 void setAbortCallback( SoVolumeRenderAbortCB *func, void *userData = NULL);
1191
1192
1193#if 1
1194SoDEPRECATED
1214SoDEPRECATED
1221SoDEPRECATED
1228
1229#endif
1230
1231#if 1
1232SoDEPRECATED
1241
1242#endif
1243
1244/*****************************************************************************/
1245private:
1247 virtual void computeBBox(SoAction *, SbBox3f &box, SbVec3f &center);
1248
1250 virtual void rayPick(SoRayPickAction *action);
1251
1252/*****************************************************************************/
1253private:
1254
1256 static void initClass();
1257
1259 static void exitClass();
1260
1264 SoVolumeRenderingQuality* getVolumeRenderingQuality( SoState* state ) const;
1265
1269 SoVolumeOffscreenImpl* getVolumeOffscreenImpl() const;
1270
1271#if 1
1272SoDEPRECATED
1274
1275#endif
1279 bool needOivDepth(SoState* state);
1280
1285 bool needRttColor(SoState* state) const;
1286
1289 bool needRttEdgeDetect(SoState* state) const;
1290
1293 bool needRttBoundaryDepth(SoState* state) const;
1294
1297 bool needRttBoundaryColor(SoState* state) const;
1298
1300 SamplingAlignment getSamplingAlignment(SoState* state) const;
1301
1303 void removeDsFromRegList(SoDataSet* pDs);
1304
1306 virtual void notify(SoNotList *list);
1307
1311 void onUserInteractionChange(SoState*state, bool stopMoving);
1312
1313/*****************************************************************************/
1314 private:
1315 // Destructor
1316 virtual ~SoVolumeRender();
1317
1318 void createVolumeRender( SoState* state );
1319
1320 void generatePrimitives(SoAction *action);
1321
1322 void doRendering(SoGLRenderAction *action);
1323
1324 void setupVolumeRenderInterface(SoState* state);
1325
1326 SoDetail *createTriangleDetail(SoRayPickAction *,
1327 const SoPrimitiveVertex *v1,
1328 const SoPrimitiveVertex *,
1329 const SoPrimitiveVertex *,
1330 SoPickedPoint *);
1331
1336 void beginOffscreenRendering( SoGLRenderAction* action );
1337
1342 void endOffscreenRendering( SoGLRenderAction* action );
1343
1347 void setupFrontToBackGlState(SoState* state);
1348
1353 SbBool shouldGLRender(SoGLRenderAction *renderAction, SbBool isPointsOrLines);
1354
1355/*****************************************************************************/
1356SoINTERNAL private:
1357
1359 virtual void ldmAction(SoLdmValuationAction* action);
1360
1361/*****************************************************************************/
1362private:
1363
1364#if 1 SoDEPRECATED
1366 SoSFBool useEarlyZ;SoDEPRECATED
1368 SoSFInt32 numEarlyZPasses;SoDEPRECATED
1370 SoSFBool gpuVertexGen;
1371#endif
1372
1374 void fillDetail(SoRayPickAction* rpa, SoVolumeRenderDetail* detail, const SoLDM::DataSetIdPair& idPair);
1375
1376 void genPrimDataSet(SoAction* action, const SoLDM::DataSetIdPair& idPair);
1377
1379 bool canSubdivideTiles(SoState* state);
1380
1382 bool isRaycastingEnabled(SoState* state) const;
1383
1384 SoVolumeRenderAbortCB *m_abortCBfunc;
1385 void *m_abortCBuserData;
1386 void GLRenderTex2D3D(SoGLRenderAction* action);
1387
1391 void useOffscreenRendering(SoGLRenderAction* action);
1392
1396 void initInternalShaders();
1397
1398 void setupDepthPeelingTextures(SoGLRenderAction *action);
1399
1400 void rayPickDataSet(SoRayPickAction* action, const SoLDM::DataSetIdPair& idPair);
1401
1403 SoVRImageSpaceEffects* m_imageSpaceEffects;
1404
1411 int m_vpScale;
1412
1415 int m_lowScreenResScale;
1416
1417 SoShaderParameter1i *m_opacityTex;
1418 SoGLProgramGLSL* m_binaryOpacityComposeShader;
1419
1420 SoShaderProgram* m_writeFragShader;
1421
1422 SoVolumeIsosurface* m_volumeIsosurface;
1423
1427 void deleteShadersFboTextures();
1428
1432 void updateLowResScale( SoState* state );
1433
1437 void registerCtxId(const SoLDM::DsVector &dsVector, int ctxId);
1438
1442 void unregisterCtxId(const SoLDM::DsVector &dsVector, int ctxId);
1443
1445 bool m_useLowResMove;
1446
1448 bool m_useLowNumSliceMove;
1449
1450 SoVolumeRenderLdm* m_vriLdm;
1451 SoVolumeRenderRaycast* m_vriRaycast;
1452 SoVolumeRenderInterface* m_vri;
1453
1454 bool m_frontToBackComposition;
1455
1456 // List of dataset gathered in previous valuation action
1457 SoLDM::DsVector m_prevDsList;
1458
1459 // Callback to manage deletion of dataset
1460 static void volDataDeleteCB(void* data, SoSensor *sensor);
1461
1462 // ctxId attached to this volumeRender. Set by ValuationAction.
1463 int m_prevRegisteredCtxId;
1464
1465 SoVolumeStateVr* m_vs;
1466
1467 SoVolumeOffscreenImpl* m_volumeOffscreenImpl;
1468
1469 // Associate a Node sensor to each DataSet managed
1470 std::map<SoDataSet*, SoNodeSensor*> m_mapDsSensor;
1471
1472 friend class SoVolumeRenderLdm;
1474
1475 SoRef<SoGroup> m_depthPeelingSG;
1476 SoRef<SoGroup> m_depthPeelingColorTexGroup;
1477 SoRef<SoTextureUnit> m_depthPeelingColorTexUnit;
1478 SoRef<SoGroup> m_depthPeelingDepthTexGroup;
1479 SoRef<SoTextureUnit> m_depthPeelingDepthTexUnit;
1480};
3D box class.
Definition SbBox.h:649
Base class for coordinate projection classes.
3D vector class.
Definition SbVec.h:932
Abstract base class for all actions.
Definition SoAction.h:132
<a href="IconLegend.html"><img src="extLDM.gif" alt="Large Data Management" border="0"></a> Data set...
Definition SoDataSet.h:139
Base class for describing detail information about a shape node.
Definition SoDetail.h:99
Renders a scene graph using Open Inventor's Render Engine.
<a href="IconLegend.html"><img src="extLDM.gif" alt="Large Data Management" border="0"></a> Tile ID
Definition SoLDMTileID.h:63
friend class SoLdmValuationAction
Definition SoLdmShape.h:84
Multiple-value field containing any number of int32_t integers.
Definition SoMFInt32.h:88
Sensor class that can be attached to Open Inventor nodes.
Represents point on surface of picked object.
Represents a vertex of a generated primitive.
Intersects objects with a ray cast into scene.
Smart pointer for any class inheriting SoRefCounter.
Definition SoRef.h:90
Single-value field containing a set of bit flags.
Field containing a single Boolean value.
Definition SoSFBool.h:79
Field containing an enumerated value.
Definition SoSFEnum.h:89
Field containing a floating-point value.
Definition SoSFFloat.h:78
Field containing a int32_t integer.
Definition SoSFInt32.h:80
Field containing a two-dimensional vector.
Definition SoSFVec2i32.h:52
Field containing a three-dimensional vector.
Definition SoSFVec3f.h:80
Abstract base class for Open Inventor sensors.
Definition SoSensor.h:100
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Uniform shader p...
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Shader program p...
Traversal state.
Definition SoState.h:74
Groups multiple volumes to be volume rendered in the same scene.
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Isosurface property n...
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Stores detail informa...
SoSFEnum renderMode
Specifies how the voxels along each sampling ray are combined to form the final image.
SoSFInt32 numSlices
Specifies the number of samples along each ray.
SoVolumeRender()
Constructor.
SoSFBool subdivideTile
If true, LDM tiles will be subdivided for rendering.
NumSlicesControl
Number of samples control mode.
@ MANUAL
Use the number of samples specified by the numSlices field.
@ MAIN_AXIS
Use a number of samples computed as follows: n = complexity * 2 * volumeDataDimension[mainVisibl...
@ AUTOMATIC
(Recommended) Use a number of samples computed as follows: If numSlices is greater than zero,...
@ ALL
Use all samples.
SoSFEnum samplingAlignment
Specifies which technique to use to align rayCast samples.
friend class SoVolumeRenderLdm
AbortCode
Abort code for callback.
@ SKIP
The current slice is not drawn.
@ ABORT
The render action of the SoVolumeRender node is aborted.
@ CONTINUE
Continue rendering as usual.
SoDEPRECATED SoSFBool lighting
Indicates if lighting is required.
SoSFBool fixedNumSlicesInRoi
When this field is set to FALSE (the default), the number of samples set by numSlices is the number o...
SoDEPRECATED SoSFFloat lightIntensity
Light intensity in the range [0-1].
SoSFFloat opacityThreshold
Specifies a threshold opacity (alpha) value that defines voxels considered to be "solid" (non-transpa...
SoDEPRECATED SoSFBool viewAlignedSlices
Indicates if samples should be computed in a view-aligned manner.
SamplingAlignment
Sampling alignment.
@ VIEW_ALIGNED
Samples are located on planes perpendicular to the view direction.
@ BOUNDARY_ALIGNED
Samples are located on shells aligned with the volume's internal "boundary".
@ DATA_ALIGNED
Samples are located on planes perpendicular to one axis of the volume.
@ SMOOTH_BOUNDARY_ALIGNED
Similar to BOUNDARY_ALIGNED but uses a cubic interpolation to compute the boundary,...
SoSFVec2i32 stillScreenTileSize
Specifies the size of the screen tiles used for rendering.
SoSFBitMask lowResMode
Sets the method to use when moving in low resolution.
SoSFBool opacityCorrection
Controls whether opacity correction is done.
SoSFEnum numSlicesControl
Controls how the number of samples along each ray is determined.
LowResMode
Method to use when moving in low resolution.
@ DECREASE_SCREEN_RESOLUTION
Downscale the screen resolution of the volume when moving by the factor defined in lowScreenResolutio...
@ DECREASE_NONE
No low resolution mode when moving.
@ DECREASE_SLICES
Decrease the number of samples according to SoComplexity::value when moving.
SoSFInt32 projectedTileSubdivision
When doing volume projection (see SoProjection), only the geometry (corner vertices) of the LDM tiles...
void setAbortCallback(SoVolumeRenderAbortCB *func, void *userData=NULL)
Sets callback to call during texture map rendering to test for an abort condition.
friend class SoVolumeRenderRaycast
RenderMode
Composition mode.
@ MAX_INTENSITY_PROJECTION
Maximum intensity projection (MIP).
@ MAX_INTENSITY_DIFFERENCE_ACCUMULATION
Maximum Intensity Difference Accumulation (MIDA).
@ INTENSITY_DIFFERENCE_ACCUMULATION
Intensity Difference Accumulation.
@ MIN_INTENSITY_PROJECTION
Minimum intensity projection (MinIP).
@ AVERAGE_INTENSITY_PROJECTION
Average Intensity projection (AIP).
@ VOLUME_RENDERING
Alpha compositing (Default).
@ MAX_GRADIENT_DIFFERENCE_ACCUMULATION
Maximum Gradient Difference Accumulation.
@ SUM_INTENSITY_PROJECTION
Ray sum intensity projection (RSP).
@ GRADIENT_DIFFERENCE_ACCUMULATION
Gradient Difference Accumulation.
SoSFInt32 lowScreenResolutionScale
If lowResMode is DECREASE_SCREEN_RESOLUTION, render the volume at a lower screen resolution.
AbortCode SoVolumeRenderAbortCB(int totalElems, int thisElem, void *userData)
SoDEPRECATED SoSFVec3f lightDirection
Light direction (relative to the volume).
SoMFInt32 dataSetIds
Specifies the list of volumes on which volume rendering is applied.
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Volume rendering qual...
int SbBool
Boolean type.
Definition SbBase.h:87
std::pair< SoDataSet *, int > DataSetIdPair
Pair containing an SoDataset and its dataSetId.
Definition SoLDM.h:71
std::vector< SoDataSet * > DsVector
Vector of SoDataSet.
Definition SoLDM.h:56