VTK
vtkUnstructuredGridVolumeZSweepMapper.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkUnstructuredGridVolumeZSweepMapper.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
35 #ifndef vtkUnstructuredGridVolumeZSweepMapper_h
36 #define vtkUnstructuredGridVolumeZSweepMapper_h
37 
38 #include "vtkRenderingVolumeModule.h" // For export macro
40 
41 class vtkRenderer;
42 class vtkVolume;
44 class vtkCell;
45 class vtkGenericCell;
46 class vtkIdList;
47 class vtkPriorityQueue;
48 class vtkTransform;
49 class vtkMatrix4x4;
50 class vtkVolumeProperty;
51 class vtkDoubleArray;
53 class vtkRenderWindow;
54 
55 // Internal classes
57 {
58  class vtkScreenEdge;
59  class vtkSpan;
60  class vtkPixelListFrame;
61  class vtkUseSet;
62  class vtkVertices;
63  class vtkSimpleScreenEdge;
64  class vtkDoubleScreenEdge;
65  class vtkVertexEntry;
66  class vtkPixelListEntryMemory;
67 };
68 
70 {
71 public:
73  void PrintSelf( ostream& os, vtkIndent indent ) override;
74 
79 
81 
86  vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f );
87  vtkGetMacro( ImageSampleDistance, float );
89 
91 
95  vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f );
96  vtkGetMacro( MinimumImageSampleDistance, float );
98 
100 
104  vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f );
105  vtkGetMacro( MaximumImageSampleDistance, float );
107 
109 
115  vtkSetClampMacro( AutoAdjustSampleDistances, vtkTypeBool, 0, 1 );
116  vtkGetMacro( AutoAdjustSampleDistances, vtkTypeBool );
117  vtkBooleanMacro( AutoAdjustSampleDistances, vtkTypeBool );
119 
121 
125  vtkSetClampMacro( IntermixIntersectingGeometry, vtkTypeBool, 0, 1 );
126  vtkGetMacro( IntermixIntersectingGeometry, vtkTypeBool );
127  vtkBooleanMacro( IntermixIntersectingGeometry, vtkTypeBool );
129 
136  int GetMaxPixelListSize();
137 
143  void SetMaxPixelListSize(int size);
144 
146 
150  virtual void SetRayIntegrator(vtkUnstructuredGridVolumeRayIntegrator *ri);
151  vtkGetObjectMacro(RayIntegrator, vtkUnstructuredGridVolumeRayIntegrator);
153 
159  void Render(vtkRenderer *ren,
160  vtkVolume *vol) override;
161 
162  vtkGetVectorMacro( ImageInUseSize, int, 2 );
163  vtkGetVectorMacro( ImageOrigin, int, 2 );
164  vtkGetVectorMacro( ImageViewportSize, int , 2 );
165 
166 protected:
169 
173  void BuildUseSets();
174 
179  int ReorderTriangle(vtkIdType v[3],
180  vtkIdType w[3]);
181 
187  void ProjectAndSortVertices(vtkRenderer *ren,
188  vtkVolume *vol);
189 
193  void CreateAndCleanPixelList();
194 
199  void MainLoop(vtkRenderWindow *renWin);
200 
205  void CompositeFunction(double zTarget);
206 
210  unsigned char ColorComponentRealToByte(float color);
211 
215  void RasterizeFace(vtkIdType faceIds[3], int externalSide);
216 
223  void RasterizeTriangle(
224  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertexEntry *ve0,
225  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertexEntry *ve1,
226  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertexEntry *ve2,
227  bool exitFace);
228 
235  void RasterizeSpan(int y,
236  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkScreenEdge *left,
237  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkScreenEdge *right,
238  bool exitFace);
239 
246  void RasterizeLine(
247  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertexEntry *v0,
248  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertexEntry *v1,
249  bool exitFace);
250 
251  void StoreRenderTime(vtkRenderer *ren,
252  vtkVolume *vol,
253  float t);
254 
255  float RetrieveRenderTime(vtkRenderer *ren,
256  vtkVolume *vol);
257 
261  double GetZBufferValue(int x,
262  int y);
263 
264  double GetMinimumBoundsDepth(vtkRenderer *ren,
265  vtkVolume *vol);
266 
271  void AllocateUseSet(vtkIdType size);
272 
277  void AllocateVertices(vtkIdType size);
278 
282  void SavePixelListFrame();
283 
285 
290 
292 
293  // This is how big the image would be if it covered the entire viewport
294  int ImageViewportSize[2];
295 
296  // This is how big the allocated memory for image is. This may be bigger
297  // or smaller than ImageFullSize - it will be bigger if necessary to
298  // ensure a power of 2, it will be smaller if the volume only covers a
299  // small region of the viewport
300  int ImageMemorySize[2];
301 
302  // This is the size of subregion in ImageSize image that we are using for
303  // the current image. Since ImageSize is a power of 2, there is likely
304  // wasted space in it. This number will be used for things such as clearing
305  // the image if necessary.
306  int ImageInUseSize[2];
307 
308  // This is the location in ImageFullSize image where our ImageSize image
309  // is located.
310  int ImageOrigin[2];
311 
312  // This is the allocated image
313  unsigned char *Image;
314 
315  // This is the accumulating double RGBA image
317 
323 
325 
326  float *ZBuffer;
327  int ZBufferSize[2];
328  int ZBufferOrigin[2];
329 
332 
333  // if use CellScalars, we need to keep track of the
334  // values on each side of the face and figure out
335  // if the face is used by two cells (twosided) or one cell.
336  double FaceScalars[2];
337  int FaceSide;
338 
339  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkSpan *Span;
340  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkPixelListFrame *PixelListFrame;
341 
342  // Used by BuildUseSets().
344 
345  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkUseSet *UseSet;
346 
348  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertices *Vertices;
349 
352 
353  // Used by the main loop
355  int XBounds[2];
356  int YBounds[2];
357 
358  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkSimpleScreenEdge *SimpleEdge;
359  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkDoubleScreenEdge *DoubleEdge;
360 
363 
365 
366  // Used during compositing
370 
371  // Benchmark
373 
374 
375  vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkPixelListEntryMemory *MemoryManager;
376 
377 private:
379  void operator=(const vtkUnstructuredGridVolumeZSweepMapper&) = delete;
380 };
381 
382 #endif
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkSpan * Span
represents a volume (data & properties) in a rendered scene
Definition: vtkVolume.h:50
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:41
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkPixelListEntryMemory * MemoryManager
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkSimpleScreenEdge * SimpleEdge
record modification and/or execution time
Definition: vtkTimeStamp.h:35
abstract specification for renderers
Definition: vtkRenderer.h:63
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:60
int vtkIdType
Definition: vtkType.h:347
provides thread-safe access to cells
vtkUnstructuredGridVolumeRayIntegrator * RealRayIntegrator
helper class that draws the image to the screen
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkVertices * Vertices
dynamic, self-adjusting array of double
a list of ids arranged in priority order
a superclass for volume ray integration functions
int vtkTypeBool
Definition: vtkABI.h:69
abstract class to specify cell behavior
Definition: vtkCell.h:59
a simple class to control print indentation
Definition: vtkIndent.h:39
Abstract class for an unstructured grid volume mapper.
list of point or cell ids
Definition: vtkIdList.h:36
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:54
represents the common properties for rendering a volume.
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkPixelListFrame * PixelListFrame
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkUseSet * UseSet
create a window for renderers to draw into
Unstructured grid volume mapper based the ZSweep Algorithm.
vtkUnstructuredGridVolumeZSweepMapperNamespace::vtkDoubleScreenEdge * DoubleEdge
vtkUnstructuredGridVolumeRayIntegrator * RayIntegrator