Open Inventor Release 2024.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-2024 BY FEI S.A.S, ***
17 *** BORDEAUX, FRANCE ***
18 *** ALL RIGHTS RESERVED ***
19**=======================================================================*/
20/*=======================================================================
21** Author : P. ESTRADE (Mar 2000)
22**=======================================================================*/
23#ifndef _SO_VOLUME_RENDER_
24#define _SO_VOLUME_RENDER_
25
26#include <Inventor/caches/SoCache.h>
27#include <Inventor/nodes/SoShape.h>
28#include <Inventor/nodes/SoShaderParameter.h>
29#include <Inventor/nodes/SoGroup.h>
30#include <Inventor/nodes/SoTextureUnit.h>
31#include <Inventor/fields/SoSFBool.h>
32#include <Inventor/fields/SoSFBitMask.h>
33#include <Inventor/fields/SoSFEnum.h>
34#include <Inventor/fields/SoSFFloat.h>
35#include <Inventor/fields/SoSFVec3f.h>
36#include <Inventor/fields/SoSFInt32.h>
37#include <Inventor/SbBox.h>
38
39#include <Inventor/STL/vector>
40#include <Inventor/STL/map>
41
42#include <VolumeViz/nodes/SoVolumeShape.h>
43
44#include <VolumeViz/LDM/SoLDMTileID.h>
45
46class SbProjection;
47class SoFrameBufferObject;
48class SoGLProgramGLSL;
49class SoGLTexture;
50class SoVRImageSpaceEffects;
51class SoLDMTileID;
52class SoLdmSubDivisionIsosurfacePolicy;
53class SoLdmSubDivisionPolicy;
54class SoLdmSubDivisionTransferFunctionPolicy;
55class SoShaderProgram;
56class SoVolumeGroup;
58class SoVolumeRenderInterface;
59class SoVolumeRenderRaycast;
60class SoVolumeRenderLdm;
61class SoVolumeRenderLdm;
62class SoVolumeRenderPaging;
64class SoVolumeStateVr;
66class SoNodeSensor;
67class SoVolumeOffscreenImpl;
68
69#ifdef _WIN32
70#pragma warning( push )
71#pragma warning(disable:4251)
72#endif
73
765 SO_NODE_HEADER( SoVolumeRender );
766
767 public:
768
791
792
837
869
883
893
912
921
922
940
952
970
981
1053
1061
1095
1124
1142
1147
1166
1170 typedef AbortCode SoVolumeRenderAbortCB(int totalElems, int thisElem, void *userData);
1171
1191 void setAbortCallback( SoVolumeRenderAbortCB *func, void *userData = NULL);
1192
1193
1194#if 1 SoDEPRECATED
1215SoDEPRECATED
1222SoDEPRECATED
1229
1230#endif
1232#if 1 SoDEPRECATED
1242
1243#endif
1245/*****************************************************************************/
1246private:
1248 virtual void computeBBox(SoAction *, SbBox3f &box, SbVec3f &center);
1249
1251 virtual void rayPick(SoRayPickAction *action);
1252
1253/*****************************************************************************/
1254private:
1255
1257 static void initClass();
1258
1260 static void exitClass();
1261
1265 SoVolumeRenderingQuality* getVolumeRenderingQuality( SoState* state ) const;
1266
1270 SoVolumeOffscreenImpl* getVolumeOffscreenImpl() const;
1271
1272#if 1 SoDEPRECATED
1275
1276#endif
1280 bool needOivDepth(SoState* state);
1281
1286 bool needRttColor(SoState* state) const;
1287
1290 bool needRttEdgeDetect(SoState* state) const;
1291
1294 bool needRttBoundaryDepth(SoState* state) const;
1295
1298 bool needRttBoundaryColor(SoState* state) const;
1299
1301 SamplingAlignment getSamplingAlignment(SoState* state) const;
1302
1304 void removeDsFromRegList(SoDataSet* pDs);
1305
1307 virtual void notify(SoNotList *list);
1308
1312 void onUserInteractionChange(SoState*state, bool stopMoving);
1313
1314/*****************************************************************************/
1315 private:
1316 // Destructor
1317 virtual ~SoVolumeRender();
1318
1319 void createVolumeRender( SoState* state );
1320
1321 void generatePrimitives(SoAction *action);
1322
1323 void doRendering(SoGLRenderAction *action);
1324
1325 void setupVolumeRenderInterface(SoState* state);
1326
1327 SoDetail *createTriangleDetail(SoRayPickAction *,
1328 const SoPrimitiveVertex *v1,
1329 const SoPrimitiveVertex *,
1330 const SoPrimitiveVertex *,
1331 SoPickedPoint *);
1332
1337 void beginOffscreenRendering( SoGLRenderAction* action );
1338
1343 void endOffscreenRendering( SoGLRenderAction* action );
1344
1348 void setupFrontToBackGlState(SoState* state);
1349
1354 SbBool shouldGLRender(SoGLRenderAction *renderAction, SbBool isPointsOrLines);
1355
1356/*****************************************************************************/
1357SoINTERNAL private:
1358
1360 virtual void ldmAction(SoLdmValuationAction* action);
1361
1362/*****************************************************************************/
1363private:
1364
1365#if 1 SoDEPRECATED
1367 SoSFBool useEarlyZ;SoDEPRECATED
1369 SoSFInt32 numEarlyZPasses;SoDEPRECATED
1371 SoSFBool gpuVertexGen;
1372#endif
1375 void fillDetail(SoRayPickAction* rpa, SoVolumeRenderDetail* detail, const SoLDM::DataSetIdPair& idPair);
1376
1377 void genPrimDataSet(SoAction* action, const SoLDM::DataSetIdPair& idPair);
1378
1380 bool canSubdivideTiles(SoState* state);
1381
1383 bool isRaycastingEnabled(SoState* state) const;
1384
1385 SoVolumeRenderAbortCB *m_abortCBfunc;
1386 void *m_abortCBuserData;
1387 void GLRenderTex2D3D(SoGLRenderAction* action);
1388
1392 void useOffscreenRendering(SoGLRenderAction* action);
1393
1397 void initInternalShaders();
1398
1399 void setupDepthPeelingTextures(SoGLRenderAction *action);
1400
1401 void rayPickDataSet(SoRayPickAction* action, const SoLDM::DataSetIdPair& idPair);
1402
1404 SoVRImageSpaceEffects* m_imageSpaceEffects;
1405
1412 int m_vpScale;
1413
1416 int m_lowScreenResScale;
1417
1418 SoShaderParameter1i *m_opacityTex;
1419 SoGLProgramGLSL* m_binaryOpacityComposeShader;
1420
1421 SoShaderProgram* m_writeFragShader;
1422
1423 SoVolumeIsosurface* m_volumeIsosurface;
1424
1428 void deleteShadersFboTextures();
1429
1433 void updateLowResScale( SoState* state );
1434
1438 void registerCtxId(const SoLDM::DsVector &dsVector, int ctxId);
1439
1443 void unregisterCtxId(const SoLDM::DsVector &dsVector, int ctxId);
1444
1446 bool m_useLowResMove;
1447
1449 bool m_useLowNumSliceMove;
1450
1451 SoVolumeRenderLdm* m_vriLdm;
1452 SoVolumeRenderRaycast* m_vriRaycast;
1453 SoVolumeRenderInterface* m_vri;
1454
1455 bool m_frontToBackComposition;
1456
1457 // List of dataset gathered in previous valuation action
1458 SoLDM::DsVector m_prevDsList;
1459
1460 // Callback to manage deletion of dataset
1461 static void volDataDeleteCB(void* data, SoSensor *sensor);
1462
1463 // ctxId attached to this volumeRender. Set by ValuationAction.
1464 int m_prevRegisteredCtxId;
1465
1466 SoVolumeStateVr* m_vs;
1467
1468 SoVolumeOffscreenImpl* m_volumeOffscreenImpl;
1469
1470 // Associate a Node sensor to each DataSet managed
1471 std::map<SoDataSet*, SoNodeSensor*> m_mapDsSensor;
1472
1473 friend class SoVolumeRenderLdm;
1475
1476 SoRef<SoGroup> m_depthPeelingSG;
1477 SoRef<SoGroup> m_depthPeelingColorTexGroup;
1478 SoRef<SoTextureUnit> m_depthPeelingColorTexUnit;
1479 SoRef<SoGroup> m_depthPeelingDepthTexGroup;
1480 SoRef<SoTextureUnit> m_depthPeelingDepthTexUnit;
1481};
1482
1483#if defined(_WIN32)
1484#pragma warning( pop )
1485#endif
1486
1487#endif // _SO_VOLUME_RENDER_
1488
1489
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 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...
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Renders data volumes ...
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,...
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...
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Abstract base class f...
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