21 #ifndef _OF_OPENVRDEVICE_ 22 #define _OF_OPENVRDEVICE_ 26 #include <osg/ref_ptr> 27 #include <osg/Referenced> 29 #include <osg/LineWidth> 30 #include <osg/MatrixTransform> 31 #include <osg/Texture> 33 #include <osgGA/Device> 34 #include <osgViewer/ViewerEventHandlers> 50 class IVRRenderModels;
52 struct VRControllerState001_t;
53 typedef VRControllerState001_t VRControllerState_t;
61 struct VRTextureBuffer;
78 vr::VREvent_t *_ovrEvent;
92 OpenVRDevice(
double worldUnitsPerMeter,
double userHeight);
104 w = _width; h = _height;
129 void showLaser(
bool show);
130 bool isLaserShown()
const {
return (_laserTransform->getNodeMask() == ~0x0); }
138 double getLaserHideDelay()
const {
return _hideDelay; }
141 void setColor(
const osg::Vec4& color);
142 const osg::Vec4& getColor()
const {
return _colors->back(); }
143 void setDefaultColor(
const osg::Vec4& color) { _defaultColor = color; }
144 const osg::Vec4& getDefaultColor()
const {
return _defaultColor; }
147 void setLength(
const double& length);
148 double getLength()
const {
return -(*_vertices)[1].z(); }
149 void setDefaultLength(
const double& length) { _defaultLength = (length >= 0.0) ? length : _defaultLength; }
150 double getDefaultLength()
const {
return _defaultLength; }
153 void setWidth(
const float& width);
154 float getWidth()
const {
return _lineWidth->getWidth(); }
155 void setDefaultWidth(
const float& width) { _defaultWidth = (width > 0.0) ? width : _defaultWidth; }
156 float getDefaultWidth()
const {
return _defaultWidth; }
162 void restoreDefaults();
167 osg::ref_ptr<osg::MatrixTransform> _laserTransform;
168 osg::Timer_t _lastUpdateTime;
169 osg::ref_ptr<osg::Geometry> _geom;
170 osg::ref_ptr<osg::Vec3Array> _vertices;
171 osg::ref_ptr<osg::Vec4Array> _colors;
172 osg::ref_ptr<osg::LineWidth> _lineWidth;
174 double _defaultLength;
175 osg::Vec4 _defaultColor;
196 DeviceModel() : _valid(
false), _class(NONE), _controllerState(
nullptr)
198 _modelTransform =
new osg::MatrixTransform;
199 _modelTransform->setNodeMask(0x0);
203 osg::ref_ptr<osg::MatrixTransform> _modelTransform;
204 osg::Matrixd _rawDeviceToWorld;
210 osg::ref_ptr<LaserModel> _laser;
211 vr::VRControllerState_t *_controllerState;
216 const DeviceModel* getDeviceModel(
unsigned int id)
const 218 if(
id < _deviceIDToModel.size())
return &(_deviceIDToModel[
id]);
223 void updateDeviceModels();
227 {
return _deviceIDToModel[0]._modelTransform->getMatrix(); }
230 void updateProjectionMatrices();
231 osg::Matrixd& getRightEyeProjectionMatrix() {
return _rightEyeProj; }
232 osg::Matrixd& getLeftEyeProjectionMatrix() {
return _leftEyeProj; }
233 osg::Matrixd& getCenterProjectionMatrix() {
return _centerProj; }
237 osg::Vec3d& getLeftEyeViewOffset() {
return _leftEyeViewOffset; }
238 osg::Vec3d& getCenterViewOffset() {
return _centerViewOffset; }
243 void computeDeviceTransforms();
246 void setWorldUnitsPerMeter(
const double& worldUnitsPerMeter);
247 double getWorldUnitsPerMeter()
const {
return _worldUnitsPerMeter; }
248 void setWorldUnitsPerMeterLimits(
const double& minWorldUnitsPerMeter,
249 const double& maxWorldUnitsPerMeter)
251 _minWorldUnitsPerMeter = std::max(0.0, minWorldUnitsPerMeter);
252 _maxWorldUnitsPerMeter = std::max(_minWorldUnitsPerMeter, maxWorldUnitsPerMeter);
255 double newWUM = std::max(_minWorldUnitsPerMeter, std::min(_worldUnitsPerMeter, _maxWorldUnitsPerMeter));
256 setWorldUnitsPerMeter(newWUM);
258 void getWorldUnitsPerMeterLimits(
double &minWorldUnitsPerMeter,
double &maxWorldUnitsPerMeter)
const 260 minWorldUnitsPerMeter = _minWorldUnitsPerMeter;
261 maxWorldUnitsPerMeter = _maxWorldUnitsPerMeter;
266 double getUserHeight()
const {
return _userHeight; }
272 void submitFrame(GLuint rightEyeTexName, GLuint leftEyeTexName);
284 void updateViewOffsets();
287 void createDeviceRenderModels();
290 void setupRenderModelForTrackedDevice(uint32_t deviceID);
292 double _worldUnitsPerMeter;
293 double _minWorldUnitsPerMeter, _maxWorldUnitsPerMeter;
299 vr::IVRSystem* _vrSystem;
300 vr::IVRRenderModels* _vrRenderModels;
320 : _ovrDevice(ovrDevice)
324 virtual bool handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv);
326 osg::observer_ptr<OpenVRDevice> _ovrDevice;
330 osg::ref_ptr<osg::MatrixTransform> _deviceModels;
333 osg::ref_ptr<osg::MatrixTransform> _controllerMidpoint;
336 osg::ref_ptr<osg::MatrixTransform> _roomGround;
339 osg::Matrixd _rightEyeProj, _leftEyeProj, _centerProj;
342 osg::Vec3d _rightEyeViewOffset, _leftEyeViewOffset, _centerViewOffset;
343 osg::Vec3d _rightEyeViewOffsetRaw, _leftEyeViewOffsetRaw, _centerViewOffsetRaw;
356 : _ovrDevice(ovrDevice)
358 setCapabilities(osgGA::Device::RECEIVE_EVENTS);
362 virtual bool checkEvents();
365 osg::observer_ptr<OpenVRDevice> _ovrDevice;
386 : _cameraType(cameraType), _ovrDevice(ovrDevice)
389 virtual void updateSlave(osg::View& view, osg::View::Slave& slave);
391 CameraType _cameraType;
392 osg::observer_ptr<OpenVRDevice> _ovrDevice;
409 virtual const char* className()
const {
return "OpenVRTrackball"; }
412 virtual osg::Matrixd getMatrix()
const;
413 virtual osg::Matrixd getInverseMatrix()
const;
419 const osg::Matrixd& getRoomToTrackballMatrix()
const {
return _roomPose; }
420 void setRoomToTrackballMatrix(
const osg::Matrixd& roomPose) { _roomPose = roomPose; }
423 double getDefaultWorldUnitsPerMeterRatio()
const {
return _defaultWorldUnitsPerMeter; }
424 void setDefaultWorldUnitsPerMeterRatio(
const double& wum) { _defaultWorldUnitsPerMeter = wum; }
433 void setOneButtonMode(OneButtonMode mode) { _oneButtonMode = mode; }
434 OneButtonMode getOneButtonMode()
const {
return _oneButtonMode; }
439 TWOBUTTON_ROTATESCALE,
442 void setTwoButtonMode(TwoButtonMode mode) { _twoButtonMode = mode; }
443 TwoButtonMode getTwoButtonMode()
const {
return _twoButtonMode; }
446 virtual bool handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us);
449 osg::observer_ptr<OpenVRDevice> _ovrDevice;
452 osg::Matrixd _roomPose, _savedRoomPose;
454 double _savedWorldUnitsPerMeter;
455 double _defaultWorldUnitsPerMeter;
458 void processMotion();
459 void processOneButtonMotion();
460 void processTwoButtonMotion();
463 virtual void saveState();
464 virtual void restoreState();
465 virtual void resetState();
474 MotionMode _motionMode;
476 OneButtonMode _oneButtonMode;
477 TwoButtonMode _twoButtonMode;
490 osg::Matrixd _device1OrigPoseRaw;
491 osg::Matrixd _device2OrigPoseRaw;
492 double _origWorldUnitsPerMeter;
493 osg::Quat _origRotation;
494 osg::Matrixd _origTrackball;
495 osg::Matrixd _origRoomPose;
497 void saveCurrentMotionData();
514 virtual void swapBuffersImplementation(osg::GraphicsContext *gc);
516 osg::observer_ptr<OpenVRDevice> _ovrDevice;
517 osg::observer_ptr<VRTextureBuffer> _texBuffer;
535 virtual bool handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv);
538 void setSelectedWidth(
const float& width) { _laserSelectedWidth = (width > 0) ? width : _laserSelectedWidth; }
539 float getSelectedWidth() {
return _laserSelectedWidth; }
541 void setSelectedColor(
const osg::Vec4& color) { _laserSelectedColor = color; }
542 const osg::Vec4& getSelectedColor()
const {
return _laserSelectedColor; }
545 void setTriggerThreshold(
const float& threshold)
547 if ((threshold >= 0.0) && (threshold <= 1.0)) _triggerThreshold = threshold;
549 float getTriggerThreshold()
const {
return _triggerThreshold; }
555 osgViewer::InteractiveImageHandler()
559 osgViewer::InteractiveImageHandler(ovrih, copyop)
563 void processImagePick();
566 float getTriggerValue(
const vr::VRControllerState_t *controllerState)
const;
586 osg::NodePath nodePath;
588 void saveCurrentPickData(
PickMode mode, osgViewer::View* view, osg::NodeVisitor* nv, uint32_t device1ID);
590 osg::observer_ptr<const OpenVRDevice> _ovrDevice;
592 float _laserSelectedWidth;
593 osg::Vec4 _laserSelectedColor;
594 float _triggerThreshold;
599 #endif // !define _OF_OPENVRDEVICE_ void getRecommendedTextureSize(int &w, int &h) const
Definition: OpenVRDevice.hpp:102
MotionMode
Definition: OpenVRDevice.hpp:468
PickMode
Definition: OpenVRDevice.hpp:569
DeviceClass
Definition: OpenVRDevice.hpp:180
Encapsulates textures used for VR offscreen rendering.
Definition: VRUtils.hpp:42
Encapsulates an OpenVR device's model.
Definition: OpenVRDevice.hpp:194
osg::MatrixTransform * getTransform() const
Get Local->World matrix (transforms points in Laser frame to Controller frame)
Definition: OpenVRDevice.hpp:125
std::map< std::string, osg::ref_ptr< osg::Geode > > DeviceGeodeMap
Definition: OpenVRDevice.hpp:303
Represents data needed to use an OpenVR-supported HMD.
Definition: OpenVRDevice.hpp:87
osg::MatrixTransform * getDeviceRenderModels() const
Definition: OpenVRDevice.hpp:111
Defines transforms that can perform complex view transformations.
Definition: View.hpp:220
This class extends FollowingTrackball to include the OpenVR HMD transform.
Definition: OpenVRDevice.hpp:404
void setUserHeight(double userHeight)
Definition: OpenVRDevice.hpp:265
osg::Vec3d & getRightEyeViewOffset()
Definition: OpenVRDevice.hpp:236
const osg::Timer_t & getUpdateTime() const
Last time any laser property was updated.
Definition: OpenVRDevice.hpp:159
Definition: CoordinateAxes.hpp:29
An OSG-compatible event adapter for OpenVR.
Definition: OpenVRDevice.hpp:70
osg::MatrixTransform * getGroundPlane()
Definition: OpenVRDevice.hpp:269
This class computes per-eye view matrices.
Definition: OpenVRDevice.hpp:376
Encapsulates the laser attached to OpenVR devices (usually controllers).
Definition: OpenVRDevice.hpp:119
Polls for OpenVR events and stores them in its OSG event queue.
Definition: OpenVRDevice.hpp:352
unsigned int getNumDeviceModels() const
Definition: OpenVRDevice.hpp:215
const osg::Matrixd & getHMDPoseMatrix() const
Definition: OpenVRDevice.hpp:226
Event callback that shows/hides a VR controller's laser when its trigger is pressed.
Definition: OpenVRDevice.hpp:317
std::vector< DeviceModel > DeviceModelVector
TODO: Make this a vector of pointers, then DeviceModel can be subclassed.
Definition: OpenVRDevice.hpp:308
Event handler that enables clicking on an image using VR controllers.
Definition: OpenVRDevice.hpp:526
Data used when computing world transformations during user events.
Definition: OpenVRDevice.hpp:581
vr::IVRSystem * getVRSystem() const
Definition: OpenVRDevice.hpp:278
bool isInitialized() const
Definition: OpenVRDevice.hpp:108
Data used when computing world transformations during user events.
Definition: OpenVRDevice.hpp:485
void setLaserHideDelay(const double &delay)
Definition: OpenVRDevice.hpp:137
This class submits eye textures to OpenVR.
Definition: OpenVRDevice.hpp:508