VTK  9.3.0
vtkWidgetRepresentation.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
46 #ifndef vtkWidgetRepresentation_h
47 #define vtkWidgetRepresentation_h
48 
49 #include "vtkInteractionWidgetsModule.h" // For export macro
50 #include "vtkNew.h" // for ivars
51 #include "vtkProp.h"
52 #include "vtkWeakPointer.h" // needed for vtkWeakPointer iVar.
53 
54 VTK_ABI_NAMESPACE_BEGIN
56 class vtkAbstractWidget;
57 class vtkMatrix4x4;
58 class vtkPickingManager;
59 class vtkProp3D;
61 class vtkRenderer;
62 class vtkTransform;
63 
64 class VTKINTERACTIONWIDGETS_EXPORT vtkWidgetRepresentation : public vtkProp
65 {
66 public:
68 
72  void PrintSelf(ostream& os, vtkIndent indent) override;
74 
76 
80  vtkBooleanMacro(PickingManaged, bool);
81  void SetPickingManaged(bool managed);
82  vtkGetMacro(PickingManaged, bool);
84 
86 
102  virtual void SetRenderer(vtkRenderer* ren);
104  virtual void BuildRepresentation() = 0;
106 
139  virtual void PlaceWidget(double vtkNotUsed(bounds)[6]);
140  virtual void StartWidgetInteraction(double eventPos[2]) { (void)eventPos; }
141  virtual void WidgetInteraction(double newEventPos[2]) { (void)newEventPos; }
142  virtual void EndWidgetInteraction(double newEventPos[2]) { (void)newEventPos; }
143  virtual int ComputeInteractionState(int X, int Y, int modify = 0);
144  virtual int GetInteractionState() { return this->InteractionState; }
145  virtual void Highlight(int vtkNotUsed(highlightOn)) {}
146 
148  // Widgets were originally designed to be driven by 2D mouse events
149  // With Virtual Reality and multitouch we get mnore complex events
150  // that may involve multiple pointers as well as 3D pointers and
151  // orientations. As such we provide pointers to the interactor
152  // widget and an event type so that representations can access the
153  // values they need.
155  vtkRenderWindowInteractor*, vtkAbstractWidget*, unsigned long /* event */, void* /*callData*/)
156  {
157  }
158  virtual void ComplexInteraction(
159  vtkRenderWindowInteractor*, vtkAbstractWidget*, unsigned long /* event */, void* /* callData */)
160  {
161  }
162  virtual void EndComplexInteraction(
163  vtkRenderWindowInteractor*, vtkAbstractWidget*, unsigned long /* event */, void* /* callData */)
164  {
165  }
167  vtkAbstractWidget* widget, unsigned long event, void* callData, int modify = 0);
169 
171 
178  vtkSetClampMacro(PlaceFactor, double, 0.01, VTK_DOUBLE_MAX);
179  vtkGetMacro(PlaceFactor, double);
181 
183 
192  vtkSetClampMacro(HandleSize, double, 0.001, 1000);
193  vtkGetMacro(HandleSize, double);
195 
197 
201  vtkGetMacro(NeedToRender, vtkTypeBool);
202  vtkSetClampMacro(NeedToRender, vtkTypeBool, 0, 1);
203  vtkBooleanMacro(NeedToRender, vtkTypeBool);
205 
213  double* GetBounds() VTK_SIZEHINT(6) override { return nullptr; }
214  void ShallowCopy(vtkProp* prop) override;
215  void GetActors(vtkPropCollection*) override {}
216  void GetActors2D(vtkPropCollection*) override {}
217  void GetVolumes(vtkPropCollection*) override {}
219  int RenderOverlay(vtkViewport* vtkNotUsed(viewport)) override { return 0; }
220  int RenderOpaqueGeometry(vtkViewport* vtkNotUsed(viewport)) override { return 0; }
221  int RenderTranslucentPolygonalGeometry(vtkViewport* vtkNotUsed(viewport)) override { return 0; }
222  int RenderVolumetricGeometry(vtkViewport* vtkNotUsed(viewport)) override { return 0; }
224 
230  virtual void RegisterPickers();
231 
235  virtual void UnRegisterPickers();
236 
238 
241  enum Axis
242  {
243  NONE = -1,
244  XAxis = 0,
245  YAxis = 1,
246  ZAxis = 2,
247  Custom = 3
248  };
250 
251 protected:
254 
255  // The renderer in which this widget is placed
257 
258  // The state of this representation based on a recent event
260 
261  // These are used to track the beginning of interaction with the representation
262  // It's dimensioned [3] because some events re processed in 3D.
263  double StartEventPosition[3];
264 
265  // Instance variable and members supporting suclasses
266  double PlaceFactor; // Used to control how widget is placed around bounding box
267  int Placed; // Indicate whether widget has been placed
268  void AdjustBounds(double bounds[6], double newBounds[6], double center[3]);
269  double InitialBounds[6]; // initial bounds on place widget (valid after PlaceWidget)
270  double InitialLength; // initial length on place widget
271 
272  // Sizing handles is tricky because the procedure requires information
273  // relative to the last pick, as well as a live renderer to perform
274  // coordinate conversions. In some cases, a pick is never made so handle
275  // sizing has to follow a different path. The following ivars help with
276  // this process.
277  int ValidPick; // indicate when valid picks are made
278 
279  // This variable controls whether the picking is managed by the Picking
280  // Manager or not. True by default.
282 
288 
294  vtkAssemblyPath* GetAssemblyPath(double X, double Y, double Z, vtkAbstractPropPicker* picker);
296 
297  // Helper function to cull events if they are not near to the actual widget
298  // representation. This is needed typically in situations of extreme zoom
299  // for 3D widgets. The current event position, and 3D bounds of the widget
300  // are provided.
301  bool NearbyEvent(int X, int Y, double bounds[6]);
302 
303  // Members use to control handle size. The two methods return a "radius"
304  // in world coordinates. Note that the HandleSize data member is used
305  // internal to the SizeHandles__() methods.
306  double HandleSize; // controlling relative size of widget handles
307  double SizeHandlesRelativeToViewport(double factor, double pos[3]);
308  double SizeHandlesInPixels(double factor, double pos[3]);
309 
310  // Try and reduce multiple renders
312 
313  // This is the time that the representation was built. This data member
314  // can be used to reduce the time spent building the widget.
316 
317  // update the pose of a prop based on two sets of
318  // position, orientation vectors
319  void UpdatePropPose(vtkProp3D* prop, const double* pos1, const double* orient1,
320  const double* pos2, const double* orient2);
323 
324 private:
326  void operator=(const vtkWidgetRepresentation&) = delete;
327 };
328 
329 VTK_ABI_NAMESPACE_END
330 #endif
abstract API for pickers that can pick an instance of vtkProp
define the API for widget / widget representation
a list of nodes that form an assembly path
a simple class to control print indentation
Definition: vtkIndent.h:29
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:31
Class defines API to manage the picking process.
represents an 3D object for placement in a rendered scene
Definition: vtkProp3D.h:39
an ordered list of Props
abstract superclass for all actors, volumes and annotations
Definition: vtkProp.h:46
platform-independent render window interaction including picking and frame rate control.
abstract specification for renderers
Definition: vtkRenderer.h:62
record modification and/or execution time
Definition: vtkTimeStamp.h:25
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:50
abstract specification for Viewports
Definition: vtkViewport.h:45
abstract class defines interface between the widget and widget representation classes
bool NearbyEvent(int X, int Y, double bounds[6])
vtkAssemblyPath * GetAssemblyPath3DPoint(double pos[3], vtkAbstractPropPicker *picker)
void AdjustBounds(double bounds[6], double newBounds[6], double center[3])
virtual void StartComplexInteraction(vtkRenderWindowInteractor *, vtkAbstractWidget *, unsigned long, void *)
virtual int ComputeComplexInteractionState(vtkRenderWindowInteractor *iren, vtkAbstractWidget *widget, unsigned long event, void *callData, int modify=0)
int RenderOpaqueGeometry(vtkViewport *vtkNotUsed(viewport)) override
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods for instances of this class.
virtual void EndComplexInteraction(vtkRenderWindowInteractor *, vtkAbstractWidget *, unsigned long, void *)
vtkTypeBool HasTranslucentPolygonalGeometry() override
WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE DO NOT USE THESE METHODS OUTSIDE OF THE RENDE...
double * GetBounds() override
Methods to make this class behave as a vtkProp.
void GetVolumes(vtkPropCollection *) override
vtkNew< vtkTransform > TempTransform
virtual void UnRegisterPickers()
Unregister internal pickers from the Picking Manager.
vtkAssemblyPath * GetAssemblyPath(double X, double Y, double Z, vtkAbstractPropPicker *picker)
Proceed to a pick, whether through the PickingManager if the picking is managed or directly using the...
virtual void Highlight(int vtkNotUsed(highlightOn))
virtual void SetRenderer(vtkRenderer *ren)
Subclasses of vtkWidgetRepresentation must implement these methods.
void ShallowCopy(vtkProp *prop) override
Shallow copy of this vtkProp.
vtkWeakPointer< vtkRenderer > Renderer
~vtkWidgetRepresentation() override
virtual void WidgetInteraction(double newEventPos[2])
void ReleaseGraphicsResources(vtkWindow *) override
WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE Release any graphics resources that are being...
virtual void ComplexInteraction(vtkRenderWindowInteractor *, vtkAbstractWidget *, unsigned long, void *)
virtual void EndWidgetInteraction(double newEventPos[2])
virtual void RegisterPickers()
Register internal Pickers in the Picking Manager.
double SizeHandlesRelativeToViewport(double factor, double pos[3])
virtual vtkRenderer * GetRenderer()
Subclasses of vtkWidgetRepresentation must implement these methods.
virtual void StartWidgetInteraction(double eventPos[2])
void UpdatePropPose(vtkProp3D *prop, const double *pos1, const double *orient1, const double *pos2, const double *orient2)
vtkNew< vtkMatrix4x4 > TempMatrix
virtual void BuildRepresentation()=0
Subclasses of vtkWidgetRepresentation must implement these methods.
vtkPickingManager * GetPickingManager()
Return the picking manager associated on the context on which the widget representation currently bel...
void SetPickingManaged(bool managed)
Enable/Disable the use of a manager to process the picking.
virtual int ComputeInteractionState(int X, int Y, int modify=0)
int RenderTranslucentPolygonalGeometry(vtkViewport *vtkNotUsed(viewport)) override
void GetActors(vtkPropCollection *) override
For some exporters and other other operations we must be able to collect all the actors or volumes.
virtual void PlaceWidget(double vtkNotUsed(bounds)[6])
The following is a suggested API for widget representations.
void GetActors2D(vtkPropCollection *) override
int RenderVolumetricGeometry(vtkViewport *vtkNotUsed(viewport)) override
double SizeHandlesInPixels(double factor, double pos[3])
int RenderOverlay(vtkViewport *vtkNotUsed(viewport)) override
window superclass for vtkRenderWindow
Definition: vtkWindow.h:28
@ center
Definition: vtkX3D.h:230
int vtkTypeBool
Definition: vtkABI.h:64
#define VTK_DOUBLE_MAX
Definition: vtkType.h:154
#define VTK_SIZEHINT(...)