1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/************************************************************************
*
* Copyright (C) 2009-2024 IRCAD France
* Copyright (C) 2012-2021 IHU Strasbourg
*
* This file is part of Sight.
*
* Sight is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Sight is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Sight. If not, see <https://www.gnu.org/licenses/>.
*
***********************************************************************/
#pragma once
#include <sight/geometry/data/config.hpp>
#include <data/matrix4.hpp>
#include <data/point.hpp>
#include <glm/mat4x4.hpp>
namespace sight::geometry::data
{
/**
* @brief Invert a matrix.
* @param[in] _input Input matrix
* @param[out] _output Inverted matrix.
*/
SIGHT_GEOMETRY_DATA_API bool invert(
const sight::data::matrix4& _input,
sight::data::matrix4& _output
);
/**
* @brief Multiply two matrices.
* @param[in] _trf_a First matrix.
* @param[in] _trf_b Second matrix.
* @param[out] _output Output matrix.
*/
SIGHT_GEOMETRY_DATA_API void multiply(
const sight::data::matrix4& _trf_a,
const sight::data::matrix4& _trf_b,
sight::data::matrix4& _output
);
/**
* @brief Set the matrix to identity.
* @param[in,out] _trf Matrix we want to set to identity.
*/
SIGHT_GEOMETRY_DATA_API void identity(sight::data::matrix4& _trf);
/**
* @brief Multiply a point and a matrix.
* @param[in] _trf Matrix.
* @param[in] _input Input point.
* @param[out] _output Output point.
*/
SIGHT_GEOMETRY_DATA_API void multiply(
const sight::data::matrix4& _trf,
const sight::data::point& _input,
sight::data::point& _output
);
/**
* @brief Return whether a data::matrix4 is an identity matrix.
* @param[in] _trf Input data::matrix4.
* @param[in] _epsilon Precision of the test (default 1e-12)
* @return boolean value: true if the matrix is identity, false otherwise.
*/
SIGHT_GEOMETRY_DATA_API bool is_identity(
const sight::data::matrix4& _trf,
double _epsilon = 1e-12
);
/**
* @brief Return whether a data::matrix4 is orthogonal
* @param[in] _trf Input data::matrix4
* @param[in] _epsilon Precision of the test (default 1e-6)
* @return boolean value: true if the matrix is orthogonal, false otherwise.
*/
SIGHT_GEOMETRY_DATA_API bool is_orthogonal(const sight::data::matrix4& _trf, double _epsilon = 1e-6);
/**
* @brief Return whether a data::matrix4 is homogeneous
* @param[in] _trf Input data::matrix4
* @param[in] _epsilon Precision of the test (default 1e-6)
* @return boolean value: true if the matrix is homogeneous, false otherwise.
*/
SIGHT_GEOMETRY_DATA_API bool is_homogeneous(const sight::data::matrix4& _trf, double _epsilon = 1e-6);
/**
* @brief Convert a data::matrix4 into a GLM matrix.
* @param[in] _trf Input data::matrix4.
* @return GLM matrix.
*/
inline glm::dmat4x4 to_glm_mat(const sight::data::matrix4& _trf)
{
// Matrix4 is stored row-major
// glm matrices are stored column-major
glm::dmat4x4 mat(_trf[0], _trf[4], _trf[8], _trf[12],
_trf[1], _trf[5], _trf[9], _trf[13],
_trf[2], _trf[6], _trf[10], _trf[14],
_trf[3], _trf[7], _trf[11], _trf[15]);
return mat;
}
/**
* @brief Convert a GLM matrix into a data::matrix4.
* @param[out] _trf Output data::matrix4.
* @param[in] _input Input GLM matrix.
*/
inline void from_glm_mat(sight::data::matrix4& _trf, const glm::dmat4x4& _input)
{
// Matrix4 is stored row-major
// glm matrices are stored column-major
for(std::size_t i = 0 ; i < 4 ; ++i)
{
const std::size_t row_dst = i * 4;
const auto row_src = static_cast<glm::length_t>(i);
for(std::size_t j = 0 ; j < 4 ; ++j)
{
const auto col_src = static_cast<glm::length_t>(j);
_trf[row_dst + j] = _input[col_src][row_src];
}
}
}
} // namespace sight::geometry::data
|