# namespace utils

## Overview

General namespace for utilities. More…

    namespace utils {

    // typedefs

    typedef utils::StrongOptionalType<float, class LogReader> ProgressPercentage;
    typedef DelegatedNotifier<const LogEntry::Type> LogEntryNotifier;
    typedef DelegatedNotifier<const ProgressPercentage> ProgressNotifier;

    // enums

    enum BaseAxis;
    enum Handedness;
    enum SpaceCategory;
    enum Units;

    // structs

    struct BasisDefinition;
    struct IntrinsicParams;

    template <typename C, typename T, T(C::*)() const getter, void(C::*)(const T&) setter>
    struct Property;

    template <typename C, typename T, T(C::*)() const getter, void(C::*)(T) setter>
    struct PropertyByValue;

    struct ScannerParams;
    struct SerializableJson;
    struct SpaceDefinition;

    template <typename PhantomType>
    struct StrongId;

    template <typename ValueType, typename PhantomType>
    struct StrongOptionalType;

    template <typename ValueType, typename PhantomType>
    struct StrongType;

    struct UnitNames;
    struct Version;

    // classes

    class CallbackTimer;

    template <typename T>
    class ConcurrentBinding;

    template <typename Type>
    class Couple;

    template <typename... Args>
    class DelegatedNotifier;

    class Dictionary;

    template <class T, class TMask = uint32_t>
    class EnumFlags;

    class EventHandler;
    class GlmQuatSerializable;
    class GlmVec3Serializable;

    template <typename IdType>
    class Identifiable;

    class IniParser;
    class Interval;
    class LogEntry;
    class LogReader;
    class LogWriter;
    class Logger;

    template <typename T>
    class NamedClass;

    template <typename... Args>
    class Notifier;

    class OnEnd;

    template <typename Type, typename SerializableType>
    class Serializer;

    template <typename Type>
    class Statistics;

    template <typename Type>
    class Triplet;

    // global variables

    const std::unordered_map<int, std::string> CV_MAT_TYPE_TO_STRING;
    const ScannerParams PHOXI_XS = []()   {     ScannerParams phoxi_xs;     phoxi_xs.resolution = glm::uvec2(2064, 1544);     phoxi_xs.fx = 3626.18f;     phoxi_xs.fy = 3627.91f;     phoxi_xs.cx = 1188.59f;     phoxi_xs.cy = 684.239f;     phoxi_xs.baseline = 85.0f;     phoxi_xs.camera_angle = 0.0f;     phoxi_xs.projector_angle = 17.0f;     phoxi_xs.projector_fovx = 47.5f;     phoxi_xs.projector_fovy = 36.0f;     phoxi_xs.near_range = 161.0f;     phoxi_xs.far_range = 205.0f;     return phoxi_xs;   }();
    const ScannerParams PHOXI_S = []()   {     ScannerParams phoxi_s;     phoxi_s.resolution = glm::uvec2(2064, 1544);     phoxi_s.fx = 2245.92f;     phoxi_s.fy = 2246.5f;     phoxi_s.cx = 1042.98f;     phoxi_s.cy = 772.933f;     phoxi_s.baseline = 230.0f;     phoxi_s.camera_angle = 15.45f;     phoxi_s.projector_angle = 15.45f;     phoxi_s.projector_fovx = 47.5f;     phoxi_s.projector_fovy = 36.0f;     phoxi_s.near_range = 384.0f;     phoxi_s.far_range = 520.0f;     return phoxi_s;   }();
    const ScannerParams PHOXI_M = []()   {     ScannerParams phoxi_m;     phoxi_m.resolution = glm::uvec2(2064, 1544);     phoxi_m.fx = 2268.68f;     phoxi_m.fy = 2268.88f;     phoxi_m.cx = 1032.65f;     phoxi_m.cy = 799.183f;     phoxi_m.baseline = 350.0f;     phoxi_m.camera_angle = 11.75f;     phoxi_m.projector_angle = 11.75f;     phoxi_m.projector_fovx = 47.5f;     phoxi_m.projector_fovy = 36.0f;     phoxi_m.near_range = 458.0f;     phoxi_m.far_range = 1118.0f;     return phoxi_m;   }();
    const ScannerParams PHOXI_L = []()   {     ScannerParams phoxi_l;     phoxi_l.resolution = glm::uvec2(2064, 1544);     phoxi_l.fx = 2263.31f;     phoxi_l.fy = 2263.29f;     phoxi_l.cx = 1054.4f;     phoxi_l.cy = 770.566f;     phoxi_l.baseline = 550.0f;     phoxi_l.camera_angle = 9.45f;     phoxi_l.projector_angle = 9.45f;     phoxi_l.projector_fovx = 47.5f;     phoxi_l.projector_fovy = 36.0f;     phoxi_l.near_range = 870.0f;     phoxi_l.far_range = 2150.0f;     return phoxi_l;   }();
    const ScannerParams PHOXI_XL = []()   {     ScannerParams phoxi_xl;     phoxi_xl.resolution = glm::uvec2(2064, 1544);     phoxi_xl.fx = 2245.37f;     phoxi_xl.fy = 2244.88f;     phoxi_xl.cx = 998.051f;     phoxi_xl.cy = 756.269f;     phoxi_xl.baseline = 850.0f;     phoxi_xl.camera_angle = 7.5f;     phoxi_xl.projector_angle = 7.5f;     phoxi_xl.projector_fovx = 47.5f;     phoxi_xl.projector_fovy = 36.0f;     phoxi_xl.near_range = 1680.0f;     phoxi_xl.far_range = 3780.0f;     return phoxi_xl;   }();
    const uint8_t BASIS_DEFINITION_VERSION = 1;
    const uint8_t SPACE_DEFINITION_VERSION = 2;
    const SpaceDefinition PHOXI_MARKER_SPACE = []()   {     SpaceDefinition space;     space.id = "PhoXi Marker";     space.category = SpaceCategory::marker;     space.up = BaseAxis::positive_z;     space.forward = BaseAxis::negative_x;     space.units = Units::mm;     space.handedness = Handedness::right;     return space;   }();
    const SpaceDefinition COGS_MARKER_SPACE = []()   {     SpaceDefinition space;     space.id = "COGS Marker";     space.category = SpaceCategory::marker;     space.up = BaseAxis::positive_y;     space.forward = BaseAxis::positive_z;     space.units = Units::m;     space.handedness = Handedness::right;     return space;   }();
    const SpaceDefinition PHOXI_CAMERA_SPACE = []()   {     SpaceDefinition space;     space.id = "PhoXi Camera";     space.category = SpaceCategory::camera;     space.up = BaseAxis::negative_y;     space.forward = BaseAxis::positive_z;     space.units = Units::mm;     space.handedness = Handedness::right;     return space;   }();
    const SpaceDefinition COGS_CAMERA_SPACE = []()   {     SpaceDefinition space;     space.id = "COGS Camera";     space.category = SpaceCategory::camera;     space.up = BaseAxis::positive_y;     space.forward = BaseAxis::negative_z;     space.units = Units::m;     space.handedness = Handedness::right;     return space;   }();
    const std::map<std::string, SpaceDefinition> SPACE_DEFINITION_OF_ID =   {     {PHOXI_MARKER_SPACE.id, PHOXI_MARKER_SPACE},     {PHOXI_CAMERA_SPACE.id, PHOXI_CAMERA_SPACE},     {COGS_MARKER_SPACE.id, COGS_MARKER_SPACE},     {COGS_CAMERA_SPACE.id, COGS_CAMERA_SPACE}   };

    // global functions

    glm::vec3 BulletToGlmVec(const btVector3& bt_vec);
    glm::quat BulletToGlmQuat(const btQuaternion& bt_quat);
    Eigen::Vector3d BulletToEigenVec(const btVector3& bt_vec);
    Eigen::Quaterniond BulletToEigenQuat(const btQuaternion& bt_quat);
    btVector3 GlmToBulletVec(const glm::vec3& vec);
    btQuaternion GlmToBulletQuat(const glm::quat& glm_quat);
    bool HasPermissionToWriteHere();
    gl::GLenum CvMatTypeToGlType(const int mat_type);
    unsigned int GetNumOfChannels(const int mat_type);
    glw::PTexture2D MatToTexture(const cv::Mat& image, bool flip_vertically);
    cv::Mat TextureToMat(const glw::PTexture2D& texture, bool flip_vertically, const int mat_type);

    template <typename T, int m, int n, typename OutT = float>
    glm::mat<m, n, OutT, glm::precision::highp> EigenToGlmMat(const Eigen::Matrix<T, m, n>& em);

    template <typename T, int m, int n>
    Eigen::Matrix<T, m, n> GlmToEigenMat(const glm::mat<m, n, float, glm::precision::highp>& glm_mat);

    template <typename T, int m>
    glm::vec<m, float, glm::precision::highp> EigenToGlmVec(const Eigen::Matrix<T, m, 1>& em);

    template <typename T>
    glm::quat EigenToGlmQuat(const Eigen::Quaternion<T>& q);

    Eigen::Vector3d GlmToEigenVec(const glm::vec3& glm_vec);

    template <typename T>
    Eigen::Quaternion<T> GlmToEigenQuat(const glm::quat& q);

    glm::vec2 GetPrincipalPoint(float focal_length, float fovx, float fovy);
    IntrinsicParams GetIntrinsicParamsFromResolution(const glm::uvec2& resolution, float fovx, float fovy);
    IntrinsicParams GetIntrinsicParamsFromDepth(float focal_length, float fovx, float fovy);
    UTILS_API bool operator==(const IntrinsicParams& p1, const IntrinsicParams& p2);
    UTILS_API bool operator!=(const IntrinsicParams& p1, const IntrinsicParams& p2);
    UTILS_API bool operator==(const ScannerParams& p1, const ScannerParams& p2);
    UTILS_API bool operator!=(const ScannerParams& p1, const ScannerParams& p2);
    static float GetUnitConversionRatio(utils::Units source_units, utils::Units target_units);
    static const UnitNames& GetUnitName(utils::Units unit);
    static size_t BaseAxisToId(BaseAxis axis);
    static float BaseAxisToSign(BaseAxis axis);
    static glm::vec3 BaseAxisToVec3(BaseAxis axis);
    static glm::vec4 BaseAxisToVec4(BaseAxis axis, float w = 0.0f);
    static bool AreCollinear(BaseAxis axis_a, BaseAxis axis_b);
    std::string SpaceCategoryToString(SpaceCategory categ);
    bool operator<(const Version& a, const Version& b);
    bool operator>(const Version& a, const Version& b);
    bool operator<=(const Version& a, const Version& b);
    bool operator>=(const Version& a, const Version& b);
    bool operator==(const Version& a, const Version& b);
    bool operator!=(const Version& a, const Version& b);

    } // namespace utils

## Detailed Documentation

General namespace for utilities.

### Global Variables

    const ScannerParams PHOXI_XS = []()   {     ScannerParams phoxi_xs;     phoxi_xs.resolution = glm::uvec2(2064, 1544);     phoxi_xs.fx = 3626.18f;     phoxi_xs.fy = 3627.91f;     phoxi_xs.cx = 1188.59f;     phoxi_xs.cy = 684.239f;     phoxi_xs.baseline = 85.0f;     phoxi_xs.camera_angle = 0.0f;     phoxi_xs.projector_angle = 17.0f;     phoxi_xs.projector_fovx = 47.5f;     phoxi_xs.projector_fovy = 36.0f;     phoxi_xs.near_range = 161.0f;     phoxi_xs.far_range = 205.0f;     return phoxi_xs;   }()

Scanner parameter definition for PhoXi XS device.

    const ScannerParams PHOXI_S = []()   {     ScannerParams phoxi_s;     phoxi_s.resolution = glm::uvec2(2064, 1544);     phoxi_s.fx = 2245.92f;     phoxi_s.fy = 2246.5f;     phoxi_s.cx = 1042.98f;     phoxi_s.cy = 772.933f;     phoxi_s.baseline = 230.0f;     phoxi_s.camera_angle = 15.45f;     phoxi_s.projector_angle = 15.45f;     phoxi_s.projector_fovx = 47.5f;     phoxi_s.projector_fovy = 36.0f;     phoxi_s.near_range = 384.0f;     phoxi_s.far_range = 520.0f;     return phoxi_s;   }()

Scanner parameter definition for PhoXi S device.

    const ScannerParams PHOXI_M = []()   {     ScannerParams phoxi_m;     phoxi_m.resolution = glm::uvec2(2064, 1544);     phoxi_m.fx = 2268.68f;     phoxi_m.fy = 2268.88f;     phoxi_m.cx = 1032.65f;     phoxi_m.cy = 799.183f;     phoxi_m.baseline = 350.0f;     phoxi_m.camera_angle = 11.75f;     phoxi_m.projector_angle = 11.75f;     phoxi_m.projector_fovx = 47.5f;     phoxi_m.projector_fovy = 36.0f;     phoxi_m.near_range = 458.0f;     phoxi_m.far_range = 1118.0f;     return phoxi_m;   }()

Scanner parameter definition for PhoXi M device.

    const ScannerParams PHOXI_L = []()   {     ScannerParams phoxi_l;     phoxi_l.resolution = glm::uvec2(2064, 1544);     phoxi_l.fx = 2263.31f;     phoxi_l.fy = 2263.29f;     phoxi_l.cx = 1054.4f;     phoxi_l.cy = 770.566f;     phoxi_l.baseline = 550.0f;     phoxi_l.camera_angle = 9.45f;     phoxi_l.projector_angle = 9.45f;     phoxi_l.projector_fovx = 47.5f;     phoxi_l.projector_fovy = 36.0f;     phoxi_l.near_range = 870.0f;     phoxi_l.far_range = 2150.0f;     return phoxi_l;   }()

Scanner parameter definition for PhoXi L device.

    const ScannerParams PHOXI_XL = []()   {     ScannerParams phoxi_xl;     phoxi_xl.resolution = glm::uvec2(2064, 1544);     phoxi_xl.fx = 2245.37f;     phoxi_xl.fy = 2244.88f;     phoxi_xl.cx = 998.051f;     phoxi_xl.cy = 756.269f;     phoxi_xl.baseline = 850.0f;     phoxi_xl.camera_angle = 7.5f;     phoxi_xl.projector_angle = 7.5f;     phoxi_xl.projector_fovx = 47.5f;     phoxi_xl.projector_fovy = 36.0f;     phoxi_xl.near_range = 1680.0f;     phoxi_xl.far_range = 3780.0f;     return phoxi_xl;   }()

Scanner parameter definition for PhoXi XL device.

### Global Functions

    glm::vec3 BulletToGlmVec(const btVector3& bt_vec)

Converts bullet vector to glm vector.

    glm::quat BulletToGlmQuat(const btQuaternion& bt_quat)

Converts bullet quaternion to glm quaternion.

    Eigen::Vector3d BulletToEigenVec(const btVector3& bt_vec)

Converts bullet vector to Eigen vector.

    Eigen::Quaterniond BulletToEigenQuat(const btQuaternion& bt_quat)

Converts bullet quaternion to Eigen quaternion.

    btVector3 GlmToBulletVec(const glm::vec3& vec)

Converts glm vector to bullet vector.

    btQuaternion GlmToBulletQuat(const glm::quat& glm_quat)

Converts glm quaternion to bullet quaternion.

    bool HasPermissionToWriteHere()

Function returns if the current user has the right to write into the project directory.

    template <typename T, int m, int n, typename OutT = float>
    glm::mat<m, n, OutT, glm::precision::highp> EigenToGlmMat(const Eigen::Matrix<T, m, n>& em)

Converts Eigen matrix to glm matrix.

    template <typename T, int m, int n>
    Eigen::Matrix<T, m, n> GlmToEigenMat(const glm::mat<m, n, float, glm::precision::highp>& glm_mat)

Converts glm matrix to Eigen matrix.

    template <typename T, int m>
    glm::vec<m, float, glm::precision::highp> EigenToGlmVec(const Eigen::Matrix<T, m, 1>& em)

Converts Eigen matrix to glm vector.

    template <typename T>
    glm::quat EigenToGlmQuat(const Eigen::Quaternion<T>& q)

Converts Eigen quaternion to glm quaternion.

    Eigen::Vector3d GlmToEigenVec(const glm::vec3& glm_vec)

Converts glm vector to Eigen vector.

    template <typename T>
    Eigen::Quaternion<T> GlmToEigenQuat(const glm::quat& q)

Converts glm quaternion to Eigen quaternion.

    glm::vec2 GetPrincipalPoint(float focal_length, float fovx, float fovy)

Returns intrinsic cx, cy parameters for defined projection depth and field of view angles.

    IntrinsicParams GetIntrinsicParamsFromResolution(const glm::uvec2& resolution, float fovx, float fovy)

Calculates intrinsic projection parameters from resolution and field of view angles.

    IntrinsicParams GetIntrinsicParamsFromDepth(float focal_length, float fovx, float fovy)

Calculates intrinsic projection parameters from projection depth and field of view angles.

    UTILS_API bool operator==(const IntrinsicParams& p1, const IntrinsicParams& p2)

Compare equality of two parameter structures.

    UTILS_API bool operator!=(const IntrinsicParams& p1, const IntrinsicParams& p2)

Compare unequality of two parameter structures.

    UTILS_API bool operator==(const ScannerParams& p1, const ScannerParams& p2)

Compare equality of two parameter structures.

    UTILS_API bool operator!=(const ScannerParams& p1, const ScannerParams& p2)

Compare unequality of two parameter structures.

    static float GetUnitConversionRatio(utils::Units source_units, utils::Units target_units)

Gets ratio that describes relation between two provided units. target_value = source_value * ratio.

    static const UnitNames& GetUnitName(utils::Units unit)

Gets ratio that describes relation between two provided unit: target_value = source_value * ratio.

    static size_t BaseAxisToId(BaseAxis axis)

Converts base axis x,y,z hints to 0,1,2 respectively.

    static float BaseAxisToSign(BaseAxis axis)

Converts base axis positive,negative hints to 1,-1 respectively.

    static glm::vec3 BaseAxisToVec3(BaseAxis axis)

Converts base axis to vec3.

    static glm::vec4 BaseAxisToVec4(BaseAxis axis, float w = 0.0f)

Converts base axis to vec4, with possible custom w element value.