cgv
vr_server.h
1 #pragma once
2 
3 #include <cgv/gui/key_event.h>
4 #include <cgv/gui/throttle_event.h>
5 #include <cgv/gui/stick_event.h>
6 #include <cgv/gui/pose_event.h>
7 #include <cgv/gui/event_handler.h>
8 #include <vr/vr_kit.h>
9 #include <cgv/gui/window.h>
10 #include <cgv/signal/signal.h>
11 #include <cgv/signal/bool_signal.h>
12 #include <vr/vr_log.h>
13 #include <fstream>
14 
15 #include "lib_begin.h"
16 
19 
21 namespace cgv {
23  namespace gui {
24 
27  {
28  VRE_NONE = 0,
29  VRE_DEVICE = 1,
30  VRE_STATUS = 2,
31  VRE_KEY = 4,
33  VRE_TWO_AXES = 16,
36  VRE_POSE = 128,
37  VRE_ALL = 255
38  };
39 
41  enum VRFocus
42  {
43  VRF_RELEASED = 0,
44  VRF_GRAB = 1,
45  VRF_EXCLUSIVE = 2,
46  VRF_GRAB_EXCLUSIVE = 3,
47  VRF_PERMANENT = 4,
48  VRF_GRAB_PERMANENT = 5,
49  VRF_GRAB_PERMANENT_AND_EXCLUSIVE = 7
50  };
51 
53 
135  class CGV_API vr_server
136  {
137  public:
138  typedef stick_event::vec2 vec2;
139  protected:
140  double last_device_scan;
141  double device_scan_interval;
142  std::vector<void*> vr_kit_handles;
143  std::vector<vr::vr_kit_state> last_states;
144  std::vector<unsigned> last_time_stamps;
145  VREventTypeFlags event_type_flags;
146  VRFocus focus_type;
147  event_handler* focus;
148  std::unordered_map<int, cgv::data::ref_ptr<vr::vr_log>> log_data;
150  void emit_events_and_update_state(void* kit_handle, const vr::vr_kit_state& new_state, int kit_index, VREventTypeFlags flags, double time);
152  float correct_deadzone_and_precision(float value, const vr::controller_input_config& IC);
154  vec2 correct_deadzone_and_precision(const vec2& position, const vr::controller_input_config& IC);
155  public:
157  vr_server();
159  VREventTypeFlags get_event_type_flags() const;
161  void set_event_type_flags(VREventTypeFlags flags);
163  void set_device_scan_interval(double duration);
165  double get_device_scan_interval() const { return device_scan_interval; }
167  void check_device_changes(double time);
169  void check_and_emit_events(double time);
171  bool check_new_state(void* kit_handle, const vr::vr_kit_state& new_state, double time);
173  bool check_new_state(void* kit_handle, const vr::vr_kit_state& new_state, double time, VREventTypeFlags flags);
175  bool grab_focus(VRFocus focus, event_handler* handler);
177  bool release_focus(event_handler* handler);
179  bool dispatch(cgv::gui::event& e);
181  cgv::signal::bool_signal<cgv::gui::event&> on_event;
183  cgv::signal::signal<void*, bool> on_device_change;
185  cgv::signal::signal<void*, int, vr::VRStatus, vr::VRStatus> on_status_change;
188  void enable_log(const std::string fn="", const bool in_memory_log = true, const int filter=vr::vr_log::F_ALL, const int kit_index = 0);
190  void disable_log(const int kit_index=0);
192  vr::vr_log& ref_log(const int kit_index=0);
194  cgv::data::ref_ptr<vr::vr_log> get_log(const int kit_index=0);
195  };
196 
198  extern CGV_API vr_server& ref_vr_server();
199 
201  extern CGV_API void connect_vr_server(bool connect_device_change_only_to_animation_trigger = true, cgv::gui::window_ptr w = cgv::gui::window_ptr());
202  }
203 }
204 
206 
207 #include <cgv/config/lib_end.h>
cgv::gui::VRFocus
VRFocus
different types of event focus grabbing
Definition: vr_server.h:42
cgv::gui::event_handler
interface for all classes that want to receive events
Definition: event_handler.h:15
cgv::gui::vr_server::get_device_scan_interval
double get_device_scan_interval() const
return the time interval in seconds to check for device connection changes
Definition: vr_server.h:165
cgv::gui::VRE_NONE
@ VRE_NONE
no events
Definition: vr_server.h:28
cgv::math::fvec< float, 2 >
cgv::gui::ref_vr_server
vr_server & ref_vr_server()
return a reference to gamepad server singleton
Definition: vr_server.cxx:397
cgv::data::ref_ptr
Definition: ref_ptr.h:19
cgv::gui::VRE_ONE_AXIS
@ VRE_ONE_AXIS
trigger / throttle / pedal events
Definition: vr_server.h:32
vr::vr_log
helper struct for logging vr events
Definition: vr_log.h:19
vr::controller_input_config
configuration of a controller input axis
Definition: vr_kit.h:20
cgv::gui::VRE_ALL
@ VRE_ALL
all event types
Definition: vr_server.h:37
cgv::gui::vr_server::on_status_change
cgv::signal::signal< void *, int, vr::VRStatus, vr::VRStatus > on_status_change
signal emitted to notify about status changes of trackables, first argument is handle,...
Definition: vr_server.h:185
cgv::gui::vr_server::on_event
cgv::signal::bool_signal< cgv::gui::event & > on_event
signal emitted to dispatch events
Definition: vr_server.h:181
cgv::gui::VRE_DEVICE
@ VRE_DEVICE
device change events
Definition: vr_server.h:29
cgv::gui::event
Definition: event.h:59
cgv::gui::vr_server
server for vr events
Definition: vr_server.h:136
cgv::gui::vr_server::on_device_change
cgv::signal::signal< void *, bool > on_device_change
signal emitted to notify about device changes, first argument is handle and second a flag telling whe...
Definition: vr_server.h:183
cgv::gui::connect_vr_server
void connect_vr_server(bool connect_device_change_only_to_animation_trigger, cgv::gui::window_ptr w)
connect the gamepad server to the given window or the first window of the application,...
Definition: vr_server.cxx:414
cgv::gui::VRE_KEY
@ VRE_KEY
key events
Definition: vr_server.h:31
cgv::gui::VRE_STATUS
@ VRE_STATUS
status change events
Definition: vr_server.h:30
vr::vr_kit_state
structure that stores all information describing the state of a VR kit
Definition: vr_state.h:139
cgv::gui::VREventTypeFlags
VREventTypeFlags
flags to define which events should be generated by server
Definition: vr_server.h:27
cgv::gui::VRE_POSE
@ VRE_POSE
pose events
Definition: vr_server.h:36
cgv::gui::VRE_ONE_AXIS_GENERATES_KEY
@ VRE_ONE_AXIS_GENERATES_KEY
whether one axis events should generate a key event when passing inputs threshold value
Definition: vr_server.h:34
cgv
the cgv namespace
Definition: vr_calib.cxx:9
cgv::gui::VRE_TWO_AXES
@ VRE_TWO_AXES
pad / stick events
Definition: vr_server.h:33
cgv::gui::VRE_TWO_AXES_GENERATES_DPAD
@ VRE_TWO_AXES_GENERATES_DPAD
whether two axes input generates direction pad keys when presses
Definition: vr_server.h:35