VTK  9.4.20250211
vtkOpenXRRenderWindowInteractor.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
35#ifndef vtkOpenXRRenderWindowInteractor_h
36#define vtkOpenXRRenderWindowInteractor_h
37
38#include "vtkRenderingOpenXRModule.h" // For export macro
40
41#include "vtkEventData.h" // for ivar
42#include "vtkOpenXRManager.h" //for types
43
44#include <functional> // for std::function
45#include <map> // for std::map
46
48
49VTK_ABI_NAMESPACE_BEGIN
50class VTKRENDERINGOPENXR_EXPORT vtkOpenXRRenderWindowInteractor : public vtkVRRenderWindowInteractor
51{
52public:
55
59 void Initialize() override;
60
61 void DoOneEvent(vtkVRRenderWindow* renWin, vtkRenderer* ren) override;
62
68 XrPosef* GetHandPose(uint32_t hand);
69
71
75 void AddAction(const std::string& path, const vtkCommand::EventIds&);
76 void AddAction(const std::string& path, const std::function<void(vtkEventData*)>&);
78
80
88 void AddAction(const std::string& path, const vtkCommand::EventIds&, bool isAnalog) override;
90 const std::string& path, bool isAnalog, const std::function<void(vtkEventData*)>&) override;
92
93 void ConvertOpenXRPoseToWorldCoordinates(const XrPosef& xrPose,
94 double pos[3], // Output world position
95 double wxyz[4], // Output world orientation quaternion
96 double ppos[3], // Output physical position
97 double wdir[3]); // Output world view direction (-Z)
98
104 bool ApplyVibration(const std::string& actionName, int hand, float amplitude = 0.5,
105 float duration = 25000000.0, float frequency = XR_FREQUENCY_UNSPECIFIED);
106
107protected:
114
116 void PrintSelf(ostream& os, vtkIndent indent) override;
117
122
128
129 struct ActionData;
130
131 XrActionType GetActionTypeFromString(const std::string& type);
132 bool LoadActions(const std::string& actionFilename);
133 bool LoadDefaultBinding(const std::string& bindingFilename);
134 ActionData* GetActionDataFromName(const std::string& actionName);
135
136 void HandleAction(const ActionData& actionData, int hand, vtkEventDataDevice3D* ed);
137 void HandleBooleanAction(const ActionData& actionData, int hand, vtkEventDataDevice3D* ed);
138 void HandlePoseAction(const ActionData& actionData, int hand, vtkEventDataDevice3D* ed);
139 void HandleVector2fAction(const ActionData& actionData, int hand, vtkEventDataDevice3D* ed);
140 void ApplyAction(const ActionData& actionData, vtkEventDataDevice3D* ed);
141
143 {
144 std::string Name;
145
147
148 // This structure is defined in vtkOpenXRManager
149 // And hold OpenXR related data
150 Action_t ActionStruct{ XR_NULL_HANDLE };
151
153 std::function<void(vtkEventData*)> Function;
154 bool UseFunction = false;
155 };
156
157 using MapAction = std::map<std::string, ActionData*>;
159
161
162private:
164 void operator=(const vtkOpenXRRenderWindowInteractor&) = delete;
165};
166
167VTK_ABI_NAMESPACE_END
168#endif
169// VTK-HeaderTest-Exclude: vtkOpenXRRenderWindowInteractor.h
a simple class to control print indentation
Definition vtkIndent.h:108
Allocate and hold a VTK object.
Definition vtkNew.h:167
implements OpenXR specific functions required by vtkRenderWindowInteractor.
void AddAction(const std::string &path, bool isAnalog, const std::function< void(vtkEventData *)> &) override
Assign an event or std::function to an event path.
void HandlePoseAction(const ActionData &actionData, int hand, vtkEventDataDevice3D *ed)
void ProcessXrEvents()
Process OpenXR specific events.
void DoOneEvent(vtkVRRenderWindow *renWin, vtkRenderer *ren) override
Implements the event loop.
void AddAction(const std::string &path, const std::function< void(vtkEventData *)> &)
Assign an event or std::function to an event path.
void AddAction(const std::string &path, const vtkCommand::EventIds &)
Assign an event or std::function to an event path.
ActionData * GetActionDataFromName(const std::string &actionName)
bool LoadDefaultBinding(const std::string &bindingFilename)
XrActionType GetActionTypeFromString(const std::string &type)
void ApplyAction(const ActionData &actionData, vtkEventDataDevice3D *ed)
void PollXrActions()
Update the action states using the OpenXRManager and handle all actions.
std::map< std::string, ActionData * > MapAction
void HandleBooleanAction(const ActionData &actionData, int hand, vtkEventDataDevice3D *ed)
bool ApplyVibration(const std::string &actionName, int hand, float amplitude=0.5, float duration=25000000.0, float frequency=XR_FREQUENCY_UNSPECIFIED)
Apply haptic vibration using the provided action action to emit vibration on hand to emit on amplitud...
void AddAction(const std::string &path, const vtkCommand::EventIds &, bool isAnalog) override
Assign an event or std::function to an event path.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void ConvertOpenXRPoseToWorldCoordinates(const XrPosef &xrPose, double pos[3], double wxyz[4], double ppos[3], double wdir[3])
void HandleAction(const ActionData &actionData, int hand, vtkEventDataDevice3D *ed)
XrPosef * GetHandPose(uint32_t hand)
Return the XrPosef for the action named "handpose" and the hand hand or return nullptr if "handpose" ...
static vtkOpenXRRenderWindowInteractor * New()
void Initialize() override
Initialize the event handler.
bool LoadActions(const std::string &actionFilename)
vtkOpenXRRenderWindowInteractor()
Create and set the openxr style on this Set ActionManifestFileName to vtk_openxr_actions....
void HandleVector2fAction(const ActionData &actionData, int hand, vtkEventDataDevice3D *ed)
abstract specification for renderers
Implements VR specific functions required by vtkRenderWindowInteractor.
VR rendering window.
vtkEventDataDeviceInput
vtkOpenXRManager::Action_t Action_t