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
|