You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.4 KiB
C++
175 lines
5.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkSelectVisiblePoints.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkSelectVisiblePoints
|
|
* @brief extract points that are visible (based on z-buffer calculation)
|
|
*
|
|
* vtkSelectVisiblePoints is a filter that selects points based on
|
|
* whether they are visible or not. Visibility is determined by
|
|
* accessing the z-buffer of a rendering window. (The position of each
|
|
* input point is converted into display coordinates, and then the
|
|
* z-value at that point is obtained. If within the user-specified
|
|
* tolerance, the point is considered visible.)
|
|
*
|
|
* Points that are visible (or if the ivar SelectInvisible is on,
|
|
* invisible points) are passed to the output. Associated data
|
|
* attributes are passed to the output as well.
|
|
*
|
|
* This filter also allows you to specify a rectangular window in display
|
|
* (pixel) coordinates in which the visible points must lie. This can be
|
|
* used as a sort of local "brushing" operation to select just data within
|
|
* a window.
|
|
*
|
|
*
|
|
* @warning
|
|
* You must carefully synchronize the execution of this filter. The
|
|
* filter refers to a renderer, which is modified every time a render
|
|
* occurs. Therefore, the filter is always out of date, and always
|
|
* executes. You may have to perform two rendering passes, or if you
|
|
* are using this filter in conjunction with vtkLabeledDataMapper,
|
|
* things work out because 2D rendering occurs after the 3D rendering.
|
|
*/
|
|
|
|
#ifndef vtkSelectVisiblePoints_h
|
|
#define vtkSelectVisiblePoints_h
|
|
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
#include "vtkRenderingCoreModule.h" // For export macro
|
|
|
|
class vtkRenderer;
|
|
class vtkMatrix4x4;
|
|
|
|
class VTKRENDERINGCORE_EXPORT vtkSelectVisiblePoints : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkSelectVisiblePoints, vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Instantiate object with no renderer; window selection turned off;
|
|
* tolerance set to 0.01; and select invisible off.
|
|
*/
|
|
static vtkSelectVisiblePoints* New();
|
|
|
|
//@{
|
|
/**
|
|
* Specify the renderer in which the visibility computation is to be
|
|
* performed.
|
|
*/
|
|
void SetRenderer(vtkRenderer* ren)
|
|
{
|
|
if (this->Renderer != ren)
|
|
{
|
|
this->Renderer = ren;
|
|
this->Modified();
|
|
}
|
|
}
|
|
vtkRenderer* GetRenderer() { return this->Renderer; }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the flag which enables selection in a rectangular display
|
|
* region.
|
|
*/
|
|
vtkSetMacro(SelectionWindow, vtkTypeBool);
|
|
vtkGetMacro(SelectionWindow, vtkTypeBool);
|
|
vtkBooleanMacro(SelectionWindow, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify the selection window in display coordinates. You must specify
|
|
* a rectangular region using (xmin,xmax,ymin,ymax).
|
|
*/
|
|
vtkSetVector4Macro(Selection, int);
|
|
vtkGetVectorMacro(Selection, int, 4);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the flag which enables inverse selection; i.e., invisible points
|
|
* are selected.
|
|
*/
|
|
vtkSetMacro(SelectInvisible, vtkTypeBool);
|
|
vtkGetMacro(SelectInvisible, vtkTypeBool);
|
|
vtkBooleanMacro(SelectInvisible, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get a tolerance in normalized display coordinate system
|
|
* to use to determine whether a point is visible. A
|
|
* tolerance is usually required because the conversion from world space
|
|
* to display space during rendering introduces numerical round-off.
|
|
*/
|
|
vtkSetClampMacro(Tolerance, double, 0.0, VTK_DOUBLE_MAX);
|
|
vtkGetMacro(Tolerance, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get a tolerance in world coordinate system
|
|
* to use to determine whether a point is visible.
|
|
* This allows determining visibility of small spheroid objects
|
|
* (such as glyphs) with known size in world coordinates.
|
|
* By default it is set to 0.
|
|
*/
|
|
vtkSetClampMacro(ToleranceWorld, double, 0.0, VTK_DOUBLE_MAX);
|
|
vtkGetMacro(ToleranceWorld, double);
|
|
//@}
|
|
|
|
/**
|
|
* Requires the renderer to be set. Populates the composite perspective transform
|
|
* and returns a pointer to the Z-buffer (that must be deleted) if getZbuff is set.
|
|
*/
|
|
float* Initialize(bool getZbuff);
|
|
|
|
/**
|
|
* Tests if a point x is being occluded or not against the Z-Buffer array passed in by
|
|
* zPtr. Call Initialize before calling this method.
|
|
*/
|
|
bool IsPointOccluded(const double x[3], const float* zPtr);
|
|
|
|
/**
|
|
* Return MTime also considering the renderer.
|
|
*/
|
|
vtkMTimeType GetMTime() override;
|
|
|
|
protected:
|
|
vtkSelectVisiblePoints();
|
|
~vtkSelectVisiblePoints() override;
|
|
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
|
|
|
vtkRenderer* Renderer;
|
|
vtkMatrix4x4* CompositePerspectiveTransform;
|
|
|
|
vtkTypeBool SelectionWindow;
|
|
int Selection[4];
|
|
int InternalSelection[4];
|
|
vtkTypeBool SelectInvisible;
|
|
double DirectionOfProjection[3];
|
|
double Tolerance;
|
|
double ToleranceWorld;
|
|
|
|
private:
|
|
vtkSelectVisiblePoints(const vtkSelectVisiblePoints&) = delete;
|
|
void operator=(const vtkSelectVisiblePoints&) = delete;
|
|
};
|
|
|
|
#endif
|