Skip to content

File quest_controller.hpp

File List > data_format > quest_controller.hpp

Go to the documentation of this file

#pragma once

#include "illixr/data_format/poses/pose_base.hpp"
#include "illixr/switchboard.hpp"

#include 
#include 

namespace ILLIXR::data_format {

enum class quest_controller_profile : std::uint8_t {
    none,
    simple_controller,
    oculus_touch,
    htc_vive,
    valve_index,
    microsoft_motion,
    unknown,
};

struct quest_controller_pose : public pose::pose_base {
#ifdef USING_OPENXR
    quest_controller_pose() {
        orientation.w = 1.0F;
    }
#endif

    bool active{false};
    bool position_valid{false};
    bool orientation_valid{false};
    bool position_tracked{false};
    bool orientation_tracked{false};

    [[nodiscard]] bool valid() const {
        return active && position_valid && orientation_valid;
    }

    [[nodiscard]] bool tracked() const {
        return active && position_tracked && orientation_tracked;
    }
};

struct quest_controller_button {
    bool         active{false};
    bool         pressed{false};
    bool         changed_since_last_sync{false};
    float        value{0.0F};
    std::int64_t last_change_time{0}; 
};

struct quest_controller_axis2d {
    bool            active{false};
    bool            changed_since_last_sync{false};
    Eigen::Vector2f value{Eigen::Vector2f::Zero()};
    std::int64_t    last_change_time{0}; 
};

struct quest_hand_controller {
    bool available{false};

    quest_controller_profile interaction_profile{quest_controller_profile::none};

    quest_controller_pose grip_pose;
    quest_controller_pose aim_pose;

    quest_controller_button trigger;
    quest_controller_button squeeze;
    quest_controller_button primary;   
    quest_controller_button secondary; 
    quest_controller_button thumbstick_click;
    quest_controller_axis2d thumbstick;

    [[nodiscard]] bool tracked() const {
        return grip_pose.tracked() || aim_pose.tracked();
    }
};

struct quest_controller_input : public switchboard::event {
    std::uint64_t sequence{0};
    time_point   sample_time{};
    std::int64_t xr_sample_time{0};

    quest_hand_controller left;
    quest_hand_controller right;
};

} // namespace ILLIXR::data_format