File: mesh.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 (167 lines) | stat: -rw-r--r-- 5,445 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
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
/************************************************************************
 *
 * Copyright (C) 2009-2024 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 <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);
};

} // namespace sight::geometry::data