# Copyright (c) 2019 - 2026 Geode-solutions
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

add_geode_library(
    NAME mesh
    FOLDER "geode/mesh"
    SOURCES
        "builder/coordinate_reference_system_manager_builder.cpp"
        "builder/coordinate_reference_system_managers_builder.cpp"
        "builder/edged_curve_builder.cpp"
        "builder/graph_builder.cpp"
        "builder/grid_builder.cpp"
        "builder/hybrid_solid_builder.cpp"
        "builder/point_set_builder.cpp"
        "builder/polygonal_surface_builder.cpp"
        "builder/polyhedral_solid_builder.cpp"
        "builder/register_builder.cpp"
        "builder/surface_edges_builder.cpp"
        "builder/surface_mesh_builder.cpp"
        "builder/regular_grid_solid_builder.cpp"
        "builder/regular_grid_surface_builder.cpp"
        "builder/solid_edges_builder.cpp"
        "builder/solid_facets_builder.cpp"
        "builder/solid_mesh_builder.cpp"
        "builder/surface_mesh_builder.cpp"
        "builder/tetrahedral_solid_builder.cpp"
        "builder/triangulated_surface_builder.cpp"
        "builder/vertex_set_builder.cpp"
        "builder/geode/geode_point_set_builder.cpp"
        "builder/geode/geode_edged_curve_builder.cpp"
        "builder/geode/geode_graph_builder.cpp"
        "builder/geode/geode_hybrid_solid_builder.cpp"
        "builder/geode/geode_polygonal_surface_builder.cpp"
        "builder/geode/geode_polyhedral_solid_builder.cpp"
        "builder/geode/geode_regular_grid_solid_builder.cpp"
        "builder/geode/geode_regular_grid_surface_builder.cpp"
        "builder/geode/geode_tetrahedral_solid_builder.cpp"
        "builder/geode/geode_triangulated_surface_builder.cpp"
        "builder/geode/geode_vertex_set_builder.cpp"
        "common.cpp"
        "core/attribute_coordinate_reference_system.cpp"
        "core/bitsery_archive.cpp"
        "core/coordinate_reference_system.cpp"
        "core/coordinate_reference_system_manager.cpp"
        "core/coordinate_reference_system_managers.cpp"
        "core/edged_curve.cpp"
        "core/graph.cpp"
        "core/grid.cpp"
        "core/hybrid_solid.cpp"
        "core/light_regular_grid.cpp"
        "core/mesh_element.cpp"
        "core/mesh_factory.cpp"
        "core/mesh_id.cpp"
        "core/point_set.cpp"
        "core/polygonal_surface.cpp"
        "core/polyhedral_solid.cpp"
        "core/register_mesh.cpp"
        "core/regular_grid_solid.cpp"
        "core/regular_grid_surface.cpp"
        "core/solid_facets.cpp"
        "core/solid_edges.cpp"
        "core/solid_mesh.cpp"
        "core/surface_edges.cpp"
        "core/surface_mesh.cpp"
        "core/tetrahedral_solid.cpp"
        "core/texture_manager.cpp"
        "core/texture_storage.cpp"
        "core/texture1d.cpp"
        "core/texture2d.cpp"
        "core/texture3d.cpp"
        "core/triangulated_surface.cpp"
        "core/vertex_set.cpp"
        "core/geode/geode_point_set.cpp"
        "core/geode/geode_edged_curve.cpp"
        "core/geode/geode_graph.cpp"
        "core/geode/geode_hybrid_solid.cpp"
        "core/geode/geode_polygonal_surface.cpp"
        "core/geode/geode_polyhedral_solid.cpp"
        "core/geode/geode_regular_grid_solid.cpp"
        "core/geode/geode_regular_grid_surface.cpp"
        "core/geode/geode_tetrahedral_solid.cpp"
        "core/geode/geode_triangulated_surface.cpp"
        "helpers/aabb_edged_curve_helpers.cpp"
        "helpers/aabb_surface_helpers.cpp"
        "helpers/aabb_solid_helpers.cpp"
        "helpers/build_grid.cpp"
        "helpers/convert_edged_curve.cpp"
        "helpers/convert_grid.cpp"
        "helpers/convert_point_set.cpp"
        "helpers/convert_surface_mesh.cpp"
        "helpers/convert_solid_mesh.cpp"
        "helpers/create_coordinate_system.cpp"
        "helpers/euclidean_distance_transform.cpp"
        "helpers/gradient_computation.cpp"
        "helpers/hausdorff_distance.cpp"
        "helpers/mesh_statistics.cpp"
        "helpers/rasterize.cpp"
        "helpers/ray_tracing.cpp"
        "helpers/grid_point_function.cpp"
        "helpers/grid_scalar_function.cpp"
        "helpers/repair_polygon_orientations.cpp"
        "helpers/tetrahedral_solid_point_function.cpp"
        "helpers/tetrahedral_solid_scalar_function.cpp"
        "helpers/triangulated_surface_point_function.cpp"
        "helpers/triangulated_surface_scalar_function.cpp"
        "helpers/detail/component_identifier.cpp"
        "helpers/detail/create_mesh.cpp"
        "helpers/detail/curve_merger.cpp"
        "helpers/detail/debug.cpp"
        "helpers/detail/element_identifier.cpp"
        "helpers/detail/mesh_intersection_detection.cpp"
        "helpers/detail/point_set_merger.cpp"
        "helpers/detail/solid_merger.cpp"
        "helpers/detail/solid_mesh_validity_fix.cpp"
        "helpers/detail/split_along_solid_facets.cpp"
        "helpers/detail/surface_merger.cpp"
        "helpers/detail/surface_mesh_validity_fix.cpp"
        "helpers/detail/vertex_merger.cpp"
        "helpers/internal/copy.cpp"
        "helpers/internal/grid_shape_function.cpp"
        "io/edged_curve_input.cpp"
        "io/edged_curve_output.cpp"
        "io/graph_input.cpp"
        "io/graph_output.cpp"
        "io/hybrid_solid_input.cpp"
        "io/hybrid_solid_output.cpp"
        "io/light_regular_grid_input.cpp"
        "io/light_regular_grid_output.cpp"
        "io/point_set_input.cpp"
        "io/point_set_output.cpp"
        "io/polygonal_surface_input.cpp"
        "io/polygonal_surface_output.cpp"
        "io/polyhedral_solid_input.cpp"
        "io/polyhedral_solid_output.cpp"
        "io/register_input.cpp"
        "io/register_output.cpp"
        "io/regular_grid_input.cpp"
        "io/regular_grid_output.cpp"
        "io/tetrahedral_solid_input.cpp"
        "io/tetrahedral_solid_output.cpp"
        "io/triangulated_surface_input.cpp"
        "io/triangulated_surface_output.cpp"
        "io/vertex_set_input.cpp"
        "io/vertex_set_output.cpp"
    PUBLIC_HEADERS
        "common.hpp"
        "builder/coordinate_reference_system_manager_builder.hpp"
        "builder/coordinate_reference_system_managers_builder.hpp"
        "builder/edged_curve_builder.hpp"
        "builder/graph_builder.hpp"
        "builder/grid_builder.hpp"
        "builder/hybrid_solid_builder.hpp"
        "builder/mesh_builder_factory.hpp"
        "builder/point_set_builder.hpp"
        "builder/polygonal_surface_builder.hpp"
        "builder/polyhedral_solid_builder.hpp"
        "builder/regular_grid_solid_builder.hpp"
        "builder/regular_grid_surface_builder.hpp"
        "builder/solid_facets_builder.hpp"
        "builder/solid_edges_builder.hpp"
        "builder/solid_mesh_builder.hpp"
        "builder/surface_edges_builder.hpp"
        "builder/surface_mesh_builder.hpp"
        "builder/tetrahedral_solid_builder.hpp"
        "builder/triangulated_surface_builder.hpp"
        "builder/vertex_set_builder.hpp"
        "builder/geode/geode_edged_curve_builder.hpp"
        "builder/geode/geode_graph_builder.hpp"
        "builder/geode/geode_hybrid_solid_builder.hpp"
        "builder/geode/geode_point_set_builder.hpp"
        "builder/geode/geode_polygonal_surface_builder.hpp"
        "builder/geode/geode_polyhedral_solid_builder.hpp"
        "builder/geode/geode_regular_grid_solid_builder.hpp"
        "builder/geode/geode_regular_grid_surface_builder.hpp"
        "builder/geode/geode_tetrahedral_solid_builder.hpp"
        "builder/geode/geode_triangulated_surface_builder.hpp"
        "builder/geode/geode_vertex_set_builder.hpp"
        "builder/geode/register_builder.hpp"
        "core/attribute_coordinate_reference_system.hpp"
        "core/bitsery_archive.hpp"
        "core/coordinate_reference_system.hpp"
        "core/coordinate_reference_system_manager.hpp"
        "core/coordinate_reference_system_managers.hpp"
        "core/edged_curve.hpp"
        "core/graph.hpp"
        "core/grid.hpp"
        "core/hybrid_solid.hpp"
        "core/light_regular_grid.hpp"
        "core/mesh_factory.hpp"
        "core/mesh_element.hpp"
        "core/mesh_id.hpp"
        "core/point_set.hpp"
        "core/polygonal_surface.hpp"
        "core/polyhedral_solid.hpp"
        "core/regular_grid_solid.hpp"
        "core/solid_edges.hpp"
        "core/solid_facets.hpp"
        "core/solid_mesh.hpp"
        "core/surface_edges.hpp"
        "core/surface_mesh.hpp"
        "core/tetrahedral_solid.hpp"
        "core/texture_manager.hpp"
        "core/texture_storage.hpp"
        "core/texture1d.hpp"
        "core/texture2d.hpp"
        "core/texture3d.hpp"
        "core/triangulated_surface.hpp"
        "core/vertex_set.hpp"
        "core/geode/geode_edged_curve.hpp"
        "core/geode/geode_graph.hpp"
        "core/geode/geode_hybrid_solid.hpp"
        "core/geode/geode_point_set.hpp"
        "core/geode/geode_polygonal_surface.hpp"
        "core/geode/geode_polyhedral_solid.hpp"
        "core/geode/geode_regular_grid_solid.hpp"
        "core/geode/geode_regular_grid_surface.hpp"
        "core/geode/geode_tetrahedral_solid.hpp"
        "core/geode/geode_triangulated_surface.hpp"
        "core/geode/geode_vertex_set.hpp"
        "core/geode/register_mesh.hpp"
        "helpers/aabb_edged_curve_helpers.hpp"
        "helpers/aabb_surface_helpers.hpp"
        "helpers/aabb_solid_helpers.hpp"
        "helpers/build_grid.hpp"
        "helpers/convert_edged_curve.hpp"
        "helpers/convert_grid.hpp"
        "helpers/convert_point_set.hpp"
        "helpers/convert_surface_mesh.hpp"
        "helpers/convert_solid_mesh.hpp"
        "helpers/create_coordinate_system.hpp"
        "helpers/euclidean_distance_transform.hpp"
        "helpers/gradient_computation.hpp"
        "helpers/generic_solid_accessor.hpp"
        "helpers/generic_grid_accessor.hpp"
        "helpers/generic_surface_accessor.hpp"
        "helpers/generic_edged_curve_accessor.hpp"
        "helpers/hausdorff_distance.hpp"
        "helpers/nnsearch_mesh.hpp"
        "helpers/mesh_statistics.hpp"
        "helpers/rasterize.hpp"
        "helpers/ray_tracing.hpp"
        "helpers/grid_point_function.hpp"
        "helpers/grid_scalar_function.hpp"
        "helpers/repair_polygon_orientations.hpp"
        "helpers/tetrahedral_solid_point_function.hpp"
        "helpers/tetrahedral_solid_scalar_function.hpp"
        "helpers/triangulated_surface_point_function.hpp"
        "helpers/triangulated_surface_scalar_function.hpp"
        "io/edged_curve_input.hpp"
        "io/edged_curve_output.hpp"
        "io/graph_input.hpp"
        "io/graph_output.hpp"
        "io/hybrid_solid_input.hpp"
        "io/hybrid_solid_output.hpp"
        "io/light_regular_grid_input.hpp"
        "io/light_regular_grid_output.hpp"
        "io/point_set_input.hpp"
        "io/point_set_output.hpp"
        "io/polygonal_surface_input.hpp"
        "io/polygonal_surface_output.hpp"
        "io/polyhedral_solid_input.hpp"
        "io/polyhedral_solid_output.hpp"
        "io/regular_grid_input.hpp"
        "io/regular_grid_output.hpp"
        "io/tetrahedral_solid_input.hpp"
        "io/tetrahedral_solid_output.hpp"
        "io/triangulated_surface_input.hpp"
        "io/triangulated_surface_output.hpp"
        "io/vertex_set_input.hpp"
        "io/vertex_set_output.hpp"
        "io/geode/geode_bitsery_mesh_input.hpp"
        "io/geode/geode_bitsery_mesh_output.hpp"
        "io/geode/geode_edged_curve_input.hpp"
        "io/geode/geode_edged_curve_output.hpp"
        "io/geode/geode_graph_input.hpp"
        "io/geode/geode_graph_output.hpp"
        "io/geode/geode_hybrid_solid_input.hpp"
        "io/geode/geode_hybrid_solid_output.hpp"
        "io/geode/geode_light_regular_grid_input.hpp"
        "io/geode/geode_point_set_input.hpp"
        "io/geode/geode_point_set_output.hpp"
        "io/geode/geode_polygonal_surface_input.hpp"
        "io/geode/geode_polygonal_surface_output.hpp"
        "io/geode/geode_polyhedral_solid_input.hpp"
        "io/geode/geode_polyhedral_solid_output.hpp"
        "io/geode/geode_regular_grid_input.hpp"
        "io/geode/geode_regular_grid_output.hpp"
        "io/geode/geode_tetrahedral_solid_input.hpp"
        "io/geode/geode_tetrahedral_solid_output.hpp"
        "io/geode/geode_triangulated_surface_input.hpp"
        "io/geode/geode_triangulated_surface_output.hpp"
        "io/geode/geode_vertex_set_input.hpp"
        "io/geode/register_input.hpp"
        "io/geode/register_output.hpp"
    ADVANCED_HEADERS
        "core/detail/facet_storage.hpp"
        "core/detail/geode_elements.hpp"
        "core/detail/vertex_cycle.hpp"
        "helpers/detail/component_identifier.hpp"
        "helpers/detail/create_mesh.hpp"
        "helpers/detail/curve_merger.hpp"
        "helpers/detail/debug.hpp"
        "helpers/detail/element_identifier.hpp"
        "helpers/detail/mesh_intersection_detection.hpp"
        "helpers/detail/point_set_merger.hpp"
        "helpers/detail/solid_merger.hpp"
        "helpers/detail/solid_mesh_validity_fix.hpp"
        "helpers/detail/split_along_solid_facets.hpp"
        "helpers/detail/surface_merger.hpp"
        "helpers/detail/surface_mesh_validity_fix.hpp"
        "helpers/detail/vertex_merger.hpp"
    INTERNAL_HEADERS
        "core/internal/edges_impl.hpp"
        "core/internal/facet_edges_impl.hpp"
        "core/internal/grid_impl.hpp"
        "core/internal/points_impl.hpp"
        "core/internal/solid_mesh_impl.hpp"
        "core/internal/surface_mesh_impl.hpp"
        "core/internal/texture_impl.hpp"
        "helpers/internal/copy.hpp"
        "helpers/internal/grid_shape_function.hpp"
    PUBLIC_DEPENDENCIES
        absl::flat_hash_map
        Bitsery::bitsery
        ${PROJECT_NAME}::basic
        ${PROJECT_NAME}::geometry
    PRIVATE_DEPENDENCIES
        Async++
        ${PROJECT_NAME}::image
)
