// Copyright (c) 2018 GeometryFactory (France). // Copyright (c) 2004-2006 INRIA Sophia-Antipolis (France). // Copyright (c) 2009 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: GPL-3.0+ // // Author(s) : Laurent RINEAU, Stephane Tayeb, Maxime Gimeno #ifndef CGAL_VTP_IO_H #define CGAL_VTP_IO_H #include #include #include #include //todo try to factorize with functors namespace CGAL{ // writes the polys appended data at the end of the .vtp file template void write_polys(std::ostream& os, const Mesh & mesh, const NamedParameters& np) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::face_iterator face_iterator; typedef typename CGAL::Polygon_mesh_processing::GetVertexIndexMap::type Vimap; Vimap V = choose_param(get_param(np, CGAL::internal_np::vertex_index), get_const_property_map(CGAL::internal_np::vertex_index, mesh)); std::vector connectivity_table; std::vector offsets; std::vector cell_type(num_faces(mesh),5); // triangle == 5 std::size_t off = 0; for( face_iterator fit = faces(mesh).begin() ; fit != faces(mesh).end() ; ++fit ) { off += 3; offsets.push_back(off); BOOST_FOREACH(vertex_descriptor v, vertices_around_face(halfedge(*fit, mesh), mesh)) connectivity_table.push_back(V[v]); } write_vector(os,connectivity_table); write_vector(os,offsets); write_vector(os,cell_type); } //todo use named params for maps template void write_polys_tag(std::ostream& os, const Mesh & mesh, bool binary, std::size_t& offset, const NamedParameters& np) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::face_iterator face_iterator; typedef typename CGAL::Polygon_mesh_processing::GetVertexIndexMap::type Vimap; Vimap V = choose_param(get_param(np, CGAL::internal_np::vertex_index), get_const_property_map(CGAL::internal_np::vertex_index, mesh)); std::string formatattribute = binary ? " format=\"appended\"" : " format=\"ascii\""; std::string typeattribute; switch(sizeof(std::size_t)) { case 8: typeattribute = " type=\"UInt64\""; break; case 4: typeattribute = " type=\"UInt32\""; break; default: CGAL_error_msg("Unknown size of std::size_t"); } // Write connectivity table os << " \n" << " \n"; offset += (3 * num_faces(mesh)+ 1) * sizeof(std::size_t); // 3 indices (size_t) per triangle + length of the encoded data (size_t) } else { os << "\">\n"; for( face_iterator fit = faces(mesh).begin() ; fit != faces(mesh).end() ; ++fit ) { BOOST_FOREACH(vertex_descriptor v, vertices_around_face(halfedge(*fit, mesh), mesh)) os << V[v] << " "; } os << " \n"; } // Write offsets os << " \n"; offset += (num_faces(mesh) + 1) * sizeof(std::size_t); // 1 offset (size_t) per triangle + length of the encoded data (size_t) } else { os << "\">\n"; std::size_t polys_offset = 0; for( face_iterator fit = faces(mesh).begin() ; fit != faces(mesh).end() ; ++fit ) { polys_offset += 3; os << polys_offset << " "; } os << " \n"; } // Write cell type (triangle == 5) os << " \n"; offset += num_faces(mesh) + sizeof(std::size_t); // 1 unsigned char per cell + length of the encoded data (size_t) } else { os << "\">\n"; for(std::size_t i = 0; i< num_faces(mesh); ++i) os << "5 "; os << " \n"; } os << " \n"; } //todo : use namedparams for points and ids //overload for facegraph template void write_points_tag(std::ostream& os, const Mesh & mesh, bool binary, std::size_t& offset, const NamedParameters& np) { typedef typename boost::graph_traits::vertex_iterator vertex_iterator; typedef typename CGAL::Polygon_mesh_processing::GetVertexPointMap::const_type Vpmap; Vpmap vpm = choose_param(get_param(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, mesh)); typedef typename boost::property_traits::value_type Point_t; typedef typename CGAL::Kernel_traits::Kernel Gt; typedef typename Gt::FT FT; std::string format = binary ? "appended" : "ascii"; std::string type = (sizeof(FT) == 8) ? "Float64" : "Float32"; os << " \n" << " \n"; offset += 3 * num_vertices(mesh) * sizeof(FT) + sizeof(std::size_t); // 3 coords per points + length of the encoded data (size_t) } else { os << "\">\n"; for( vertex_iterator vit = vertices(mesh).begin(); vit != vertices(mesh).end(); ++vit) { os << get(vpm, *vit).x() << " " << get(vpm, *vit).y() << " " << get(vpm, *vit).z() << " "; } os << " \n"; } os << " \n"; } // writes the points appended data at the end of the .vtp file template void write_polys_points(std::ostream& os, const Mesh & mesh, const NamedParameters& np) { typedef typename boost::graph_traits::vertex_iterator vertex_iterator; typedef typename CGAL::Polygon_mesh_processing::GetVertexPointMap::const_type Vpmap; Vpmap vpm = choose_param(get_param(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, mesh)); typedef typename boost::property_traits::value_type Point_t; typedef typename CGAL::Kernel_traits::Kernel Gt; typedef typename Gt::FT FT; std::vector coordinates; for( vertex_iterator vit = vertices(mesh).begin(); vit != vertices(mesh).end(); ++vit) { coordinates.push_back(get(vpm, *vit).x()); coordinates.push_back(get(vpm, *vit).y()); coordinates.push_back(get(vpm, *vit).z()); } write_vector(os,coordinates); } //public API template void write_VTP(std::ostream& os, const TriangleMesh& mesh, bool binary, const NamedParameters& np) { os << "\n" << "\n" << " " << "\n"; os << " \n"; std::size_t offset = 0; write_points_tag(os,mesh,binary,offset, np); write_polys_tag(os,mesh,binary,offset, np); os << " \n" << " \n"; if (binary) { os << "\n_"; write_polys_points(os,mesh, np); write_polys(os,mesh, np); } os << "\n"; } template void write_VTP(std::ostream& os, const TriangleMesh& mesh, bool binary = true) { write_VTP(os, mesh, binary, CGAL::parameters::all_default()); } } //end CGAL #endif // CGAL_VTP_IO_H