File: matrix4.hpp

package info (click to toggle)
sight 25.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,252 kB
  • sloc: cpp: 310,629; xml: 17,622; ansic: 9,960; python: 1,379; sh: 144; makefile: 33
file content (140 lines) | stat: -rw-r--r-- 4,361 bytes parent folder | download | duplicates (2)
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