VTK  9.3.20240418
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 
61  virtual void EndPick(vtkEventDataDevice3D*);
67  virtual void EndClip(vtkEventDataDevice3D*);
68  virtual void StartMovement3D(int interactionState, 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;
88  virtual void LoadNextCameraPose() = 0;
90 
96 
102 
107 
109 
119 
124  vtkEventDataDevice device, vtkEventDataDeviceInput input, const std::string& text = {});
125 
130 
132 
137  vtkSetMacro(HoverPick, bool);
138  vtkGetMacro(HoverPick, bool);
139  vtkBooleanMacro(HoverPick, bool);
141 
143 
147  vtkSetMacro(GrabWithRay, bool);
148  vtkGetMacro(GrabWithRay, bool);
149  vtkBooleanMacro(GrabWithRay, bool);
151 
153  {
155  GROUNDED_STYLE
156  };
157 
159 
163  vtkSetMacro(Style, MovementStyle);
164  vtkGetMacro(Style, MovementStyle);
166 
173  {
174  int deviceIndex = static_cast<int>(device);
175  if (deviceIndex < 0 || deviceIndex >= vtkEventDataNumberOfDevices)
176  {
177  // Since VTKIS_*STATE* are expected to be >= VTKIS_NONE with VTKIS_NONE == 0,
178  // return -1 if device is invalid.
179  return -1;
180  }
181  return this->InteractionState[static_cast<int>(device)];
182  }
183 
191  void SetInteractionState(vtkEventDataDevice device, int state);
192 
194 
197  void ShowRay(vtkEventDataDevice controller);
198  void HideRay(vtkEventDataDevice controller);
200 
202 
205  void ShowBillboard(const std::string& text);
208 
213  void ShowPickSphere(double* pos, double radius, vtkProp3D*);
214 
221 
226 
228 
232  void SetDrawControls(bool);
234 
239 
243  virtual void SetupActions(vtkRenderWindowInteractor* iren) = 0;
244 
248  vtkVRMenuWidget* GetMenu() { return this->Menu.Get(); }
249 
250 protected:
253 
257  virtual void UpdateRay(vtkEventDataDevice controller);
258 
260  static void MenuCallback(
261  vtkObject* object, unsigned long event, void* clientdata, void* calldata);
262 
266  void StartAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
267  void EndAction(int VTKIS_STATE, vtkEventDataDevice3D* edata);
268 
272  bool HardwareSelect(vtkEventDataDevice controller, bool actorPassOnly);
273 
277  void Movement3D(int interactionState, vtkEventData* edata);
278 
279  bool HoverPick = false;
280  bool GrabWithRay = true;
281 
285 
290 
291  // Device input to interaction state mapping
292  std::map<std::tuple<vtkCommand::EventIds, vtkEventDataAction>, int> InputMap;
294 
295  // Store required controllers information when performing action
296  int InteractionState[vtkEventDataNumberOfDevices];
297  std::vector<vtkSmartPointer<vtkProp3D>> InteractionProps;
298  std::vector<vtkSmartPointer<vtkPlane>> ClippingPlanes;
299 
300  // Store headset world orientation
301  double HeadsetDir[3] = { 0, 0, 0 };
302 
303  // Store movement style
305 
306  // Interaction timers
309 
310  // Interaction trackpad position
311  double LastGroundMovementTrackPadPosition[2] = { 0, 0 };
312  double LastElevationTrackPadPosition[2] = { 0, 0 };
313 
314 private:
316  void operator=(const vtkVRInteractorStyle&) = delete;
317 };
318 
319 VTK_ABI_NAMESPACE_END
320 #endif
supports function callbacks
abstract class to specify cell behavior
Definition: vtkCell.h:130
a simple class to control print indentation
Definition: vtkIndent.h:108
extends interaction to support 3D input
abstract base class for most VTK objects
Definition: vtkObject.h:162
perform various plane computations
Definition: vtkPlane.h:135
represents an 3D object for placement in a rendered scene
Definition: vtkProp3D.h:89
platform-independent render window interaction including picking and frame rate control.
data object that represents a "selection" in VTK.
Definition: vtkSelection.h:159
create a polygonal sphere centered at the origin
An actor that displays text.
Tooltip helper explaining controls Helper class to draw one tooltip per button around the controller.
pick an actor/prop given a controller position and orientation
Extended from vtkInteractorStyle3D to override command methods.
void ShowPickSphere(double *pos, double radius, vtkProp3D *)
Make the pick actor a sphere of given radius centered at given position, and show it.
void PositionProp(vtkEventData *, double *lwpos=nullptr, double *lwori=nullptr) override
Methods for interaction.
void ProbeData(vtkEventDataDevice controller)
Methods for interaction.
vtkVRMenuWidget * GetMenu()
Return the menu to allow the user to add options to it.
virtual void SetupActions(vtkRenderWindowInteractor *iren)=0
Setup default actions defined with an action path and a corresponding command.
std::vector< vtkSmartPointer< vtkPlane > > ClippingPlanes
vtkNew< vtkTextActor3D > TextActor3D
void Clip(vtkEventDataDevice3D *)
Methods for interaction.
virtual void EndMovement3D(vtkEventDataDevice3D *)
Interaction mode entry points.
virtual void StartPick(vtkEventDataDevice3D *)
Interaction mode entry points.
void ShowBillboard(const std::string &text)
Show/hide billboard with given text string.
void SetDrawControls(bool)
Control visibility of descriptive tooltips for controller/HMD models.
void OnNextPose3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
void EndAction(int VTKIS_STATE, vtkEventDataDevice3D *edata)
void OnSelect3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
vtkNew< vtkCallbackCommand > MenuCommand
void Movement3D(int interactionState, vtkEventData *edata)
Update the 3D movement according to the given interaction state.
bool HardwareSelect(vtkEventDataDevice controller, bool actorPassOnly)
Pick using hardware selector.
void HidePickActor()
Hide the pick actor (sphere or polydata).
virtual void StartMovement3D(int interactionState, vtkEventDataDevice3D *)
Interaction mode entry points.
int GetInteractionState(vtkEventDataDevice device)
Return interaction state for the specified device (dolly, pick, none, etc...).
virtual void StartLoadCamPose(vtkEventDataDevice3D *)
Interaction mode entry points.
void OnMenu3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
void OnPinch() override
Complex gesture events binding.
void StartAction(int VTKIS_STATE, vtkEventDataDevice3D *edata)
Utility routines.
vtkNew< vtkTimerLog > LastGroundMovement3DEventTime
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void AddTooltipForInput(vtkEventDataDevice device, vtkEventDataDeviceInput input, const std::string &text={})
Define the helper text that goes with an input.
void OnElevation3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
vtkNew< vtkTimerLog > LastElevation3DEventTime
void Teleportation3D(vtkEventDataDevice3D *edd)
Instant movement to the picked point.
void EndPickCallback(vtkSelection *sel)
void MapInputToAction(vtkCommand::EventIds eid, vtkEventDataAction action, int state)
Map controller inputs to actions.
vtkNew< vtkVRMenuRepresentation > MenuRepresentation
void SetInteractor(vtkRenderWindowInteractor *iren) override
Set the Interactor wrapper being controlled by this object.
vtkNew< vtkVRHardwarePicker > HardwarePicker
void HideBillboard()
Show/hide billboard with given text string.
void ShowRay(vtkEventDataDevice controller)
Show/hide the ray for the specified controller.
~vtkVRInteractorStyle() override
virtual void EndPositionProp(vtkEventDataDevice3D *)
Interaction mode entry points.
static void MenuCallback(vtkObject *object, unsigned long event, void *clientdata, void *calldata)
virtual void EndLoadCamPose(vtkEventDataDevice3D *)
Interaction mode entry points.
int GetMappedAction(vtkCommand::EventIds eid, vtkEventDataAction action=vtkEventDataAction::Press)
Map controller inputs to actions.
vtkNew< vtkVRMenuWidget > Menu
virtual void UpdateRay(vtkEventDataDevice controller)
Update and draw the ray.
void OnViewerMovement3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
void HideRay(vtkEventDataDevice controller)
Show/hide the ray for the specified controller.
virtual void EndPick(vtkEventDataDevice3D *)
Interaction mode entry points.
std::map< std::tuple< vtkCommand::EventIds, vtkEventDataAction >, int > InputMap
void ShowPickCell(vtkCell *cell, vtkProp3D *)
Make the pick actor a polydata built from the points and edges of the given cell, and show it.
void OnRotate() override
Complex gesture events binding.
void OnPan() override
Complex gesture events binding.
void SetInteractionState(vtkEventDataDevice device, int state)
Set interaction state for the specified device (dolly, pick, none, etc...).
void OnMove3D(vtkEventData *edata) override
Override generic event bindings to call the corresponding action.
vtkNew< vtkActor > PickActor
std::vector< vtkSmartPointer< vtkProp3D > > InteractionProps
virtual void LoadNextCameraPose()=0
Methods for interaction.
void ToggleDrawControls()
Control visibility of descriptive tooltips for controller/HMD models.
void GroundMovement3D(vtkEventDataDevice3D *)
Move the camera on the "XY" plan (ground) using the thumbstick/trackpad position (up/down and left/ri...
virtual void StartPositionProp(vtkEventDataDevice3D *)
Interaction mode entry points.
void MapInputToAction(vtkCommand::EventIds eid, int state)
Map controller inputs to actions.
void Elevation3D(vtkEventDataDevice3D *)
Move the camera following the "Z" axis (elevation) using the thumbstick/trackpad position (up/down).
virtual vtkVRControlsHelper * MakeControlsHelper()=0
Creates a new ControlsHelper suitable for use with the child class.
virtual void EndClip(vtkEventDataDevice3D *)
Interaction mode entry points.
virtual void StartClip(vtkEventDataDevice3D *)
Interaction mode entry points.
vtkNew< vtkSphereSource > Sphere
Widget representation for vtkVRMenuWidget Implementation of the popup panel representation for the vt...
3D widget to display a menu in VR
@ radius
Definition: vtkX3D.h:252
@ string
Definition: vtkX3D.h:490
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:15
const int vtkEventDataNumberOfDevices
Definition: vtkEventData.h:25
vtkEventDataAction
Definition: vtkEventData.h:44
vtkEventDataDeviceInput
Definition: vtkEventData.h:29
const int vtkEventDataNumberOfInputs
Definition: vtkEventData.h:40