VTK  9.3.1
vtkVRInteractorStyle.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
13 #ifndef vtkVRInteractorStyle_h
14 #define vtkVRInteractorStyle_h
15 
16 #include "vtkEventData.h" // for enums
17 #include "vtkInteractorStyle3D.h"
18 #include "vtkNew.h" // for vtkNew
19 #include "vtkRenderingVRModule.h" // For export macro
20 #include "vtkSmartPointer.h" // for vtkSmartPointer
21 
22 #include <map> // for std::map
23 #include <vector> // for std::vector
24 
25 VTK_ABI_NAMESPACE_BEGIN
26 class vtkCallbackCommand;
27 class vtkCell;
28 class vtkPlane;
30 class vtkSelection;
31 class vtkSphereSource;
32 class vtkTextActor3D;
36 class vtkVRMenuWidget;
37 
38 class VTKRENDERINGVR_EXPORT vtkVRInteractorStyle : public vtkInteractorStyle3D
39 {
40 public:
42  void PrintSelf(ostream& os, vtkIndent indent) override;
43 
45 
48  void OnSelect3D(vtkEventData* edata) override;
49  void OnNextPose3D(vtkEventData* edata) override;
50  void OnViewerMovement3D(vtkEventData* edata) override;
51  void OnMove3D(vtkEventData* edata) override;
52  void OnMenu3D(vtkEventData* edata) override;
53  void OnElevation3D(vtkEventData* edata) override;
55 
57 
60  void StartPick(vtkEventDataDevice3D*);
61  void EndPick(vtkEventDataDevice3D*);
62  void StartLoadCamPose(vtkEventDataDevice3D*);
63  void EndLoadCamPose(vtkEventDataDevice3D*);
64  void StartPositionProp(vtkEventDataDevice3D*);
65  void EndPositionProp(vtkEventDataDevice3D*);
66  void StartClip(vtkEventDataDevice3D*);
67  void EndClip(vtkEventDataDevice3D*);
68  void StartMovement3D(int interactionState, vtkEventDataDevice3D*);
69  void EndMovement3D(vtkEventDataDevice3D*);
71 
73 
76  void OnPan() override;
77  void OnPinch() override;
78  void OnRotate() override;
80 
82 
85  void ProbeData(vtkEventDataDevice controller);
86  void PositionProp(vtkEventData*, double* lwpos = nullptr, double* lwori = nullptr) override;
87  void Clip(vtkEventDataDevice3D*);
88  virtual void LoadNextCameraPose() = 0;
90 
95  void GroundMovement3D(vtkEventDataDevice3D*);
96 
101  void Elevation3D(vtkEventDataDevice3D*);
102 
104 
109  void MapInputToAction(vtkCommand::EventIds eid, int state);
110  void MapInputToAction(vtkCommand::EventIds eid, vtkEventDataAction action, int state);
112 
116  void AddTooltipForInput(
117  vtkEventDataDevice device, vtkEventDataDeviceInput input, const std::string& text = {});
118 
122  virtual vtkVRControlsHelper* MakeControlsHelper() = 0;
123 
125 
130  vtkSetMacro(HoverPick, bool);
131  vtkGetMacro(HoverPick, bool);
132  vtkBooleanMacro(HoverPick, bool);
134 
136 
140  vtkSetMacro(GrabWithRay, bool);
141  vtkGetMacro(GrabWithRay, bool);
142  vtkBooleanMacro(GrabWithRay, bool);
144 
146  {
148  GROUNDED_STYLE
149  };
150 
152 
156  vtkSetMacro(Style, MovementStyle);
157  vtkGetMacro(Style, MovementStyle);
159 
164  {
165  return this->InteractionState[static_cast<int>(device)];
166  }
167 
169 
172  void ShowRay(vtkEventDataDevice controller);
173  void HideRay(vtkEventDataDevice controller);
175 
177 
180  void ShowBillboard(const std::string& text);
181  void HideBillboard();
183 
188  void ShowPickSphere(double* pos, double radius, vtkProp3D*);
189 
195  void ShowPickCell(vtkCell* cell, vtkProp3D*);
196 
200  void HidePickActor();
201 
203 
206  void ToggleDrawControls();
207  void SetDrawControls(bool);
209 
213  void SetInteractor(vtkRenderWindowInteractor* iren) override;
214 
218  virtual void SetupActions(vtkRenderWindowInteractor* iren) = 0;
219 
223  vtkVRMenuWidget* GetMenu() { return this->Menu.Get(); }
224 
225 protected:
227  ~vtkVRInteractorStyle() override;
228 
232  void UpdateRay(vtkEventDataDevice controller);
233 
234  void EndPickCallback(vtkSelection* sel);
235  static void MenuCallback(
236  vtkObject* object, unsigned long event, void* clientdata, void* calldata);
237 
241  void StartAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
242  void EndAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
243 
247  bool HardwareSelect(vtkEventDataDevice controller, bool actorPassOnly);
248 
252  void Movement3D(int interactionState, vtkEventData* edata);
253 
254  bool HoverPick = false;
255  bool GrabWithRay = true;
256 
260 
265 
266  // Device input to interaction state mapping
267  std::map<std::tuple<vtkCommand::EventIds, vtkEventDataAction>, int> InputMap;
269 
270  // Store required controllers information when performing action
271  int InteractionState[vtkEventDataNumberOfDevices];
272  std::vector<vtkSmartPointer<vtkProp3D>> InteractionProps;
273  std::vector<vtkSmartPointer<vtkPlane>> ClippingPlanes;
274 
275  // Store headset world orientation
276  double HeadsetDir[3] = { 0, 0, 0 };
277 
278  // Store movement style
280 
281  // Interaction timers
284 
285  // Interaction trackpad position
286  double LastGroundMovementTrackPadPosition[2] = { 0, 0 };
287  double LastElevationTrackPadPosition[2] = { 0, 0 };
288 
289 private:
291  void operator=(const vtkVRInteractorStyle&) = delete;
292 };
293 
294 VTK_ABI_NAMESPACE_END
295 #endif
pick an actor/prop given a controller position and orientation
virtual void OnRotate()
vtkNew< vtkVRHardwarePicker > HardwarePicker
abstract base class for most VTK objects
Definition: vtkObject.h:51
vtkEventDataDeviceInput
Definition: vtkEventData.h:28
std::vector< vtkSmartPointer< vtkProp3D > > InteractionProps
vtkNew< vtkVRMenuWidget > Menu
void SetInteractor(vtkRenderWindowInteractor *interactor) override
Set/Get the Interactor wrapper being controlled by this object.
std::map< std::tuple< vtkCommand::EventIds, vtkEventDataAction >, int > InputMap
extends interaction to support 3D input
data object that represents a "selection" in VTK.
Definition: vtkSelection.h:49
represents an 3D object for placement in a rendered scene
Definition: vtkProp3D.h:38
int GetInteractionState(vtkEventDataDevice device)
Return interaction state for the specified device (dolly, pick, none, etc...).
const int vtkEventDataNumberOfDevices
Definition: vtkEventData.h:25
const int vtkEventDataNumberOfInputs
Definition: vtkEventData.h:40
platform-independent render window interaction including picking and frame rate control.
vtkEventDataAction
Definition: vtkEventData.h:43
abstract class to specify cell behavior
Definition: vtkCell.h:49
create a polygonal sphere centered at the origin
supports function callbacks
virtual void OnMove3D(vtkEventData *)
Generic 3D event bindings can be overridden in subclasses.
virtual void OnSelect3D(vtkEventData *)
a simple class to control print indentation
Definition: vtkIndent.h:28
Widget representation for vtkVRMenuWidget Implementation of the popup panel representation for the vt...
perform various plane computations
Definition: vtkPlane.h:25
3D widget to display a menu in VR
std::vector< vtkSmartPointer< vtkPlane > > ClippingPlanes
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:14
An actor that displays text.
vtkNew< vtkVRMenuRepresentation > MenuRepresentation
virtual void OnMenu3D(vtkEventData *)
vtkNew< vtkActor > PickActor
virtual void OnNextPose3D(vtkEventData *)
Extended from vtkInteractorStyle3D to override command methods.
vtkNew< vtkCallbackCommand > MenuCommand
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkNew< vtkSphereSource > Sphere
virtual void OnElevation3D(vtkEventData *)
vtkNew< vtkTextActor3D > TextActor3D
virtual void OnViewerMovement3D(vtkEventData *)
vtkNew< vtkTimerLog > LastGroundMovement3DEventTime
vtkVRMenuWidget * GetMenu()
Return the menu to allow the user to add options to it.
Tooltip helper explaining controls Helper class to draw one tooltip per button around the controller...
virtual void OnPinch()
vtkNew< vtkTimerLog > LastElevation3DEventTime
virtual void PositionProp(vtkEventData *, double *lwpos=nullptr, double *lwori=nullptr)