// Copyright (c) 2019 GeometryFactory // // This file is part of CGAL (www.cgal.org); // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Maxime Gimeno // Mael Rouxel-Labbé #ifndef CGAL_BGL_IO_GENERIC_FACEGRAPH_BUILDER_H #define CGAL_BGL_IO_GENERIC_FACEGRAPH_BUILDER_H #include #include #include #include #include namespace CGAL{ namespace IO { namespace internal { template class Generic_facegraph_builder { protected: typedef std::vector Point_container; typedef typename Point_container::size_type size_type; typedef std::vector Face; typedef std::vector Face_container; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; public: Generic_facegraph_builder(std::istream& in_) : m_is(in_) { } template bool operator()(Graph& g, const NamedParameters& np = parameters::default_values()) { typedef typename GetK::Kernel Kernel; typedef typename Kernel::Vector_3 Vector; typedef typename Kernel::Point_2 Texture; typedef CGAL::IO::Color Color; typedef typename CGAL::GetVertexPointMap::type VPM; // usually will be true, but might not be the case if using custom type points // static_assert(std::is_same::value_type>::value); // static_assert(std::is_same::type>::value); typedef typename internal_np::Lookup_named_param_def< internal_np::vertex_normal_map_t, NamedParameters, Constant_property_map >::type VNM; typedef typename internal_np::Lookup_named_param_def< internal_np::vertex_color_map_t, NamedParameters, Constant_property_map >::type VCM; typedef typename internal_np::Lookup_named_param_def< internal_np::vertex_texture_map_t, NamedParameters, Constant_property_map >::type VTM; typedef typename internal_np::Lookup_named_param_def< internal_np::face_color_map_t, NamedParameters, Constant_property_map >::type FCM; typedef typename boost::property_traits::value_type Vertex_normal; typedef typename boost::property_traits::value_type Vertex_color; typedef typename boost::property_traits::value_type Vertex_texture; typedef typename boost::property_traits::value_type Face_color; using parameters::choose_parameter; using parameters::is_default_parameter; using parameters::get_parameter; const bool is_vnm_requested = !(is_default_parameter::value); const bool is_vcm_requested = !(is_default_parameter::value); const bool is_vtm_requested = !(is_default_parameter::value); const bool is_fcm_requested = !(is_default_parameter::value); std::vector vertex_normals; std::vector vertex_colors; std::vector vertex_textures; std::vector face_colors; const bool verbose = choose_parameter(get_parameter(np, internal_np::verbose), false); const bool binary = choose_parameter(get_parameter(np, internal_np::use_binary_mode), true); bool ok = static_cast(this)->read(m_is, m_points, m_faces, parameters::vertex_normal_output_iterator(std::back_inserter(vertex_normals)) .vertex_color_output_iterator(std::back_inserter(vertex_colors)) .vertex_texture_output_iterator(std::back_inserter(vertex_textures)) .face_color_output_iterator(std::back_inserter(face_colors)) .verbose(verbose) .use_binary_mode(binary)); if(!ok) return false; // Construct the graph VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(CGAL::vertex_point, g)); VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), VNM()); VCM vcm = choose_parameter(get_parameter(np, internal_np::vertex_color_map), VCM()); VTM vtm = choose_parameter(get_parameter(np, internal_np::vertex_texture_map), VTM()); FCM fcm = choose_parameter(get_parameter(np, internal_np::face_color_map), FCM()); const bool has_vertex_normals = (is_vnm_requested && !(vertex_normals.empty())); const bool has_vertex_colors = (is_vcm_requested && !(vertex_colors.empty())); const bool has_vertex_textures = (is_vtm_requested && !(vertex_textures.empty())); const bool has_face_colors = (is_fcm_requested && !(face_colors.empty())); if(has_vertex_normals && vertex_normals.size() != m_points.size()) return false; if(has_vertex_colors && vertex_colors.size() != m_points.size()) return false; if(has_vertex_textures && vertex_textures.size() != m_points.size()) return false; if(has_face_colors && face_colors.size() != m_faces.size()) return false; std::vector vertices(m_points.size()); for(std::size_t id=0, ps=m_points.size(); id face(m_faces[i].size()); for(std::size_t j=0, fis=face.size(); j::null_face()) { if (verbose) { std::cerr << "Error: Failed to add face [" << i << "]\n"; std::cerr << "Diagnostic:" << std::endl; CGAL_assertion_code(bool cannot_add = ) CGAL::Euler::can_add_face(face, g, true /*verbose*/); CGAL_assertion(!cannot_add); } return false; } if(has_face_colors) put(fcm, f, face_colors[i]); } return is_valid(g); } protected: std::istream& m_is; Point_container m_points; Face_container m_faces; }; } // namespace internal } // namespace IO } // namespace CGAL #endif // CGAL_BGL_IO_GENERIC_FACEGRAPH_BUILDER_H