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
188 lines
6.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|