VTK  9.7.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 #include "vtkWrappingHints.h" // For VTK_MARSHALAUTO
22 
23 #include <map> // for std::map
24 #include <vector> // for std::vector
25 
26 VTK_ABI_NAMESPACE_BEGIN
27 class vtkCallbackCommand;
28 class vtkCell;
29 class vtkPlane;
31 class vtkSelection;
32 class vtkSphereSource;
33 class vtkTextActor3D;
37 class vtkVRMenuWidget;
38 
39 class VTKRENDERINGVR_EXPORT VTK_MARSHALAUTO vtkVRInteractorStyle : public vtkInteractorStyle3D
40 {
41 public:
43  void PrintSelf(ostream& os, vtkIndent indent) override;
44 
46 
49  void OnSelect3D(vtkEventData* edata) override;
50  void OnNextPose3D(vtkEventData* edata) override;
51  void OnViewerMovement3D(vtkEventData* edata) override;
52  void OnMove3D(vtkEventData* edata) override;
53  void OnMenu3D(vtkEventData* edata) override;
54  void OnElevation3D(vtkEventData* edata) override;
56 
58 
61  virtual void StartPick(vtkEventDataDevice3D*);
62  virtual void EndPick(vtkEventDataDevice3D*);
63  virtual void StartLoadCamPose(vtkEventDataDevice3D*);
64  virtual void EndLoadCamPose(vtkEventDataDevice3D*);
65  virtual void StartPositionProp(vtkEventDataDevice3D*);
66  virtual void EndPositionProp(vtkEventDataDevice3D*);
67  virtual void StartClip(vtkEventDataDevice3D*);
68  virtual void EndClip(vtkEventDataDevice3D*);
69  virtual void StartMovement3D(int interactionState, vtkEventDataDevice3D*);
70  virtual void EndMovement3D(vtkEventDataDevice3D*);
72 
74 
77  void OnPan() override;
78  void OnPinch() override;
79  void OnRotate() override;
81 
83 
86  void ProbeData(vtkEventDataDevice controller);
87  void PositionProp(vtkEventData*, double* lwpos = nullptr, double* lwori = nullptr) override;
88  void Clip(vtkEventDataDevice3D*);
89  virtual void LoadNextCameraPose() = 0;
91 
96  void GroundMovement3D(vtkEventDataDevice3D*);
97 
102  void Elevation3D(vtkEventDataDevice3D*);
103 
107  void Teleportation3D(vtkEventDataDevice3D* edd);
108 
110 
115  void MapInputToAction(vtkCommand::EventIds eid, int state);
116  void MapInputToAction(vtkCommand::EventIds eid, vtkEventDataAction action, int state);
117  int GetMappedAction(
120 
124  void AddTooltipForInput(
125  vtkEventDataDevice device, vtkEventDataDeviceInput input, const std::string& text = {});
126 
130  virtual vtkVRControlsHelper* MakeControlsHelper() = 0;
131 
133 
138  vtkSetMacro(HoverPick, bool);
139  vtkGetMacro(HoverPick, bool);
140  vtkBooleanMacro(HoverPick, bool);
142 
144 
148  vtkSetMacro(GrabWithRay, bool);
149  vtkGetMacro(GrabWithRay, bool);
150  vtkBooleanMacro(GrabWithRay, bool);
152 
154  {
156  GROUNDED_STYLE
157  };
158 
160 
164  vtkSetMacro(Style, MovementStyle);
165  vtkGetMacro(Style, MovementStyle);
167 
174  {
175  int deviceIndex = static_cast<int>(device);
176  if (deviceIndex < 0 || deviceIndex >= vtkEventDataNumberOfDevices)
177  {
178  // Since VTKIS_*STATE* are expected to be >= VTKIS_NONE with VTKIS_NONE == 0,
179  // return -1 if device is invalid.
180  return -1;
181  }
182  return this->InteractionState[static_cast<int>(device)];
183  }
184 
192  void SetInteractionState(vtkEventDataDevice device, int state);
193 
195 
198  void ShowRay(vtkEventDataDevice controller);
199  void HideRay(vtkEventDataDevice controller);
201 
203 
206  void ShowBillboard(const std::string& text);
207  void HideBillboard();
209 
214  void ShowPickSphere(double* pos, double radius, vtkProp3D*);
215 
221  void ShowPickCell(vtkCell* cell, vtkProp3D*);
222 
226  void HidePickActor();
227 
229 
232  void ToggleDrawControls();
233  void SetDrawControls(bool);
235 
239  void SetInteractor(vtkRenderWindowInteractor* iren) override;
240 
244  virtual void SetupActions(vtkRenderWindowInteractor* iren) = 0;
245 
249  vtkVRMenuWidget* GetMenu() { return this->Menu.Get(); }
250 
251 protected:
253  ~vtkVRInteractorStyle() override;
254 
258  virtual void UpdateRay(vtkEventDataDevice controller);
259 
260  void EndPickCallback(vtkSelection* sel);
261  static void MenuCallback(
262  vtkObject* object, unsigned long event, void* clientdata, void* calldata);
263 
267  void StartAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
268  void EndAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
269 
273  bool HardwareSelect(vtkEventDataDevice controller, bool actorPassOnly);
274 
278  void Movement3D(int interactionState, vtkEventData* edata);
279 
280  bool HoverPick = false;
281  bool GrabWithRay = true;
282 
286 
291 
292  // Device input to interaction state mapping
293  std::map<std::tuple<vtkCommand::EventIds, vtkEventDataAction>, int> InputMap;
295 
296  // Store required controllers information when performing action
297  int InteractionState[vtkEventDataNumberOfDevices];
298  std::vector<vtkSmartPointer<vtkProp3D>> InteractionProps;
299  std::vector<vtkSmartPointer<vtkPlane>> ClippingPlanes;
300 
301  // Store headset world orientation
302  double HeadsetDir[3] = { 0, 0, 0 };
303 
304  // Store movement style
306 
307  // Interaction timers
310 
311  // Interaction trackpad position
312  double LastGroundMovementTrackPadPosition[2] = { 0, 0 };
313  double LastElevationTrackPadPosition[2] = { 0, 0 };
314 
315 private:
317  void operator=(const vtkVRInteractorStyle&) = delete;
318 };
319 
320 VTK_ABI_NAMESPACE_END
321 #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:52
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:39
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:50
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:31
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 *)
#define VTK_MARSHALAUTO
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)