Files
flightgear/3rdparty/osgXR/src/OpenXR/Space.h
T
2022-10-20 20:29:11 +08:00

127 lines
2.9 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2021 James Hogan <james@albanarts.com>
#ifndef OSGXR_OPENXR_SPACE
#define OSGXR_OPENXR_SPACE 1
#include "Action.h"
#include "Path.h"
#include "Session.h"
#include <osg/Quat>
#include <osg/Vec3f>
#include <osg/observer_ptr>
namespace osgXR {
namespace OpenXR {
class Space : public osg::Referenced
{
public:
/// Create a reference space
Space(Session *session, XrReferenceSpaceType type);
/// Create an action space
Space(Session *session, ActionPose *action,
Path subactionPath = Path());
virtual ~Space();
// Error checking
inline bool valid() const
{
return _space != XR_NULL_HANDLE;
}
inline bool check(XrResult result, const char *warnMsg) const
{
return _session->check(result, warnMsg);
}
// Conversions
inline XrSpace getXrSpace() const
{
return _space;
}
// Locating a space
class Location
{
public:
// Constructors
Location();
Location(XrSpaceLocationFlags flags,
const osg::Quat &orientation,
const osg::Vec3f &position);
// Error checking
inline bool valid() const
{
return _flags != 0;
}
// Accessors
bool isOrientationValid() const
{
return _flags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT;
}
bool isPositionValid() const
{
return _flags & XR_SPACE_LOCATION_POSITION_VALID_BIT;
}
bool isOrientationTracked() const
{
return _flags & XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT;
}
bool isPositionTracked() const
{
return _flags & XR_SPACE_LOCATION_POSITION_TRACKED_BIT;
}
XrSpaceLocationFlags getFlags() const
{
return _flags;
}
const osg::Quat &getOrientation() const
{
return _orientation;
}
const osg::Vec3f &getPosition() const
{
return _position;
}
protected:
XrSpaceLocationFlags _flags;
osg::Quat _orientation;
osg::Vec3f _position;
};
bool locate(const Space *baseSpace, XrTime time,
Location &location);
protected:
osg::observer_ptr<Session> _session;
XrSpace _space;
};
} // osgXR::OpenXR
} // osgXR
#endif