Skip to content

File openxr_defines.hpp

File List > data_format > poses > openxr_defines.hpp

Go to the documentation of this file

#pragma once

#ifdef USING_OPENXR
#    ifdef ENABLE_MONADO
#        include 
#    else
#        include 
#        include 

namespace ILLIXR::data_format::pose {
// From monado xrt_defines.h
enum xrt_space_relation_flags : uint32_t {
    // clang-format off
    XRT_SPACE_RELATION_ORIENTATION_VALID_BIT =          (1u << 0u),
    XRT_SPACE_RELATION_POSITION_VALID_BIT =             (1u << 1u),
    XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT =      (1u << 2u),
    XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT =     (1u << 3u),
    XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT =        (1u << 4u),
    XRT_SPACE_RELATION_POSITION_TRACKED_BIT =           (1u << 5u),
    // clang-format on
    XRT_SPACE_RELATION_BITMASK_ALL [[maybe_unused]] = (uint32_t) XRT_SPACE_RELATION_ORIENTATION_VALID_BIT | //
        (uint32_t) XRT_SPACE_RELATION_POSITION_VALID_BIT |                                                  //
        (uint32_t) XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT |                                           //
        (uint32_t) XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT |                                          //
        (uint32_t) XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT |                                             //
        (uint32_t) XRT_SPACE_RELATION_POSITION_TRACKED_BIT,
    XRT_SPACE_RELATION_BITMASK_NONE = 0,
};

struct xrt_space_relation {
    uint32_t          relation_flags{XRT_SPACE_RELATION_BITMASK_NONE}; 
    struct XrPosef    pose;                                            
    struct XrVector3f linear_velocity;                                 
    struct XrVector3f angular_velocity;                                

    void set_flags(const XrSpaceLocationFlags location_flags) {
        relation_flags = XRT_SPACE_RELATION_BITMASK_NONE;
        if (location_flags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_ORIENTATION_VALID_BIT;
        if (location_flags & XR_SPACE_LOCATION_POSITION_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_POSITION_VALID_BIT;
        if (location_flags & XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT)
            relation_flags |= XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT;
        if (location_flags & XR_SPACE_LOCATION_POSITION_TRACKED_BIT)
            relation_flags |= XRT_SPACE_RELATION_POSITION_TRACKED_BIT;
    }

    void set_flags(const XrSpaceLocationFlags location_flags, const XrSpaceVelocityFlags velocity_flags) {
        set_flags(location_flags);
        if (location_flags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_ORIENTATION_VALID_BIT;
        if (location_flags & XR_SPACE_LOCATION_POSITION_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_POSITION_VALID_BIT;
        if (location_flags & XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT)
            relation_flags |= XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT;
        if (location_flags & XR_SPACE_LOCATION_POSITION_TRACKED_BIT)
            relation_flags |= XRT_SPACE_RELATION_POSITION_TRACKED_BIT;
        if (velocity_flags & XR_SPACE_VELOCITY_LINEAR_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT;
        if (velocity_flags & XR_SPACE_VELOCITY_ANGULAR_VALID_BIT)
            relation_flags |= XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT;
    }

    xrt_space_relation()
        : relation_flags{XRT_SPACE_RELATION_BITMASK_NONE}
        , pose{}
        , linear_velocity{}
        , angular_velocity{} { }

    [[maybe_unused]] xrt_space_relation(XrSpaceLocation location, XrSpaceVelocity velocity)
        : pose{location.pose}
        , linear_velocity{velocity.linearVelocity}
        , angular_velocity{velocity.angularVelocity} {
        set_flags(location.locationFlags, velocity.velocityFlags);
    }

    [[nodiscard]] virtual 
        bool
        valid() const {
        return (relation_flags & XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0u &&
            (relation_flags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) != 0u;
    }
};
} // namespace ILLIXR::data_format::pose
#    endif
#endif