File: mesh.hpp

package info (click to toggle)
sight 25.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 42,180 kB
  • sloc: cpp: 289,476; xml: 17,257; ansic: 9,878; python: 1,379; sh: 144; makefile: 33
file content (190 lines) | stat: -rw-r--r-- 6,408 bytes parent folder | download
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/************************************************************************
 *
 * Copyright (C) 2009-2025 IRCAD France
 * Copyright (C) 2012-2020 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 <core/base.hpp>
#include <core/compound_types.hpp>

#include <data/matrix4.hpp>
#include <data/mesh.hpp>

#include <glm/vec3.hpp>

namespace sight::geometry::data
{

/**
 * @brief   This helper generates a mesh using specified structure (quad or triangle).
 */
class mesh
{
public:

    using points_map_t   = std::map<glm::vec3, sight::data::mesh::point_t>;
    using position_t     = std::array<double, 3>;
    using organization_t = std::array<std::size_t, 3>;

    /**
     * @brief Generate cell normals for the mesh.
     *
     * @param[out]  _mesh data::mesh structure to fill with cell normals.
     */
    SIGHT_GEOMETRY_DATA_API static void generate_cell_normals(sight::data::mesh::sptr _mesh);

    /**
     * @brief Generate point normals for the mesh.
     *
     * @param[out]  _mesh data::mesh structure to fill with cell normals.
     */
    SIGHT_GEOMETRY_DATA_API static void generate_point_normals(sight::data::mesh::sptr _mesh);

    /**
     * @brief Shake point Normals.
     *
     * @param[out]  _mesh data::mesh structure to shake normals.
     */
    SIGHT_GEOMETRY_DATA_API static void shake_point_normals(sight::data::mesh::sptr _mesh);

    /**
     * @brief Shake cell Normals.
     *
     * @param[out]  _mesh data::mesh structure to shake normals.
     */
    SIGHT_GEOMETRY_DATA_API static void shake_cell_normals(sight::data::mesh::sptr _mesh);

    /**
     * @brief Shake points of the mesh.
     *
     * @param[out]  _mesh data::mesh structure to shake.
     */
    SIGHT_GEOMETRY_DATA_API static void shake_point(sight::data::mesh::sptr _mesh);

    /**
     * @brief Colorize mesh (vertex point color).
     *
     * @param[in]  _mesh data::mesh mesh structure to colorize.
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_points(sight::data::mesh::sptr _mesh);

    /**
     * @brief Colorize mesh (cell color).
     *
     * @param[in]  _mesh data::mesh mesh structure to colorize.
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_cells(sight::data::mesh::sptr _mesh);

    /// Apply a transformation 4x4 from an input mesh to an output mesh
    SIGHT_GEOMETRY_DATA_API static void transform(
        sight::data::mesh::csptr _in_mesh,
        sight::data::mesh::sptr _out_mesh,
        const sight::data::matrix4& _t
    );

    /// Apply a transformation 4x4 on a mesh
    SIGHT_GEOMETRY_DATA_API static void transform(sight::data::mesh::sptr _mesh, const sight::data::matrix4& _t);

    /**
     * @brief Colorize the mesh points with the given color
     * @pre point color array must be allocated
     * @pre mesh must only contain triangle
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_points(
        const sight::data::mesh::sptr& _mesh,
        std::uint8_t _color_r,
        std::uint8_t _color_g,
        std::uint8_t _color_b,
        std::uint8_t _color_a = 255
    );

    /**
     * @brief Colorize the mesh points associated to the triangle in _vectorNumTriangle
     * @pre point color array must be allocated
     * @pre mesh must only contain triangle
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_points(
        const sight::data::mesh::sptr& _mesh,
        const std::vector<std::size_t>& _vector_num_triangle,
        std::uint8_t _color_r,
        std::uint8_t _color_g,
        std::uint8_t _color_b,
        std::uint8_t _color_a = 255
    );

    /**
     * @brief Colorize the mesh cells with the given rgb color
     * @pre cell color array must be allocated
     * @pre mesh must only contain triangle
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_cells(
        const sight::data::mesh::sptr& _mesh,
        std::uint8_t _color_r,
        std::uint8_t _color_g,
        std::uint8_t _color_b,
        std::uint8_t _color_a = 255
    );
    /**
     * @brief Colorize the cells in vectorNumTriangle
     * @pre cell color array must be allocated
     * @pre mesh must only contain triangle
     */
    SIGHT_GEOMETRY_DATA_API static void colorize_mesh_cells(
        const sight::data::mesh::sptr& _mesh,
        const std::vector<std::size_t>& _triangle_index_vector,
        std::uint8_t _color_r,
        std::uint8_t _color_g,
        std::uint8_t _color_b,
        std::uint8_t _color_a = 255
    );

    /*!
     * @brief Return true if the mesh is closed.
     * The result is computed for each call.
     */
    SIGHT_GEOMETRY_DATA_API static bool is_closed(const sight::data::mesh::csptr& _mesh);

    /**
     * @brief Verify if the point is inside the Axis-aligned bounding box.
     * @param _point : The coordinates of the point to be tested.
     * @param  _box : The coordinates of the bounding box.
     * @return true if the point is inside the Axis-aligned bounding box false otherwise.
     */
    SIGHT_GEOMETRY_DATA_API static bool is_inside_bounding_box(
        const sight::vec3d_t& _point,
        const sight::data::mesh::axis_aligned_box_t& _box
    );

    /**
     * @brief Merge a point into an Axis-aligned bounding box.
     * @param _point : The coordinates of the point to be merged.
     * @param  _box : The coordinates of the bounding box.
     * @return The merged Axis-aligned bounding box.
     */
    SIGHT_GEOMETRY_DATA_API static sight::data::mesh::axis_aligned_box_t merge_bounding_box(
        const sight::vec3f_t& _point,
        const sight::data::mesh::axis_aligned_box_t& _box
    );
};

} // namespace sight::geometry::data