+OpenVRController *OpenVRSystem::create_controller()
+{
+ return new OpenVRController(*this);
+}
+
+void OpenVRSystem::tick()
+{
+ vr::IVRSystem *vr_sys = vr::VRSystem();
+
+ OpenVRController::Event event;
+ while(vr_sys->PollNextEvent(&event, sizeof(event)))
+ {
+ bool controller_matched = false;
+ for(vector<OpenVRController *>::iterator i=controllers.begin(); i!=controllers.end(); ++i)
+ {
+ int cindex = (*i)->get_index();
+ if(cindex>=0 && event.trackedDeviceIndex==static_cast<unsigned>(cindex))
+ {
+ (*i)->event(event);
+ controller_matched = true;
+ }
+ }
+
+ if(!controller_matched && event.eventType==vr::VREvent_TrackedDeviceActivated)
+ {
+ if(event.trackedDeviceIndex>=n_tracked_devices)
+ {
+ n_tracked_devices = event.trackedDeviceIndex+1;
+ tracking_matrices.resize(n_tracked_devices);
+ }
+
+ vr::ETrackedDeviceClass dev_class = vr_sys->GetTrackedDeviceClass(event.trackedDeviceIndex);
+
+ if(dev_class==vr::TrackedDeviceClass_Controller)
+ {
+ bool assigned_to_controller = false;
+ for(vector<OpenVRController *>::iterator i=controllers.begin(); i!=controllers.end(); ++i)
+ if((*i)->get_index()<0)
+ {
+ (*i)->event(event);
+ assigned_to_controller = true;
+ break;
+ }
+
+ if(!assigned_to_controller)
+ unclaimed_controllers.push_back(event.trackedDeviceIndex);
+ }
+ }
+ }
+
+ for(vector<OpenVRController *>::iterator i=controllers.begin(); i!=controllers.end(); ++i)
+ (*i)->update_input_state();
+}
+