Open Inventor Release 2024.2.0
 
Loading...
Searching...
No Matches
SoVolumeClippingGroup.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 : Benjamin GRANGE (Aug 2006)
22** Modified : David BEILLOIN (Mar 2011)
23**=======================================================================*/
24#ifndef _SO_VOLUME_CLIPPING_GROUP_
25#define _SO_VOLUME_CLIPPING_GROUP_
26
27#include <Inventor/nodes/SoGroup.h>
28#include <Inventor/fields/SoSFInt32.h>
29#include <Inventor/fields/SoSFFloat.h>
30#include <Inventor/SbBox.h>
31
32class SoGLDepthPeeling;
33class SoState;
34
170 SO_NODE_HEADER( SoVolumeClippingGroup );
171
172 public:
173
178
184
192
196 static unsigned int getMaxNumPasses();
197
199 typedef void SoVolumeClippingGroupCB( SoVolumeClippingGroup* mgr, void* userData );
200
206
207 private:
208 virtual void GLRender(SoGLRenderAction* action);
209 virtual void doAction(SoAction* action);
210 virtual void getBoundingBox(SoGetBoundingBoxAction* action);
211
213 virtual void rayPick(SoRayPickAction* action);
214
215 private:
216 static void initClass();
217 static void exitClass();
218
219 //Get the texture unit number where the first depth layer is binded
220 int getFirstDepthTextureUnit( SoGLRenderAction* action ) const;
221
222 //Return the number of depth textures pairs
223 int getNumPairs() const;
224
225 //Return the real number of depth layer passes used
226 int getNumPassUsed() const;
227
228 //TRUE if box is not into the clipping volume
229 SbBool isCulled(const SbBox3f& box);
230
231 // This is used by SoVolumeGroupElement just to ensure that
232 // the resources won't be allocated-computed-release for each path
233 // collected by the SoVolumeGroup node.
234 //
235 // This method is called by SoVolumeClippingGroup itself. The SoVolumeGroupElement calls the unlock
236 // in order to allow releaseResources to do the job.
237 void lockResources();
238
239 // Release previously locked resources.
240 void unlockResources();
241
242 // Indicates if the resources are locked or not.
243 bool areResourcesLocked() const;
244
245 // Release the depth peeling resources if they are not locked.
246 // Most of the time it is called by SoVolumeClippingGroupElement, except when we do multi volume
247 // the release is done by SoVolumeGroupElement.
248 void releaseResources();
249
250 // Set depth texture in SoVolumeRender
251 void setDepthPeelingTextureOnState(SoGLRenderAction* action);
252
255 inline const SbXfBox3f& getWorldBbox() const { return m_worldBbox; }
256
258 virtual void notify(SoNotList* list);
259
260private:
261 virtual ~SoVolumeClippingGroup();
262
263private:
264
265 enum LayersState
266 {
267 NOT_COMPUTED,
268 COMPUTED,
269 };
270
271 LayersState m_layersState;
272
273 bool m_isLocked;
274
276 struct NotEnoughLayerCBData {
277 NotEnoughLayerCBData() : m_notEnoughPassCB(NULL), m_notEnoughPassCBData(NULL), that(NULL) {}
279 SoVolumeClippingGroupCB* m_notEnoughPassCB;
281 void* m_notEnoughPassCBData;
284 };
286 NotEnoughLayerCBData m_notEnoughLayerCBData;
287
297 static void notEnoughLayerCB(void* userData, SoGLDepthPeeling* mgr);
298
299 void commonInit();
300
301 SbBool initDepthPeeling(SoGLRenderAction* action, const SbVec2s& vpSize);
302
303 SoGLDepthPeeling* m_glDepthPeeling;
304
305 // update bbox of the clipping volume
306 void updateChildBBox();
307
308 // get bbox of the clipping volume
309 const SbXfBox3f& getBBox(SoAction*);
310
311 bool m_applyTochild;
312 SbXfBox3f m_bbox;
313 bool m_bboxCacheClean;
314
315 SbXfBox3f m_worldBbox;
316
317 struct SoVolumeClippingInfos {
320 } m_clippingInfos;
321 static void renderCB(void* userData, SoGLDepthPeeling* );
322
325 SbBool m_depthPeelingPass;
326
327 SbBool m_releaseResources;
328};
329/*----------------------------------------------------------------------------*/
330#endif
331
332
3D box class.
Definition SbBox.h:649
2D vector class.
Definition SbVec.h:700
3D box with an associated transformation matrix.
Definition SbBox.h:1250
Abstract base class for all actions.
Definition SoAction.h:132
Renders a scene graph using Open Inventor's Render Engine.
Computes bounding box of a scene.
Base class for all group nodes.
Definition SoGroup.h:122
Intersects objects with a ray cast into scene.
Field containing a single Boolean value.
Definition SoSFBool.h:79
Field containing a int32_t integer.
Definition SoSFInt32.h:80
Traversal state.
Definition SoState.h:74
<a href="IconLegend.html"><img src="extVR.gif" alt="VolumeViz" border="0"></a> Clipping a volume wit...
SoSFBool clipOutside
If TRUE, voxels inside the clipping object will be drawn, voxels outside will be clipped.
void SoVolumeClippingGroupCB(SoVolumeClippingGroup *mgr, void *userData)
Callback prototype.
static unsigned int getMaxNumPasses()
Returns the maximum number of passes supported by the hardware.
SoSFInt32 numPasses
Number of passes used to do the clipping.
SoVolumeClippingGroup()
Default constructor.
void setNotEnoughPassCallback(SoVolumeClippingGroupCB *f, void *userData)
Set a callback to be called when there are not enough passes (see numPasses) to properly apply the cl...
int SbBool
Boolean type.
Definition SbBase.h:87