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.

188 lines
6.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkAbstractPicker.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 vtkAbstractPicker
* @brief define API for picking subclasses
*
* vtkAbstractPicker is an abstract superclass that defines a minimal API
* for its concrete subclasses. The minimum functionality of a picker is
* to return the x-y-z global coordinate position of a pick (the pick
* itself is defined in display coordinates).
*
* The API to this class is to invoke the Pick() method with a selection
* point (in display coordinates - pixels) and a renderer. Then get the
* resulting pick position in global coordinates with the GetPickPosition()
* method.
*
* vtkPicker fires events during the picking process. These
* events are StartPickEvent, PickEvent, and EndPickEvent which are
* invoked prior to picking, when something is picked, and after all picking
* candidates have been tested. Note that during the pick process the
* PickEvent of vtkProp (and its subclasses such as vtkActor) is fired
* prior to the PickEvent of vtkPicker.
*
* @warning
* vtkAbstractPicker and its subclasses will not pick props that are
* "unpickable" (see vtkProp) or are fully transparent (if transparency
* is a property of the vtkProp).
*
* @warning
* There are two classes of pickers: those that pick using geometric methods
* (typically a ray cast); and those that use rendering hardware. Geometric
* methods return more information but are slower. Hardware methods are much
* faster and return minimal information. Examples of geometric pickers
* include vtkPicker, vtkCellPicker, and vtkPointPicker. Examples of hardware
* pickers include vtkWorldPointPicker and vtkPropPicker.
*
* @sa
* vtkPropPicker uses hardware acceleration to pick an instance of vtkProp.
* (This means that 2D and 3D props can be picked, and it's relatively fast.)
* If you need to pick cells or points, you might wish to use vtkCellPicker
* or vtkPointPicker. vtkWorldPointPicker is the fastest picker, returning
* an x-y-z coordinate value using the hardware z-buffer. vtkPicker can be
* used to pick the bounding box of 3D props.
*/
#ifndef vtkAbstractPicker_h
#define vtkAbstractPicker_h
#include "vtkObject.h"
#include "vtkRenderingCoreModule.h" // For export macro
class vtkRenderer;
class vtkProp;
class vtkPropCollection;
class VTKRENDERINGCORE_EXPORT vtkAbstractPicker : public vtkObject
{
public:
vtkTypeMacro(vtkAbstractPicker, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Get the renderer in which pick event occurred.
*/
vtkGetObjectMacro(Renderer, vtkRenderer);
//@}
//@{
/**
* Get the selection point in screen (pixel) coordinates. The third
* value is related to z-buffer depth. (Normally should be =0.)
*/
vtkGetVectorMacro(SelectionPoint, double, 3);
//@}
//@{
/**
* Return position in global coordinates of pick point.
*/
vtkGetVectorMacro(PickPosition, double, 3);
//@}
/**
* Perform pick operation with selection point provided. Normally the
* first two values for the selection point are x-y pixel coordinate, and
* the third value is =0. Return non-zero if something was successfully
* picked.
*/
virtual int Pick(
double selectionX, double selectionY, double selectionZ, vtkRenderer* renderer) = 0;
/**
* provided. Normally the first two values for the selection point
* are x-y pixel coordinate, and the third value is =0. Return
* non-zero if something was successfully picked.
*/
int Pick(double selectionPt[3], vtkRenderer* ren)
{
return this->Pick(selectionPt[0], selectionPt[1], selectionPt[2], ren);
}
/**
* Perform pick operation with selection point provided. The
* selectionPt is in world coordinates.
* Return non-zero if something was successfully picked.
*/
virtual int Pick3DPoint(double /* selectionPt */[3], vtkRenderer* /*ren*/)
{
vtkErrorMacro("Pick3DPoint called without implementation");
return 0;
}
/**
* Perform pick operation with selection point and orientation provided.
* The selectionPt is in world coordinates.
* Return non-zero if something was successfully picked.
*/
virtual int Pick3DRay(double /* selectionPt */[3], double /* orient */[4], vtkRenderer* /*ren*/)
{
vtkErrorMacro("Pick3DRay called without implementation");
return 0;
}
//@{
/**
* Use these methods to control whether to limit the picking to this list
* (rather than renderer's actors). Make sure that the pick list contains
* actors that referred to by the picker's renderer.
*/
vtkSetMacro(PickFromList, vtkTypeBool);
vtkGetMacro(PickFromList, vtkTypeBool);
vtkBooleanMacro(PickFromList, vtkTypeBool);
//@}
/**
* Initialize list of actors in pick list.
*/
void InitializePickList();
/**
* Add an actor to the pick list.
*/
void AddPickList(vtkProp*);
/**
* Delete an actor from the pick list.
*/
void DeletePickList(vtkProp*);
/**
* Return the list of actors in the PickList.
*/
vtkPropCollection* GetPickList() { return this->PickList; }
protected:
vtkAbstractPicker();
~vtkAbstractPicker() override;
virtual void Initialize();
vtkRenderer* Renderer; // pick occurred in this renderer's viewport
double SelectionPoint[3]; // selection point in window (pixel) coordinates
double PickPosition[3]; // selection point in world coordinates
// use the following to control picking from a list
vtkTypeBool PickFromList;
vtkPropCollection* PickList;
private:
vtkAbstractPicker(const vtkAbstractPicker&) = delete;
void operator=(const vtkAbstractPicker&) = delete;
};
#endif