From 32ecb119475d911daf94f48b0ab08bd83de21c9e Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 4 Jul 2022 10:25:59 +0200 Subject: [PATCH 001/341] CGAL: Initial commit to handle GraphicBuffer with Basic viewers. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 230 +++++++----------- 1 file changed, 92 insertions(+), 138 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 111b70f0fd39..0e9d90441902 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -47,8 +47,8 @@ #include #include -#include #include +#include #include #include #include @@ -111,54 +111,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer m_faces_mono_color(60, 60, 200), m_ambient_color(0.6f, 0.5f, 0.5f, 0.5f), m_are_buffers_initialized(false), - m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], - nullptr, - &m_bounding_box, - nullptr, nullptr, nullptr), - m_buffer_for_colored_points(&arrays[POS_COLORED_POINTS], - nullptr, - &m_bounding_box, - &arrays[COLOR_POINTS], - nullptr, nullptr), - m_buffer_for_mono_segments(&arrays[POS_MONO_SEGMENTS], - nullptr, - &m_bounding_box, - nullptr, nullptr, nullptr), - m_buffer_for_colored_segments(&arrays[POS_COLORED_SEGMENTS], - nullptr, - &m_bounding_box, - &arrays[COLOR_SEGMENTS], - nullptr, nullptr), - m_buffer_for_mono_rays(&arrays[POS_MONO_RAYS], - nullptr, - &m_bounding_box, - nullptr, nullptr), - m_buffer_for_colored_rays(&arrays[POS_COLORED_RAYS], - nullptr, - &m_bounding_box, - &arrays[COLOR_RAYS], - nullptr, nullptr), - m_buffer_for_mono_lines(&arrays[POS_MONO_RAYS], - nullptr, - &m_bounding_box, - nullptr, nullptr), - m_buffer_for_colored_lines(&arrays[POS_COLORED_LINES], - nullptr, - &m_bounding_box, - &arrays[COLOR_LINES], - nullptr, nullptr), - m_buffer_for_mono_faces(&arrays[POS_MONO_FACES], - nullptr, - &m_bounding_box, - nullptr, - &arrays[FLAT_NORMAL_MONO_FACES], - &arrays[SMOOTH_NORMAL_MONO_FACES]), - m_buffer_for_colored_faces(&arrays[POS_COLORED_FACES], - nullptr, - &m_bounding_box, - &arrays[COLOR_FACES], - &arrays[FLAT_NORMAL_COLORED_FACES], - &arrays[SMOOTH_NORMAL_COLORED_FACES]) + gBuffer(arrays,m_bounding_box) { // Define 'Control+Q' as the new exit shortcut (default was 'Escape') setShortcut(qglviewer::EXIT_VIEWER, ::Qt::CTRL, ::Qt::Key_Q); @@ -257,16 +210,16 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_empty() const { - return (m_buffer_for_mono_points.is_empty() && - m_buffer_for_colored_points.is_empty() && - m_buffer_for_mono_segments.is_empty() && - m_buffer_for_colored_segments.is_empty() && - m_buffer_for_mono_rays.is_empty() && - m_buffer_for_colored_rays.is_empty() && - m_buffer_for_mono_lines.is_empty() && - m_buffer_for_colored_lines.is_empty() && - m_buffer_for_mono_faces.is_empty() && - m_buffer_for_colored_faces.is_empty()); + return (gBuffer.get_buffer_for_mono_points().is_empty() && + gBuffer.get_buffer_for_colored_points().is_empty() && + gBuffer.get_buffer_for_mono_segments().is_empty() && + gBuffer.get_buffer_for_colored_segments().is_empty() && + gBuffer.get_buffer_for_mono_rays().is_empty() && + gBuffer.get_buffer_for_colored_rays().is_empty() && + gBuffer.get_buffer_for_mono_lines().is_empty() && + gBuffer.get_buffer_for_colored_lines().is_empty() && + gBuffer.get_buffer_for_mono_faces().is_empty() && + gBuffer.get_buffer_for_colored_faces().is_empty()); } const CGAL::Bbox_3& bounding_box() const @@ -275,46 +228,46 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool has_zero_x() const { return - m_buffer_for_mono_points.has_zero_x() && - m_buffer_for_colored_points.has_zero_x() && - m_buffer_for_mono_segments.has_zero_x() && - m_buffer_for_colored_segments.has_zero_x() && - m_buffer_for_mono_faces.has_zero_x() && - m_buffer_for_colored_faces.has_zero_x() && - m_buffer_for_mono_rays.has_zero_x() && - m_buffer_for_colored_rays.has_zero_x() && - m_buffer_for_mono_lines.has_zero_x() && - m_buffer_for_colored_lines.has_zero_x(); + gBuffer.get_buffer_for_mono_points().has_zero_x() && + gBuffer.get_buffer_for_colored_points().has_zero_x() && + gBuffer.get_buffer_for_mono_segments().has_zero_x() && + gBuffer.get_buffer_for_colored_segments().has_zero_x() && + gBuffer.get_buffer_for_mono_faces().has_zero_x() && + gBuffer.get_buffer_for_colored_faces().has_zero_x() && + gBuffer.get_buffer_for_mono_rays().has_zero_x() && + gBuffer.get_buffer_for_colored_rays().has_zero_x() && + gBuffer.get_buffer_for_mono_lines().has_zero_x() && + gBuffer.get_buffer_for_colored_lines().has_zero_x(); } bool has_zero_y() const { return - m_buffer_for_mono_points.has_zero_y() && - m_buffer_for_colored_points.has_zero_y() && - m_buffer_for_mono_segments.has_zero_y() && - m_buffer_for_colored_segments.has_zero_y() && - m_buffer_for_mono_faces.has_zero_y() && - m_buffer_for_colored_faces.has_zero_y() && - m_buffer_for_mono_rays.has_zero_y() && - m_buffer_for_colored_rays.has_zero_y() && - m_buffer_for_mono_lines.has_zero_y() && - m_buffer_for_colored_lines.has_zero_y(); + gBuffer.get_buffer_for_mono_points().has_zero_y() && + gBuffer.get_buffer_for_colored_points().has_zero_y() && + gBuffer.get_buffer_for_mono_segments().has_zero_y() && + gBuffer.get_buffer_for_colored_segments().has_zero_y() && + gBuffer.get_buffer_for_mono_faces().has_zero_y() && + gBuffer.get_buffer_for_colored_faces().has_zero_y() && + gBuffer.get_buffer_for_mono_rays().has_zero_y() && + gBuffer.get_buffer_for_colored_rays().has_zero_y() && + gBuffer.get_buffer_for_mono_lines().has_zero_y() && + gBuffer.get_buffer_for_colored_lines().has_zero_y(); } bool has_zero_z() const { return - m_buffer_for_mono_points.has_zero_z() && - m_buffer_for_colored_points.has_zero_z() && - m_buffer_for_mono_segments.has_zero_z() && - m_buffer_for_colored_segments.has_zero_z() && - m_buffer_for_mono_faces.has_zero_z() && - m_buffer_for_colored_faces.has_zero_z() && - m_buffer_for_mono_rays.has_zero_z() && - m_buffer_for_colored_rays.has_zero_z() && - m_buffer_for_mono_lines.has_zero_z() && - m_buffer_for_colored_lines.has_zero_z(); + gBuffer.get_buffer_for_mono_points().has_zero_z() && + gBuffer.get_buffer_for_colored_points().has_zero_z() && + gBuffer.get_buffer_for_mono_segments().has_zero_z() && + gBuffer.get_buffer_for_colored_segments().has_zero_z() && + gBuffer.get_buffer_for_mono_faces().has_zero_z() && + gBuffer.get_buffer_for_colored_faces().has_zero_z() && + gBuffer.get_buffer_for_mono_rays().has_zero_z() && + gBuffer.get_buffer_for_colored_rays().has_zero_z() && + gBuffer.get_buffer_for_mono_lines().has_zero_z() && + gBuffer.get_buffer_for_colored_lines().has_zero_z(); } Local_kernel::Plane_3 clipping_plane() const @@ -330,20 +283,20 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_point(const KPoint& p) - { m_buffer_for_mono_points.add_point(p); } + { gBuffer.add_point(p);} //get_buffer_for_mono_points().add_point(p); } template void add_point(const KPoint& p, const CGAL::IO::Color& acolor) - { m_buffer_for_colored_points.add_point(p, acolor); } + { gBuffer.get_buffer_for_colored_points().add_point(p, acolor); } template void add_segment(const KPoint& p1, const KPoint& p2) - { m_buffer_for_mono_segments.add_segment(p1, p2); } + { gBuffer.add_segment(p1, p2);}//get_buffer_for_mono_segments().add_segment(p1, p2); } template void add_segment(const KPoint& p1, const KPoint& p2, const CGAL::IO::Color& acolor) - { m_buffer_for_colored_segments.add_segment(p1, p2, acolor); } + { gBuffer.add_segment(p1, p2, acolor);}//get_buffer_for_colored_segments().add_segment(p1, p2, acolor); } template void update_bounding_box_for_ray(const KPoint &p, const KVector &v) @@ -370,29 +323,34 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_ray(const KPoint &p, const KVector &v) { double bigNumber = 1e30; - m_buffer_for_mono_rays.add_ray_segment(p, (p + (bigNumber)*v)); + gBuffer.get_buffer_for_mono_rays().add_ray_segment(p, (p + (bigNumber)*v)); + // gBuffer.get_buffer_for_mono_rays().add_ray(p, v); } template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) { - double bigNumber = 1e30; - m_buffer_for_colored_rays.add_ray_segment(p, (p + (bigNumber)*v), acolor); + // gBuffer.get_buffer_for_colored_rays().add_ray(p, v, acolor); + double bigNumber = 1e30; + gBuffer.get_buffer_for_colored_lines().add_ray_segment(p, (p + (bigNumber)*v), acolor); } template void add_line(const KPoint &p, const KVector &v) { - double bigNumber = 1e30; - m_buffer_for_mono_lines.add_line_segment((p - (bigNumber)*v), + // gBuffer.add_line(p,v); + double bigNumber = 1e30; + gBuffer.get_buffer_for_mono_lines().add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v)); } template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) { - double bigNumber = 1e30; - m_buffer_for_colored_lines.add_line_segment((p - (bigNumber)*v), + // gBuffer.add_line(p,v,acolor); + + double bigNumber = 1e30; + gBuffer.get_buffer_for_colored_lines().add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v), acolor); } @@ -413,8 +371,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_a_face_started() const { - return m_buffer_for_mono_faces.is_a_face_started() || - m_buffer_for_colored_faces.is_a_face_started(); + return gBuffer.get_buffer_for_mono_faces().is_a_face_started() || + gBuffer.get_buffer_for_colored_faces().is_a_face_started(); } void face_begin() @@ -424,7 +382,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer std::cerr<<"You cannot start a new face before to finish the previous one."< - bool add_point_in_face(const KPoint& kp) - { - if (m_buffer_for_mono_faces.is_a_face_started()) - { return m_buffer_for_mono_faces.add_point_in_face(kp); } - else if (m_buffer_for_colored_faces.is_a_face_started()) - { return m_buffer_for_colored_faces.add_point_in_face(kp); } - return false; + template + bool add_point_in_face(const KPoint &kp) { + return gBuffer.add_point_in_face(kp); } - template - bool add_point_in_face(const KPoint& kp, const KVector& p_normal) - { - if (m_buffer_for_mono_faces.is_a_face_started()) - { return m_buffer_for_mono_faces.add_point_in_face(kp, p_normal); } - else if (m_buffer_for_colored_faces.is_a_face_started()) - { return m_buffer_for_colored_faces.add_point_in_face(kp, p_normal); } - return false; + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal) { + return gBuffer.add_point_in_face(kp, p_normal); } void face_end() { - if (m_buffer_for_mono_faces.is_a_face_started()) - { m_buffer_for_mono_faces.face_end(); } - else if (m_buffer_for_colored_faces.is_a_face_started()) - { return m_buffer_for_colored_faces.face_end(); } + if (gBuffer.get_buffer_for_mono_faces().is_a_face_started()) + { + auto mono_faces = gBuffer.get_buffer_for_mono_faces(); + mono_faces.face_end(); + } + else if (gBuffer.get_buffer_for_colored_faces().is_a_face_started()) + { + auto colored_faces = gBuffer.get_buffer_for_colored_faces(); + return colored_faces.face_end(); + } } virtual void redraw() @@ -1422,8 +1382,11 @@ class Basic_viewer_qt : public CGAL::QGLViewer void negate_all_normals() { - m_buffer_for_mono_faces.negate_normals(); - m_buffer_for_colored_faces.negate_normals(); + auto mono_faces = gBuffer.get_buffer_for_mono_faces(); + mono_faces.negate_normals(); + + auto colored_faces = gBuffer.get_buffer_for_colored_faces(); + mono_faces.negate_normals(); } virtual void keyPressEvent(QKeyEvent *e) @@ -1682,6 +1645,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer } protected: + + GraphicBuffer gBuffer; + bool m_draw_vertices; bool m_draw_edges; bool m_draw_rays; @@ -1755,18 +1721,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; std::vector arrays[LAST_INDEX]; - Buffer_for_vao m_buffer_for_mono_points; - Buffer_for_vao m_buffer_for_colored_points; - Buffer_for_vao m_buffer_for_mono_segments; - Buffer_for_vao m_buffer_for_colored_segments; - Buffer_for_vao m_buffer_for_mono_rays; - Buffer_for_vao m_buffer_for_colored_rays; - Buffer_for_vao m_buffer_for_mono_lines; - Buffer_for_vao m_buffer_for_colored_lines; - Buffer_for_vao m_buffer_for_mono_faces; - Buffer_for_vao m_buffer_for_colored_faces; - Buffer_for_vao m_buffer_for_clipping_plane; - static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ (END_COLOR-BEGIN_COLOR)+2; // +2 for 2 vectors of normals From 79a8ed3d245977a432fd679cc82befded5dcde4f Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 4 Jul 2022 10:28:18 +0200 Subject: [PATCH 002/341] CGAL: Initial commit for buffer dealing. --- GraphicsView/include/CGAL/GraphicBuffer.h | 225 ++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 GraphicsView/include/CGAL/GraphicBuffer.h diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h new file mode 100644 index 000000000000..19dbc065977e --- /dev/null +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -0,0 +1,225 @@ +// Copyright (c) 2022 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s): Mostafa Ashraf + +#ifndef CGAL_GRAPHIC_BUFFER_H +#define CGAL_GRAPHIC_BUFFER_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +namespace CGAL { + +// This class is responsible to deal with CGAL data structures, +// filling mesh, and handling buffers. +template class GraphicBuffer { + +public: + GraphicBuffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) + : m_buffer_for_mono_points(&pos[POS_MONO_POINTS], nullptr, &bbox, nullptr, + nullptr, nullptr), + m_buffer_for_colored_points(&pos[POS_COLORED_POINTS], nullptr, &bbox, + &pos[COLOR_POINTS], nullptr, nullptr), + m_buffer_for_mono_segments(&pos[POS_MONO_SEGMENTS], nullptr, &bbox, + nullptr, nullptr, nullptr), + m_buffer_for_colored_segments(&pos[POS_COLORED_SEGMENTS], nullptr, + &bbox, &pos[COLOR_SEGMENTS], nullptr, + nullptr), + m_buffer_for_mono_rays(&pos[POS_MONO_RAYS], nullptr, &bbox, nullptr, + nullptr), + m_buffer_for_colored_rays(&pos[POS_COLORED_RAYS], nullptr, &bbox, + &pos[COLOR_RAYS], nullptr, nullptr), + m_buffer_for_mono_lines(&pos[POS_MONO_RAYS], nullptr, &bbox, nullptr, + nullptr), + m_buffer_for_colored_lines(&pos[POS_COLORED_LINES], nullptr, &bbox, + &pos[COLOR_LINES], nullptr, nullptr), + m_buffer_for_mono_faces(&pos[POS_MONO_FACES], nullptr, &bbox, nullptr, + &pos[FLAT_NORMAL_MONO_FACES], + &pos[SMOOTH_NORMAL_MONO_FACES]), + m_buffer_for_colored_faces(&pos[POS_COLORED_FACES], nullptr, &bbox, + &pos[COLOR_FACES], + &pos[FLAT_NORMAL_COLORED_FACES], + &pos[SMOOTH_NORMAL_COLORED_FACES]) {} + + const Buffer_for_vao &get_buffer_for_mono_points() const { + return m_buffer_for_mono_points; + } + + const Buffer_for_vao &get_buffer_for_colored_points() const { + return m_buffer_for_colored_points; + } + + const Buffer_for_vao &get_buffer_for_mono_segments() const { + return m_buffer_for_mono_segments; + } + + const Buffer_for_vao &get_buffer_for_colored_segments() const { + return m_buffer_for_colored_segments; + } + + const Buffer_for_vao &get_buffer_for_mono_rays() const { + return m_buffer_for_mono_rays; + } + + const Buffer_for_vao &get_buffer_for_colored_rays() const { + return m_buffer_for_colored_rays; + } + + const Buffer_for_vao &get_buffer_for_mono_lines() const { + return m_buffer_for_mono_lines; + } + + const Buffer_for_vao &get_buffer_for_colored_lines() const { + return m_buffer_for_colored_lines; + } + + const Buffer_for_vao &get_buffer_for_mono_faces() const { + return m_buffer_for_mono_faces; + } + + const Buffer_for_vao &get_buffer_for_colored_faces() const { + return m_buffer_for_colored_faces; + } + + const Buffer_for_vao &get_buffer_for_clipping_plane() const { + return m_buffer_for_clipping_plane; + } + + template void add_point(const KPoint &p) { + m_buffer_for_mono_points.add_point(p); + } + + template + void add_point(const KPoint &p, const CGAL::IO::Color &acolor) { + m_buffer_for_colored_points.add_point(p, acolor); + } + + template + void add_segment(const KPoint &p1, const KPoint &p2) { + m_buffer_for_mono_segments.add_segment(p1, p2); + } + + template + void add_segment(const KPoint &p1, const KPoint &p2, + const CGAL::IO::Color &acolor) { + m_buffer_for_colored_segments.add_segment(p1, p2, acolor); + } + + template + void add_ray(const KPoint &p, const KVector &v) { + double bigNumber = 1e30; + m_buffer_for_mono_rays.add_ray_segment(p, (p + (bigNumber)*v)); + } + + template + void add_ray(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor) { + double bigNumber = 1e30; + m_buffer_for_colored_rays.add_ray_segment(p, (p + (bigNumber)*v), acolor); + } + + template + void add_line(const KPoint &p, const KVector &v) { + double bigNumber = 1e30; + m_buffer_for_mono_lines.add_line_segment((p - (bigNumber)*v), + (p + (bigNumber)*v)); + } + + template + void add_line(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor) { + double bigNumber = 1e30; + m_buffer_for_colored_lines.add_line_segment((p - (bigNumber)*v), + (p + (bigNumber)*v), acolor); + } + + template bool add_point_in_face(const KPoint &kp) { + if (m_buffer_for_mono_faces.is_a_face_started()) { + return m_buffer_for_mono_faces.add_point_in_face(kp); + } else if (m_buffer_for_colored_faces.is_a_face_started()) { + return m_buffer_for_colored_faces.add_point_in_face(kp); + } + return false; + } + + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal) { + if (m_buffer_for_mono_faces.is_a_face_started()) { + return m_buffer_for_mono_faces.add_point_in_face(kp, p_normal); + } else if (m_buffer_for_colored_faces.is_a_face_started()) { + return m_buffer_for_colored_faces.add_point_in_face(kp, p_normal); + } + return false; + } + +protected: + // The following enum gives the indices of different elements of arrays + // vectors. + enum { + BEGIN_POS = 0, + POS_MONO_POINTS = BEGIN_POS, + POS_COLORED_POINTS, + POS_MONO_SEGMENTS, + POS_COLORED_SEGMENTS, + POS_MONO_RAYS, + POS_COLORED_RAYS, + POS_MONO_LINES, + POS_COLORED_LINES, + POS_MONO_FACES, + POS_COLORED_FACES, + POS_CLIPPING_PLANE, + END_POS, + BEGIN_COLOR = END_POS, + COLOR_POINTS = BEGIN_COLOR, + COLOR_SEGMENTS, + COLOR_RAYS, + COLOR_LINES, + COLOR_FACES, + END_COLOR, + BEGIN_NORMAL = END_COLOR, + SMOOTH_NORMAL_MONO_FACES = BEGIN_NORMAL, + FLAT_NORMAL_MONO_FACES, + SMOOTH_NORMAL_COLORED_FACES, + FLAT_NORMAL_COLORED_FACES, + END_NORMAL, + LAST_INDEX = END_NORMAL + }; + + Buffer_for_vao m_buffer_for_mono_points; + Buffer_for_vao m_buffer_for_colored_points; + Buffer_for_vao m_buffer_for_mono_segments; + Buffer_for_vao m_buffer_for_colored_segments; + Buffer_for_vao m_buffer_for_mono_rays; + Buffer_for_vao m_buffer_for_colored_rays; + Buffer_for_vao m_buffer_for_mono_lines; + Buffer_for_vao m_buffer_for_colored_lines; + Buffer_for_vao m_buffer_for_mono_faces; + Buffer_for_vao m_buffer_for_colored_faces; + Buffer_for_vao m_buffer_for_clipping_plane; +}; + +} // namespace CGAL + +#endif // CGAL_GRAPHIC_BUFFER_H From a859f50716e67c0f84954aa5658e495b1e8c5c9f Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 19 Jul 2022 09:36:45 +0200 Subject: [PATCH 003/341] fixes bugs, WIP constructor --- .../include/CGAL/Qt/Basic_viewer_qt.h | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 0e9d90441902..46bc11e50d13 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -161,6 +161,20 @@ class Basic_viewer_qt : public CGAL::QGLViewer { negate_all_normals(); } } + Basic_viewer_qt(QWidget* parent, + const char* title="", + bool draw_vertices=false, + bool draw_edges=true, + bool draw_faces=true, + bool use_mono_color=false, + bool inverse_normal=false, + bool draw_rays=true, + bool draw_lines=true, + bool draw_text=true, + bool no_2D_mode=false, + GraphicBuffer& buf) : + gBuffer(buf) {} + ~Basic_viewer_qt() { makeCurrent(); @@ -283,15 +297,15 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_point(const KPoint& p) - { gBuffer.add_point(p);} //get_buffer_for_mono_points().add_point(p); } + { gBuffer.add_point(p); } template void add_point(const KPoint& p, const CGAL::IO::Color& acolor) - { gBuffer.get_buffer_for_colored_points().add_point(p, acolor); } + { gBuffer.add_point(p, acolor); } template void add_segment(const KPoint& p1, const KPoint& p2) - { gBuffer.add_segment(p1, p2);}//get_buffer_for_mono_segments().add_segment(p1, p2); } + { gBuffer.add_segment(p1, p2);} template void add_segment(const KPoint& p1, const KPoint& p2, @@ -331,7 +345,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) { // gBuffer.get_buffer_for_colored_rays().add_ray(p, v, acolor); - double bigNumber = 1e30; + double bigNumber = 1e30; gBuffer.get_buffer_for_colored_lines().add_ray_segment(p, (p + (bigNumber)*v), acolor); } @@ -339,7 +353,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_line(const KPoint &p, const KVector &v) { // gBuffer.add_line(p,v); - double bigNumber = 1e30; + double bigNumber = 1e30; gBuffer.get_buffer_for_mono_lines().add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v)); } @@ -348,8 +362,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) { // gBuffer.add_line(p,v,acolor); - - double bigNumber = 1e30; + double bigNumber = 1e30; gBuffer.get_buffer_for_colored_lines().add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v), acolor); } From e51c41d7d638d7a54807ee2546fb62eae67efbab Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 19 Jul 2022 09:39:10 +0200 Subject: [PATCH 004/341] Handled buffers check. --- GraphicsView/include/CGAL/GraphicBuffer.h | 37 +++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 19dbc065977e..9405bd6a4d7c 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -32,8 +32,8 @@ namespace CGAL { -// This class is responsible to deal with CGAL data structures, -// filling mesh, and handling buffers. +// This class is responsible for dealing with available CGAL data structures and +// handling buffers. template class GraphicBuffer { public: @@ -174,6 +174,39 @@ template class GraphicBuffer { return false; } + bool is_a_face_started() const { + return m_buffer_for_mono_faces.is_a_face_started() || + m_buffer_for_colored_faces.is_a_face_started(); + } + + void face_begin() { + if (is_a_face_started()) { + std::cerr + << "You cannot start a new face before to finish the previous one." + << std::endl; + } else { + m_buffer_for_mono_faces.face_begin(); + } + } + + void face_begin(const CGAL::IO::Color &acolor) { + if (is_a_face_started()) { + std::cerr + << "You cannot start a new face before to finish the previous one." + << std::endl; + } else { + m_buffer_for_colored_faces.face_begin(acolor); + } + } + + void face_end() { + if (m_buffer_for_mono_faces.is_a_face_started()) { + m_buffer_for_mono_faces.face_end(); + } else if (m_buffer_for_colored_faces.is_a_face_started()) { + return m_buffer_for_colored_faces.face_end(); + } + } + protected: // The following enum gives the indices of different elements of arrays // vectors. From 81e42ffd733e2b4ae25627a5f391f4202518b947 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 19 Jul 2022 09:40:23 +0200 Subject: [PATCH 005/341] Initial commit handling basic viewers. The new version of dealing with CGAL basic viewers and data structures uses functions inserted of classes. --- ...aw_linear_cell_complex_functions_usage.cpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp diff --git a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp new file mode 100644 index 000000000000..5af105a84874 --- /dev/null +++ b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp @@ -0,0 +1,29 @@ +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<3> LCC; +typedef LCC::Dart_handle Dart_handle; +typedef LCC::Point Point; + +int main() +{ + LCC lcc; + Dart_handle dh1= + lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), + Point(5,5,0), Point(0,5,0), + Point(0,5,4), Point(0,0,4), + Point(5,0,4), Point(5,5,4)); + Dart_handle dh2= + lcc.make_hexahedron(Point(5,0,0), Point(10,0,0), + Point(10,5,0), Point(5,5,0), + Point(5,5,4), Point(5,0,4), + Point(10,0,4), Point(10,5,4)); + + lcc.sew<3>(lcc.beta(dh1, 1, 1, 2), lcc.beta(dh2, 2)); + + lcc.display_characteristics(std::cout)<<", valid=" + < Date: Tue, 19 Jul 2022 10:47:51 +0200 Subject: [PATCH 006/341] small correctioin --- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 46bc11e50d13..f8752bb45b86 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -162,6 +162,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer } Basic_viewer_qt(QWidget* parent, + GraphicBuffer<>& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -171,8 +172,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool draw_rays=true, bool draw_lines=true, bool draw_text=true, - bool no_2D_mode=false, - GraphicBuffer& buf) : + bool no_2D_mode=false) : gBuffer(buf) {} ~Basic_viewer_qt() From c1a64ea90d74c8542e0844c4c91b0b2ecf64e3bd Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 02:08:40 +0200 Subject: [PATCH 007/341] Deleted, Redundant. --- ...aw_linear_cell_complex_functions_usage.cpp | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp diff --git a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp deleted file mode 100644 index 5af105a84874..000000000000 --- a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex_functions_usage.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include - -typedef CGAL::Linear_cell_complex_for_combinatorial_map<3> LCC; -typedef LCC::Dart_handle Dart_handle; -typedef LCC::Point Point; - -int main() -{ - LCC lcc; - Dart_handle dh1= - lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), - Point(5,5,0), Point(0,5,0), - Point(0,5,4), Point(0,0,4), - Point(5,0,4), Point(5,5,4)); - Dart_handle dh2= - lcc.make_hexahedron(Point(5,0,0), Point(10,0,0), - Point(10,5,0), Point(5,5,0), - Point(5,5,4), Point(5,0,4), - Point(10,0,4), Point(10,5,4)); - - lcc.sew<3>(lcc.beta(dh1, 1, 1, 2), lcc.beta(dh2, 2)); - - lcc.display_characteristics(std::cout)<<", valid=" - < Date: Wed, 20 Jul 2022 09:40:17 +0200 Subject: [PATCH 008/341] Moved the graphical store elements, and used elements from the graphic buffer. Moved m_texts, arrays, m_bounding_box. Handled methods that use basic viewer arrays to use them from the graphic buffer. Moved a few methods. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 192 +++++++----------- 1 file changed, 77 insertions(+), 115 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index f8752bb45b86..affadf329221 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -215,7 +215,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer for (unsigned int i=0; i void add_text(const KPoint& kp, const QString& txt) { - Local_point p=get_local_point(kp); - m_texts.push_back(std::make_tuple(p, txt)); + gbuffer.add_text(kp, txt); } template void add_text(const KPoint& kp, const char* txt) - { add_text(kp, QString(txt)); } + { gbuffer.add_text(kp, txt); } template void add_text(const KPoint& kp, const std::string& txt) - { add_text(kp, txt.c_str()); } + { gbuffer.add_text(kp, txt.c_str()); } bool is_a_face_started() const { @@ -588,8 +548,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer unsigned int bufn = 0; CGAL_assertion(bufn(arrays[POS_MONO_POINTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_MONO_POINTS).data(), + static_cast(gbuffer.get_array_of_index(POS_MONO_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -605,8 +565,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_COLORED_POINTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index.(POS_COLORED_POINTS).data(), + static_cast(gbuffer.get_array_of_index(POS_COLORED_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); buffers[bufn].release(); @@ -614,8 +574,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[COLOR_POINTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(COLOR_POINTS).data(), + static_cast(gbuffer.get_array_of_index(COLOR_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -630,8 +590,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_MONO_SEGMENTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_MONO_SEGMENTS).data(), + static_cast(gbuffer.get_array_of_index(POS_MONO_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -647,8 +607,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_COLORED_SEGMENTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_COLORED_SEGMENTS).data(), + static_cast(gbuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -657,8 +617,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[COLOR_SEGMENTS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(COLOR_SEGMENTS).data(), + static_cast(gbuffer.get_array_of_index(COLOR_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -675,8 +635,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_MONO_RAYS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_MONO_RAYS).data(), + static_cast(gbuffer.get_array_of_index(POS_MONO_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -693,8 +653,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_COLORED_RAYS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_COLORED_RAYS).data(), + static_cast(gbuffer.get_array_of_index(POS_COLORED_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -703,8 +663,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[COLOR_RAYS].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(COLOR_RAYS).data(), + static_cast(gbuffer.get_array_of_index(COLOR_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -720,8 +680,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_MONO_LINES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_MONO_LINES).data(), + static_cast(gbuffer.get_array_of_index(POS_MONO_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -738,8 +698,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_COLORED_LINES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_COLORED_LINES).data(), + static_cast(gbuffer.get_array_of_index(POS_COLORED_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -748,8 +708,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[COLOR_LINES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(COLOR_LINES).data(), + static_cast(gbuffer.get_array_of_index(COLOR_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -768,8 +728,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_MONO_FACES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_MONO_FACES).data(), + static_cast(gbuffer.get_array_of_index(POS_MONO_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -781,14 +741,14 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(arrays[FLAT_NORMAL_MONO_FACES].data(), - static_cast(arrays[FLAT_NORMAL_MONO_FACES].size()* + buffers[bufn].allocate(gbuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).data(), + static_cast(gbuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).size()* sizeof(float))); } else { - buffers[bufn].allocate(arrays[SMOOTH_NORMAL_MONO_FACES].data(), - static_cast(arrays[SMOOTH_NORMAL_MONO_FACES].size()* + buffers[bufn].allocate(gbuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).data(), + static_cast(gbuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).size()* sizeof(float))); } rendering_program_face.enableAttributeArray("normal"); @@ -807,8 +767,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[POS_COLORED_FACES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_COLORED_FACES).data(), + static_cast(gbuffer.get_array_of_index(POS_COLORED_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -820,14 +780,14 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(arrays[FLAT_NORMAL_COLORED_FACES].data(), - static_cast(arrays[FLAT_NORMAL_COLORED_FACES].size()* + buffers[bufn].allocate(gbuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).data(), + static_cast(gbuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).size()* sizeof(float))); } else { - buffers[bufn].allocate(arrays[SMOOTH_NORMAL_COLORED_FACES].data(), - static_cast(arrays[SMOOTH_NORMAL_COLORED_FACES].size()* + buffers[bufn].allocate(gbuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).data(), + static_cast(gbuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).size()* sizeof(float))); } rendering_program_face.enableAttributeArray("normal"); @@ -839,8 +799,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(arrays[COLOR_FACES].size()*sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(COLOR_FACES).data(), + static_cast(gbuffer.get_array_of_index(COLOR_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("color"); rendering_program_face.setAttributeBuffer("color",GL_FLOAT,0,3); @@ -862,8 +822,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn < NB_VBO_BUFFERS); buffers[bufn].bind(); - buffers[bufn].allocate(arrays[POS_CLIPPING_PLANE].data(), - static_cast(arrays[POS_CLIPPING_PLANE].size() * sizeof(float))); + buffers[bufn].allocate(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).data(), + static_cast(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).size() * sizeof(float))); rendering_program_clipping_plane.enableAttributeArray("vertex"); rendering_program_clipping_plane.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); @@ -1017,7 +977,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_MONO_POINTS].size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_POINTS).size()/3)); vao[VAO_MONO_POINTS].release(); vao[VAO_COLORED_POINTS].bind(); @@ -1037,7 +997,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(arrays[POS_COLORED_POINTS].size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_POINTS).size()/3)); vao[VAO_COLORED_POINTS].release(); }; @@ -1076,7 +1036,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_MONO_SEGMENTS].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_SEGMENTS).size()/3)); vao[VAO_MONO_SEGMENTS].release(); vao[VAO_COLORED_SEGMENTS].bind(); @@ -1096,7 +1056,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_COLORED_SEGMENTS].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()/3)); vao[VAO_COLORED_SEGMENTS].release(); }; @@ -1128,7 +1088,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_rays_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_MONO_RAYS].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_RAYS).size()/3)); vao[VAO_MONO_RAYS].release(); vao[VAO_COLORED_RAYS].bind(); @@ -1145,7 +1105,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_COLORED_RAYS].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_RAYS).size()/3)); vao[VAO_COLORED_RAYS].release(); rendering_program_p_l.release(); @@ -1161,7 +1121,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_lines_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_MONO_LINES].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_LINES).size()/3)); vao[VAO_MONO_LINES].release(); rendering_program_p_l.release(); @@ -1180,7 +1140,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_COLORED_LINES].size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_LINES).size()/3)); vao[VAO_COLORED_LINES].release(); rendering_program_p_l.release(); @@ -1214,7 +1174,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_MONO_FACES].size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_FACES).size()/3)); vao[VAO_MONO_FACES].release(); vao[VAO_COLORED_FACES].bind(); @@ -1234,7 +1194,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_COLORED_FACES].size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_FACES).size()/3)); vao[VAO_COLORED_FACES].release(); }; @@ -1245,7 +1205,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.bind(); vao[VAO_CLIPPING_PLANE].bind(); glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast(arrays[POS_CLIPPING_PLANE].size() / 3)); + glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).size() / 3)); glLineWidth(1.0f); vao[VAO_CLIPPING_PLANE].release(); rendering_program_clipping_plane.release(); @@ -1371,25 +1331,26 @@ class Basic_viewer_qt : public CGAL::QGLViewer (bounding_box().zmax() - bounding_box().zmin())); const unsigned int nbSubdivisions=30; - arrays[POS_CLIPPING_PLANE].clear(); + gbuffer.get_array_of_index(POS_CLIPPING_PLANE).clear(); for (unsigned int i=0; i<=nbSubdivisions; ++i) { const float pos = float(size*(2.0*i/nbSubdivisions-1.0)); - arrays[POS_CLIPPING_PLANE].push_back(pos); - arrays[POS_CLIPPING_PLANE].push_back(float(-size)); - arrays[POS_CLIPPING_PLANE].push_back(0.f); - - arrays[POS_CLIPPING_PLANE].push_back(pos); - arrays[POS_CLIPPING_PLANE].push_back(float(+size)); - arrays[POS_CLIPPING_PLANE].push_back(0.f); - - arrays[POS_CLIPPING_PLANE].push_back(float(-size)); - arrays[POS_CLIPPING_PLANE].push_back(pos); - arrays[POS_CLIPPING_PLANE].push_back(0.f); - - arrays[POS_CLIPPING_PLANE].push_back(float(size)); - arrays[POS_CLIPPING_PLANE].push_back(pos); - arrays[POS_CLIPPING_PLANE].push_back(0.f); + auto array = gbuffer.get_array_of_index(POS_CLIPPING_PLANE); + array.push_back(pos); + array.push_back(float(-size)); + array.push_back(0.f); + + array.push_back(pos); + array.push_back(float(+size)); + array.push_back(0.f); + + array.push_back(float(-size)); + array.push_back(pos); + array.push_back(0.f); + + array.push_back(float(size)); + array.push_back(pos); + array.push_back(0.f); } } @@ -1732,6 +1693,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer END_NORMAL, LAST_INDEX=END_NORMAL }; + // TODO: deprecated, would remove! std::vector arrays[LAST_INDEX]; static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ From 8778d1c4b4d6a45b69605454f1178d22697d4918 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 09:50:38 +0200 Subject: [PATCH 009/341] Handled constructor. --- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index affadf329221..a024e37295bc 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -79,6 +79,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Constructor/Destructor Basic_viewer_qt(QWidget* parent, + GraphicBuffer<>& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -111,7 +112,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer m_faces_mono_color(60, 60, 200), m_ambient_color(0.6f, 0.5f, 0.5f, 0.5f), m_are_buffers_initialized(false), - gBuffer(arrays,m_bounding_box) + gBuffer(buf) { // Define 'Control+Q' as the new exit shortcut (default was 'Escape') setShortcut(qglviewer::EXIT_VIEWER, ::Qt::CTRL, ::Qt::Key_Q); @@ -161,20 +162,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer { negate_all_normals(); } } - Basic_viewer_qt(QWidget* parent, - GraphicBuffer<>& buf, - const char* title="", - bool draw_vertices=false, - bool draw_edges=true, - bool draw_faces=true, - bool use_mono_color=false, - bool inverse_normal=false, - bool draw_rays=true, - bool draw_lines=true, - bool draw_text=true, - bool no_2D_mode=false) : - gBuffer(buf) {} - ~Basic_viewer_qt() { makeCurrent(); From 46e1bc7fcafd24d6684501a607e9b8a9dc4d8085 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 10:02:17 +0200 Subject: [PATCH 010/341] Got member elements of basic viewer. added needed methods to work externally. --- GraphicsView/include/CGAL/GraphicBuffer.h | 127 ++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 9405bd6a4d7c..1c9755c53518 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -37,6 +37,8 @@ namespace CGAL { template class GraphicBuffer { public: + typedef Local_kernel::Point_3 Local_point; + GraphicBuffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) : m_buffer_for_mono_points(&pos[POS_MONO_POINTS], nullptr, &bbox, nullptr, nullptr, nullptr), @@ -63,6 +65,35 @@ template class GraphicBuffer { &pos[FLAT_NORMAL_COLORED_FACES], &pos[SMOOTH_NORMAL_COLORED_FACES]) {} + GraphicBuffer() + : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, + &m_bounding_box, nullptr, nullptr, nullptr), + m_buffer_for_colored_points(&arrays[POS_COLORED_POINTS], nullptr, + &m_bounding_box, &arrays[COLOR_POINTS], + nullptr, nullptr), + m_buffer_for_mono_segments(&arrays[POS_MONO_SEGMENTS], nullptr, + &m_bounding_box, nullptr, nullptr, nullptr), + m_buffer_for_colored_segments(&arrays[POS_COLORED_SEGMENTS], nullptr, + &m_bounding_box, &arrays[COLOR_SEGMENTS], + nullptr, nullptr), + m_buffer_for_mono_rays(&arrays[POS_MONO_RAYS], nullptr, &m_bounding_box, + nullptr, nullptr), + m_buffer_for_colored_rays(&arrays[POS_COLORED_RAYS], nullptr, + &m_bounding_box, &arrays[COLOR_RAYS], nullptr, + nullptr), + m_buffer_for_mono_lines(&arrays[POS_MONO_RAYS], nullptr, + &m_bounding_box, nullptr, nullptr), + m_buffer_for_colored_lines(&arrays[POS_COLORED_LINES], nullptr, + &m_bounding_box, &arrays[COLOR_LINES], + nullptr, nullptr), + m_buffer_for_mono_faces( + &arrays[POS_MONO_FACES], nullptr, &m_bounding_box, nullptr, + &arrays[FLAT_NORMAL_MONO_FACES], &arrays[SMOOTH_NORMAL_MONO_FACES]), + m_buffer_for_colored_faces(&arrays[POS_COLORED_FACES], nullptr, + &m_bounding_box, &arrays[COLOR_FACES], + &arrays[FLAT_NORMAL_COLORED_FACES], + &arrays[SMOOTH_NORMAL_COLORED_FACES]) {} + const Buffer_for_vao &get_buffer_for_mono_points() const { return m_buffer_for_mono_points; } @@ -107,6 +138,22 @@ template class GraphicBuffer { return m_buffer_for_clipping_plane; } + const CGAL::Bbox_3 &get_bounding_box() const { + return m_bounding_box; + } + + std::vector& get_array_of_index(int index) { + return arrays[index]; + } + + void update_bounding_box(CGAL::Bbox_3& box) { + m_bounding_box += box + } + + void initiate_bounding_box(CGAL::Bbox_3 new_bounding_box) { + m_bounding_box = new_bounding_box; + } + template void add_point(const KPoint &p) { m_buffer_for_mono_points.add_point(p); } @@ -207,6 +254,80 @@ template class GraphicBuffer { } } + bool is_empty() const { + return (gBuffer.get_buffer_for_mono_points().is_empty() && + gBuffer.get_buffer_for_colored_points().is_empty() && + gBuffer.get_buffer_for_mono_segments().is_empty() && + gBuffer.get_buffer_for_colored_segments().is_empty() && + gBuffer.get_buffer_for_mono_rays().is_empty() && + gBuffer.get_buffer_for_colored_rays().is_empty() && + gBuffer.get_buffer_for_mono_lines().is_empty() && + gBuffer.get_buffer_for_colored_lines().is_empty() && + gBuffer.get_buffer_for_mono_faces().is_empty() && + gBuffer.get_buffer_for_colored_faces().is_empty()); + } + + bool has_zero_x() const { + return gBuffer.get_buffer_for_mono_points().has_zero_x() && + gBuffer.get_buffer_for_colored_points().has_zero_x() && + gBuffer.get_buffer_for_mono_segments().has_zero_x() && + gBuffer.get_buffer_for_colored_segments().has_zero_x() && + gBuffer.get_buffer_for_mono_faces().has_zero_x() && + gBuffer.get_buffer_for_colored_faces().has_zero_x() && + gBuffer.get_buffer_for_mono_rays().has_zero_x() && + gBuffer.get_buffer_for_colored_rays().has_zero_x() && + gBuffer.get_buffer_for_mono_lines().has_zero_x() && + gBuffer.get_buffer_for_colored_lines().has_zero_x(); + } + + bool has_zero_y() const { + return gBuffer.get_buffer_for_mono_points().has_zero_y() && + gBuffer.get_buffer_for_colored_points().has_zero_y() && + gBuffer.get_buffer_for_mono_segments().has_zero_y() && + gBuffer.get_buffer_for_colored_segments().has_zero_y() && + gBuffer.get_buffer_for_mono_faces().has_zero_y() && + gBuffer.get_buffer_for_colored_faces().has_zero_y() && + gBuffer.get_buffer_for_mono_rays().has_zero_y() && + gBuffer.get_buffer_for_colored_rays().has_zero_y() && + gBuffer.get_buffer_for_mono_lines().has_zero_y() && + gBuffer.get_buffer_for_colored_lines().has_zero_y(); + } + + bool has_zero_z() const { + return gBuffer.get_buffer_for_mono_points().has_zero_z() && + gBuffer.get_buffer_for_colored_points().has_zero_z() && + gBuffer.get_buffer_for_mono_segments().has_zero_z() && + gBuffer.get_buffer_for_colored_segments().has_zero_z() && + gBuffer.get_buffer_for_mono_faces().has_zero_z() && + gBuffer.get_buffer_for_colored_faces().has_zero_z() && + gBuffer.get_buffer_for_mono_rays().has_zero_z() && + gBuffer.get_buffer_for_colored_rays().has_zero_z() && + gBuffer.get_buffer_for_mono_lines().has_zero_z() && + gBuffer.get_buffer_for_colored_lines().has_zero_z(); + } + + template + static Local_point get_local_point(const KPoint &p) { + return internal::Geom_utils::Kernel, + Local_kernel>::get_local_point(p); + } + + template + void add_text(const KPoint &kp, const QString &txt) { + Local_point p = get_local_point(kp); + m_texts.push_back(std::make_tuple(p, txt)); + } + + template void add_text(const KPoint &kp, const char *txt) { + add_text(kp, QString(txt)); + } + + template + void add_text(const KPoint &kp, const std::string &txt) { + add_text(kp, txt.c_str()); + } + + protected: // The following enum gives the indices of different elements of arrays // vectors. @@ -251,6 +372,12 @@ template class GraphicBuffer { Buffer_for_vao m_buffer_for_mono_faces; Buffer_for_vao m_buffer_for_colored_faces; Buffer_for_vao m_buffer_for_clipping_plane; + + std::vector> m_texts; + + std::vector arrays[LAST_INDEX]; + + CGAL::Bbox_3 m_bounding_box; }; } // namespace CGAL From 2a3144b7f308ff1b63e52ef285791ed5b7043c4e Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 10:04:47 +0200 Subject: [PATCH 011/341] Dealing bounding box from the graphic buffer. TODO for expected would remove --- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index a024e37295bc..7c5227702d0b 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -205,7 +205,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer { gbuffer.get_array_of_index(i).clear(); } } - m_bounding_box=CGAL::Bbox_3(); + gbuffer.initiate_bounding_box(CGAL::Bbox_3()); m_texts.clear(); } @@ -215,7 +215,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer } const CGAL::Bbox_3& bounding_box() const - { return m_bounding_box; } + { + auto bounding_box = gbuffer.get_bounding_box(); + return bounding_box; + } bool has_zero_x() const { @@ -266,7 +269,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer Local_point lp = get_local_point(p); Local_vector lv = get_local_vector(v); CGAL::Bbox_3 b = (lp + lv).bbox(); - m_bounding_box += b; + gbuffer.update_bounding_box(b); } template @@ -278,7 +281,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer Local_vector lpv = get_local_vector(pv); CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - m_bounding_box += b; + gbuffer.update_bounding_box(b); } template @@ -1644,6 +1647,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer QVector4D m_ambient_color; bool m_are_buffers_initialized; + // TODO: deprecated, would remove! CGAL::Bbox_3 m_bounding_box; // CGAL::qglviewer::LocalConstraint constraint; @@ -1713,6 +1717,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool clipping_plane_rendering = true; // will be toggled when alt+c is pressed, which is used for indicating whether or not to render the clipping plane ; float clipping_plane_rendering_transparency = 0.5f; // to what extent the transparent part should be rendered; + // TODO: deprecated, would remove! std::vector > m_texts; }; From c3541b2c6f963c4c107026c4867cb3f400baa67b Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 10:06:10 +0200 Subject: [PATCH 012/341] Use the new version. --- .../examples/Linear_cell_complex/draw_linear_cell_complex.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp index 429d1c0a1c7b..48cc41de9d19 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp +++ b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp @@ -1,5 +1,7 @@ #include -#include +// NOTE: deprecated, would remove +// #include +#include typedef CGAL::Linear_cell_complex_for_combinatorial_map<3> LCC; typedef LCC::Dart_handle Dart_handle; From 5d7bb6848051ee75425549d8115095c99793bf63 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 11:46:30 +0200 Subject: [PATCH 013/341] Fixed typo, added forward declaration at basic viewers. --- GraphicsView/include/CGAL/GraphicBuffer.h | 3 +- .../include/CGAL/Qt/Basic_viewer_qt.h | 139 +++++++++--------- 2 files changed, 74 insertions(+), 68 deletions(-) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 1c9755c53518..75e9a478da6f 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -147,7 +148,7 @@ template class GraphicBuffer { } void update_bounding_box(CGAL::Bbox_3& box) { - m_bounding_box += box + m_bounding_box += box; } void initiate_bounding_box(CGAL::Bbox_3 new_bounding_box) { diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 7c5227702d0b..75390e7ee24c 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -69,7 +69,11 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) while(res.red()==255 && res.green()==255 && res.blue()==255); return res; } + +template +class GraphicBuffer; //------------------------------------------------------------------------------ +template class Basic_viewer_qt : public CGAL::QGLViewer { public: @@ -202,37 +206,37 @@ class Basic_viewer_qt : public CGAL::QGLViewer for (unsigned int i=0; i @@ -281,7 +285,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer Local_vector lpv = get_local_vector(pv); CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - gbuffer.update_bounding_box(b); + gBuffer.update_bounding_box(b); } template @@ -321,16 +325,16 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_text(const KPoint& kp, const QString& txt) { - gbuffer.add_text(kp, txt); + gBuffer.add_text(kp, txt); } template void add_text(const KPoint& kp, const char* txt) - { gbuffer.add_text(kp, txt); } + { gBuffer.add_text(kp, txt); } template void add_text(const KPoint& kp, const std::string& txt) - { gbuffer.add_text(kp, txt.c_str()); } + { gBuffer.add_text(kp, txt.c_str()); } bool is_a_face_started() const { @@ -384,7 +388,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer else if (gBuffer.get_buffer_for_colored_faces().is_a_face_started()) { auto colored_faces = gBuffer.get_buffer_for_colored_faces(); - return colored_faces.face_end(); + // return colored_faces.face_end(); + colored_faces.face_end(); } } @@ -538,8 +543,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer unsigned int bufn = 0; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_MONO_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_MONO_POINTS).data(), + static_cast(gBuffer.get_array_of_index(POS_MONO_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -555,8 +560,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_COLORED_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_COLORED_POINTS).data(), + static_cast(gBuffer.get_array_of_index(POS_COLORED_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); buffers[bufn].release(); @@ -564,8 +569,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(COLOR_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(COLOR_POINTS).data(), + static_cast(gBuffer.get_array_of_index(COLOR_POINTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -580,8 +585,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_MONO_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_MONO_SEGMENTS).data(), + static_cast(gBuffer.get_array_of_index(POS_MONO_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -597,8 +602,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_COLORED_SEGMENTS).data(), + static_cast(gBuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -607,8 +612,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(COLOR_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(COLOR_SEGMENTS).data(), + static_cast(gBuffer.get_array_of_index(COLOR_SEGMENTS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -625,8 +630,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_MONO_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_MONO_RAYS).data(), + static_cast(gBuffer.get_array_of_index(POS_MONO_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -643,8 +648,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_COLORED_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_COLORED_RAYS).data(), + static_cast(gBuffer.get_array_of_index(POS_COLORED_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -653,8 +658,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(COLOR_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(COLOR_RAYS).data(), + static_cast(gBuffer.get_array_of_index(COLOR_RAYS).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -670,8 +675,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_MONO_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_MONO_LINES).data(), + static_cast(gBuffer.get_array_of_index(POS_MONO_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -688,8 +693,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_COLORED_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_COLORED_LINES).data(), + static_cast(gBuffer.get_array_of_index(POS_COLORED_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -698,8 +703,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(COLOR_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(COLOR_LINES).data(), + static_cast(gBuffer.get_array_of_index(COLOR_LINES).size()*sizeof(float))); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -718,8 +723,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_MONO_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_MONO_FACES).data(), + static_cast(gBuffer.get_array_of_index(POS_MONO_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -731,14 +736,14 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(gbuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).data(), - static_cast(gbuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).size()* + buffers[bufn].allocate(gBuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).data(), + static_cast(gBuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).size()* sizeof(float))); } else { - buffers[bufn].allocate(gbuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).data(), - static_cast(gbuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).size()* + buffers[bufn].allocate(gBuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).data(), + static_cast(gBuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).size()* sizeof(float))); } rendering_program_face.enableAttributeArray("normal"); @@ -757,8 +762,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(POS_COLORED_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_COLORED_FACES).data(), + static_cast(gBuffer.get_array_of_index(POS_COLORED_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -770,14 +775,14 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(gbuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).data(), - static_cast(gbuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).size()* + buffers[bufn].allocate(gBuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).data(), + static_cast(gBuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).size()* sizeof(float))); } else { - buffers[bufn].allocate(gbuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).data(), - static_cast(gbuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).size()* + buffers[bufn].allocate(gBuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).data(), + static_cast(gBuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).size()* sizeof(float))); } rendering_program_face.enableAttributeArray("normal"); @@ -789,8 +794,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gbuffer.get_array_of_index(COLOR_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(COLOR_FACES).data(), + static_cast(gBuffer.get_array_of_index(COLOR_FACES).size()*sizeof(float))); rendering_program_face.enableAttributeArray("color"); rendering_program_face.setAttributeBuffer("color",GL_FLOAT,0,3); @@ -812,8 +817,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn < NB_VBO_BUFFERS); buffers[bufn].bind(); - buffers[bufn].allocate(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).data(), - static_cast(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).size() * sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).data(), + static_cast(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).size() * sizeof(float))); rendering_program_clipping_plane.enableAttributeArray("vertex"); rendering_program_clipping_plane.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); @@ -967,7 +972,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_POINTS).size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_POINTS).size()/3)); vao[VAO_MONO_POINTS].release(); vao[VAO_COLORED_POINTS].bind(); @@ -987,7 +992,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_POINTS).size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_POINTS).size()/3)); vao[VAO_COLORED_POINTS].release(); }; @@ -1026,7 +1031,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_SEGMENTS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_SEGMENTS).size()/3)); vao[VAO_MONO_SEGMENTS].release(); vao[VAO_COLORED_SEGMENTS].bind(); @@ -1046,7 +1051,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()/3)); vao[VAO_COLORED_SEGMENTS].release(); }; @@ -1078,7 +1083,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_rays_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_RAYS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_RAYS).size()/3)); vao[VAO_MONO_RAYS].release(); vao[VAO_COLORED_RAYS].bind(); @@ -1095,7 +1100,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_RAYS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_RAYS).size()/3)); vao[VAO_COLORED_RAYS].release(); rendering_program_p_l.release(); @@ -1111,7 +1116,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_lines_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_LINES).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_LINES).size()/3)); vao[VAO_MONO_LINES].release(); rendering_program_p_l.release(); @@ -1130,7 +1135,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_LINES).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_LINES).size()/3)); vao[VAO_COLORED_LINES].release(); rendering_program_p_l.release(); @@ -1164,7 +1169,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gbuffer.get_array_of_index(POS_MONO_FACES).size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_FACES).size()/3)); vao[VAO_MONO_FACES].release(); vao[VAO_COLORED_FACES].bind(); @@ -1184,7 +1189,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gbuffer.get_array_of_index(POS_COLORED_FACES).size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_FACES).size()/3)); vao[VAO_COLORED_FACES].release(); }; @@ -1195,7 +1200,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.bind(); vao[VAO_CLIPPING_PLANE].bind(); glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast(gbuffer.get_array_of_index(POS_CLIPPING_PLANE).size() / 3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).size() / 3)); glLineWidth(1.0f); vao[VAO_CLIPPING_PLANE].release(); rendering_program_clipping_plane.release(); @@ -1321,11 +1326,11 @@ class Basic_viewer_qt : public CGAL::QGLViewer (bounding_box().zmax() - bounding_box().zmin())); const unsigned int nbSubdivisions=30; - gbuffer.get_array_of_index(POS_CLIPPING_PLANE).clear(); + gBuffer.get_array_of_index(POS_CLIPPING_PLANE).clear(); for (unsigned int i=0; i<=nbSubdivisions; ++i) { const float pos = float(size*(2.0*i/nbSubdivisions-1.0)); - auto array = gbuffer.get_array_of_index(POS_CLIPPING_PLANE); + auto array = gBuffer.get_array_of_index(POS_CLIPPING_PLANE); array.push_back(pos); array.push_back(float(-size)); array.push_back(0.f); @@ -1610,7 +1615,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer protected: - GraphicBuffer gBuffer; + GraphicBuffer gBuffer; bool m_draw_vertices; bool m_draw_edges; From 2cc082e2ada1895975da867c8133716cae3e9928 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 12:13:04 +0200 Subject: [PATCH 014/341] Fixed typo, added local kernel. --- GraphicsView/include/CGAL/GraphicBuffer.h | 84 ++++++++++++----------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 75e9a478da6f..1a4ca391cacf 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -29,7 +29,7 @@ #include #include -#include +// #include namespace CGAL { @@ -38,6 +38,8 @@ namespace CGAL { template class GraphicBuffer { public: + + typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; GraphicBuffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) @@ -256,55 +258,55 @@ template class GraphicBuffer { } bool is_empty() const { - return (gBuffer.get_buffer_for_mono_points().is_empty() && - gBuffer.get_buffer_for_colored_points().is_empty() && - gBuffer.get_buffer_for_mono_segments().is_empty() && - gBuffer.get_buffer_for_colored_segments().is_empty() && - gBuffer.get_buffer_for_mono_rays().is_empty() && - gBuffer.get_buffer_for_colored_rays().is_empty() && - gBuffer.get_buffer_for_mono_lines().is_empty() && - gBuffer.get_buffer_for_colored_lines().is_empty() && - gBuffer.get_buffer_for_mono_faces().is_empty() && - gBuffer.get_buffer_for_colored_faces().is_empty()); + return (m_buffer_for_mono_points.is_empty() && + m_buffer_for_colored_points.is_empty() && + m_buffer_for_mono_segments.is_empty() && + m_buffer_for_colored_segments.is_empty() && + m_buffer_for_mono_rays.is_empty() && + m_buffer_for_colored_rays.is_empty() && + m_buffer_for_mono_lines.is_empty() && + m_buffer_for_colored_lines.is_empty() && + m_buffer_for_mono_faces.is_empty() && + m_buffer_for_colored_faces.is_empty()); } bool has_zero_x() const { - return gBuffer.get_buffer_for_mono_points().has_zero_x() && - gBuffer.get_buffer_for_colored_points().has_zero_x() && - gBuffer.get_buffer_for_mono_segments().has_zero_x() && - gBuffer.get_buffer_for_colored_segments().has_zero_x() && - gBuffer.get_buffer_for_mono_faces().has_zero_x() && - gBuffer.get_buffer_for_colored_faces().has_zero_x() && - gBuffer.get_buffer_for_mono_rays().has_zero_x() && - gBuffer.get_buffer_for_colored_rays().has_zero_x() && - gBuffer.get_buffer_for_mono_lines().has_zero_x() && - gBuffer.get_buffer_for_colored_lines().has_zero_x(); + return m_buffer_for_mono_points.has_zero_x() && + m_buffer_for_colored_points.has_zero_x() && + m_buffer_for_mono_segments.has_zero_x() && + m_buffer_for_colored_segments.has_zero_x() && + m_buffer_for_mono_faces.has_zero_x() && + m_buffer_for_colored_faces.has_zero_x() && + m_buffer_for_mono_rays.has_zero_x() && + m_buffer_for_colored_rays.has_zero_x() && + m_buffer_for_mono_lines.has_zero_x() && + m_buffer_for_colored_lines.has_zero_x(); } bool has_zero_y() const { - return gBuffer.get_buffer_for_mono_points().has_zero_y() && - gBuffer.get_buffer_for_colored_points().has_zero_y() && - gBuffer.get_buffer_for_mono_segments().has_zero_y() && - gBuffer.get_buffer_for_colored_segments().has_zero_y() && - gBuffer.get_buffer_for_mono_faces().has_zero_y() && - gBuffer.get_buffer_for_colored_faces().has_zero_y() && - gBuffer.get_buffer_for_mono_rays().has_zero_y() && - gBuffer.get_buffer_for_colored_rays().has_zero_y() && - gBuffer.get_buffer_for_mono_lines().has_zero_y() && - gBuffer.get_buffer_for_colored_lines().has_zero_y(); + return m_buffer_for_mono_points.has_zero_y() && + m_buffer_for_colored_points.has_zero_y() && + m_buffer_for_mono_segments.has_zero_y() && + m_buffer_for_colored_segments.has_zero_y() && + m_buffer_for_mono_faces.has_zero_y() && + m_buffer_for_colored_faces.has_zero_y() && + m_buffer_for_mono_rays.has_zero_y() && + m_buffer_for_colored_rays.has_zero_y() && + m_buffer_for_mono_lines.has_zero_y() && + m_buffer_for_colored_lines.has_zero_y(); } bool has_zero_z() const { - return gBuffer.get_buffer_for_mono_points().has_zero_z() && - gBuffer.get_buffer_for_colored_points().has_zero_z() && - gBuffer.get_buffer_for_mono_segments().has_zero_z() && - gBuffer.get_buffer_for_colored_segments().has_zero_z() && - gBuffer.get_buffer_for_mono_faces().has_zero_z() && - gBuffer.get_buffer_for_colored_faces().has_zero_z() && - gBuffer.get_buffer_for_mono_rays().has_zero_z() && - gBuffer.get_buffer_for_colored_rays().has_zero_z() && - gBuffer.get_buffer_for_mono_lines().has_zero_z() && - gBuffer.get_buffer_for_colored_lines().has_zero_z(); + return m_buffer_for_mono_points.has_zero_z() && + m_buffer_for_colored_points.has_zero_z() && + m_buffer_for_mono_segments.has_zero_z() && + m_buffer_for_colored_segments.has_zero_z() && + m_buffer_for_mono_faces.has_zero_z() && + m_buffer_for_colored_faces.has_zero_z() && + m_buffer_for_mono_rays.has_zero_z() && + m_buffer_for_colored_rays.has_zero_z() && + m_buffer_for_mono_lines.has_zero_z() && + m_buffer_for_colored_lines.has_zero_z(); } template From 405b64edb75e26802f8356d5d8b5b7fd48357e11 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 12:46:29 +0200 Subject: [PATCH 015/341] Initial commit of filling buffers and drawing it for each data structure. --- .../CGAL/draw_linear_cell_complex_function.h | 381 ++++++++++++++++++ 1 file changed, 381 insertions(+) create mode 100644 Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h new file mode 100644 index 000000000000..984b4d2fe57b --- /dev/null +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -0,0 +1,381 @@ +// Copyright (c) 2022 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s): Mostafa Ashraf + +#ifndef CGAL_DRAW_LCC_H +#define CGAL_DRAW_LCC_H + +#include +#include + +#ifdef CGAL_USE_BASIC_VIEWER +#include + +#include +#include + +namespace CGAL { + +// Default color functor; user can change it to have its own face color +struct DefaultDrawingFunctorLCC { + /// @return true iff the volume containing dh is drawn. + template + bool draw_volume(const LCC &, typename LCC::Dart_const_handle) const { + return true; + } + /// @return true iff the face containing dh is drawn. + template + bool draw_face(const LCC &, typename LCC::Dart_const_handle) const { + return true; + } + /// @return true iff the edge containing dh is drawn. + template + bool draw_edge(const LCC &, typename LCC::Dart_const_handle) const { + return true; + } + /// @return true iff the vertex containing dh is drawn. + template + bool draw_vertex(const LCC &, typename LCC::Dart_const_handle) const { + return true; + } + + /// @return true iff the volume containing dh is drawn in wireframe. + template + bool volume_wireframe(const LCC &, typename LCC::Dart_const_handle) const { + return false; + } + /// @return true iff the face containing dh is drawn in wireframe. + template + bool face_wireframe(const LCC &, typename LCC::Dart_const_handle) const { + return false; + } + + /// @return true iff the volume containing dh is colored. + template + bool colored_volume(const LCC &, typename LCC::Dart_const_handle) const { + return true; + } + /// @return true iff the face containing dh is colored. + /// if we have also colored_volume(alcc, dh), the volume color is + /// ignored and only the face color is considered. + template + bool colored_face(const LCC &, typename LCC::Dart_const_handle) const { + return false; + } + /// @return true iff the edge containing dh is colored. + template + bool colored_edge(const LCC &, typename LCC::Dart_const_handle) const { + return false; + } + /// @return true iff the vertex containing dh is colored. + template + bool colored_vertex(const LCC &, typename LCC::Dart_const_handle) const { + return false; + } + + /// @return the color of the volume containing dh + /// used only if colored_volume(alcc, dh) and !colored_face(alcc, dh) + template + CGAL::IO::Color volume_color(const LCC &alcc, + typename LCC::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(alcc.darts().index(dh))); + return get_random_color(random); + } + /// @return the color of the face containing dh + /// used only if colored_face(alcc, dh) + template + CGAL::IO::Color face_color(const LCC &alcc, + typename LCC::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(alcc.darts().index(dh))); + return get_random_color(random); + } + /// @return the color of the edge containing dh + /// used only if colored_edge(alcc, dh) + template + CGAL::IO::Color edge_color(const LCC &alcc, + typename LCC::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(alcc.darts().index(dh))); + return get_random_color(random); + } + /// @return the color of the vertex containing dh + /// used only if colored_vertex(alcc, dh) + template + CGAL::IO::Color vertex_color(const LCC &alcc, + typename LCC::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(alcc.darts().index(dh))); + return get_random_color(random); + } +}; + +template +struct LCC_geom_utils; + +template +struct LCC_geom_utils { + static typename Local_kernel::Vector_3 + get_vertex_normal(const LCC &lcc, typename LCC::Dart_const_handle dh) { + typename Local_kernel::Vector_3 n = + internal::Geom_utils:: + get_local_vector(CGAL::compute_normal_of_cell_0(lcc, dh)); + n = n / (CGAL::sqrt(n * n)); + return n; + } +}; + +template +struct LCC_geom_utils { + static typename Local_kernel::Vector_3 + get_vertex_normal(const LCC &, typename LCC::Dart_const_handle) { + typename Local_kernel::Vector_3 n = CGAL::NULL_VECTOR; + return n; + } +}; + +// Specialization of draw function. +#define CGAL_LCC_TYPE \ + CGAL::Linear_cell_complex_base + +// #define LCC CGAL_LCC_TYPE + +// TODO? +typedef typename LCC::Dart_const_handle Dart_const_handle; +typedef typename LCC::Traits Kernel; +typedef typename Kernel::Point Point; +typedef typename Kernel::Vector Vector; + +template +void compute_face(Dart_const_handle dh, Dart_const_handle voldh, const LCC *lcc, + bool m_nofaces, bool m_random_face_color, + const DrawingFunctorLCC &m_drawing_functor, + GraphicBuffer &graphic_buffer) { + if (m_nofaces || !m_drawing_functor.draw_face(*lcc, dh)) + return; + + // We fill only closed faces. + Dart_const_handle cur = dh; + Dart_const_handle min = dh; + do { + if (!lcc->is_next_exist(cur)) + return; // open face=>not filled + if (cur < min) + min = cur; + cur = lcc->next(cur); + } while (cur != dh); + + if (m_random_face_color) { + CGAL::Random random((unsigned int)(lcc->darts().index(dh))); + CGAL::IO::Color c = get_random_color(random); + graphic_buffer.face_begin(c); + } else if (m_drawing_functor.colored_face(*lcc, dh)) { + CGAL::IO::Color c = m_drawing_functor.face_color(*lcc, dh); + graphic_buffer.face_begin(c); + } else if (m_drawing_functor.colored_volume(*lcc, voldh)) { + CGAL::IO::Color c = m_drawing_functor.volume_color(*lcc, voldh); + graphic_buffer.face_begin(c); + } else { + graphic_buffer.face_begin(); + } + + cur = dh; + do { + graphic_buffer.add_point_in_face( + lcc->point(cur), + LCC_geom_utils::get_vertex_normal(*lcc, cur)); + cur = lcc->next(cur); + } while (cur != dh); + + graphic_buffer.face_end(); +} + +template +void compute_edge(Dart_const_handle dh, const LCC *lcc, + const DrawingFunctorLCC &m_drawing_functor, + GraphicBuffer &graphic_buffer) { + if (!m_drawing_functor.draw_edge(*lcc, dh)) + return; + + Point p1 = lcc->point(dh); + Dart_const_handle d2 = lcc->other_extremity(dh); + if (d2 != nullptr) { + if (m_drawing_functor.colored_edge(*lcc, dh)) { + graphic_buffer.add_segment(p1, lcc->point(d2), + m_drawing_functor.edge_color(*lcc, dh)); + } else { + graphic_buffer.add_segment(p1, lcc->point(d2)); + } + } +} + +template +void compute_vertex(Dart_const_handle dh, const LCC *lcc, + const DrawingFunctorLCC &m_drawing_functor, + GraphicBuffer &graphic_buffer) { + if (!m_drawing_functor.draw_vertex(*lcc, dh)) + return; + + if (m_drawing_functor.colored_vertex(*lcc, dh)) { + graphic_buffer.add_point(lcc->point(dh), + m_drawing_functor.vertex_color(*lcc, dh)); + } else { + graphic_buffer.add_point(lcc->point(dh)); + } +} + +template +void compute_elements(const LCC *lcc, + const DrawingFunctorLCC &m_drawing_functor, + bool m_nofaces, bool m_random_face_color, + GraphicBuffer &graphic_buffer) { + + if (lcc == nullptr) + return; + + typename LCC::size_type markvolumes = lcc->get_new_mark(); + typename LCC::size_type markfaces = lcc->get_new_mark(); + typename LCC::size_type markedges = lcc->get_new_mark(); + typename LCC::size_type markvertices = lcc->get_new_mark(); + typename LCC::size_type oriented_mark = lcc->get_new_mark(); + + lcc->orient(oriented_mark); + + for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), + itend = lcc->darts().end(); + it != itend; ++it) { + if (!lcc->is_marked(it, markvolumes) && + m_drawing_functor.draw_volume(*lcc, it)) { + for (typename LCC::template Dart_of_cell_basic_range<3>::const_iterator + itv = lcc->template darts_of_cell_basic<3>(it, markvolumes) + .begin(), + itvend = + lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); + itv != itvend; ++itv) { + lcc->mark(itv, markvolumes); // To be sure that all darts of the basic + // iterator will be marked + if (!lcc->is_marked(itv, markfaces) && + lcc->is_marked(itv, oriented_mark) && + m_drawing_functor.draw_face(*lcc, itv)) { + if (!m_drawing_functor.volume_wireframe(*lcc, itv) && + !m_drawing_functor.face_wireframe(*lcc, itv)) { + compute_face(itv, it, lcc, m_nofaces, m_random_face_color, + m_drawing_functor, graphic_buffer); + } + for (typename LCC::template Dart_of_cell_basic_range< + 2>::const_iterator + itf = lcc->template darts_of_cell_basic<2>(itv, markfaces) + .begin(), + itfend = lcc->template darts_of_cell_basic<2>(itv, markfaces) + .end(); + itf != itfend; ++itf) { + if (!m_drawing_functor.volume_wireframe(*lcc, itv) && + !m_drawing_functor.face_wireframe(*lcc, itv)) { + lcc->mark(itf, markfaces); + } // To be sure that all darts of the basic iterator will be marked + if (!lcc->is_marked(itf, markedges) && + m_drawing_functor.draw_edge(*lcc, itf)) { + compute_edge(itf, lcc, m_drawing_functor, graphic_buffer); + for (typename LCC::template Dart_of_cell_basic_range< + 1>::const_iterator + ite = + lcc->template darts_of_cell_basic<1>(itf, markedges) + .begin(), + iteend = + lcc->template darts_of_cell_basic<1>(itf, markedges) + .end(); + ite != iteend; ++ite) { + lcc->mark(ite, markedges); // To be sure that all darts of the + // basic iterator will be marked + if (!lcc->is_marked(ite, markvertices) && + m_drawing_functor.draw_vertex(*lcc, ite)) { + compute_vertex(ite, lcc, m_drawing_functor, graphic_buffer); + CGAL::mark_cell(*lcc, ite, markvertices); + } + } + } + } + } + } + } + } + + for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), + itend = lcc->darts().end(); + it != itend; ++it) { + lcc->unmark(it, markvertices); + lcc->unmark(it, markedges); + lcc->unmark(it, markfaces); + lcc->unmark(it, markvolumes); + lcc->unmark(it, oriented_mark); + } + + lcc->free_mark(markvolumes); + lcc->free_mark(markfaces); + lcc->free_mark(markedges); + lcc->free_mark(markvertices); + lcc->free_mark(oriented_mark); +} + +// This function is responsible for filling the buffer to allow visualization. +template +void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, + const DrawingFunctorLCC &m_drawing_functor, + const LCC *alcc = nullptr, bool nofill = false, + bool m_random_face_color = false + ) { + + if (alcc != nullptr) { + compute_elements(graphic_buffer, alcc, m_drawing_functor); + } +} + +template +void draw_buffer(GraphicBuffer &graphic_buffer) { + +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite = true; +#else + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4, 3); + int argc = 1; + const char *argv[2] = {"lccviewer", nullptr}; + QApplication app(argc, const_cast(argv)); + + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); + + basic_viewer.show(); + app.exec(); + } +} + +template class Map, + class Refs, class Storage_, + class DrawingFunctorLCC = DefaultDrawingFunctorLCC> +void draw(const CGAL_LCC_TYPE &alcc, + const char *title = "LCC for CMap Basic Viewer", bool nofill = false, + const DrawingFunctorLCC &drawing_functor = DrawingFunctorLCC()) { + GraphicBuffer buffer; + add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc, nofill, false); + draw_buffer(buffer); +} + +// Todo a function taking a const DrawingFunctorLCC& drawing_functor as +// parameter +#undef CGAL_LCC_TYPE + +} // End namespace CGAL + +#endif // CGAL_USE_BASIC_VIEWER + +#endif // CGAL_DRAW_LCC_H From e050176613818d03c8365a6c182b8f4791636daa Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 12:47:29 +0200 Subject: [PATCH 016/341] Removed forward declaration. --- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 75390e7ee24c..8e909e6fed87 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -70,8 +70,6 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) return res; } -template -class GraphicBuffer; //------------------------------------------------------------------------------ template class Basic_viewer_qt : public CGAL::QGLViewer From 0bc2f1050f653eb4d7e9a9ab9791de1fbafe1bea Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 12:48:29 +0200 Subject: [PATCH 017/341] Small modifications --- GraphicsView/include/CGAL/GraphicBuffer.h | 28 +++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 1a4ca391cacf..82ff62e04e59 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -13,6 +13,14 @@ #define CGAL_GRAPHIC_BUFFER_H #include +#include + +#include +#include +#include +#include +#include +#include #include #include @@ -24,9 +32,6 @@ #include #include -#include -#include -#include #include // #include @@ -35,10 +40,10 @@ namespace CGAL { // This class is responsible for dealing with available CGAL data structures and // handling buffers. -template class GraphicBuffer { +template +class GraphicBuffer { public: - typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; @@ -141,17 +146,11 @@ template class GraphicBuffer { return m_buffer_for_clipping_plane; } - const CGAL::Bbox_3 &get_bounding_box() const { - return m_bounding_box; - } + const CGAL::Bbox_3 &get_bounding_box() const { return m_bounding_box; } - std::vector& get_array_of_index(int index) { - return arrays[index]; - } + std::vector &get_array_of_index(int index) { return arrays[index]; } - void update_bounding_box(CGAL::Bbox_3& box) { - m_bounding_box += box; - } + void update_bounding_box(CGAL::Bbox_3 &box) { m_bounding_box += box; } void initiate_bounding_box(CGAL::Bbox_3 new_bounding_box) { m_bounding_box = new_bounding_box; @@ -330,7 +329,6 @@ template class GraphicBuffer { add_text(kp, txt.c_str()); } - protected: // The following enum gives the indices of different elements of arrays // vectors. From 01289f62217a8f8a7a311c7302159b7505643e2b Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 17:59:37 +0200 Subject: [PATCH 018/341] Trying to solve warninggit add GraphicsView/include/CGAL/GraphicBuffer.h --- GraphicsView/include/CGAL/GraphicBuffer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 82ff62e04e59..65f9160b0c3d 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -13,6 +13,7 @@ #define CGAL_GRAPHIC_BUFFER_H #include +// BUG: Warning - TODO? #include #include From 02cf9a1999de156b5b75daf1ab98ab3b8d7c1599 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 18:00:40 +0200 Subject: [PATCH 019/341] Trying to solve warning --- GraphicsView/include/CGAL/GraphicBuffer.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 65f9160b0c3d..35c2e902215b 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -14,6 +14,11 @@ #include // BUG: Warning - TODO? +/* +#include errors detected. Please update your includePath. ' +Squiggles are disabled for this translation unit + +*/ #include #include From 0f7d0c5c9248a3bdce75d9b6232e21a27b5a4bed Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 18:03:52 +0200 Subject: [PATCH 020/341] Fixed Dart_const_handle error --- .../CGAL/draw_linear_cell_complex_function.h | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 984b4d2fe57b..919e8f40208e 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -12,8 +12,8 @@ #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H -#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER #include @@ -138,24 +138,22 @@ struct LCC_geom_utils { } }; -// Specialization of draw function. -#define CGAL_LCC_TYPE \ - CGAL::Linear_cell_complex_base - // #define LCC CGAL_LCC_TYPE // TODO? -typedef typename LCC::Dart_const_handle Dart_const_handle; -typedef typename LCC::Traits Kernel; -typedef typename Kernel::Point Point; -typedef typename Kernel::Vector Vector; -template -void compute_face(Dart_const_handle dh, Dart_const_handle voldh, const LCC *lcc, + +template +void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, bool m_nofaces, bool m_random_face_color, const DrawingFunctorLCC &m_drawing_functor, GraphicBuffer &graphic_buffer) { + + typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::Traits Kernel; + typedef typename Kernel::Point Point; + typedef typename Kernel::Vector Vector; + if (m_nofaces || !m_drawing_functor.draw_face(*lcc, dh)) return; @@ -196,9 +194,13 @@ void compute_face(Dart_const_handle dh, Dart_const_handle voldh, const LCC *lcc, } template -void compute_edge(Dart_const_handle dh, const LCC *lcc, +void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, GraphicBuffer &graphic_buffer) { + typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::Traits Kernel; + typedef typename Kernel::Point Point; + if (!m_drawing_functor.draw_edge(*lcc, dh)) return; @@ -215,7 +217,7 @@ void compute_edge(Dart_const_handle dh, const LCC *lcc, } template -void compute_vertex(Dart_const_handle dh, const LCC *lcc, +void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, GraphicBuffer &graphic_buffer) { if (!m_drawing_functor.draw_vertex(*lcc, dh)) @@ -357,6 +359,11 @@ void draw_buffer(GraphicBuffer &graphic_buffer) { } } +// Specialization of draw function. +#define CGAL_LCC_TYPE \ + CGAL::Linear_cell_complex_base + template class Map, From c85f775651fe765ad2ab4e64354d0eacfcfce6c6 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 20 Jul 2022 18:05:42 +0200 Subject: [PATCH 021/341] TODO --- .../include/CGAL/draw_linear_cell_complex_function.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 919e8f40208e..cace65d7e300 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -337,6 +337,7 @@ void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, } } +// TODO: Move to Basic_viewer_qt.h template void draw_buffer(GraphicBuffer &graphic_buffer) { From a68ad47df0f84fe6c9da2654156540737ab56f0c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 22 Jul 2022 15:17:44 +0200 Subject: [PATCH 022/341] Local_Kernel error during compiling --- .../CGAL/draw_linear_cell_complex_function.h | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index cace65d7e300..afab1cf2f058 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -12,8 +12,8 @@ #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H -#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER #include @@ -138,13 +138,10 @@ struct LCC_geom_utils { } }; -// #define LCC CGAL_LCC_TYPE - -// TODO? - -template -void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, +template +void compute_face(typename LCC::Dart_const_handle dh, + typename LCC::Dart_const_handle voldh, const LCC *lcc, bool m_nofaces, bool m_random_face_color, const DrawingFunctorLCC &m_drawing_functor, GraphicBuffer &graphic_buffer) { @@ -232,10 +229,9 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, } template -void compute_elements(const LCC *lcc, +void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - bool m_nofaces, bool m_random_face_color, - GraphicBuffer &graphic_buffer) { + bool m_nofaces, bool m_random_face_color) { if (lcc == nullptr) return; @@ -327,13 +323,13 @@ void compute_elements(const LCC *lcc, // This function is responsible for filling the buffer to allow visualization. template void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, - const DrawingFunctorLCC &m_drawing_functor, + const DrawingFunctorLCC &m_drawing_functor, const LCC *alcc = nullptr, bool nofill = false, - bool m_random_face_color = false - ) { + bool m_random_face_color = false) { if (alcc != nullptr) { - compute_elements(graphic_buffer, alcc, m_drawing_functor); + compute_elements(graphic_buffer, alcc, m_drawing_functor, nofill, + m_random_face_color); } } From 9d0fb1e2899db6f4645e7c8532f97752dbd0ea5f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 22 Jul 2022 18:27:58 +0200 Subject: [PATCH 023/341] Correction of draw_linear_cell_complex_function --- .../include/CGAL/draw_linear_cell_complex_function.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index afab1cf2f058..50e23994a069 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -114,6 +114,13 @@ struct DefaultDrawingFunctorLCC { } }; + namespace draw_function + { + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Vector_3 Local_vector; + template struct LCC_geom_utils; @@ -320,6 +327,8 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, lcc->free_mark(oriented_mark); } +} // namespace draw_function + // This function is responsible for filling the buffer to allow visualization. template void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, @@ -328,7 +337,7 @@ void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, bool m_random_face_color = false) { if (alcc != nullptr) { - compute_elements(graphic_buffer, alcc, m_drawing_functor, nofill, + draw_function::compute_elements(graphic_buffer, alcc, m_drawing_functor, nofill, m_random_face_color); } } From 1dcca825bd506d245a0b857aa802677eae7459f0 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 25 Jul 2022 15:05:35 +0200 Subject: [PATCH 024/341] Move vector of texts --- GraphicsView/include/CGAL/GraphicBuffer.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 35c2e902215b..d2ff2d6e1df3 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -335,6 +335,18 @@ class GraphicBuffer { add_text(kp, txt.c_str()); } + void m_texts_clear() { + m_texts.clear(); + } + + int m_texts_size() { + return m_texts.size(); + } + + std::vector>& get_m_texts() { + return m_texts; + } + protected: // The following enum gives the indices of different elements of arrays // vectors. From b8509e4da1f6159dba9999ee0bbc118ff86bf309 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 25 Jul 2022 15:08:18 +0200 Subject: [PATCH 025/341] Fixed bugs, migrated variables to graphics buffer, and removes unneeded variables. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 8e909e6fed87..de94f6e40cfc 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -208,7 +208,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer } gBuffer.initiate_bounding_box(CGAL::Bbox_3()); - m_texts.clear(); + gBuffer.m_texts_clear(); } bool is_empty() const @@ -218,7 +218,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer const CGAL::Bbox_3& bounding_box() const { - auto bounding_box = gBuffer.get_bounding_box(); + const auto& bounding_box = gBuffer.get_bounding_box(); return bounding_box; } @@ -1260,14 +1260,15 @@ class Basic_viewer_qt : public CGAL::QGLViewer if (m_draw_text) { glDisable(GL_LIGHTING); - for (std::size_t i=0; iprojectedCoordinatesOf - (CGAL::qglviewer::Vec(std::get<0>(m_texts[i]).x(), - std::get<0>(m_texts[i]).y(), - std::get<0>(m_texts[i]).z())); + (CGAL::qglviewer::Vec(std::get<0>(m_texts_vec[i]).x(), + std::get<0>(m_texts_vec[i]).y(), + std::get<0>(m_texts_vec[i]).z())); - drawText((int)screenPos[0], (int)screenPos[1], std::get<1>(m_texts[i])); + drawText((int)screenPos[0], (int)screenPos[1], std::get<1>(m_texts_vec[i])); } glEnable(GL_LIGHTING); } @@ -1328,7 +1329,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer for (unsigned int i=0; i<=nbSubdivisions; ++i) { const float pos = float(size*(2.0*i/nbSubdivisions-1.0)); - auto array = gBuffer.get_array_of_index(POS_CLIPPING_PLANE); + auto& array = gBuffer.get_array_of_index(POS_CLIPPING_PLANE); array.push_back(pos); array.push_back(float(-size)); array.push_back(0.f); @@ -1650,8 +1651,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer QVector4D m_ambient_color; bool m_are_buffers_initialized; - // TODO: deprecated, would remove! - CGAL::Bbox_3 m_bounding_box; // CGAL::qglviewer::LocalConstraint constraint; CGAL::qglviewer::WorldConstraint constraint; @@ -1687,8 +1686,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer END_NORMAL, LAST_INDEX=END_NORMAL }; - // TODO: deprecated, would remove! - std::vector arrays[LAST_INDEX]; static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ (END_COLOR-BEGIN_COLOR)+2; // +2 for 2 vectors of normals @@ -1720,8 +1717,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool clipping_plane_rendering = true; // will be toggled when alt+c is pressed, which is used for indicating whether or not to render the clipping plane ; float clipping_plane_rendering_transparency = 0.5f; // to what extent the transparent part should be rendered; - // TODO: deprecated, would remove! - std::vector > m_texts; }; } // End namespace CGAL From c8c068ecff0db9325624c0c2a4e97dbbfc8f1ff6 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 25 Jul 2022 19:45:45 +0200 Subject: [PATCH 026/341] Moved draw_buffer function. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 25 +++++++++++++++++++ .../CGAL/draw_linear_cell_complex_function.h | 24 ------------------ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index de94f6e40cfc..f2943cc11dc0 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -53,6 +53,7 @@ #include #include #include +#include namespace CGAL { @@ -1719,6 +1720,30 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; +template +void draw_buffer(GraphicBuffer &graphic_buffer) { + +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite = true; +#else + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4, 3); + // Qt::init_ogl_context(4, 3); + + int argc = 1; + const char *argv[2] = {"lccviewer", nullptr}; + QApplication app(argc, const_cast(argv)); + + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); + + basic_viewer.show(); + app.exec(); + } +} + } // End namespace CGAL #else // CGAL_USE_BASIC_VIEWER diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 50e23994a069..615eb3d6a4a1 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -16,7 +16,6 @@ #include #ifdef CGAL_USE_BASIC_VIEWER -#include #include #include @@ -342,29 +341,6 @@ void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, } } -// TODO: Move to Basic_viewer_qt.h -template -void draw_buffer(GraphicBuffer &graphic_buffer) { - -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite = true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) { - CGAL::Qt::init_ogl_context(4, 3); - int argc = 1; - const char *argv[2] = {"lccviewer", nullptr}; - QApplication app(argc, const_cast(argv)); - - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); - - basic_viewer.show(); - app.exec(); - } -} - // Specialization of draw function. #define CGAL_LCC_TYPE \ CGAL::Linear_cell_complex_base Date: Wed, 31 Aug 2022 10:51:30 +0200 Subject: [PATCH 027/341] Removed nofill redundant, added formatting. --- .../CGAL/draw_linear_cell_complex_function.h | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 615eb3d6a4a1..df8d313f7731 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -7,7 +7,8 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s): Mostafa Ashraf +// Author(s): Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H @@ -113,13 +114,12 @@ struct DefaultDrawingFunctorLCC { } }; - namespace draw_function - { - +namespace draw_function { + typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; -typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - + template struct LCC_geom_utils; @@ -144,7 +144,6 @@ struct LCC_geom_utils { } }; - template void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, @@ -328,16 +327,23 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, } // namespace draw_function -// This function is responsible for filling the buffer to allow visualization. +/** + * @brief This function is responsible for filling the buffer to allow + * visualization. + * + * @param graphic_buffer + * @param m_drawing_functor + * @param alcc + */ template void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, const DrawingFunctorLCC &m_drawing_functor, - const LCC *alcc = nullptr, bool nofill = false, + const LCC *alcc = nullptr, bool m_random_face_color = false) { if (alcc != nullptr) { - draw_function::compute_elements(graphic_buffer, alcc, m_drawing_functor, nofill, - m_random_face_color); + draw_function::compute_elements(graphic_buffer, alcc, m_drawing_functor, + m_random_face_color); } } @@ -352,10 +358,10 @@ template void draw(const CGAL_LCC_TYPE &alcc, - const char *title = "LCC for CMap Basic Viewer", bool nofill = false, + const char *title = "LCC for CMap Basic Viewer", const DrawingFunctorLCC &drawing_functor = DrawingFunctorLCC()) { GraphicBuffer buffer; - add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc, nofill, false); + add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc, false); draw_buffer(buffer); } From 8e3b1bef758aa461908e227a4628567e23b4b34c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Wed, 31 Aug 2022 11:06:07 +0200 Subject: [PATCH 028/341] Fix typo bug in the variable name. --- .../include/CGAL/draw_linear_cell_complex_function.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index df8d313f7731..2990c02778ce 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -334,16 +334,17 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, * @param graphic_buffer * @param m_drawing_functor * @param alcc + * @param anofaces if true, do not draw faces. */ template void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, const DrawingFunctorLCC &m_drawing_functor, - const LCC *alcc = nullptr, + const LCC *alcc = nullptr, bool nofaces = false, bool m_random_face_color = false) { if (alcc != nullptr) { draw_function::compute_elements(graphic_buffer, alcc, m_drawing_functor, - m_random_face_color); + nofaces, m_random_face_color); } } From ebc4b65607c61ad5a43e8b1f2fd88bd69b4401ce Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Sep 2022 08:37:31 +0200 Subject: [PATCH 029/341] Initial commit for modifying demo. --- .../demo/Linear_cell_complex/Viewer.cpp | 58 +++++++++++-------- .../demo/Linear_cell_complex/Viewer.h | 11 +++- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index dafcccb16951..6187787bc19c 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -9,44 +9,54 @@ // // Author(s) : Guillaume Damiand // Contributor(s): Kumar Snehasish +// Mostafa Ashraf // #include "Viewer.h" #include -Viewer::Viewer(QWidget* parent) : - Base(parent, nullptr, ""), - m_previous_scene_empty(true) -{} +Viewer::Viewer(QWidget *parent) + // TODO: add a new constructor that does not take graphic buffer. + : Base(parent, ""), m_drawing_functor(MyDrawingFunctorLCC()), + m_nofaces(false), m_random_face_color(false), + m_previous_scene_empty(true) {} -void Viewer::setScene(Scene* scene_, bool doredraw) -{ +void Viewer::setScene(Scene *scene_, bool doredraw) { scene = scene_; - set_lcc(scene->lcc, doredraw); + + if (scene->lcc != nullptr) { + compute_elements(gBuffer, scene->lcc, m_drawing_functor, m_nofaces, + m_random_face_color); + } + + if (doredraw) { + Base::redraw(); + } } -void Viewer::sceneChanged() -{ - Base::compute_elements(); - this->camera()-> - setSceneBoundingBox(CGAL::qglviewer::Vec(m_bounding_box.xmin(), - m_bounding_box.ymin(), - m_bounding_box.zmin()), - CGAL::qglviewer::Vec(m_bounding_box.xmax(), - m_bounding_box.ymax(), - m_bounding_box.zmax())); +void Viewer::sceneChanged() { + compute_elements(gBuffer, scene->lcc, m_drawing_functor, m_nofaces, + m_random_face_color); + + this->camera()->setSceneBoundingBox( + CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), + gBuffer.get_bounding_box().ymin(), + gBuffer.get_bounding_box().zmin()), + CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmax(), + gBuffer.get_bounding_box().ymax(), + gBuffer.get_bounding_box().zmax())); Base::redraw(); - if (m_previous_scene_empty) - { this->showEntireScene(); } + if (m_previous_scene_empty) { + this->showEntireScene(); + } - m_previous_scene_empty = scene->lcc->is_empty(); // for the next call to sceneChanged + m_previous_scene_empty = + scene->lcc->is_empty(); // for the next call to sceneChanged } -void Viewer::keyPressEvent(QKeyEvent *e) -{ +void Viewer::keyPressEvent(QKeyEvent *e) { // const Qt::KeyboardModifiers modifiers = e->modifiers(); Base::keyPressEvent(e); } -QString Viewer::helpString() const -{ return Base::helpString("LCC Demo"); } +QString Viewer::helpString() const { return Base::helpString("LCC Demo"); } diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 18e66603ef45..f25f73de78a3 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -9,12 +9,15 @@ // // Author(s) : Guillaume Damiand // Kumar Snehasish +// Mostafa Ashraf // #ifndef VIEWER_H #define VIEWER_H #include "typedefs.h" -#include + +#include +#include // Functor used by SimpleLCCViewerQt to colorize of not elements. struct MyDrawingFunctorLCC @@ -104,11 +107,11 @@ struct MyDrawingFunctorLCC }; -class Viewer : public CGAL::SimpleLCCViewerQt +class Viewer : public Basic_viewer_qt { Q_OBJECT - typedef CGAL::SimpleLCCViewerQt Base; + typedef CGAL::Basic_viewer_qt Base; public: Viewer(QWidget* parent); @@ -120,6 +123,8 @@ public Q_SLOTS: void sceneChanged(); private: + const DrawingFunctorLCC &m_drawing_functor; + bool m_nofaces, m_random_face_color; Scene* scene; bool m_previous_scene_empty; }; From ca7ae5f8789d2c4cbd6c774c047792b406926175 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Sep 2022 09:22:36 +0200 Subject: [PATCH 030/341] Initial commit for generic functors with and without volume for faces, edges, and vertices. --- .../CGAL/draw_linear_cell_complex_function.h | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 2990c02778ce..efd64ff4271e 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -23,6 +23,7 @@ namespace CGAL { +// This functor draws all faces, edges, and vertices. // Default color functor; user can change it to have its own face color struct DefaultDrawingFunctorLCC { /// @return true iff the volume containing dh is drawn. @@ -114,6 +115,91 @@ struct DefaultDrawingFunctorLCC { } }; +// TODO: these functors will modify a specific face, edge, and vertex. +struct DefaultDrawingFunctorX { + + template + bool draw_face(const DS &, typename DS::Dart_const_handle) const { + return true; + } + + template + bool draw_edge(const DS &, typename DS::Dart_const_handle) const { + return true; + } + + template + bool draw_vertex(const DS &, typename DS::Dart_const_handle) const { + return true; + } + + template + bool face_wireframe(const DS &, typename DS::Dart_const_handle) const { + return false; + } + + template + bool colored_face(const DS &, typename DS::Dart_const_handle) const { + return false; + } + + template + bool colored_edge(const DS &, typename DS::Dart_const_handle) const { + return false; + } + + template + bool colored_vertex(const DS &, typename DS::Dart_const_handle) const { + return false; + } + + template + CGAL::IO::Color face_color(const DS &aVal, + typename DS::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + return get_random_color(random); + } + + template + CGAL::IO::Color edge_color(const DS &aVal, + typename DS::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + return get_random_color(random); + } + + template + CGAL::IO::Color vertex_color(const DS &aVal, + typename DS::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + return get_random_color(random); + } +}; + +struct DefaultDrawingFunctorXWithVoulume : public DefaultDrawingFunctorX { + + template + bool draw_volume(const DS &, typename DS::Dart_const_handle) const { + return true; + } + + template + CGAL::IO::Color volume_color(const DS &aVal, + typename LCC::Dart_const_handle dh) const { + CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + return get_random_color(random); + } + + template + bool volume_wireframe(const DS &, typename DS::Dart_const_handle) const { + return false; + } + + template + bool colored_volume(const DS &, typename DS::Dart_const_handle) const { + return true; + } +}; + namespace draw_function { typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; From 382aa602d7321d82384d91ee4be9c139ee7e2b53 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 10 Sep 2022 21:19:17 +0200 Subject: [PATCH 031/341] Error in build didn't see gBuffer, and add_in_graphic_buffer_lcc --- .../demo/Linear_cell_complex/Viewer.cpp | 14 +++++++------- .../demo/Linear_cell_complex/Viewer.h | 11 +++++++---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 6187787bc19c..75ce3dce7c2f 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -16,17 +16,16 @@ #include Viewer::Viewer(QWidget *parent) - // TODO: add a new constructor that does not take graphic buffer. - : Base(parent, ""), m_drawing_functor(MyDrawingFunctorLCC()), - m_nofaces(false), m_random_face_color(false), + : Base(parent, ""), m_drawing_functor_(MyDrawingFunctorLCC()), + m_nofaces_(false), m_random_face_color_(false), m_previous_scene_empty(true) {} void Viewer::setScene(Scene *scene_, bool doredraw) { scene = scene_; if (scene->lcc != nullptr) { - compute_elements(gBuffer, scene->lcc, m_drawing_functor, m_nofaces, - m_random_face_color); + CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor_, scene->lcc, m_nofaces_, + m_random_face_color_); } if (doredraw) { @@ -35,8 +34,9 @@ void Viewer::setScene(Scene *scene_, bool doredraw) { } void Viewer::sceneChanged() { - compute_elements(gBuffer, scene->lcc, m_drawing_functor, m_nofaces, - m_random_face_color); + + CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor_, scene->lcc, + m_nofaces_, m_random_face_color_); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index f25f73de78a3..cd86e1530838 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -16,7 +16,10 @@ #include "typedefs.h" -#include +// QUESTION: When I added this line compiler tell me "No such file or directory!" how? +// #include + +#include #include // Functor used by SimpleLCCViewerQt to colorize of not elements. @@ -107,7 +110,7 @@ struct MyDrawingFunctorLCC }; -class Viewer : public Basic_viewer_qt +class Viewer : public CGAL::Basic_viewer_qt { Q_OBJECT @@ -123,8 +126,8 @@ public Q_SLOTS: void sceneChanged(); private: - const DrawingFunctorLCC &m_drawing_functor; - bool m_nofaces, m_random_face_color; + const MyDrawingFunctorLCC &m_drawing_functor_; + bool m_nofaces_, m_random_face_color_; Scene* scene; bool m_previous_scene_empty; }; From b61722fb1c29b40be032a73d7256ff0e0a9ff754 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 10 Sep 2022 21:22:18 +0200 Subject: [PATCH 032/341] Added template inheritance. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index f2943cc11dc0..b2265ee32d14 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -9,6 +9,7 @@ // // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_BASIC_VIEWER_QT_H #define CGAL_BASIC_VIEWER_QT_H @@ -83,6 +84,28 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Constructor/Destructor Basic_viewer_qt(QWidget* parent, GraphicBuffer<>& buf, + const char* title="", + bool draw_vertices=false, + bool draw_edges=true, + bool draw_faces=true, + bool use_mono_color=false, + bool inverse_normal=false, + bool draw_rays=true, + bool draw_lines=true, + bool draw_text=true, + bool no_2D_mode=false): + Basic_viewer_qt(parent, title, draw_vertices, + draw_edges, + draw_faces, + use_mono_color, + inverse_normal, + draw_rays, + draw_lines, + draw_text, + no_2D_mode), gBuffer(buf){} + + + Basic_viewer_qt(QWidget* parent, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -114,8 +137,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer m_lines_mono_color(0, 0, 0), m_faces_mono_color(60, 60, 200), m_ambient_color(0.6f, 0.5f, 0.5f, 0.5f), - m_are_buffers_initialized(false), - gBuffer(buf) + m_are_buffers_initialized(false) { // Define 'Control+Q' as the new exit shortcut (default was 'Escape') setShortcut(qglviewer::EXIT_VIEWER, ::Qt::CTRL, ::Qt::Key_Q); @@ -1720,6 +1742,12 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; +/** + * @brief + * + * @tparam BufferType + * @param graphic_buffer + */ template void draw_buffer(GraphicBuffer &graphic_buffer) { From 156ea1a1c94ebe71f1cb2a6ffb21caa4b46298f6 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 10 Sep 2022 21:52:39 +0200 Subject: [PATCH 033/341] Edit generic functor. --- .../CGAL/draw_linear_cell_complex_function.h | 75 +++++++++++-------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index efd64ff4271e..4b218c7431dd 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -118,58 +118,65 @@ struct DefaultDrawingFunctorLCC { // TODO: these functors will modify a specific face, edge, and vertex. struct DefaultDrawingFunctorX { - template - bool draw_face(const DS &, typename DS::Dart_const_handle) const { + template + bool draw_face(const DS &, face_handle handle) const { return true; } - template - bool draw_edge(const DS &, typename DS::Dart_const_handle) const { + template + bool draw_edge(const DS &, edge_handle handle) const { return true; } - template - bool draw_vertex(const DS &, typename DS::Dart_const_handle) const { + template + bool draw_vertex(const DS &, vertex_handle handle) const { return true; } - template + template bool face_wireframe(const DS &, typename DS::Dart_const_handle) const { return false; } - template - bool colored_face(const DS &, typename DS::Dart_const_handle) const { + template + bool colored_face(const DS &, face_handle handle) const { return false; } - template - bool colored_edge(const DS &, typename DS::Dart_const_handle) const { + template + bool colored_edge(const DS &, edge_handle handle) const { return false; } - template - bool colored_vertex(const DS &, typename DS::Dart_const_handle) const { + template + bool colored_vertex(const DS &, vertex_handle handle) const { return false; } - template - CGAL::IO::Color face_color(const DS &aVal, - typename DS::Dart_const_handle dh) const { + template + CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { CGAL::Random random((unsigned int)(aVal.darts().index(dh))); return get_random_color(random); } - template - CGAL::IO::Color edge_color(const DS &aVal, - typename DS::Dart_const_handle dh) const { + template + CGAL::IO::Color edge_color(const DS &aVal, edge_handle dh) const { CGAL::Random random((unsigned int)(aVal.darts().index(dh))); return get_random_color(random); } - template - CGAL::IO::Color vertex_color(const DS &aVal, - typename DS::Dart_const_handle dh) const { + template + CGAL::IO::Color vertex_color(const DS &aVal, vertex_handle dh) const { CGAL::Random random((unsigned int)(aVal.darts().index(dh))); return get_random_color(random); } @@ -177,25 +184,29 @@ struct DefaultDrawingFunctorX { struct DefaultDrawingFunctorXWithVoulume : public DefaultDrawingFunctorX { - template - bool draw_volume(const DS &, typename DS::Dart_const_handle) const { + template + bool draw_volume(const DS &, volume_handle) const { return true; } - template + template CGAL::IO::Color volume_color(const DS &aVal, - typename LCC::Dart_const_handle dh) const { + volume_handle dh) const { CGAL::Random random((unsigned int)(aVal.darts().index(dh))); return get_random_color(random); } - template - bool volume_wireframe(const DS &, typename DS::Dart_const_handle) const { + template + bool volume_wireframe(const DS &, volume_handle) const { return false; } - template - bool colored_volume(const DS &, typename DS::Dart_const_handle) const { + template + bool colored_volume(const DS &, volume_handle) const { return true; } }; @@ -444,9 +455,13 @@ template class Map, class Refs, class Storage_, class DrawingFunctorLCC = DefaultDrawingFunctorLCC> + // TODO: I'll add it again after done LCC demo. + // class DrawingFunctorLCC = DefaultDrawingFunctorXWithVoulume> void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer", const DrawingFunctorLCC &drawing_functor = DrawingFunctorLCC()) { + // TODO: I'll add it again after done LCC demo. + // const DrawingFunctorLCC &drawing_functor = DefaultDrawingFunctorXWithVoulume()) { GraphicBuffer buffer; add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc, false); draw_buffer(buffer); From 6076849ea5fa14b0d131a2f53eb085d7572950ce Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 12 Sep 2022 10:55:37 +0200 Subject: [PATCH 034/341] Update for basic viewer --- GraphicsView/include/CGAL/Buffer_for_vao.h | 3 ++- GraphicsView/include/CGAL/GraphicBuffer.h | 16 +++++++++++ .../include/CGAL/Qt/Basic_viewer_qt.h | 27 +++---------------- .../demo/Linear_cell_complex/Viewer.cpp | 8 +++--- .../demo/Linear_cell_complex/Viewer.h | 11 ++++---- .../include/CGAL/draw_linear_cell_complex.h | 8 +++--- 6 files changed, 34 insertions(+), 39 deletions(-) diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index 882bf7c98d7f..6847863fc64e 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -163,7 +163,8 @@ class Buffer_for_vao if (m_index_buffer!=nullptr) { m_index_buffer->clear(); } if (m_flat_normal_buffer!=nullptr) { m_flat_normal_buffer->clear(); } if (m_gouraud_normal_buffer!=nullptr) { m_gouraud_normal_buffer->clear(); } - + if (m_bb!=nullptr) { (*m_bb)=CGAL::Bbox_3(); } + m_zero_x=true; m_zero_y=true; m_zero_z=true; diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index d2ff2d6e1df3..1381eaf99b6b 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -314,6 +314,22 @@ class GraphicBuffer { m_buffer_for_colored_lines.has_zero_z(); } + void clear() + { + m_buffer_for_mono_points.clear(); + m_buffer_for_colored_points.clear(); + m_buffer_for_mono_segments.clear(); + m_buffer_for_colored_segments.clear(); + m_buffer_for_mono_rays.clear(); + m_buffer_for_colored_rays.clear(); + m_buffer_for_mono_lines.clear(); + m_buffer_for_colored_lines.clear(); + m_buffer_for_mono_faces.clear(); + m_buffer_for_colored_faces.clear(); + m_buffer_for_clipping_plane.clear(); + m_texts.clear(); + } + template static Local_point get_local_point(const KPoint &p) { return internal::Geom_utils::Kernel, diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index b2265ee32d14..98709c811f90 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -83,29 +83,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - GraphicBuffer<>& buf, - const char* title="", - bool draw_vertices=false, - bool draw_edges=true, - bool draw_faces=true, - bool use_mono_color=false, - bool inverse_normal=false, - bool draw_rays=true, - bool draw_lines=true, - bool draw_text=true, - bool no_2D_mode=false): - Basic_viewer_qt(parent, title, draw_vertices, - draw_edges, - draw_faces, - use_mono_color, - inverse_normal, - draw_rays, - draw_lines, - draw_text, - no_2D_mode), gBuffer(buf){} - - - Basic_viewer_qt(QWidget* parent, + GraphicBuffer& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -117,6 +95,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool draw_text=true, bool no_2D_mode=false) : CGAL::QGLViewer(parent), + gBuffer(buf), m_draw_vertices(draw_vertices), m_draw_edges(draw_edges), m_draw_rays(draw_rays), @@ -1637,7 +1616,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer protected: - GraphicBuffer gBuffer; + GraphicBuffer& gBuffer; bool m_draw_vertices; bool m_draw_edges; diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 75ce3dce7c2f..a41f174d92a5 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -16,9 +16,9 @@ #include Viewer::Viewer(QWidget *parent) - : Base(parent, ""), m_drawing_functor_(MyDrawingFunctorLCC()), - m_nofaces_(false), m_random_face_color_(false), - m_previous_scene_empty(true) {} + : Base(parent, m_graphic_buffer, ""), + m_nofaces_(false), m_random_face_color_(false), + m_previous_scene_empty(true) {} void Viewer::setScene(Scene *scene_, bool doredraw) { scene = scene_; @@ -34,7 +34,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) { } void Viewer::sceneChanged() { - + gBuffer.clear(); CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor_, scene->lcc, m_nofaces_, m_random_face_color_); diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index cd86e1530838..f7473cff8d70 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -17,8 +17,7 @@ #include "typedefs.h" // QUESTION: When I added this line compiler tell me "No such file or directory!" how? -// #include - +#include #include #include @@ -109,12 +108,11 @@ struct MyDrawingFunctorLCC { return CGAL::IO::Color(0, 0, 0); } }; - -class Viewer : public CGAL::Basic_viewer_qt +class Viewer : public CGAL::Basic_viewer_qt { Q_OBJECT - typedef CGAL::Basic_viewer_qt Base; + typedef CGAL::Basic_viewer_qt Base; public: Viewer(QWidget* parent); @@ -126,7 +124,8 @@ public Q_SLOTS: void sceneChanged(); private: - const MyDrawingFunctorLCC &m_drawing_functor_; + MyDrawingFunctorLCC m_drawing_functor_; + CGAL::GraphicBuffer m_graphic_buffer; bool m_nofaces_, m_random_face_color_; Scene* scene; bool m_previous_scene_empty; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 73f360debfa1..0480547ec5ed 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -148,7 +148,7 @@ struct LCC_geom_utils }; // Viewer class for LCC -template +/*template class SimpleLCCViewerQt : public Basic_viewer_qt { typedef Basic_viewer_qt Base; @@ -379,9 +379,9 @@ class SimpleLCCViewerQt : public Basic_viewer_qt bool m_random_face_color; const DrawingFunctorLCC& m_drawing_functor; }; - +*/ // Specialization of draw function. -#define CGAL_LCC_TYPE CGAL::Linear_cell_complex_base \ +/*#define CGAL_LCC_TYPE CGAL::Linear_cell_complex_base \ template < unsigned int d_, unsigned int ambient_dim, @@ -419,7 +419,7 @@ void draw(const CGAL_LCC_TYPE& alcc, // Todo a function taking a const DrawingFunctorLCC& drawing_functor as parameter #undef CGAL_LCC_TYPE - +*/ } // End namespace CGAL #endif // CGAL_USE_BASIC_VIEWER From 974a4accf10c7633843a013941111950571b6c5a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 12 Sep 2022 15:42:07 +0200 Subject: [PATCH 035/341] Update drawing functor and lcc demo --- .../demo/Linear_cell_complex/Viewer.cpp | 48 +- .../demo/Linear_cell_complex/Viewer.h | 94 +--- .../demo/Linear_cell_complex/typedefs.h | 5 +- .../CGAL/draw_linear_cell_complex_function.h | 526 +++++++----------- 4 files changed, 244 insertions(+), 429 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index a41f174d92a5..bd48145e3a4e 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -17,26 +17,37 @@ Viewer::Viewer(QWidget *parent) : Base(parent, m_graphic_buffer, ""), - m_nofaces_(false), m_random_face_color_(false), - m_previous_scene_empty(true) {} + m_previous_scene_empty(true) +{ + m_drawing_functor.volume_color=[](const LCC & alcc, + Dart_const_handle dh)->CGAL::IO::Color + { return alcc.template info<3>(dh).color(); }; -void Viewer::setScene(Scene *scene_, bool doredraw) { + m_drawing_functor.colored_volume=[](const LCC &, Dart_const_handle)->bool + { return true; }; + + m_drawing_functor.draw_volume=[](const LCC & alcc, Dart_const_handle dh)->bool + { return alcc.template info<3>(dh).is_visible(); }; + + m_drawing_functor.volume_wireframe=[](const LCC& alcc, Dart_const_handle dh)->bool + { return !(alcc.template info<3>(dh).is_filled()); }; +} + +void Viewer::setScene(Scene *scene_, bool doredraw) +{ scene = scene_; - if (scene->lcc != nullptr) { - CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor_, scene->lcc, m_nofaces_, - m_random_face_color_); - } + if (scene->lcc!=nullptr) + { CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor, scene->lcc); } - if (doredraw) { - Base::redraw(); - } + if (doredraw) + { Base::redraw(); } } -void Viewer::sceneChanged() { +void Viewer::sceneChanged() +{ gBuffer.clear(); - CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor_, scene->lcc, - m_nofaces_, m_random_face_color_); + CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor, scene->lcc); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), @@ -46,15 +57,14 @@ void Viewer::sceneChanged() { gBuffer.get_bounding_box().ymax(), gBuffer.get_bounding_box().zmax())); Base::redraw(); - if (m_previous_scene_empty) { - this->showEntireScene(); - } + if (m_previous_scene_empty) + { this->showEntireScene(); } - m_previous_scene_empty = - scene->lcc->is_empty(); // for the next call to sceneChanged + m_previous_scene_empty=scene->lcc->is_empty(); // for the next call to sceneChanged } -void Viewer::keyPressEvent(QKeyEvent *e) { +void Viewer::keyPressEvent(QKeyEvent *e) +{ // const Qt::KeyboardModifiers modifiers = e->modifiers(); Base::keyPressEvent(e); } diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index f7473cff8d70..e4e834e0a7ec 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -21,93 +21,6 @@ #include #include -// Functor used by SimpleLCCViewerQt to colorize of not elements. -struct MyDrawingFunctorLCC -{ - /// @return true iff the volume containing dh is drawn. - template - bool draw_volume(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { return alcc.template info<3>(dh).is_visible(); } - /// @return true iff the face containing dh is drawn. - template - bool draw_face(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the edge containing dh is drawn. - template - bool draw_edge(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the vertex containing dh is drawn. - template - bool draw_vertex(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - - /// @return true iff the volume containing dh is drawn in wireframe. - template - bool volume_wireframe(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { return !(alcc.template info<3>(dh).is_filled()); } - /// @return true iff the face containing dh is drawn in wireframe. - template - bool face_wireframe(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - - /// @return true iff the volume containing dh is colored. - template - bool colored_volume(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the face containing dh is colored. - /// if we have also colored_volume(alcc, dh), the volume color is - /// ignored and only the face color is considered. - template - bool colored_face(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - /// @return true iff the edge containing dh is colored. - template - bool colored_edge(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - /// @return true iff the vertex containing dh is colored. - template - bool colored_vertex(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - - /// @return the color of the volume containing dh - /// used only if colored_volume(alcc, dh) and !colored_face(alcc, dh) - template - CGAL::IO::Color volume_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { return alcc.template info<3>(dh).color(); } - /// @return the color of the face containing dh - /// used only if colored_face(alcc, dh) - template - CGAL::IO::Color face_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the edge containing dh - /// used only if colored_edge(alcc, dh) - template - CGAL::IO::Color edge_color(const LCC&, - typename LCC::Dart_const_handle) const - { return CGAL::IO::Color(0, 0, 0); } - /// @return the color of the vertex containing dh - /// used only if colored_vertex(alcc, dh) - template - CGAL::IO::Color vertex_color(const LCC&, - typename LCC::Dart_const_handle) const - { return CGAL::IO::Color(0, 0, 0); } -}; - class Viewer : public CGAL::Basic_viewer_qt { Q_OBJECT @@ -124,9 +37,12 @@ public Q_SLOTS: void sceneChanged(); private: - MyDrawingFunctorLCC m_drawing_functor_; + CGAL::DefaultDrawingFunctorXWithVolume m_drawing_functor; CGAL::GraphicBuffer m_graphic_buffer; - bool m_nofaces_, m_random_face_color_; Scene* scene; bool m_previous_scene_empty; }; diff --git a/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h b/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h index 787b5a48aac2..5955485c8e49 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h @@ -158,8 +158,9 @@ typedef CGAL::Linear_cell_complex_traits <3,CGAL::Exact_predicates_inexact_constructions_kernel> Mytraits; typedef CGAL::Linear_cell_complex_for_combinatorial_map<3,3,Mytraits,Myitems> LCC; -typedef LCC::Dart_handle Dart_handle; -typedef LCC::Vertex_attribute Vertex; +typedef LCC::Dart_handle Dart_handle; +typedef LCC::Dart_const_handle Dart_const_handle; +typedef LCC::Vertex_attribute Vertex; typedef LCC::Point Point_3; typedef LCC::Vector Vector_3; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 4b218c7431dd..856c5a8783be 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -15,6 +15,7 @@ #include #include +#include #ifdef CGAL_USE_BASIC_VIEWER @@ -23,195 +24,94 @@ namespace CGAL { -// This functor draws all faces, edges, and vertices. -// Default color functor; user can change it to have its own face color -struct DefaultDrawingFunctorLCC { - /// @return true iff the volume containing dh is drawn. - template - bool draw_volume(const LCC &, typename LCC::Dart_const_handle) const { - return true; - } - /// @return true iff the face containing dh is drawn. - template - bool draw_face(const LCC &, typename LCC::Dart_const_handle) const { - return true; - } - /// @return true iff the edge containing dh is drawn. - template - bool draw_edge(const LCC &, typename LCC::Dart_const_handle) const { - return true; - } - /// @return true iff the vertex containing dh is drawn. - template - bool draw_vertex(const LCC &, typename LCC::Dart_const_handle) const { - return true; - } - - /// @return true iff the volume containing dh is drawn in wireframe. - template - bool volume_wireframe(const LCC &, typename LCC::Dart_const_handle) const { - return false; - } - /// @return true iff the face containing dh is drawn in wireframe. - template - bool face_wireframe(const LCC &, typename LCC::Dart_const_handle) const { - return false; - } - - /// @return true iff the volume containing dh is colored. - template - bool colored_volume(const LCC &, typename LCC::Dart_const_handle) const { - return true; - } - /// @return true iff the face containing dh is colored. - /// if we have also colored_volume(alcc, dh), the volume color is - /// ignored and only the face color is considered. - template - bool colored_face(const LCC &, typename LCC::Dart_const_handle) const { - return false; - } - /// @return true iff the edge containing dh is colored. - template - bool colored_edge(const LCC &, typename LCC::Dart_const_handle) const { - return false; - } - /// @return true iff the vertex containing dh is colored. - template - bool colored_vertex(const LCC &, typename LCC::Dart_const_handle) const { - return false; - } - - /// @return the color of the volume containing dh - /// used only if colored_volume(alcc, dh) and !colored_face(alcc, dh) - template - CGAL::IO::Color volume_color(const LCC &alcc, - typename LCC::Dart_const_handle dh) const { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the face containing dh - /// used only if colored_face(alcc, dh) - template - CGAL::IO::Color face_color(const LCC &alcc, - typename LCC::Dart_const_handle dh) const { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the edge containing dh - /// used only if colored_edge(alcc, dh) - template - CGAL::IO::Color edge_color(const LCC &alcc, - typename LCC::Dart_const_handle dh) const { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the vertex containing dh - /// used only if colored_vertex(alcc, dh) - template - CGAL::IO::Color vertex_color(const LCC &alcc, - typename LCC::Dart_const_handle dh) const { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } -}; - -// TODO: these functors will modify a specific face, edge, and vertex. -struct DefaultDrawingFunctorX { - - template - bool draw_face(const DS &, face_handle handle) const { - return true; - } - - template - bool draw_edge(const DS &, edge_handle handle) const { - return true; - } - - template - bool draw_vertex(const DS &, vertex_handle handle) const { - return true; - } - - template - bool face_wireframe(const DS &, typename DS::Dart_const_handle) const { - return false; - } - - template - bool colored_face(const DS &, face_handle handle) const { - return false; - } - - template - bool colored_edge(const DS &, edge_handle handle) const { - return false; - } - - template - bool colored_vertex(const DS &, vertex_handle handle) const { - return false; - } - - template - CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { - CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - return get_random_color(random); - } - - template - CGAL::IO::Color edge_color(const DS &aVal, edge_handle dh) const { - CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - return get_random_color(random); - } - - template - CGAL::IO::Color vertex_color(const DS &aVal, vertex_handle dh) const { - CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - return get_random_color(random); - } + + // CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { + // CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + // return get_random_color(random); + // } + + +template +struct DefaultDrawingFunctorX +{ + DefaultDrawingFunctorX(): m_enabled_vertices(true), + m_enabled_edges(true), + m_enabled_faces(true) + { + draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; + draw_edge=[](const DS &, edge_handle)->bool { return true; }; + draw_face=[](const DS &, face_handle)->bool { return true; }; + + colored_vertex=[](const DS &, vertex_handle)->bool { return false; }; + colored_edge=[](const DS &, edge_handle)->bool { return false; }; + colored_face=[](const DS &, face_handle)->bool { return false; }; + + face_wireframe=[](const DS &, face_handle)->bool { return false; }; + } + + std::function draw_vertex; + std::function draw_edge; + std::function draw_face; + + std::function colored_vertex; + std::function colored_edge; + std::function colored_face; + + std::function face_wireframe; + + std::function vertex_color; + std::function edge_color; + std::function face_color; + + void disable_vertices() { m_enabled_vertices=false; } + void enable_vertices() { m_enabled_vertices=true; } + bool are_vertices_enabled() const { return m_enabled_vertices; } + + void disable_edges() { m_enabled_edges=false; } + void enable_edges() { m_enabled_edges=true; } + bool are_edges_enabled() const { return m_enabled_edges; } + + void disable_faces() { m_enabled_faces=false; } + void enable_faces() { m_enabled_faces=true; } + bool are_faces_enabled() const { return m_enabled_faces; } + +protected: + bool m_enabled_vertices, m_enabled_edges, m_enabled_faces; }; -struct DefaultDrawingFunctorXWithVoulume : public DefaultDrawingFunctorX { - - template - bool draw_volume(const DS &, volume_handle) const { - return true; - } - - template - CGAL::IO::Color volume_color(const DS &aVal, - volume_handle dh) const { - CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - return get_random_color(random); - } - - template - bool volume_wireframe(const DS &, volume_handle) const { - return false; - } - - template - bool colored_volume(const DS &, volume_handle) const { - return true; - } +template +struct DefaultDrawingFunctorXWithVolume : + public DefaultDrawingFunctorX +{ + DefaultDrawingFunctorXWithVolume() : m_enabled_volumes(true) + { + draw_volume=[](const DS &, volume_handle)->bool { return true; }; + colored_volume=[](const DS &, volume_handle)->bool { return false; }; + volume_wireframe=[](const DS &, volume_handle)->bool { return false; }; + } + + std::function draw_volume; + std::function colored_volume; + std::function volume_wireframe; + std::function volume_color; + + void disable_volumes() { m_enabled_volumes=false; } + void enable_volumes() { m_enabled_volumes=true; } + bool are_volumes_enabled() const { return m_enabled_volumes; } + +protected: + bool m_enabled_volumes; }; -namespace draw_function { +namespace draw_function_for_lcc +{ typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; @@ -221,9 +121,11 @@ template struct LCC_geom_utils; template -struct LCC_geom_utils { +struct LCC_geom_utils +{ static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC &lcc, typename LCC::Dart_const_handle dh) { + get_vertex_normal(const LCC &lcc, typename LCC::Dart_const_handle dh) + { typename Local_kernel::Vector_3 n = internal::Geom_utils:: get_local_vector(CGAL::compute_normal_of_cell_0(lcc, dh)); @@ -233,110 +135,109 @@ struct LCC_geom_utils { }; template -struct LCC_geom_utils { +struct LCC_geom_utils +{ static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC &, typename LCC::Dart_const_handle) { - typename Local_kernel::Vector_3 n = CGAL::NULL_VECTOR; + get_vertex_normal(const LCC &, typename LCC::Dart_const_handle) + { + typename Local_kernel::Vector_3 n=CGAL::NULL_VECTOR; return n; } }; -template +template void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, - bool m_nofaces, bool m_random_face_color, const DrawingFunctorLCC &m_drawing_functor, - GraphicBuffer &graphic_buffer) { - - typedef typename LCC::Dart_const_handle Dart_const_handle; - typedef typename LCC::Traits Kernel; - typedef typename Kernel::Point Point; - typedef typename Kernel::Vector Vector; - - if (m_nofaces || !m_drawing_functor.draw_face(*lcc, dh)) - return; + GraphicBuffer &graphic_buffer) +{ + if (!m_drawing_functor.are_faces_enabled() || + !m_drawing_functor.draw_face(*lcc, dh)) + { return; } // We fill only closed faces. - Dart_const_handle cur = dh; - Dart_const_handle min = dh; - do { + typename LCC::Dart_const_handle cur=dh; + do + { if (!lcc->is_next_exist(cur)) - return; // open face=>not filled - if (cur < min) - min = cur; + { return; } // open face=>not filled cur = lcc->next(cur); - } while (cur != dh); + } + while (cur!=dh); - if (m_random_face_color) { - CGAL::Random random((unsigned int)(lcc->darts().index(dh))); - CGAL::IO::Color c = get_random_color(random); - graphic_buffer.face_begin(c); - } else if (m_drawing_functor.colored_face(*lcc, dh)) { - CGAL::IO::Color c = m_drawing_functor.face_color(*lcc, dh); + if (m_drawing_functor.colored_volume(*lcc, voldh)) + { + CGAL::IO::Color c=m_drawing_functor.volume_color(*lcc, voldh); graphic_buffer.face_begin(c); - } else if (m_drawing_functor.colored_volume(*lcc, voldh)) { - CGAL::IO::Color c = m_drawing_functor.volume_color(*lcc, voldh); + } + else if (m_drawing_functor.colored_face(*lcc, dh)) + { + CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); graphic_buffer.face_begin(c); - } else { - graphic_buffer.face_begin(); } + else + { graphic_buffer.face_begin(); } - cur = dh; - do { - graphic_buffer.add_point_in_face( - lcc->point(cur), - LCC_geom_utils::get_vertex_normal(*lcc, cur)); - cur = lcc->next(cur); - } while (cur != dh); + cur=dh; + do + { + graphic_buffer.add_point_in_face + (lcc->point(cur), + LCC_geom_utils::get_vertex_normal(*lcc, cur)); + cur=lcc->next(cur); + } + while (cur!=dh); graphic_buffer.face_end(); } -template +template void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - GraphicBuffer &graphic_buffer) { - typedef typename LCC::Dart_const_handle Dart_const_handle; - typedef typename LCC::Traits Kernel; - typedef typename Kernel::Point Point; - - if (!m_drawing_functor.draw_edge(*lcc, dh)) - return; - - Point p1 = lcc->point(dh); - Dart_const_handle d2 = lcc->other_extremity(dh); - if (d2 != nullptr) { - if (m_drawing_functor.colored_edge(*lcc, dh)) { + const DrawingFunctor &m_drawing_functor, + GraphicBuffer &graphic_buffer) +{ + if (!m_drawing_functor.are_edges_enabled() || + !m_drawing_functor.draw_edge(*lcc, dh)) + { return; } + + const typename LCC::Point& p1=lcc->point(dh); + typename LCC::Dart_const_handle d2=lcc->other_extremity(dh); + if (d2!=nullptr) + { + if (m_drawing_functor.colored_edge(*lcc, dh)) + { graphic_buffer.add_segment(p1, lcc->point(d2), m_drawing_functor.edge_color(*lcc, dh)); - } else { - graphic_buffer.add_segment(p1, lcc->point(d2)); } + else + { graphic_buffer.add_segment(p1, lcc->point(d2)); } } } template void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - GraphicBuffer &graphic_buffer) { - if (!m_drawing_functor.draw_vertex(*lcc, dh)) - return; - - if (m_drawing_functor.colored_vertex(*lcc, dh)) { + GraphicBuffer &graphic_buffer) +{ + if (!m_drawing_functor.are_vertices_enabled() || + !m_drawing_functor.draw_vertex(*lcc, dh)) + { return; } + + if (m_drawing_functor.colored_vertex(*lcc, dh)) + { graphic_buffer.add_point(lcc->point(dh), m_drawing_functor.vertex_color(*lcc, dh)); - } else { - graphic_buffer.add_point(lcc->point(dh)); } + else + { graphic_buffer.add_point(lcc->point(dh)); } } -template +template void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - bool m_nofaces, bool m_random_face_color) { - - if (lcc == nullptr) - return; + const DrawingFunctor &m_drawing_functor) +{ + if (lcc==nullptr) + { return; } typename LCC::size_type markvolumes = lcc->get_new_mark(); typename LCC::size_type markfaces = lcc->get_new_mark(); @@ -346,54 +247,44 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, lcc->orient(oriented_mark); - for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), - itend = lcc->darts().end(); - it != itend; ++it) { + for(typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), + itend=lcc->darts().end(); it!=itend; ++it) + { if (!lcc->is_marked(it, markvolumes) && - m_drawing_functor.draw_volume(*lcc, it)) { - for (typename LCC::template Dart_of_cell_basic_range<3>::const_iterator - itv = lcc->template darts_of_cell_basic<3>(it, markvolumes) - .begin(), - itvend = - lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); - itv != itvend; ++itv) { - lcc->mark(itv, markvolumes); // To be sure that all darts of the basic - // iterator will be marked + m_drawing_functor.draw_volume(*lcc, it)) + { + for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator + itv=lcc->template darts_of_cell_basic<3>(it, markvolumes).begin(), + itvend=lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); + itv!=itvend; ++itv) + { + lcc->mark(itv, markvolumes); if (!lcc->is_marked(itv, markfaces) && lcc->is_marked(itv, oriented_mark) && - m_drawing_functor.draw_face(*lcc, itv)) { + m_drawing_functor.draw_face(*lcc, itv)) + { if (!m_drawing_functor.volume_wireframe(*lcc, itv) && - !m_drawing_functor.face_wireframe(*lcc, itv)) { - compute_face(itv, it, lcc, m_nofaces, m_random_face_color, - m_drawing_functor, graphic_buffer); - } - for (typename LCC::template Dart_of_cell_basic_range< - 2>::const_iterator - itf = lcc->template darts_of_cell_basic<2>(itv, markfaces) - .begin(), - itfend = lcc->template darts_of_cell_basic<2>(itv, markfaces) - .end(); - itf != itfend; ++itf) { - if (!m_drawing_functor.volume_wireframe(*lcc, itv) && - !m_drawing_functor.face_wireframe(*lcc, itv)) { - lcc->mark(itf, markfaces); - } // To be sure that all darts of the basic iterator will be marked + !m_drawing_functor.face_wireframe(*lcc, itv)) + { compute_face(itv, it, lcc, m_drawing_functor, graphic_buffer); } + for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator + itf=lcc->template darts_of_cell_basic<2>(itv, markfaces).begin(), + itfend=lcc->template darts_of_cell_basic<2>(itv, markfaces).end(); + itf!=itfend; ++itf) + { + lcc->mark(itf, markfaces); if (!lcc->is_marked(itf, markedges) && - m_drawing_functor.draw_edge(*lcc, itf)) { + m_drawing_functor.draw_edge(*lcc, itf)) + { compute_edge(itf, lcc, m_drawing_functor, graphic_buffer); - for (typename LCC::template Dart_of_cell_basic_range< - 1>::const_iterator - ite = - lcc->template darts_of_cell_basic<1>(itf, markedges) - .begin(), - iteend = - lcc->template darts_of_cell_basic<1>(itf, markedges) - .end(); - ite != iteend; ++ite) { - lcc->mark(ite, markedges); // To be sure that all darts of the - // basic iterator will be marked + for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator + ite=lcc->template darts_of_cell_basic<1>(itf, markedges).begin(), + iteend=lcc->template darts_of_cell_basic<1>(itf, markedges).end(); + ite!=iteend; ++ite) + { + lcc->mark(ite, markedges); if (!lcc->is_marked(ite, markvertices) && - m_drawing_functor.draw_vertex(*lcc, ite)) { + m_drawing_functor.draw_vertex(*lcc, ite)) + { compute_vertex(ite, lcc, m_drawing_functor, graphic_buffer); CGAL::mark_cell(*lcc, ite, markvertices); } @@ -406,8 +297,8 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, } for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), - itend = lcc->darts().end(); - it != itend; ++it) { + itend = lcc->darts().end(); it != itend; ++it) + { lcc->unmark(it, markvertices); lcc->unmark(it, markedges); lcc->unmark(it, markfaces); @@ -431,17 +322,15 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, * @param graphic_buffer * @param m_drawing_functor * @param alcc - * @param anofaces if true, do not draw faces. */ -template +template void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, - const DrawingFunctorLCC &m_drawing_functor, - const LCC *alcc = nullptr, bool nofaces = false, - bool m_random_face_color = false) { - - if (alcc != nullptr) { - draw_function::compute_elements(graphic_buffer, alcc, m_drawing_functor, - nofaces, m_random_face_color); + const DrawingFunctor &m_drawing_functor, + const LCC *alcc = nullptr) +{ + if (alcc!=nullptr) + { + draw_function_for_lcc::compute_elements(graphic_buffer, alcc, m_drawing_functor); } } @@ -450,25 +339,24 @@ void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, CGAL::Linear_cell_complex_base -template class Map, - class Refs, class Storage_, - class DrawingFunctorLCC = DefaultDrawingFunctorLCC> - // TODO: I'll add it again after done LCC demo. - // class DrawingFunctorLCC = DefaultDrawingFunctorXWithVoulume> +template class Map, + class Refs, class Storage_, + class DrawingFunctor=DefaultDrawingFunctorXWithVolume> void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer", - const DrawingFunctorLCC &drawing_functor = DrawingFunctorLCC()) { - // TODO: I'll add it again after done LCC demo. - // const DrawingFunctorLCC &drawing_functor = DefaultDrawingFunctorXWithVoulume()) { + const DrawingFunctor &drawing_functor=DrawingFunctor()) +{ GraphicBuffer buffer; - add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc, false); + add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc); draw_buffer(buffer); } -// Todo a function taking a const DrawingFunctorLCC& drawing_functor as -// parameter #undef CGAL_LCC_TYPE } // End namespace CGAL From 899b8eaa82134e283207242dadc2ca2a91ff07c7 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 12 Sep 2022 15:58:04 +0200 Subject: [PATCH 036/341] Bugfix for negate normal --- GraphicsView/include/CGAL/GraphicBuffer.h | 8 ++++++- .../include/CGAL/Qt/Basic_viewer_qt.h | 22 ++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/GraphicBuffer.h index 1381eaf99b6b..bf3ec0aaac93 100644 --- a/GraphicsView/include/CGAL/GraphicBuffer.h +++ b/GraphicsView/include/CGAL/GraphicBuffer.h @@ -162,6 +162,12 @@ class GraphicBuffer { m_bounding_box = new_bounding_box; } + void negate_all_normals() + { + m_buffer_for_mono_faces.negate_normals(); + m_buffer_for_colored_faces.negate_normals(); + } + template void add_point(const KPoint &p) { m_buffer_for_mono_points.add_point(p); } @@ -329,7 +335,7 @@ class GraphicBuffer { m_buffer_for_clipping_plane.clear(); m_texts.clear(); } - + template static Local_point get_local_point(const KPoint &p) { return internal::Geom_utils::Kernel, diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 98709c811f90..2f0a0404cdaf 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -252,7 +252,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_point(const KPoint& p) - { gBuffer.add_point(p); } + { gBuffer.add_point(p); } template void add_point(const KPoint& p, const CGAL::IO::Color& acolor) @@ -349,9 +349,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer std::cerr<<"You cannot start a new face before to finish the previous one."< Date: Thu, 22 Sep 2022 17:31:50 +0200 Subject: [PATCH 037/341] Initial commit Generic functor. --- GraphicsView/include/CGAL/Generic_functors.h | 99 ++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 GraphicsView/include/CGAL/Generic_functors.h diff --git a/GraphicsView/include/CGAL/Generic_functors.h b/GraphicsView/include/CGAL/Generic_functors.h new file mode 100644 index 000000000000..e9deab53494c --- /dev/null +++ b/GraphicsView/include/CGAL/Generic_functors.h @@ -0,0 +1,99 @@ +// Copyright (c) 2022 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s): Guillaume Damiand +// Mostafa Ashraf + +#ifndef CGAL_GENERIC_FUNCTORS_H +#define CGAL_GENERIC_FUNCTORS_H + +namespace CGAL { + +template +struct GenericFunctor +{ + GenericFunctor(): m_enabled_vertices(true), + m_enabled_edges(true), + m_enabled_faces(true) + { + draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; + draw_edge=[](const DS &, edge_handle)->bool { return true; }; + draw_face=[](const DS &, face_handle)->bool { return true; }; + + colored_vertex=[](const DS &, vertex_handle)->bool { return false; }; + colored_edge=[](const DS &, edge_handle)->bool { return false; }; + colored_face=[](const DS &, face_handle)->bool { return false; }; + + face_wireframe=[](const DS &, face_handle)->bool { return false; }; + } + + std::function draw_vertex; + std::function draw_edge; + std::function draw_face; + + std::function colored_vertex; + std::function colored_edge; + std::function colored_face; + + std::function face_wireframe; + + std::function vertex_color; + std::function edge_color; + std::function face_color; + + void disable_vertices() { m_enabled_vertices=false; } + void enable_vertices() { m_enabled_vertices=true; } + bool are_vertices_enabled() const { return m_enabled_vertices; } + + void disable_edges() { m_enabled_edges=false; } + void enable_edges() { m_enabled_edges=true; } + bool are_edges_enabled() const { return m_enabled_edges; } + + void disable_faces() { m_enabled_faces=false; } + void enable_faces() { m_enabled_faces=true; } + bool are_faces_enabled() const { return m_enabled_faces; } + +protected: + bool m_enabled_vertices, m_enabled_edges, m_enabled_faces; +}; + +template +struct GenericFunctorWithVolume : + public GenericFunctor +{ + GenericFunctorWithVolume() : m_enabled_volumes(true) + { + draw_volume=[](const DS &, volume_handle)->bool { return true; }; + colored_volume=[](const DS &, volume_handle)->bool { return false; }; + volume_wireframe=[](const DS &, volume_handle)->bool { return false; }; + } + + std::function draw_volume; + std::function colored_volume; + std::function volume_wireframe; + std::function volume_color; + + void disable_volumes() { m_enabled_volumes=false; } + void enable_volumes() { m_enabled_volumes=true; } + bool are_volumes_enabled() const { return m_enabled_volumes; } + +protected: + bool m_enabled_volumes; +}; + +} // End namespace CGAL + +#endif // CGAL_GENERIC_FUNCTORS_H \ No newline at end of file From 9db1695576c390605c49d24f0f17b5a9f0af475a Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 22 Sep 2022 17:34:46 +0200 Subject: [PATCH 038/341] Migrated generic functor to Generic_functor.h, changed functors name. --- .../demo/Linear_cell_complex/Viewer.h | 4 +- .../CGAL/draw_linear_cell_complex_function.h | 83 +------------------ 2 files changed, 4 insertions(+), 83 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index e4e834e0a7ec..7ca3c9d4f187 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -18,7 +18,7 @@ // QUESTION: When I added this line compiler tell me "No such file or directory!" how? #include -#include +// #include #include class Viewer : public CGAL::Basic_viewer_qt @@ -37,7 +37,7 @@ public Q_SLOTS: void sceneChanged(); private: - CGAL::DefaultDrawingFunctorXWithVolume +#include #include #include @@ -30,86 +31,6 @@ namespace CGAL { // return get_random_color(random); // } - -template -struct DefaultDrawingFunctorX -{ - DefaultDrawingFunctorX(): m_enabled_vertices(true), - m_enabled_edges(true), - m_enabled_faces(true) - { - draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; - draw_edge=[](const DS &, edge_handle)->bool { return true; }; - draw_face=[](const DS &, face_handle)->bool { return true; }; - - colored_vertex=[](const DS &, vertex_handle)->bool { return false; }; - colored_edge=[](const DS &, edge_handle)->bool { return false; }; - colored_face=[](const DS &, face_handle)->bool { return false; }; - - face_wireframe=[](const DS &, face_handle)->bool { return false; }; - } - - std::function draw_vertex; - std::function draw_edge; - std::function draw_face; - - std::function colored_vertex; - std::function colored_edge; - std::function colored_face; - - std::function face_wireframe; - - std::function vertex_color; - std::function edge_color; - std::function face_color; - - void disable_vertices() { m_enabled_vertices=false; } - void enable_vertices() { m_enabled_vertices=true; } - bool are_vertices_enabled() const { return m_enabled_vertices; } - - void disable_edges() { m_enabled_edges=false; } - void enable_edges() { m_enabled_edges=true; } - bool are_edges_enabled() const { return m_enabled_edges; } - - void disable_faces() { m_enabled_faces=false; } - void enable_faces() { m_enabled_faces=true; } - bool are_faces_enabled() const { return m_enabled_faces; } - -protected: - bool m_enabled_vertices, m_enabled_edges, m_enabled_faces; -}; - -template -struct DefaultDrawingFunctorXWithVolume : - public DefaultDrawingFunctorX -{ - DefaultDrawingFunctorXWithVolume() : m_enabled_volumes(true) - { - draw_volume=[](const DS &, volume_handle)->bool { return true; }; - colored_volume=[](const DS &, volume_handle)->bool { return false; }; - volume_wireframe=[](const DS &, volume_handle)->bool { return false; }; - } - - std::function draw_volume; - std::function colored_volume; - std::function volume_wireframe; - std::function volume_color; - - void disable_volumes() { m_enabled_volumes=false; } - void enable_volumes() { m_enabled_volumes=true; } - bool are_volumes_enabled() const { return m_enabled_volumes; } - -protected: - bool m_enabled_volumes; -}; - namespace draw_function_for_lcc { @@ -343,7 +264,7 @@ template class Map, class Refs, class Storage_, - class DrawingFunctor=DefaultDrawingFunctorXWithVolume Date: Thu, 22 Sep 2022 23:07:54 +0200 Subject: [PATCH 039/341] Modified to use new APIs version. --- .../include/CGAL/draw_triangulation_3.h | 196 ++++++++---------- 1 file changed, 81 insertions(+), 115 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index d7b294fa1641..fbee023b4cce 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -8,159 +8,125 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_T3_H #define CGAL_DRAW_T3_H -#include +#include +#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER #include -#include #include +#include -namespace CGAL -{ +namespace CGAL { // Default color functor; user can change it to have its own face color -struct DefaultColorFunctorT3 -{ - template - static CGAL::IO::Color run(const T3&, - const typename T3::Finite_facets_iterator* fh) - { - if (fh==nullptr) // use to get the mono color +struct DefaultColorFunctorT3 { + template + static CGAL::IO::Color run(const T3 &, + const typename T3::Finite_facets_iterator *fh) { + if (fh == nullptr) // use to get the mono color return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - CGAL::Random random((unsigned int)((std::size_t)(&*((*fh)->first))+ + CGAL::Random random((unsigned int)((std::size_t)(&*((*fh)->first)) + (std::size_t)((*fh)->second))); return get_random_color(random); } }; -// Viewer class for T3 -template -class SimpleTriangulation3ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename T3::Vertex_handle Vertex_const_handle; - typedef typename T3::Finite_edges_iterator Edge_const_handle; - typedef typename T3::Finite_facets_iterator Facet_const_handle; - typedef typename T3::Cell_handle Cell_handle; - typedef typename T3::Point Point; - -public: - /// Construct the viewer. - /// @param at3 the t3 to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - SimpleTriangulation3ViewerQt(QWidget* parent, - const T3& at3, - const char* title="Basic T3 Viewer", - bool anofaces=false, - const ColorFunctor& fcolor=ColorFunctor()) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - t3(at3), - m_nofaces(anofaces), - m_fcolor(fcolor) - { - compute_elements(); - } +namespace draw_function_for_t3 { -protected: - void compute_face(Facet_const_handle fh) - { - CGAL::IO::Color c=m_fcolor.run(t3, &fh); - face_begin(c); +template +void compute_face(typename T3::Finite_facets_iterator fh, + GraphicBuffer &graphic_buffer, const T3 *t3, + const ColorFunctor &m_fcolor) { - add_point_in_face(fh->first->vertex((fh->second+1)%4)->point()); - add_point_in_face(fh->first->vertex((fh->second+2)%4)->point()); - add_point_in_face(fh->first->vertex((fh->second+3)%4)->point()); + // TODO: change it to m_fcolor.face_color(*t3, fh) + CGAL::IO::Color c = m_fcolor.run(*t3, &fh); - face_end(); - } + graphic_buffer.face_begin(c); - void compute_edge(Edge_const_handle eh) - { - add_segment(eh->first->vertex(eh->second)->point(), - eh->first->vertex(eh->third)->point()); - } + graphic_buffer.add_point_in_face( + fh->first->vertex((fh->second + 1) % 4)->point()); + graphic_buffer.add_point_in_face( + fh->first->vertex((fh->second + 2) % 4)->point()); + graphic_buffer.add_point_in_face( + fh->first->vertex((fh->second + 3) % 4)->point()); - void compute_vertex(Vertex_const_handle vh) - { add_point(vh->point()); } + graphic_buffer.face_end(); +} - void compute_elements() - { - clear(); +template +void compute_edge(typename T3::Finite_edges_iterator eh, + GraphicBuffer &graphic_buffer) { + graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), + eh->first->vertex(eh->third)->point()); +} - if (!m_nofaces) - { - for (typename T3::Finite_facets_iterator it=t3.finite_facets_begin(); - it!=t3.finite_facets_end(); ++it) - { compute_face(it); } - } +template +void compute_vertex(typename T3::Vertex_handle vh, + GraphicBuffer &graphic_buffer) { + graphic_buffer.add_point(vh->point()); +} - for (typename T3::Finite_edges_iterator it=t3.finite_edges_begin(); - it!=t3.finite_edges_end(); ++it) - { compute_edge(it); } +template +void compute_elements(GraphicBuffer &graphic_buffer, const T3 *t3, + const ColorFunctor &m_color_functor, + bool m_nofaces = false) { - for (typename T3::Finite_vertices_iterator it=t3.finite_vertices_begin(); - it!=t3.finite_vertices_end(); ++it) - { compute_vertex(it); } + if (!m_nofaces) { + for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); + it != t3->finite_facets_end(); ++it) { + compute_face(it, graphic_buffer, t3, m_color_functor); + } } - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing + for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); + it != t3->finite_edges_end(); ++it) { + compute_edge(it, graphic_buffer); + } - // Call the base method to process others/classicals key - Base::keyPressEvent(e); + for (typename T3::Finite_vertices_iterator it = t3->finite_vertices_begin(); + it != t3->finite_vertices_end(); ++it) { + compute_vertex(it, graphic_buffer); } +} -protected: - const T3& t3; - bool m_nofaces; - const ColorFunctor& m_fcolor; -}; +} // namespace draw_function_for_t3 + +template +void add_in_graphic_buffer_t3(GraphicBuffer &graphic_buffer, + const ColorFunctor &m_color_functor, + const T3 *at3 = nullptr, bool m_nofaces = false) { + if (at3 != nullptr) { + draw_function_for_t3::compute_elements(graphic_buffer, at3, m_color_functor, + m_nofaces); + } +} // Specialization of draw function. #define CGAL_T3_TYPE CGAL::Triangulation_3 -template -void draw(const CGAL_T3_TYPE& at3, - const char* title="T3 Basic Viewer", - bool nofill=false) -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"t3_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - DefaultColorFunctorT3 fcolor; - SimpleTriangulation3ViewerQt - mainwindow(app.activeWindow(), at3, title, nofill, fcolor); - mainwindow.show(); - app.exec(); - } +template > +void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer", + const ColorFunctor &color_functor = ColorFunctor(), + bool nofill = false) { + + GraphicBuffer buffer; + // add_in_graphic_buffer_t3(buffer, color_functor, &at3, false); + add_in_graphic_buffer_t3(buffer, DefaultColorFunctorT3(), &at3, false); + + draw_buffer(buffer); } #undef CGAL_T3_TYPE From 642c055db009f04fc8ac97a4b4556f7d72cc81b2 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 22 Sep 2022 23:08:39 +0200 Subject: [PATCH 040/341] QUESTION --- .../include/CGAL/draw_triangulation_3.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index fbee023b4cce..ba1a3f707459 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -47,6 +47,34 @@ void compute_face(typename T3::Finite_facets_iterator fh, GraphicBuffer &graphic_buffer, const T3 *t3, const ColorFunctor &m_fcolor) { +/* + // QUESTION: I would like to assign custom color functor during run time, which one down is right? + + // Solution 1 to assign custom color functor. + // m_fcolor.face_color = DefaultColorFunctorT3::run; + + // Solution 2 to assign custom color functor. + // m_fcolor.face_color = + // [](const T3 &, + // const typename T3::Finite_facets_iterator *fh) -> CGAL::IO::Color { + // if (fh == nullptr) // use to get the mono color + // return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + + // CGAL::Random random((unsigned int)((std::size_t)(&*((*fh)->first)) + + // (std::size_t)((*fh)->second))); + + // return get_random_color(random); + // }; + // CGAL::IO::Color c = m_fcolor.face_color(*t3, &fh); + + + // Solution 3 to assign custom color functor. + m_fcolor.test_m = []() -> void {std::cout << "Hello\n";}; + std::invoke(&ColorFunctor::test_m, m_fcolor); + + I tried the above solutions but they don't work. +*/ + // TODO: change it to m_fcolor.face_color(*t3, fh) CGAL::IO::Color c = m_fcolor.run(*t3, &fh); From 5fbaf4343478afa6d498f8973763d2a61cfa6fe0 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 00:23:39 +0200 Subject: [PATCH 041/341] Modified Triangulation 2 to use new APIs version. --- .../include/CGAL/draw_triangulation_2.h | 188 +++++++----------- 1 file changed, 77 insertions(+), 111 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 9fabd0418339..85bb391481c5 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -8,153 +8,119 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_T2_H #define CGAL_DRAW_T2_H -#include +#include +#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER #include -#include #include +#include -namespace CGAL -{ +namespace CGAL { // Default color functor; user can change it to have its own face color -struct DefaultColorFunctorT2 -{ - template - static CGAL::IO::Color run(const T2&, - const typename T2::Finite_faces_iterator fh) - { +struct DefaultColorFunctorT2 { + template + static CGAL::IO::Color run(const T2 &, + const typename T2::Finite_faces_iterator fh) { CGAL::Random random((unsigned int)(std::size_t)(&*fh)); return get_random_color(random); } }; -// Viewer class for T2 -template -class SimpleTriangulation2ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename T2::Vertex_handle Vertex_const_handle; - typedef typename T2::Finite_edges_iterator Edge_const_handle; - typedef typename T2::Finite_faces_iterator Facet_const_handle; - typedef typename T2::Point Point; - -public: - /// Construct the viewer. - /// @param at2 the t2 to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - SimpleTriangulation2ViewerQt(QWidget* parent, const T2& at2, - const char* title="Basic T2 Viewer", - bool anofaces=false, - const ColorFunctor& fcolor=ColorFunctor()) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - t2(at2), - m_nofaces(anofaces), - m_fcolor(fcolor) - { - compute_elements(); - } +namespace draw_function_for_t2 { -protected: - void compute_face(Facet_const_handle fh) - { - CGAL::IO::Color c=m_fcolor.run(t2, fh); - face_begin(c); +template +void compute_face(typename T2::Finite_faces_iterator fh, + GraphicBuffer &graphic_buffer, const T2 *t2, + const ColorFunctor &m_fcolor) { - add_point_in_face(fh->vertex(0)->point()); - add_point_in_face(fh->vertex(1)->point()); - add_point_in_face(fh->vertex(2)->point()); + // TODO: change it to m_fcolor.face_color(*t2, fh) + CGAL::IO::Color c = m_fcolor.run(*t2, fh); + graphic_buffer.face_begin(c); - face_end(); - } + graphic_buffer.add_point_in_face(fh->vertex(0)->point()); + graphic_buffer.add_point_in_face(fh->vertex(1)->point()); + graphic_buffer.add_point_in_face(fh->vertex(2)->point()); - void compute_edge(Edge_const_handle eh) - { - add_segment(eh->first->vertex(eh->first->cw(eh->second))->point(), - eh->first->vertex(eh->first->ccw(eh->second))->point()); - } + graphic_buffer.face_end(); +} - void compute_vertex(Vertex_const_handle vh) - { add_point(vh->point()); } +template +void compute_edge(typename T2::Finite_edges_iterator eh, + GraphicBuffer &graphic_buffer) { + graphic_buffer.add_segment( + eh->first->vertex(eh->first->cw(eh->second))->point(), + eh->first->vertex(eh->first->ccw(eh->second))->point()); +} - void compute_elements() - { - clear(); +template +void compute_vertex(typename T2::Vertex_handle vh, + GraphicBuffer &graphic_buffer) { + graphic_buffer.add_point(vh->point()); +} - if (!m_nofaces) - { - for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); - it!=t2.finite_faces_end(); ++it) - { compute_face(it); } - } +template +void compute_elements(GraphicBuffer &graphic_buffer, const T2 *t2, + const ColorFunctor &m_color_functor, + bool m_nofaces = false) { + // clear(); - for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); - it!=t2.finite_edges_end(); ++it) - { compute_edge(it); } + if (!m_nofaces) { + for (typename T2::Finite_faces_iterator it = t2->finite_faces_begin(); + it != t2->finite_faces_end(); ++it) { + compute_face(it, graphic_buffer, t2, m_color_functor); + } + } - for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); - it!=t2.finite_vertices_end(); ++it) - { compute_vertex(it); } + for (typename T2::Finite_edges_iterator it = t2->finite_edges_begin(); + it != t2->finite_edges_end(); ++it) { + compute_edge(it, graphic_buffer); } - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } + for (typename T2::Finite_vertices_iterator it = t2->finite_vertices_begin(); + it != t2->finite_vertices_end(); ++it) { + compute_vertex(it, graphic_buffer); + } +} - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing +} // namespace draw_function_for_t2 - // Call the base method to process others/classicals key - Base::keyPressEvent(e); +template +void add_in_graphic_buffer_t2(GraphicBuffer &graphic_buffer, + const ColorFunctor &m_color_functor, + const T2 *at2 = nullptr, bool m_nofaces = false) { + if (at2 != nullptr) { + draw_function_for_t2::compute_elements(graphic_buffer, at2, m_color_functor, + m_nofaces); } - -protected: - const T2& t2; - bool m_nofaces; - const ColorFunctor& m_fcolor; -}; +} // Specialization of draw function. #define CGAL_T2_TYPE CGAL::Triangulation_2 -template -void draw(const CGAL_T2_TYPE& at2, - const char* title="Triangulation_2 Basic Viewer", - bool nofill=false) -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"t2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - DefaultColorFunctorT2 fcolor; - SimpleTriangulation2ViewerQt - mainwindow(app.activeWindow(), at2, title, nofill, fcolor); - mainwindow.show(); - app.exec(); - } +template > +void draw(const CGAL_T2_TYPE &at2, + const char *title = "Triangulation_2 Basic Viewer", + const ColorFunctor &color_functor = ColorFunctor(), + bool nofill = false) { + + GraphicBuffer buffer; + // add_in_graphic_buffer_t3(buffer, color_functor, &at3, false); + add_in_graphic_buffer_t2(buffer, DefaultColorFunctorT2(), &at2, false); + draw_buffer(buffer); } #undef CGAL_T2_TYPE From c1037f9040c29d4e2467ef43344219b0d8b9a3db Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 01:48:59 +0200 Subject: [PATCH 042/341] Modified Point_set_3 to use new APIs version. --- Point_set_3/include/CGAL/draw_point_set_3.h | 100 +++++++------------- 1 file changed, 34 insertions(+), 66 deletions(-) diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index f8d9000cfa3e..3c5c5cfb5ccd 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -9,12 +9,13 @@ // // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_POINT_SET_3_H #define CGAL_DRAW_POINT_SET_3_H -#include #include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -36,84 +37,51 @@ void draw(const PS& aps); #ifdef CGAL_USE_BASIC_VIEWER -#include #include +#include #include -namespace CGAL -{ - -// Viewer class for Point_set -template -class SimplePointSetViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename PointSet::Point_map::value_type Point; - -public: - /// Construct the viewer. - /// @param apointset the point set to view - /// @param title the title of the window - SimplePointSetViewerQt(QWidget* parent, - const PointSet& apointset, const char* title="") : - // First draw: vertices; no-edge, no-face; mono-color; no inverse normal - Base(parent, title, true, false, false, true, false), - pointset(apointset) - { - compute_elements(); - } +namespace CGAL { -protected: - void compute_vertex(const Point& p) - { - add_point(p); - // We can use add_point(p, c) with c a CGAL::IO::Color to add a colored point - } +namespace draw_function_for_PointSet { - void compute_elements() - { - clear(); +template +void compute_vertex(const typename PointSet::Point_map::value_type &p, + GraphicBuffer &graphic_buffer) { + graphic_buffer.add_point(p); - for (typename PointSet::const_iterator it=pointset.begin(); - it!=pointset.end(); ++it) - { compute_vertex(pointset.point(*it)); } - } + // We can use add_point(p, c) with c a CGAL::IO::Color to add a colored point + // E.g: graphic_buffer.add_point(p, CGAL::IO::Color(100, 125, 200)); +} - virtual void keyPressEvent(QKeyEvent *e) - { - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - Base::keyPressEvent(e); +template +void compute_elements(const PointSet *pointset, + GraphicBuffer &graphic_buffer) { + for (typename PointSet::const_iterator it = pointset->begin(); + it != pointset->end(); ++it) { + compute_vertex(pointset->point(*it), graphic_buffer); } +} -protected: - const PointSet& pointset; -}; - -// Specialization of draw function. -template -void draw(const Point_set_3& apointset, - const char* title="Point_set_3 Basic Viewer") -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif +} // namespace draw_function_for_PointSet - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"point_set_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimplePointSetViewerQt > mainwindow(app.activeWindow(), - apointset, - title); - mainwindow.show(); - app.exec(); +template +void add_in_graphic_buffer_point_set(GraphicBuffer &graphic_buffer, + const PointSet *aPointSet = nullptr) { + if (aPointSet != nullptr) { + draw_function_for_PointSet::compute_elements(aPointSet, graphic_buffer); } } +// Specialization of draw function. +template +void draw(const Point_set_3 &apointset, + const char *title = "Point_set_3 Basic Viewer") { + GraphicBuffer buffer; + add_in_graphic_buffer_point_set(buffer, &apointset); + draw_buffer(buffer); +} + } // End namespace CGAL #endif // CGAL_USE_BASIC_VIEWER From a569437a14142f9e5fed5cb0a5d4d5330d25a3dd Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Sep 2022 09:04:58 +0200 Subject: [PATCH 043/341] Correction for draw triangulation 3 --- .../include/CGAL/draw_triangulation_3.h | 147 ++++++++---------- 1 file changed, 67 insertions(+), 80 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index ba1a3f707459..393044e3ce96 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -23,62 +23,25 @@ #include #include #include +#include namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorT3 { - template - static CGAL::IO::Color run(const T3 &, - const typename T3::Finite_facets_iterator *fh) { - if (fh == nullptr) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - - CGAL::Random random((unsigned int)((std::size_t)(&*((*fh)->first)) + - (std::size_t)((*fh)->second))); - return get_random_color(random); - } -}; - -namespace draw_function_for_t3 { +namespace draw_function_for_t3 +{ -template +template void compute_face(typename T3::Finite_facets_iterator fh, - GraphicBuffer &graphic_buffer, const T3 *t3, - const ColorFunctor &m_fcolor) { - -/* - // QUESTION: I would like to assign custom color functor during run time, which one down is right? - - // Solution 1 to assign custom color functor. - // m_fcolor.face_color = DefaultColorFunctorT3::run; - - // Solution 2 to assign custom color functor. - // m_fcolor.face_color = - // [](const T3 &, - // const typename T3::Finite_facets_iterator *fh) -> CGAL::IO::Color { - // if (fh == nullptr) // use to get the mono color - // return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - - // CGAL::Random random((unsigned int)((std::size_t)(&*((*fh)->first)) + - // (std::size_t)((*fh)->second))); - - // return get_random_color(random); - // }; - // CGAL::IO::Color c = m_fcolor.face_color(*t3, &fh); - - - // Solution 3 to assign custom color functor. - m_fcolor.test_m = []() -> void {std::cout << "Hello\n";}; - std::invoke(&ColorFunctor::test_m, m_fcolor); - - I tried the above solutions but they don't work. -*/ - - // TODO: change it to m_fcolor.face_color(*t3, fh) - CGAL::IO::Color c = m_fcolor.run(*t3, &fh); - - graphic_buffer.face_begin(c); + const DrawingFunctor &drawing_functor, + CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) +{ + if(drawing_functor.face_color) + { + CGAL::IO::Color c = drawing_functor.face_color(*t3, fh); + graphic_buffer.face_begin(c); + } + else + { graphic_buffer.face_begin(); } graphic_buffer.add_point_in_face( fh->first->vertex((fh->second + 1) % 4)->point()); @@ -92,71 +55,95 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - GraphicBuffer &graphic_buffer) { + CGAL::GraphicBuffer &graphic_buffer) { graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point()); } template void compute_vertex(typename T3::Vertex_handle vh, - GraphicBuffer &graphic_buffer) { + CGAL::GraphicBuffer &graphic_buffer) { graphic_buffer.add_point(vh->point()); } -template -void compute_elements(GraphicBuffer &graphic_buffer, const T3 *t3, - const ColorFunctor &m_color_functor, +template +void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 *t3, + const DrawingFunctor &drawing_functor, bool m_nofaces = false) { if (!m_nofaces) { for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); - it != t3->finite_facets_end(); ++it) { - compute_face(it, graphic_buffer, t3, m_color_functor); + it != t3->finite_facets_end(); ++it) + { + // TODO TEST draw_face + compute_face(it, drawing_functor, graphic_buffer, t3); } } for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); - it != t3->finite_edges_end(); ++it) { + it != t3->finite_edges_end(); ++it) + { // TODO TEST draw_edge + edge color compute_edge(it, graphic_buffer); } for (typename T3::Finite_vertices_iterator it = t3->finite_vertices_begin(); - it != t3->finite_vertices_end(); ++it) { + it != t3->finite_vertices_end(); ++it) + { // TODO TEST draw_vertex + vertex color compute_vertex(it, graphic_buffer); } } } // namespace draw_function_for_t3 -template -void add_in_graphic_buffer_t3(GraphicBuffer &graphic_buffer, - const ColorFunctor &m_color_functor, - const T3 *at3 = nullptr, bool m_nofaces = false) { - if (at3 != nullptr) { - draw_function_for_t3::compute_elements(graphic_buffer, at3, m_color_functor, - m_nofaces); +template +void add_in_graphic_buffer_t3(CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, + const T3 *at3 = nullptr) +{ + if (at3 != nullptr) + { + draw_function_for_t3::compute_elements(graphic_buffer, at3, drawing_functor); } } // Specialization of draw function. #define CGAL_T3_TYPE CGAL::Triangulation_3 -template > -void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer", - const ColorFunctor &color_functor = ColorFunctor(), - bool nofill = false) { - - GraphicBuffer buffer; - // add_in_graphic_buffer_t3(buffer, color_functor, &at3, false); - add_in_graphic_buffer_t3(buffer, DefaultColorFunctorT3(), &at3, false); - +template +void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, + const char *title = "T3 Basic Viewer") +{ + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_t3(buffer, drawingfunctor, &at3); draw_buffer(buffer); } +template +void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") +{ + CGAL::GraphicBuffer buffer; + CGAL::GenericFunctor + drawingfunctor; + + drawingfunctor.face_color = + [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) + -> CGAL::IO::Color + { + if (fh==at3.finite_facets_end()) // use to get the mono color + return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + + CGAL::Random random((unsigned int)((std::size_t)(&*(fh->first)) + + (std::size_t)(fh->second))); + + return get_random_color(random); + }; + + draw(at3, drawingfunctor, title); +} + #undef CGAL_T3_TYPE } // End namespace CGAL From d78819d54d444a34ec13db393e3fafd9e0c82699 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 17:50:44 +0200 Subject: [PATCH 044/341] GraphicBuffer.h renamed to Graphic_buffer.h --- GraphicsView/include/CGAL/{GraphicBuffer.h => Graphic_buffer.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename GraphicsView/include/CGAL/{GraphicBuffer.h => Graphic_buffer.h} (100%) diff --git a/GraphicsView/include/CGAL/GraphicBuffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h similarity index 100% rename from GraphicsView/include/CGAL/GraphicBuffer.h rename to GraphicsView/include/CGAL/Graphic_buffer.h From 6c95908e6c74ce284f34888b9c1a1551324bfbc0 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 18:03:11 +0200 Subject: [PATCH 045/341] Renamed functors and GB, added handles to test functors. --- GraphicsView/include/CGAL/Generic_functors.h | 10 ++-- GraphicsView/include/CGAL/Graphic_buffer.h | 7 --- .../include/CGAL/Qt/Basic_viewer_qt.h | 2 +- .../demo/Linear_cell_complex/Viewer.h | 2 +- .../CGAL/draw_linear_cell_complex_function.h | 4 +- .../include/CGAL/draw_triangulation_2.h | 4 +- .../include/CGAL/draw_triangulation_3.h | 54 ++++++++++++++----- 7 files changed, 53 insertions(+), 30 deletions(-) diff --git a/GraphicsView/include/CGAL/Generic_functors.h b/GraphicsView/include/CGAL/Generic_functors.h index e9deab53494c..5c39b610d45d 100644 --- a/GraphicsView/include/CGAL/Generic_functors.h +++ b/GraphicsView/include/CGAL/Generic_functors.h @@ -19,9 +19,9 @@ template -struct GenericFunctor +struct DrawingFunctor { - GenericFunctor(): m_enabled_vertices(true), + DrawingFunctor(): m_enabled_vertices(true), m_enabled_edges(true), m_enabled_faces(true) { @@ -71,10 +71,10 @@ template -struct GenericFunctorWithVolume : - public GenericFunctor +struct DrawingFunctorWithVolume : + public DrawingFunctor { - GenericFunctorWithVolume() : m_enabled_volumes(true) + DrawingFunctorWithVolume() : m_enabled_volumes(true) { draw_volume=[](const DS &, volume_handle)->bool { return true; }; colored_volume=[](const DS &, volume_handle)->bool { return false; }; diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index bf3ec0aaac93..84456815b38f 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -13,12 +13,6 @@ #define CGAL_GRAPHIC_BUFFER_H #include -// BUG: Warning - TODO? -/* -#include errors detected. Please update your includePath. ' -Squiggles are disabled for this translation unit - -*/ #include #include @@ -40,7 +34,6 @@ Squiggles are disabled for this translation unit #include #include -// #include namespace CGAL { diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 2f0a0404cdaf..1337df046e1a 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -49,7 +49,7 @@ #include #include -#include +#include #include #include #include diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 7ca3c9d4f187..c16eb2420257 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -37,7 +37,7 @@ public Q_SLOTS: void sceneChanged(); private: - CGAL::GenericFunctorWithVolume +#include #include #include #include @@ -264,7 +264,7 @@ template class Map, class Refs, class Storage_, - class DrawingFunctor=GenericFunctorWithVolume -#include +#include #include #include @@ -109,7 +109,7 @@ void add_in_graphic_buffer_t2(GraphicBuffer &graphic_buffer, template > void draw(const CGAL_T2_TYPE &at2, diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 393044e3ce96..4f60bb5328f6 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_T3_H #include -#include +#include #include #include @@ -23,7 +23,6 @@ #include #include #include -#include namespace CGAL { @@ -35,6 +34,12 @@ void compute_face(typename T3::Finite_facets_iterator fh, const DrawingFunctor &drawing_functor, CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { + // DONE: TEST draw_face + if(!drawing_functor.draw_face(*t3, fh)) + { + return; + } + if(drawing_functor.face_color) { CGAL::IO::Color c = drawing_functor.face_color(*t3, fh); @@ -55,15 +60,41 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::GraphicBuffer &graphic_buffer) { - graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), - eh->first->vertex(eh->third)->point()); + CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { + // DONE: TEST draw_edge + edge color + if(!drawing_functor.draw_edge(*t3, eh)) { + return; + } + if( && drawing_functor.edge_color) { + + CGAL::IO::Color c = drawing_functor.edge_color(*t3, eh); + graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), + eh->first->vertex(eh->third)->point(), c); + } + else { + graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), + eh->first->vertex(eh->third)->point()); + } } template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer) { - graphic_buffer.add_point(vh->point()); + CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { + + // DONE TEST draw_vertex + vertex color + if(!drawing_functor.draw_vertex(*t3, vh)) + { + return; + } + + if(drawing_functor.vertex_color) + { + CGAL::IO::Color c = drawing_functor.vertex_color(*t3, vh); + graphic_buffer.add_point(vh->point(), c); + } + else + { graphic_buffer.add_point(vh->point()); } + } template @@ -75,20 +106,19 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); it != t3->finite_facets_end(); ++it) { - // TODO TEST draw_face - compute_face(it, drawing_functor, graphic_buffer, t3); + compute_face(it, drawing_functor, graphic_buffer, t3); } } for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); it != t3->finite_edges_end(); ++it) - { // TODO TEST draw_edge + edge color + { compute_edge(it, graphic_buffer); } for (typename T3::Finite_vertices_iterator it = t3->finite_vertices_begin(); it != t3->finite_vertices_end(); ++it) - { // TODO TEST draw_vertex + vertex color + { compute_vertex(it, graphic_buffer); } } @@ -122,7 +152,7 @@ template void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") { CGAL::GraphicBuffer buffer; - CGAL::GenericFunctor From 9c1b89c202189b5c50b88f74bbbe6f2c251c0ac3 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 18:22:51 +0200 Subject: [PATCH 046/341] Modified T3 templates to test functors --- .../include/CGAL/draw_triangulation_3.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 4f60bb5328f6..478340f7912e 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -58,14 +58,14 @@ void compute_face(typename T3::Finite_facets_iterator fh, graphic_buffer.face_end(); } -template +template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { + CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { // DONE: TEST draw_edge + edge color if(!drawing_functor.draw_edge(*t3, eh)) { return; } - if( && drawing_functor.edge_color) { + if(drawing_functor.edge_color) { CGAL::IO::Color c = drawing_functor.edge_color(*t3, eh); graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), @@ -77,9 +77,9 @@ void compute_edge(typename T3::Finite_edges_iterator eh, } } -template +template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { + CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { // DONE TEST draw_vertex + vertex color if(!drawing_functor.draw_vertex(*t3, vh)) @@ -113,13 +113,13 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); it != t3->finite_edges_end(); ++it) { - compute_edge(it, graphic_buffer); + compute_edge(it, graphic_buffer,drawing_functor , t3); } for (typename T3::Finite_vertices_iterator it = t3->finite_vertices_begin(); it != t3->finite_vertices_end(); ++it) { - compute_vertex(it, graphic_buffer); + compute_vertex(it, graphic_buffer, drawing_functor, t3); } } From cf51780c0ddc6adda9eabac32b937eb6af8946a8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Sep 2022 19:48:07 +0200 Subject: [PATCH 047/341] small modifs --- .../include/CGAL/draw_triangulation_3.h | 55 +++++++++---------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 478340f7912e..c98b990d5de2 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -34,13 +34,10 @@ void compute_face(typename T3::Finite_facets_iterator fh, const DrawingFunctor &drawing_functor, CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) { - // DONE: TEST draw_face if(!drawing_functor.draw_face(*t3, fh)) - { - return; - } + { return; } - if(drawing_functor.face_color) + if(drawing_functor.colored_face(*t3, fh) && drawing_functor.face_color) { CGAL::IO::Color c = drawing_functor.face_color(*t3, fh); graphic_buffer.face_begin(c); @@ -60,13 +57,13 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { - // DONE: TEST draw_edge + edge color - if(!drawing_functor.draw_edge(*t3, eh)) { - return; - } - if(drawing_functor.edge_color) { + CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) +{ + if(!drawing_functor.draw_edge(*t3, eh)) + { return; } + if(drawing_functor.colored_edge(*t3, eh) && drawing_functor.edge_color) + { CGAL::IO::Color c = drawing_functor.edge_color(*t3, eh); graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point(), c); @@ -79,35 +76,28 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { - - // DONE TEST draw_vertex + vertex color + CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) +{ if(!drawing_functor.draw_vertex(*t3, vh)) - { - return; - } + { return; } - if(drawing_functor.vertex_color) + if(drawing_functor.colored_vertex(*t3, vh) && drawing_functor.vertex_color) { CGAL::IO::Color c = drawing_functor.vertex_color(*t3, vh); graphic_buffer.add_point(vh->point(), c); } else { graphic_buffer.add_point(vh->point()); } - } template void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 *t3, - const DrawingFunctor &drawing_functor, - bool m_nofaces = false) { - - if (!m_nofaces) { - for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); - it != t3->finite_facets_end(); ++it) - { - compute_face(it, drawing_functor, graphic_buffer, t3); - } + const DrawingFunctor &drawing_functor) +{ + for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); + it != t3->finite_facets_end(); ++it) + { + compute_face(it, drawing_functor, graphic_buffer, t3); } for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); @@ -122,7 +112,7 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 compute_vertex(it, graphic_buffer, drawing_functor, t3); } } - + } // namespace draw_function_for_t3 template @@ -158,7 +148,12 @@ void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") typename CGAL_T3_TYPE::Finite_facets_iterator> drawingfunctor; - drawingfunctor.face_color = + drawingfunctor.colored_face = + [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) + -> bool + { return true; }; + + drawingfunctor.face_color = [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) -> CGAL::IO::Color { From bf59ef50030aa5cb4b3abe3e5044b2da03f88d6c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 22:09:08 +0200 Subject: [PATCH 048/341] Generic_functor.h renamed to Drawing_functor.h --- .../include/CGAL/{Generic_functors.h => Drawing_functor.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename GraphicsView/include/CGAL/{Generic_functors.h => Drawing_functor.h} (100%) diff --git a/GraphicsView/include/CGAL/Generic_functors.h b/GraphicsView/include/CGAL/Drawing_functor.h similarity index 100% rename from GraphicsView/include/CGAL/Generic_functors.h rename to GraphicsView/include/CGAL/Drawing_functor.h From cb4c77f1eba2fad6effa8472a2df1249cccce0ee Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 22:21:01 +0200 Subject: [PATCH 049/341] changed functor names. --- GraphicsView/include/CGAL/Drawing_functor.h | 10 +++++----- Linear_cell_complex/demo/Linear_cell_complex/Viewer.h | 2 +- .../include/CGAL/draw_linear_cell_complex_function.h | 4 ++-- Triangulation_2/include/CGAL/draw_triangulation_2.h | 4 ++-- Triangulation_3/include/CGAL/draw_triangulation_3.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index 5c39b610d45d..e0907cfc12fc 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -19,9 +19,9 @@ template -struct DrawingFunctor +struct Drawing_functor { - DrawingFunctor(): m_enabled_vertices(true), + Drawing_functor(): m_enabled_vertices(true), m_enabled_edges(true), m_enabled_faces(true) { @@ -71,10 +71,10 @@ template -struct DrawingFunctorWithVolume : - public DrawingFunctor +struct Drawing_functor_with_volume : + public Drawing_functor { - DrawingFunctorWithVolume() : m_enabled_volumes(true) + Drawing_functor_with_volume() : m_enabled_volumes(true) { draw_volume=[](const DS &, volume_handle)->bool { return true; }; colored_volume=[](const DS &, volume_handle)->bool { return false; }; diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index c16eb2420257..9d662e6e6a11 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -37,7 +37,7 @@ public Q_SLOTS: void sceneChanged(); private: - CGAL::DrawingFunctorWithVolume -#include +#include #include #include @@ -264,7 +264,7 @@ template class Map, class Refs, class Storage_, - class DrawingFunctor=DrawingFunctorWithVolume +#include #include #include #include @@ -109,7 +109,7 @@ void add_in_graphic_buffer_t2(GraphicBuffer &graphic_buffer, template > void draw(const CGAL_T2_TYPE &at2, diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index c98b990d5de2..7ca0cd35e609 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -13,7 +13,7 @@ #ifndef CGAL_DRAW_T3_H #define CGAL_DRAW_T3_H -#include +#include #include #include #include From e77c52b1964f8c2752abdbb85c47e88aa393151f Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 22:29:33 +0200 Subject: [PATCH 050/341] Changed functor name --- Triangulation_3/include/CGAL/draw_triangulation_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 7ca0cd35e609..5361701bda62 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -142,7 +142,7 @@ template void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") { CGAL::GraphicBuffer buffer; - CGAL::DrawingFunctor From 53f0952e0f13e221579ad85e84bd55817bcb9ef7 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 23:03:21 +0200 Subject: [PATCH 051/341] Modified T2. --- .../include/CGAL/draw_triangulation_2.h | 137 ++++++++++++------ 1 file changed, 92 insertions(+), 45 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 9862fcd82334..a0635f428bc4 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -26,26 +26,25 @@ namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorT2 { - template - static CGAL::IO::Color run(const T2 &, - const typename T2::Finite_faces_iterator fh) { - CGAL::Random random((unsigned int)(std::size_t)(&*fh)); - return get_random_color(random); - } -}; - namespace draw_function_for_t2 { -template +template void compute_face(typename T2::Finite_faces_iterator fh, - GraphicBuffer &graphic_buffer, const T2 *t2, - const ColorFunctor &m_fcolor) { + const DrawingFunctor &drawing_functor, + CGAL::GraphicBuffer &graphic_buffer, + const T2 *t2) { - // TODO: change it to m_fcolor.face_color(*t2, fh) - CGAL::IO::Color c = m_fcolor.run(*t2, fh); - graphic_buffer.face_begin(c); + if (!drawing_functor.draw_face(*t2, fh)) { + return; + } + + if (drawing_functor.colored_face(*t2, fh) && drawing_functor.face_color) { + CGAL::IO::Color c = drawing_functor.face_color(*t2, fh); + graphic_buffer.face_begin(c); + + } else { + graphic_buffer.face_begin(); + } graphic_buffer.add_point_in_face(fh->vertex(0)->point()); graphic_buffer.add_point_in_face(fh->vertex(1)->point()); @@ -54,52 +53,78 @@ void compute_face(typename T2::Finite_faces_iterator fh, graphic_buffer.face_end(); } -template +template void compute_edge(typename T2::Finite_edges_iterator eh, - GraphicBuffer &graphic_buffer) { - graphic_buffer.add_segment( - eh->first->vertex(eh->first->cw(eh->second))->point(), - eh->first->vertex(eh->first->ccw(eh->second))->point()); + const DrawingFunctor &drawing_functor, const T2 *t2, + CGAL::GraphicBuffer &graphic_buffer) { + + if (!drawing_functor.draw_edge(*t2, eh)) { + return; + } + + if (drawing_functor.colored_edge(*t2, eh) && drawing_functor.edge_color) { + + CGAL::IO::Color c = drawing_functor.edge_color(*t2, eh); + graphic_buffer.add_segment( + eh->first->vertex(eh->first->cw(eh->second))->point(), + eh->first->vertex(eh->first->ccw(eh->second))->point(), c); + } + + else { + graphic_buffer.add_segment( + eh->first->vertex(eh->first->cw(eh->second))->point(), + eh->first->vertex(eh->first->ccw(eh->second))->point()); + } } -template +template void compute_vertex(typename T2::Vertex_handle vh, - GraphicBuffer &graphic_buffer) { - graphic_buffer.add_point(vh->point()); + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, const T2 *t2) { + + if (!drawing_functor.draw_vertex(*t2, vh)) { + return; + } + + if (drawing_functor.colored_vertex(*t2, vh) && drawing_functor.vertex_color) { + CGAL::IO::Color c = drawing_functor.vertex_color(*t2, vh); + graphic_buffer.add_point(vh->point(), c); + } else { + graphic_buffer.add_point(vh->point()); + } } -template -void compute_elements(GraphicBuffer &graphic_buffer, const T2 *t2, - const ColorFunctor &m_color_functor, +template +void compute_elements(CGAL::GraphicBuffer &graphic_buffer, + const T2 *t2, const DrawingFunctor &drawing_functor, bool m_nofaces = false) { - // clear(); if (!m_nofaces) { for (typename T2::Finite_faces_iterator it = t2->finite_faces_begin(); it != t2->finite_faces_end(); ++it) { - compute_face(it, graphic_buffer, t2, m_color_functor); + compute_face(it, drawing_functor, graphic_buffer, t2); } } for (typename T2::Finite_edges_iterator it = t2->finite_edges_begin(); it != t2->finite_edges_end(); ++it) { - compute_edge(it, graphic_buffer); + compute_edge(it, drawing_functor, t2, graphic_buffer); } for (typename T2::Finite_vertices_iterator it = t2->finite_vertices_begin(); it != t2->finite_vertices_end(); ++it) { - compute_vertex(it, graphic_buffer); + compute_vertex(it, graphic_buffer, drawing_functor, t2); } } } // namespace draw_function_for_t2 -template -void add_in_graphic_buffer_t2(GraphicBuffer &graphic_buffer, - const ColorFunctor &m_color_functor, +template +void add_in_graphic_buffer_t2(CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, const T2 *at2 = nullptr, bool m_nofaces = false) { if (at2 != nullptr) { - draw_function_for_t2::compute_elements(graphic_buffer, at2, m_color_functor, + draw_function_for_t2::compute_elements(graphic_buffer, at2, drawing_functor, m_nofaces); } } @@ -107,22 +132,44 @@ void add_in_graphic_buffer_t2(GraphicBuffer &graphic_buffer, // Specialization of draw function. #define CGAL_T2_TYPE CGAL::Triangulation_2 -template > -void draw(const CGAL_T2_TYPE &at2, +template +void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title = "Triangulation_2 Basic Viewer", - const ColorFunctor &color_functor = ColorFunctor(), bool nofill = false) { - GraphicBuffer buffer; - // add_in_graphic_buffer_t3(buffer, color_functor, &at3, false); - add_in_graphic_buffer_t2(buffer, DefaultColorFunctorT2(), &at2, false); + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_t2(buffer, drawingfunctor, &at2, nofill); draw_buffer(buffer); } +template +void draw(const CGAL_T2_TYPE &at2, + const char *title = "Triangulation_2 Basic Viewer", + bool nofill = false) { + + CGAL::GraphicBuffer buffer; + Drawing_functor + drawingFunctor; + + drawingFunctor.colored_face = + [](const CGAL_T2_TYPE &at3, + const typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> bool { + return true; + }; + + drawingFunctor.face_color = + [](const CGAL_T2_TYPE &at2, + const typename CGAL_T2_TYPE::Finite_faces_iterator fh) + -> CGAL::IO::Color { + CGAL::Random random((unsigned int)(std::size_t)(&*fh)); + return get_random_color(random); + }; + + draw(at2, drawingFunctor, title, nofill); +} + #undef CGAL_T2_TYPE } // End namespace CGAL From ac259bfc852a89085cefce66c5da844255940104 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 23 Sep 2022 23:05:45 +0200 Subject: [PATCH 052/341] Fixed typo --- Triangulation_2/include/CGAL/draw_triangulation_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index a0635f428bc4..5fd3dba9e24f 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -154,7 +154,7 @@ void draw(const CGAL_T2_TYPE &at2, drawingFunctor; drawingFunctor.colored_face = - [](const CGAL_T2_TYPE &at3, + [](const CGAL_T2_TYPE &at2, const typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> bool { return true; }; From fcdad212b566b2560dfa4dc3cb581866465c1a12 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 24 Sep 2022 00:50:13 +0200 Subject: [PATCH 053/341] Applied new APIs version on Straight skeleton 2. --- .../include/CGAL/draw_straight_skeleton_2.h | 229 ++++++++---------- 1 file changed, 100 insertions(+), 129 deletions(-) diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 60a631250a13..fcf32bed8a0f 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -8,168 +8,139 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_SS2_H #define CGAL_DRAW_SS2_H -#include +#include +#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER -#include #include +#include #include namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorSS2 -{ - template - static CGAL::IO::Color run(const SS2&, - const typename SS2::Finite_faces_iterator fh) - { - CGAL::Random random((unsigned int)(std::size_t)(&*fh)); - return get_random_color(random); +namespace draw_function_for_ss2 { + +template +void compute_edge(typename SS2::Halfedge_const_handle eh, + const DrawingFunctor &drawing_functor, const SS2 *ss2, + CGAL::GraphicBuffer &graphic_buffer) { + + if (!drawing_functor.draw_edge(*ss2, eh)) { + return; } -}; - -// Viewer class for SS2 -template -class SimpleStraightSkeleton2ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename SS2::Vertex_const_handle Vertex_const_handle; - typedef typename SS2::Halfedge_const_handle Halfedge_const_handle; - - // typedef typename SS2::Point Point; - -public: - /// Construct the viewer. - /// @param ass2 the ss2 to view - /// @param title the title of the window - SimpleStraightSkeleton2ViewerQt(QWidget* parent, const SS2& ass2, - const char* title="Basic SS2 Viewer", - const ColorFunctor& fcolor=ColorFunctor()) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - ss2(ass2), - m_fcolor(fcolor) - { - compute_elements(); + + if (drawing_functor.colored_edge(*ss2, eh)) { + if (eh->is_bisector()) + graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + eh->vertex()->point(), CGAL::IO::red()); + else + graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + eh->vertex()->point(), CGAL::IO::black()); } +} + +template +void print_halfedge_labels(typename SS2::Halfedge_const_handle h, + CGAL::GraphicBuffer &graphic_buffer) { + std::stringstream label; -protected: - /* - void compute_face(Facet_const_handle fh) - { - CGAL::IO::Color c=m_fcolor.run(ss2, fh); - face_begin(c); + label << "H" << h->id() << " (V" << h->vertex()->id() << ") "; + label << "H" << h->opposite()->id() << " (V" << h->opposite()->vertex()->id() + << ") "; + + graphic_buffer.add_text( + CGAL::midpoint(h->opposite()->vertex()->point(), h->vertex()->point()), + label.str()); +} - add_point_in_face(fh->vertex(0)->point()); - add_point_in_face(fh->vertex(1)->point()); - add_point_in_face(fh->vertex(2)->point()); +template +void compute_vertex(typename SS2::Vertex_const_handle vh, + const DrawingFunctor &drawing_functor, const SS2 *ss2, + CGAL::GraphicBuffer &graphic_buffer) { - face_end(); + if (!drawing_functor.draw_vertex(*ss2, vh)) { + return; } - */ - void compute_edge(Halfedge_const_handle eh) - { - if(eh->is_bisector()) - add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point(), CGAL::IO::red()); + if (drawing_functor.colored_vertex(*ss2, vh)) { + if (vh->is_split()) + graphic_buffer.add_point( + vh->point(), CGAL::IO::Color(10, 10, 180)); // blue, but not flashy + else if (vh->has_infinite_time()) + graphic_buffer.add_point(vh->point(), CGAL::IO::orange()); else - add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point(), CGAL::IO::black()); - } - void print_halfedge_labels(Halfedge_const_handle h) - { - std::stringstream label; - label << "H" << h->id() << " (V" << h->vertex()->id() << ") "; - label << "H" << h->opposite()->id() << " (V" << h->opposite()->vertex()->id() << ") "; - add_text(CGAL::midpoint(h->opposite()->vertex()->point(), h->vertex()->point()), label.str()); + graphic_buffer.add_point( + vh->point(), CGAL::IO::Color(10, 180, 10)); // green, but not flashy } +} - void compute_vertex(Vertex_const_handle vh) - { - if(vh->is_split()) - add_point(vh->point(), CGAL::IO::Color(10,10,180)); // blue, but not flashy - else if(vh->has_infinite_time()) - add_point(vh->point(), CGAL::IO::orange()); - else - add_point(vh->point(), CGAL::IO::Color(10,180,10)); // green, but not flashy - } - void print_vertex_label(Vertex_const_handle vh) - { - std::stringstream label; - label << "V" << vh->id() << std::ends; - add_text(vh->point(), label.str()); - } +template +void print_vertex_label(typename SS2::Vertex_const_handle vh, + CGAL::GraphicBuffer &graphic_buffer) { + std::stringstream label; + label << "V" << vh->id() << std::ends; + graphic_buffer.add_text(vh->point(), label.str()); +} - void compute_elements() - { - clear(); - - for (typename SS2::Halfedge_const_iterator it=ss2.halfedges_begin(); it!=ss2.halfedges_end(); ++it) - { - if(it->id() < it->opposite()->id()) - { - compute_edge(it); - print_halfedge_labels(it); - } - } - for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); it!=ss2.vertices_end(); ++it) - { - compute_vertex(it); - print_vertex_label(it); +template +void compute_elements(CGAL::GraphicBuffer &graphic_buffer, + const SS2 *ss2, const DrawingFunctor &drawing_functor) { + + for (typename SS2::Halfedge_const_iterator it = ss2->halfedges_begin(); + it != ss2->halfedges_end(); ++it) { + if (it->id() < it->opposite()->id()) { + compute_edge(it, drawing_functor, ss2, graphic_buffer); + print_halfedge_labels(it, graphic_buffer); } } + for (typename SS2::Vertex_const_iterator it = ss2->vertices_begin(); + it != ss2->vertices_end(); ++it) { + compute_vertex(it, drawing_functor, ss2, graphic_buffer); + print_vertex_label(it, graphic_buffer); + } +} - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing +} // namespace draw_function_for_ss2 - // Call the base method to process others/classicals key - Base::keyPressEvent(e); +template +void add_in_graphic_buffer_ss2(CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, + const ss2 *ass2 = nullptr) { + if (ass2 != nullptr) { + draw_function_for_ss2::compute_elements(graphic_buffer, ass2, + drawing_functor); } - -protected: - const SS2& ss2; - const ColorFunctor& m_fcolor; -}; +} // Specialization of draw function. #define CGAL_SS_TYPE CGAL::Straight_skeleton_2 -template -void draw(const CGAL_SS_TYPE& ass2, - const char* title="Straight Skeleton Basic Viewer") -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - int argc=1; - const char* argv[2]={"ss2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - DefaultColorFunctorSS2 fcolor; - SimpleStraightSkeleton2ViewerQt - mainwindow(app.activeWindow(), ass2, title, fcolor); - mainwindow.show(); - app.exec(); - } +template +void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, + const char *title = "Straight Skeleton Basic Viewer") { + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_ss2(buffer, drawingfunctor, &ass2); + draw_buffer(buffer); +} + +template +void draw(const CGAL_SS_TYPE &ass2, + const char *title = "Straight Skeleton Basic Viewer") { + + Drawing_functor + drawingFunctor; + + draw(ass2, drawingFunctor, title); } #undef CGAL_SS_TYPE From a84a2eea083a241385f7644db8c187226b87e27c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 24 Sep 2022 03:33:46 +0200 Subject: [PATCH 054/341] Applied new APIs version on Straight polygon 2. --- Polygon/include/CGAL/draw_polygon_2.h | 119 ++++++++++---------------- 1 file changed, 44 insertions(+), 75 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 1ab6ea142674..5173a7d5bb1c 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -13,10 +13,13 @@ // // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_POLYGON_2_H #define CGAL_DRAW_POLYGON_2_H +#include +#include #include #ifdef DOXYGEN_RUNNING @@ -39,99 +42,65 @@ void draw(const P& ap); #endif #ifdef CGAL_USE_BASIC_VIEWER -#include + #include +#include #include -namespace CGAL -{ - -// Viewer class for Polygon_2 -template -class SimplePolygon2ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename P2::Point_2 Point; +namespace CGAL { -public: - /// Construct the viewer. - /// @param ap2 the polygon to view - /// @param title the title of the window - SimplePolygon2ViewerQt(QWidget* parent, const P2& ap2, - const char* title="Basic Polygon_2 Viewer") : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - p2(ap2) - { - compute_elements(); - } +namespace draw_function_for_p2 { -protected: - void compute_elements() - { - clear(); +template +void compute_elements(CGAL::GraphicBuffer &graphic_buffer, + const P2 *p2) { - if (p2.is_empty()) return; + typedef typename P2::Point_2 Point; - Point prev=p2.vertex(p2.size()-1); + if (p2->is_empty()) + return; - CGAL::IO::Color c(75,160,255); - face_begin(c); + Point prev = p2->vertex(p2->size() - 1); - for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); - i!=p2.vertices_end(); ++i) - { - add_point(*i); // Add vertex - add_segment(prev, *i); // Add segment with previous point - add_point_in_face(*i); // Add point in face - prev=*i; - } + CGAL::IO::Color c(75, 160, 255); + graphic_buffer.face_begin(c); - face_end(); + for (typename P2::Vertex_const_iterator i = p2->vertices_begin(); + i != p2->vertices_end(); ++i) { + graphic_buffer.add_point(*i); // Add vertex + graphic_buffer.add_segment(prev, *i); // Add segment with previous point + graphic_buffer.add_point_in_face(*i); // Add point in face + prev = *i; } - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } + graphic_buffer.face_end(); +} - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing +} // namespace draw_function_for_p2 - // Call the base method to process others/classicals key - Base::keyPressEvent(e); +template +void add_in_graphic_buffer_p2(CGAL::GraphicBuffer &graphic_buffer, + const P2 *p2 = nullptr) { + if (p2 != nullptr) { + draw_function_for_p2::compute_elements(graphic_buffer, p2); } - -protected: - const P2& p2; -}; +} // Specialization of draw function. -template -void draw(const CGAL::Polygon_2& ap2, - const char* title="Polygon_2 Basic Viewer") -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif +#define CGAL_P2_TYPE CGAL::Polygon_2 - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"t2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimplePolygon2ViewerQt > - mainwindow(app.activeWindow(), ap2, title); - mainwindow.show(); - app.exec(); - } +template +void draw(const CGAL_P2_TYPE &ap2, + const char *title = "Polygon_2 Basic Viewer") { + + // Drawing_functor + // drawingFunctor; + + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_p2(buffer, &ap2); + draw_buffer(buffer); } } // End namespace CGAL From bc2158809f432cf05af605136cac3b8dccf8c6a2 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 26 Sep 2022 18:45:01 +0200 Subject: [PATCH 055/341] two versions of add --- .../include/CGAL/draw_triangulation_3.h | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 5361701bda62..3b6e7901c2b2 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -57,7 +57,8 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, const T3 *t3) { if(!drawing_functor.draw_edge(*t3, eh)) { return; } @@ -76,7 +77,8 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, const T3 *t3) { if(!drawing_functor.draw_vertex(*t3, vh)) { return; } @@ -116,32 +118,17 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 } // namespace draw_function_for_t3 template -void add_in_graphic_buffer_t3(CGAL::GraphicBuffer &graphic_buffer, - const DrawingFunctor &drawing_functor, - const T3 *at3 = nullptr) +void add_in_graphic_buffer_t3(const T3 &at3, + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor) { - if (at3 != nullptr) - { - draw_function_for_t3::compute_elements(graphic_buffer, at3, drawing_functor); - } -} - -// Specialization of draw function. -#define CGAL_T3_TYPE CGAL::Triangulation_3 - -template -void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, - const char *title = "T3 Basic Viewer") -{ - CGAL::GraphicBuffer buffer; - add_in_graphic_buffer_t3(buffer, drawingfunctor, &at3); - draw_buffer(buffer); + draw_function_for_t3::compute_elements(at3, graphic_buffer, drawing_functor); } -template -void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") +template +void add_in_graphic_buffer_t3(const T3 &at3, + CGAL::GraphicBuffer &graphic_buffer) { - CGAL::GraphicBuffer buffer; CGAL::Drawing_functor + +template +void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, + const char *title = "T3 Basic Viewer") +{ + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_t3(buffer, drawingfunctor, &at3); + draw_buffer(buffer); +} - draw(at3, drawingfunctor, title); +template +void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") +{ + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_t3(buffer, &at3); + draw_buffer(buffer); } #undef CGAL_T3_TYPE From 1108403caf8e79f8b8db2d843630e211f0546cf7 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 1 Oct 2022 18:26:09 +0200 Subject: [PATCH 056/341] Modified T3 --- .../include/CGAL/draw_triangulation_3.h | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 3b6e7901c2b2..42697e9938ea 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -93,7 +93,7 @@ void compute_vertex(typename T3::Vertex_handle vh, } template -void compute_elements(CGAL::GraphicBuffer &graphic_buffer, const T3 *t3, +void compute_elements(const T3 *t3, CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor) { for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); @@ -122,26 +122,26 @@ void add_in_graphic_buffer_t3(const T3 &at3, CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor) { - draw_function_for_t3::compute_elements(at3, graphic_buffer, drawing_functor); + draw_function_for_t3::compute_elements(&at3, graphic_buffer, drawing_functor); } template void add_in_graphic_buffer_t3(const T3 &at3, CGAL::GraphicBuffer &graphic_buffer) { - CGAL::Drawing_functor - drawingfunctor; - - drawingfunctor.colored_face = - [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) + CGAL::Drawing_functor + drawing_functor; + + drawing_functor.colored_face = + [](const T3 &at3, const typename T3::Finite_facets_iterator fh) -> bool { return true; }; - drawingfunctor.face_color = - [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) + drawing_functor.face_color = + [](const T3 &at3, const typename T3::Finite_facets_iterator fh) -> CGAL::IO::Color { if (fh==at3.finite_facets_end()) // use to get the mono color @@ -164,7 +164,7 @@ void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, const char *title = "T3 Basic Viewer") { CGAL::GraphicBuffer buffer; - add_in_graphic_buffer_t3(buffer, drawingfunctor, &at3); + add_in_graphic_buffer_t3(at3, buffer, drawingfunctor); draw_buffer(buffer); } @@ -172,7 +172,7 @@ template void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") { CGAL::GraphicBuffer buffer; - add_in_graphic_buffer_t3(buffer, &at3); + add_in_graphic_buffer_t3(at3, buffer); draw_buffer(buffer); } From 88193459ba00e91b81055d94e29f77502a250889 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 1 Oct 2022 18:48:41 +0200 Subject: [PATCH 057/341] Added two versions of add in T2 --- .../include/CGAL/draw_triangulation_2.h | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 5fd3dba9e24f..271b5b99057a 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -95,8 +95,9 @@ void compute_vertex(typename T2::Vertex_handle vh, } template -void compute_elements(CGAL::GraphicBuffer &graphic_buffer, - const T2 *t2, const DrawingFunctor &drawing_functor, +void compute_elements(const T2 *t2, + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor, bool m_nofaces = false) { if (!m_nofaces) { @@ -120,13 +121,38 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, } // namespace draw_function_for_t2 template -void add_in_graphic_buffer_t2(CGAL::GraphicBuffer &graphic_buffer, +void add_in_graphic_buffer_t2(const T2 &at2, + CGAL::GraphicBuffer &graphic_buffer, const DrawingFunctor &drawing_functor, - const T2 *at2 = nullptr, bool m_nofaces = false) { - if (at2 != nullptr) { - draw_function_for_t2::compute_elements(graphic_buffer, at2, drawing_functor, - m_nofaces); - } + bool m_nofaces = false) { + draw_function_for_t2::compute_elements(&at2, graphic_buffer, drawing_functor, + m_nofaces); +} + +template +void add_in_graphic_buffer_t2(const T2 &at2, + CGAL::GraphicBuffer &graphic_buffer, + bool m_nofaces = false) { + + CGAL::GraphicBuffer buffer; + Drawing_functor + drawingFunctor; + + drawingFunctor.colored_face = + [](const T2 &at2, const typename T2::Finite_faces_iterator fh) -> bool { + return true; + }; + + drawingFunctor.face_color = + [](const T2 &at2, + const typename T2::Finite_faces_iterator fh) -> CGAL::IO::Color { + CGAL::Random random((unsigned int)(std::size_t)(&*fh)); + return get_random_color(random); + }; + + add_in_graphic_buffer_t2(at2, graphic_buffer, drawingFunctor, m_nofaces); } // Specialization of draw function. @@ -136,9 +162,8 @@ template void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { - CGAL::GraphicBuffer buffer; - add_in_graphic_buffer_t2(buffer, drawingfunctor, &at2, nofill); + add_in_graphic_buffer_t2(at2, buffer, drawingfunctor, nofill); draw_buffer(buffer); } @@ -146,28 +171,9 @@ template void draw(const CGAL_T2_TYPE &at2, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { - CGAL::GraphicBuffer buffer; - Drawing_functor - drawingFunctor; - - drawingFunctor.colored_face = - [](const CGAL_T2_TYPE &at2, - const typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> bool { - return true; - }; - - drawingFunctor.face_color = - [](const CGAL_T2_TYPE &at2, - const typename CGAL_T2_TYPE::Finite_faces_iterator fh) - -> CGAL::IO::Color { - CGAL::Random random((unsigned int)(std::size_t)(&*fh)); - return get_random_color(random); - }; - - draw(at2, drawingFunctor, title, nofill); + add_in_graphic_buffer_t2(at2, buffer, nofill); + draw_buffer(buffer); } #undef CGAL_T2_TYPE From 273ead7ab4ba7b4951a1909cd9c932cfc6a8fcea Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 1 Oct 2022 19:07:09 +0200 Subject: [PATCH 058/341] Added two versions of add in SS2 --- .../include/CGAL/draw_straight_skeleton_2.h | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index fcf32bed8a0f..db4dfaac3ab2 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -91,8 +91,9 @@ void print_vertex_label(typename SS2::Vertex_const_handle vh, } template -void compute_elements(CGAL::GraphicBuffer &graphic_buffer, - const SS2 *ss2, const DrawingFunctor &drawing_functor) { +void compute_elements(const SS2 *ss2, + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor) { for (typename SS2::Halfedge_const_iterator it = ss2->halfedges_begin(); it != ss2->halfedges_end(); ++it) { @@ -110,14 +111,23 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, } // namespace draw_function_for_ss2 -template -void add_in_graphic_buffer_ss2(CGAL::GraphicBuffer &graphic_buffer, - const DrawingFunctor &drawing_functor, - const ss2 *ass2 = nullptr) { - if (ass2 != nullptr) { - draw_function_for_ss2::compute_elements(graphic_buffer, ass2, - drawing_functor); - } +template +void add_in_graphic_buffer_ss2(const SS2 &ass2, + CGAL::GraphicBuffer &graphic_buffer, + const DrawingFunctor &drawing_functor) { + draw_function_for_ss2::compute_elements(&ass2, graphic_buffer, + drawing_functor); +} + +template +void add_in_graphic_buffer_ss2( + const SS2 &ass2, CGAL::GraphicBuffer &graphic_buffer) { + Drawing_functor + drawingFunctor; + + add_in_graphic_buffer_ss2(ass2, graphic_buffer, drawingFunctor); } // Specialization of draw function. @@ -127,20 +137,16 @@ template void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, const char *title = "Straight Skeleton Basic Viewer") { CGAL::GraphicBuffer buffer; - add_in_graphic_buffer_ss2(buffer, drawingfunctor, &ass2); + add_in_graphic_buffer_ss2(ass2, buffer, drawingfunctor); draw_buffer(buffer); } template void draw(const CGAL_SS_TYPE &ass2, const char *title = "Straight Skeleton Basic Viewer") { - - Drawing_functor - drawingFunctor; - - draw(ass2, drawingFunctor, title); + CGAL::GraphicBuffer buffer; + add_in_graphic_buffer_ss2(ass2, buffer); + draw_buffer(buffer); } #undef CGAL_SS_TYPE From 913f676b2290cb293ccd95f41d63255aca4fdeb3 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 1 Oct 2022 19:28:47 +0200 Subject: [PATCH 059/341] Added two versions of add in LCC --- .../CGAL/draw_linear_cell_complex_function.h | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index 4034d772014c..b97085018deb 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -154,7 +154,7 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, } template -void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, +void compute_elements(const LCC *lcc, GraphicBuffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { if (lcc==nullptr) @@ -245,14 +245,21 @@ void compute_elements(GraphicBuffer &graphic_buffer, const LCC *lcc, * @param alcc */ template -void add_in_graphic_buffer_lcc(GraphicBuffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor, - const LCC *alcc = nullptr) +void add_in_graphic_buffer_lcc(const LCC &alcc, GraphicBuffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { - if (alcc!=nullptr) - { - draw_function_for_lcc::compute_elements(graphic_buffer, alcc, m_drawing_functor); - } + draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); +} + +template +void add_in_graphic_buffer_lcc(const LCC &alcc, GraphicBuffer &graphic_buffer) +{ + Drawing_functor_with_volume drawing_functor_with_volume; + + add_in_graphic_buffer_lcc(alcc, graphic_buffer, drawing_functor_with_volume); } // Specialization of draw function. @@ -264,17 +271,23 @@ template class Map, class Refs, class Storage_, - class DrawingFunctor=Drawing_functor_with_volume> -void draw(const CGAL_LCC_TYPE &alcc, - const char *title = "LCC for CMap Basic Viewer", - const DrawingFunctor &drawing_functor=DrawingFunctor()) + class DrawingFunctor> +void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, + const char *title = "LCC for CMap Basic Viewer") +{ + GraphicBuffer buffer; + add_in_graphic_buffer_lcc(alcc, buffer, drawing_functor); + draw_buffer(buffer); +} + +template class Map, + class Refs, class Storage_> +void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") { GraphicBuffer buffer; - add_in_graphic_buffer_lcc(buffer, drawing_functor, &alcc); + add_in_graphic_buffer_lcc(alcc, buffer); draw_buffer(buffer); } From 796ec13391054f04e9be70bb4debd4e7d4108fdc Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 13:27:22 +0200 Subject: [PATCH 060/341] Modified GraphicBuffer class name to snake case. --- GraphicsView/include/CGAL/Graphic_buffer.h | 6 +++--- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 6 +++--- .../demo/Linear_cell_complex/Viewer.h | 2 +- .../CGAL/draw_linear_cell_complex_function.h | 16 ++++++++-------- Point_set_3/include/CGAL/draw_point_set_3.h | 8 ++++---- Polygon/include/CGAL/draw_polygon_2.h | 6 +++--- .../include/CGAL/draw_straight_skeleton_2.h | 18 +++++++++--------- .../include/CGAL/draw_triangulation_2.h | 18 +++++++++--------- .../include/CGAL/draw_triangulation_3.h | 16 ++++++++-------- 9 files changed, 48 insertions(+), 48 deletions(-) diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index 84456815b38f..538898df76e2 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -40,13 +40,13 @@ namespace CGAL { // This class is responsible for dealing with available CGAL data structures and // handling buffers. template -class GraphicBuffer { +class Graphic_buffer { public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; - GraphicBuffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) + Graphic_buffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) : m_buffer_for_mono_points(&pos[POS_MONO_POINTS], nullptr, &bbox, nullptr, nullptr, nullptr), m_buffer_for_colored_points(&pos[POS_COLORED_POINTS], nullptr, &bbox, @@ -72,7 +72,7 @@ class GraphicBuffer { &pos[FLAT_NORMAL_COLORED_FACES], &pos[SMOOTH_NORMAL_COLORED_FACES]) {} - GraphicBuffer() + Graphic_buffer() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, &m_bounding_box, nullptr, nullptr, nullptr), m_buffer_for_colored_points(&arrays[POS_COLORED_POINTS], nullptr, diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 1337df046e1a..ceae3cfd1c43 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -83,7 +83,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - GraphicBuffer& buf, + Graphic_buffer& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -1612,7 +1612,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer protected: - GraphicBuffer& gBuffer; + Graphic_buffer& gBuffer; bool m_draw_vertices; bool m_draw_edges; @@ -1724,7 +1724,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer * @param graphic_buffer */ template -void draw_buffer(GraphicBuffer &graphic_buffer) { +void draw_buffer(Graphic_buffer &graphic_buffer) { #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 9d662e6e6a11..1e314394d60c 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -42,7 +42,7 @@ public Q_SLOTS: Dart_const_handle, Dart_const_handle, Dart_const_handle> m_drawing_functor; - CGAL::GraphicBuffer m_graphic_buffer; + CGAL::Graphic_buffer m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; }; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h index b97085018deb..e8753c5aa4d4 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h @@ -70,7 +70,7 @@ template void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - GraphicBuffer &graphic_buffer) + Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_faces_enabled() || !m_drawing_functor.draw_face(*lcc, dh)) @@ -115,7 +115,7 @@ void compute_face(typename LCC::Dart_const_handle dh, template void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctor &m_drawing_functor, - GraphicBuffer &graphic_buffer) + Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_edges_enabled() || !m_drawing_functor.draw_edge(*lcc, dh)) @@ -138,7 +138,7 @@ void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, template void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - GraphicBuffer &graphic_buffer) + Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_vertices_enabled() || !m_drawing_functor.draw_vertex(*lcc, dh)) @@ -154,7 +154,7 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, } template -void compute_elements(const LCC *lcc, GraphicBuffer &graphic_buffer, +void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { if (lcc==nullptr) @@ -245,14 +245,14 @@ void compute_elements(const LCC *lcc, GraphicBuffer &graphic_buffer, * @param alcc */ template -void add_in_graphic_buffer_lcc(const LCC &alcc, GraphicBuffer &graphic_buffer, +void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); } template -void add_in_graphic_buffer_lcc(const LCC &alcc, GraphicBuffer &graphic_buffer) +void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer) { Drawing_functor_with_volume buffer; + Graphic_buffer buffer; add_in_graphic_buffer_lcc(alcc, buffer, drawing_functor); draw_buffer(buffer); } @@ -286,7 +286,7 @@ template void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") { - GraphicBuffer buffer; + Graphic_buffer buffer; add_in_graphic_buffer_lcc(alcc, buffer); draw_buffer(buffer); } diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 3c5c5cfb5ccd..125ffe73862c 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -47,7 +47,7 @@ namespace draw_function_for_PointSet { template void compute_vertex(const typename PointSet::Point_map::value_type &p, - GraphicBuffer &graphic_buffer) { + Graphic_buffer &graphic_buffer) { graphic_buffer.add_point(p); // We can use add_point(p, c) with c a CGAL::IO::Color to add a colored point @@ -56,7 +56,7 @@ void compute_vertex(const typename PointSet::Point_map::value_type &p, template void compute_elements(const PointSet *pointset, - GraphicBuffer &graphic_buffer) { + Graphic_buffer &graphic_buffer) { for (typename PointSet::const_iterator it = pointset->begin(); it != pointset->end(); ++it) { compute_vertex(pointset->point(*it), graphic_buffer); @@ -66,7 +66,7 @@ void compute_elements(const PointSet *pointset, } // namespace draw_function_for_PointSet template -void add_in_graphic_buffer_point_set(GraphicBuffer &graphic_buffer, +void add_in_graphic_buffer_point_set(Graphic_buffer &graphic_buffer, const PointSet *aPointSet = nullptr) { if (aPointSet != nullptr) { draw_function_for_PointSet::compute_elements(aPointSet, graphic_buffer); @@ -77,7 +77,7 @@ void add_in_graphic_buffer_point_set(GraphicBuffer &graphic_buffer, template void draw(const Point_set_3 &apointset, const char *title = "Point_set_3 Basic Viewer") { - GraphicBuffer buffer; + Graphic_buffer buffer; add_in_graphic_buffer_point_set(buffer, &apointset); draw_buffer(buffer); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 5173a7d5bb1c..85c81cdafc90 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -52,7 +52,7 @@ namespace CGAL { namespace draw_function_for_p2 { template -void compute_elements(CGAL::GraphicBuffer &graphic_buffer, +void compute_elements(CGAL::Graphic_buffer &graphic_buffer, const P2 *p2) { typedef typename P2::Point_2 Point; @@ -79,7 +79,7 @@ void compute_elements(CGAL::GraphicBuffer &graphic_buffer, } // namespace draw_function_for_p2 template -void add_in_graphic_buffer_p2(CGAL::GraphicBuffer &graphic_buffer, +void add_in_graphic_buffer_p2(CGAL::Graphic_buffer &graphic_buffer, const P2 *p2 = nullptr) { if (p2 != nullptr) { draw_function_for_p2::compute_elements(graphic_buffer, p2); @@ -98,7 +98,7 @@ void draw(const CGAL_P2_TYPE &ap2, // typename CGAL_P2_TYPE::Face_const_handle> // drawingFunctor; - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_p2(buffer, &ap2); draw_buffer(buffer); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index db4dfaac3ab2..6c977a0c4f74 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -32,7 +32,7 @@ namespace draw_function_for_ss2 { template void compute_edge(typename SS2::Halfedge_const_handle eh, const DrawingFunctor &drawing_functor, const SS2 *ss2, - CGAL::GraphicBuffer &graphic_buffer) { + CGAL::Graphic_buffer &graphic_buffer) { if (!drawing_functor.draw_edge(*ss2, eh)) { return; @@ -50,7 +50,7 @@ void compute_edge(typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(typename SS2::Halfedge_const_handle h, - CGAL::GraphicBuffer &graphic_buffer) { + CGAL::Graphic_buffer &graphic_buffer) { std::stringstream label; label << "H" << h->id() << " (V" << h->vertex()->id() << ") "; @@ -65,7 +65,7 @@ void print_halfedge_labels(typename SS2::Halfedge_const_handle h, template void compute_vertex(typename SS2::Vertex_const_handle vh, const DrawingFunctor &drawing_functor, const SS2 *ss2, - CGAL::GraphicBuffer &graphic_buffer) { + CGAL::Graphic_buffer &graphic_buffer) { if (!drawing_functor.draw_vertex(*ss2, vh)) { return; @@ -84,7 +84,7 @@ void compute_vertex(typename SS2::Vertex_const_handle vh, template void print_vertex_label(typename SS2::Vertex_const_handle vh, - CGAL::GraphicBuffer &graphic_buffer) { + CGAL::Graphic_buffer &graphic_buffer) { std::stringstream label; label << "V" << vh->id() << std::ends; graphic_buffer.add_text(vh->point(), label.str()); @@ -92,7 +92,7 @@ void print_vertex_label(typename SS2::Vertex_const_handle vh, template void compute_elements(const SS2 *ss2, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { for (typename SS2::Halfedge_const_iterator it = ss2->halfedges_begin(); @@ -113,7 +113,7 @@ void compute_elements(const SS2 *ss2, template void add_in_graphic_buffer_ss2(const SS2 &ass2, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_ss2::compute_elements(&ass2, graphic_buffer, drawing_functor); @@ -121,7 +121,7 @@ void add_in_graphic_buffer_ss2(const SS2 &ass2, template void add_in_graphic_buffer_ss2( - const SS2 &ass2, CGAL::GraphicBuffer &graphic_buffer) { + const SS2 &ass2, CGAL::Graphic_buffer &graphic_buffer) { Drawing_functor @@ -136,7 +136,7 @@ void add_in_graphic_buffer_ss2( template void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, const char *title = "Straight Skeleton Basic Viewer") { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_ss2(ass2, buffer, drawingfunctor); draw_buffer(buffer); } @@ -144,7 +144,7 @@ void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, template void draw(const CGAL_SS_TYPE &ass2, const char *title = "Straight Skeleton Basic Viewer") { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_ss2(ass2, buffer); draw_buffer(buffer); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 271b5b99057a..3cb70e32b917 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -31,7 +31,7 @@ namespace draw_function_for_t2 { template void compute_face(typename T2::Finite_faces_iterator fh, const DrawingFunctor &drawing_functor, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const T2 *t2) { if (!drawing_functor.draw_face(*t2, fh)) { @@ -56,7 +56,7 @@ void compute_face(typename T2::Finite_faces_iterator fh, template void compute_edge(typename T2::Finite_edges_iterator eh, const DrawingFunctor &drawing_functor, const T2 *t2, - CGAL::GraphicBuffer &graphic_buffer) { + CGAL::Graphic_buffer &graphic_buffer) { if (!drawing_functor.draw_edge(*t2, eh)) { return; @@ -79,7 +79,7 @@ void compute_edge(typename T2::Finite_edges_iterator eh, template void compute_vertex(typename T2::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T2 *t2) { if (!drawing_functor.draw_vertex(*t2, vh)) { @@ -96,7 +96,7 @@ void compute_vertex(typename T2::Vertex_handle vh, template void compute_elements(const T2 *t2, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, bool m_nofaces = false) { @@ -122,7 +122,7 @@ void compute_elements(const T2 *t2, template void add_in_graphic_buffer_t2(const T2 &at2, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, bool m_nofaces = false) { draw_function_for_t2::compute_elements(&at2, graphic_buffer, drawing_functor, @@ -131,10 +131,10 @@ void add_in_graphic_buffer_t2(const T2 &at2, template void add_in_graphic_buffer_t2(const T2 &at2, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, bool m_nofaces = false) { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; Drawing_functor @@ -162,7 +162,7 @@ template void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_t2(at2, buffer, drawingfunctor, nofill); draw_buffer(buffer); } @@ -171,7 +171,7 @@ template void draw(const CGAL_T2_TYPE &at2, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_t2(at2, buffer, nofill); draw_buffer(buffer); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 42697e9938ea..a965fb878faa 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -32,7 +32,7 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, const DrawingFunctor &drawing_functor, - CGAL::GraphicBuffer &graphic_buffer, const T3 *t3) + CGAL::Graphic_buffer &graphic_buffer, const T3 *t3) { if(!drawing_functor.draw_face(*t3, fh)) { return; } @@ -57,7 +57,7 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { if(!drawing_functor.draw_edge(*t3, eh)) @@ -77,7 +77,7 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, const T3 *t3) { if(!drawing_functor.draw_vertex(*t3, vh)) @@ -93,7 +93,7 @@ void compute_vertex(typename T3::Vertex_handle vh, } template -void compute_elements(const T3 *t3, CGAL::GraphicBuffer &graphic_buffer, +void compute_elements(const T3 *t3, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); @@ -119,7 +119,7 @@ void compute_elements(const T3 *t3, CGAL::GraphicBuffer &graphic_buf template void add_in_graphic_buffer_t3(const T3 &at3, - CGAL::GraphicBuffer &graphic_buffer, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_t3::compute_elements(&at3, graphic_buffer, drawing_functor); @@ -127,7 +127,7 @@ void add_in_graphic_buffer_t3(const T3 &at3, template void add_in_graphic_buffer_t3(const T3 &at3, - CGAL::GraphicBuffer &graphic_buffer) + CGAL::Graphic_buffer &graphic_buffer) { CGAL::Drawing_functor void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, const char *title = "T3 Basic Viewer") { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_t3(at3, buffer, drawingfunctor); draw_buffer(buffer); } @@ -171,7 +171,7 @@ void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, template void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") { - CGAL::GraphicBuffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer_t3(at3, buffer); draw_buffer(buffer); } From 588b021d519d32d34118f9ad5d370e2835233f3f Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:24:58 +0200 Subject: [PATCH 061/341] Migrated to original file. --- .../include/CGAL/draw_linear_cell_complex.h | 541 +++++++----------- 1 file changed, 207 insertions(+), 334 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 0480547ec5ed..e8753c5aa4d4 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -1,327 +1,213 @@ -// Copyright (c) 2018 CNRS and LIRIS' Establishments (France). +// Copyright (c) 2022 GeometryFactory Sarl (France). // All rights reserved. // -// This file is part of CGAL (www.cgal.org) +// This file is part of CGAL (www.cgal.org). // // $URL$ // $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Guillaume Damiand +// Author(s): Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H +#include +#include #include +#include #ifdef CGAL_USE_BASIC_VIEWER -#include #include #include -namespace CGAL -{ +namespace CGAL { + + + // CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { + // CGAL::Random random((unsigned int)(aVal.darts().index(dh))); + // return get_random_color(random); + // } -// Default color functor; user can change it to have its own face color -struct DefaultDrawingFunctorLCC +namespace draw_function_for_lcc { - /// @return true iff the volume containing dh is drawn. - template - bool draw_volume(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the face containing dh is drawn. - template - bool draw_face(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the edge containing dh is drawn. - template - bool draw_edge(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the vertex containing dh is drawn. - template - bool draw_vertex(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - - /// @return true iff the volume containing dh is drawn in wireframe. - template - bool volume_wireframe(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - /// @return true iff the face containing dh is drawn in wireframe. - template - bool face_wireframe(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - - /// @return true iff the volume containing dh is colored. - template - bool colored_volume(const LCC&, - typename LCC::Dart_const_handle) const - { return true; } - /// @return true iff the face containing dh is colored. - /// if we have also colored_volume(alcc, dh), the volume color is - /// ignored and only the face color is considered. - template - bool colored_face(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - /// @return true iff the edge containing dh is colored. - template - bool colored_edge(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - /// @return true iff the vertex containing dh is colored. - template - bool colored_vertex(const LCC&, - typename LCC::Dart_const_handle) const - { return false; } - - /// @return the color of the volume containing dh - /// used only if colored_volume(alcc, dh) and !colored_face(alcc, dh) - template - CGAL::IO::Color volume_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the face containing dh - /// used only if colored_face(alcc, dh) - template - CGAL::IO::Color face_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the edge containing dh - /// used only if colored_edge(alcc, dh) - template - CGAL::IO::Color edge_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } - /// @return the color of the vertex containing dh - /// used only if colored_vertex(alcc, dh) - template - CGAL::IO::Color vertex_color(const LCC& alcc, - typename LCC::Dart_const_handle dh) const - { - CGAL::Random random((unsigned int)(alcc.darts().index(dh))); - return get_random_color(random); - } -}; -template +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Vector_3 Local_vector; + +template struct LCC_geom_utils; -template +template struct LCC_geom_utils { static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC& lcc, typename LCC::Dart_const_handle dh) + get_vertex_normal(const LCC &lcc, typename LCC::Dart_const_handle dh) { - typename Local_kernel::Vector_3 n = internal::Geom_utils - :: - get_local_vector(CGAL::compute_normal_of_cell_0(lcc,dh)); - n = n/(CGAL::sqrt(n*n)); + typename Local_kernel::Vector_3 n = + internal::Geom_utils:: + get_local_vector(CGAL::compute_normal_of_cell_0(lcc, dh)); + n = n / (CGAL::sqrt(n * n)); return n; } }; -template +template struct LCC_geom_utils { static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC&, typename LCC::Dart_const_handle) + get_vertex_normal(const LCC &, typename LCC::Dart_const_handle) { typename Local_kernel::Vector_3 n=CGAL::NULL_VECTOR; return n; } }; -// Viewer class for LCC -/*template -class SimpleLCCViewerQt : public Basic_viewer_qt +template +void compute_face(typename LCC::Dart_const_handle dh, + typename LCC::Dart_const_handle voldh, const LCC *lcc, + const DrawingFunctorLCC &m_drawing_functor, + Graphic_buffer &graphic_buffer) { - typedef Basic_viewer_qt Base; - typedef typename LCC::Dart_const_handle Dart_const_handle; - typedef typename LCC::Traits Kernel; - typedef typename Kernel::Point Point; - typedef typename Kernel::Vector Vector; - -public: - /// Construct the viewer. - /// @param alcc the lcc to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - SimpleLCCViewerQt(QWidget* parent, - const LCC* alcc=nullptr, - const char* title="Basic LCC Viewer", - bool anofaces=false, - const DrawingFunctorLCC& drawing_functor=DrawingFunctorLCC()) : - // First draw: vertices; edges, faces; multi-color; inverse normal - Base(parent, title, true, true, true, false, false), - lcc(alcc), - m_nofaces(anofaces), - m_random_face_color(false), - m_drawing_functor(drawing_functor) + if (!m_drawing_functor.are_faces_enabled() || + !m_drawing_functor.draw_face(*lcc, dh)) + { return; } + + // We fill only closed faces. + typename LCC::Dart_const_handle cur=dh; + do { - if (lcc!=nullptr) - { compute_elements(); } + if (!lcc->is_next_exist(cur)) + { return; } // open face=>not filled + cur = lcc->next(cur); } + while (cur!=dh); - ~SimpleLCCViewerQt() - {} - -protected: - void set_lcc(const LCC* alcc, bool doredraw=true) + if (m_drawing_functor.colored_volume(*lcc, voldh)) { - if (lcc==alcc) - { return; } - - lcc=alcc; - if (lcc!=nullptr) - { compute_elements(); } - - if (doredraw) { redraw(); } + CGAL::IO::Color c=m_drawing_functor.volume_color(*lcc, voldh); + graphic_buffer.face_begin(c); } - - void compute_face(Dart_const_handle dh, Dart_const_handle voldh) + else if (m_drawing_functor.colored_face(*lcc, dh)) { - if (m_nofaces || !m_drawing_functor.draw_face(*lcc, dh)) return; - - // We fill only closed faces. - Dart_const_handle cur=dh; - Dart_const_handle min=dh; - do - { - if (!lcc->is_next_exist(cur)) return; // open face=>not filled - if (curnext(cur); - } - while(cur!=dh); + CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); + graphic_buffer.face_begin(c); + } + else + { graphic_buffer.face_begin(); } - if (m_random_face_color) - { - CGAL::Random random((unsigned int)(lcc->darts().index(dh))); - CGAL::IO::Color c=get_random_color(random); - face_begin(c); - } - else if (m_drawing_functor.colored_face(*lcc, dh)) - { - CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); - face_begin(c); - } - else if (m_drawing_functor.colored_volume(*lcc, voldh)) - { - CGAL::IO::Color c=m_drawing_functor.volume_color(*lcc, voldh); - face_begin(c); - } - else - { face_begin(); } + cur=dh; + do + { + graphic_buffer.add_point_in_face + (lcc->point(cur), + LCC_geom_utils::get_vertex_normal(*lcc, cur)); + cur=lcc->next(cur); + } + while (cur!=dh); - cur=dh; - do - { - add_point_in_face(lcc->point(cur), LCC_geom_utils:: - get_vertex_normal(*lcc, cur)); - cur=lcc->next(cur); - } - while(cur!=dh); + graphic_buffer.face_end(); +} - face_end(); - } +template +void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, + const DrawingFunctor &m_drawing_functor, + Graphic_buffer &graphic_buffer) +{ + if (!m_drawing_functor.are_edges_enabled() || + !m_drawing_functor.draw_edge(*lcc, dh)) + { return; } - void compute_edge(Dart_const_handle dh) + const typename LCC::Point& p1=lcc->point(dh); + typename LCC::Dart_const_handle d2=lcc->other_extremity(dh); + if (d2!=nullptr) { - if (!m_drawing_functor.draw_edge(*lcc, dh)) return; - - Point p1 = lcc->point(dh); - Dart_const_handle d2 = lcc->other_extremity(dh); - if (d2!=nullptr) + if (m_drawing_functor.colored_edge(*lcc, dh)) { - if (m_drawing_functor.colored_edge(*lcc, dh)) - { add_segment(p1, lcc->point(d2), m_drawing_functor.edge_color(*lcc, dh)); } - else - { add_segment(p1, lcc->point(d2)); } + graphic_buffer.add_segment(p1, lcc->point(d2), + m_drawing_functor.edge_color(*lcc, dh)); } + else + { graphic_buffer.add_segment(p1, lcc->point(d2)); } } +} - void compute_vertex(Dart_const_handle dh) - { - if (!m_drawing_functor.draw_vertex(*lcc, dh)) return; +template +void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, + const DrawingFunctorLCC &m_drawing_functor, + Graphic_buffer &graphic_buffer) +{ + if (!m_drawing_functor.are_vertices_enabled() || + !m_drawing_functor.draw_vertex(*lcc, dh)) + { return; } - if (m_drawing_functor.colored_vertex(*lcc, dh)) - { add_point(lcc->point(dh), m_drawing_functor.vertex_color(*lcc, dh)); } - else - { add_point(lcc->point(dh)); } + if (m_drawing_functor.colored_vertex(*lcc, dh)) + { + graphic_buffer.add_point(lcc->point(dh), + m_drawing_functor.vertex_color(*lcc, dh)); } + else + { graphic_buffer.add_point(lcc->point(dh)); } +} - void compute_elements() - { - clear(); - if (lcc==nullptr) return; +template +void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ + if (lcc==nullptr) + { return; } - typename LCC::size_type markvolumes =lcc->get_new_mark(); - typename LCC::size_type markfaces =lcc->get_new_mark(); - typename LCC::size_type markedges =lcc->get_new_mark(); - typename LCC::size_type markvertices =lcc->get_new_mark(); - typename LCC::size_type oriented_mark=lcc->get_new_mark(); + typename LCC::size_type markvolumes = lcc->get_new_mark(); + typename LCC::size_type markfaces = lcc->get_new_mark(); + typename LCC::size_type markedges = lcc->get_new_mark(); + typename LCC::size_type markvertices = lcc->get_new_mark(); + typename LCC::size_type oriented_mark = lcc->get_new_mark(); - lcc->orient(oriented_mark); + lcc->orient(oriented_mark); - for (typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), - itend=lcc->darts().end(); it!=itend; ++it ) + for(typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), + itend=lcc->darts().end(); it!=itend; ++it) + { + if (!lcc->is_marked(it, markvolumes) && + m_drawing_functor.draw_volume(*lcc, it)) { - if (!lcc->is_marked(it, markvolumes) && - m_drawing_functor.draw_volume(*lcc, it)) + for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator + itv=lcc->template darts_of_cell_basic<3>(it, markvolumes).begin(), + itvend=lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); + itv!=itvend; ++itv) { - for (typename LCC::template Dart_of_cell_basic_range<3>:: - const_iterator itv=lcc->template darts_of_cell_basic<3>(it, markvolumes).begin(), - itvend=lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); - itv!=itvend; ++itv) + lcc->mark(itv, markvolumes); + if (!lcc->is_marked(itv, markfaces) && + lcc->is_marked(itv, oriented_mark) && + m_drawing_functor.draw_face(*lcc, itv)) { - lcc->mark(itv, markvolumes); // To be sure that all darts of the basic iterator will be marked - if (!lcc->is_marked(itv, markfaces) && - lcc->is_marked(itv, oriented_mark) && - m_drawing_functor.draw_face(*lcc, itv)) + if (!m_drawing_functor.volume_wireframe(*lcc, itv) && + !m_drawing_functor.face_wireframe(*lcc, itv)) + { compute_face(itv, it, lcc, m_drawing_functor, graphic_buffer); } + for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator + itf=lcc->template darts_of_cell_basic<2>(itv, markfaces).begin(), + itfend=lcc->template darts_of_cell_basic<2>(itv, markfaces).end(); + itf!=itfend; ++itf) { - if (!m_drawing_functor.volume_wireframe(*lcc, itv) && - !m_drawing_functor.face_wireframe(*lcc, itv)) - { compute_face(itv, it); } - for (typename LCC::template Dart_of_cell_basic_range<2>:: - const_iterator itf=lcc->template darts_of_cell_basic<2>(itv, markfaces).begin(), - itfend=lcc->template darts_of_cell_basic<2>(itv, markfaces).end(); - itf!=itfend; ++itf) + lcc->mark(itf, markfaces); + if (!lcc->is_marked(itf, markedges) && + m_drawing_functor.draw_edge(*lcc, itf)) { - if (!m_drawing_functor.volume_wireframe(*lcc, itv) && - !m_drawing_functor.face_wireframe(*lcc, itv)) - { lcc->mark(itf, markfaces); } // To be sure that all darts of the basic iterator will be marked - if ( !lcc->is_marked(itf, markedges) && - m_drawing_functor.draw_edge(*lcc, itf)) + compute_edge(itf, lcc, m_drawing_functor, graphic_buffer); + for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator + ite=lcc->template darts_of_cell_basic<1>(itf, markedges).begin(), + iteend=lcc->template darts_of_cell_basic<1>(itf, markedges).end(); + ite!=iteend; ++ite) { - compute_edge(itf); - for (typename LCC::template Dart_of_cell_basic_range<1>:: - const_iterator ite=lcc->template darts_of_cell_basic<1>(itf, markedges).begin(), - iteend=lcc->template darts_of_cell_basic<1>(itf, markedges).end(); - ite!=iteend; ++ite) + lcc->mark(ite, markedges); + if (!lcc->is_marked(ite, markvertices) && + m_drawing_functor.draw_vertex(*lcc, ite)) { - lcc->mark(ite, markedges); // To be sure that all darts of the basic iterator will be marked - if ( !lcc->is_marked(ite, markvertices) && - m_drawing_functor.draw_vertex(*lcc, ite)) - { - compute_vertex(ite); - CGAL::mark_cell(*lcc, ite, markvertices); - } + compute_vertex(ite, lcc, m_drawing_functor, graphic_buffer); + CGAL::mark_cell(*lcc, ite, markvertices); } } } @@ -329,97 +215,84 @@ class SimpleLCCViewerQt : public Basic_viewer_qt } } } - - for (typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), - itend=lcc->darts().end(); it!=itend; ++it ) - { - lcc->unmark(it, markvertices); - lcc->unmark(it, markedges); - lcc->unmark(it, markfaces); - lcc->unmark(it, markvolumes); - lcc->unmark(it, oriented_mark); - } - - lcc->free_mark(markvolumes); - lcc->free_mark(markfaces); - lcc->free_mark(markedges); - lcc->free_mark(markvertices); - lcc->free_mark(oriented_mark); } - virtual void init() + for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), + itend = lcc->darts().end(); it != itend; ++it) { - Base::init(); - setKeyDescription(::Qt::Key_R, "Toggles random face colors"); + lcc->unmark(it, markvertices); + lcc->unmark(it, markedges); + lcc->unmark(it, markfaces); + lcc->unmark(it, markvolumes); + lcc->unmark(it, oriented_mark); } - virtual void keyPressEvent(QKeyEvent *e) - { - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key()==::Qt::Key_R) && (modifiers==::Qt::NoButton)) - { - m_random_face_color=!m_random_face_color; - displayMessage(QString("Random face color=%1.").arg(m_random_face_color?"true":"false")); - compute_elements(); - redraw(); - } - else - { Base::keyPressEvent(e); } // Call the base method to process others/classicals key + lcc->free_mark(markvolumes); + lcc->free_mark(markfaces); + lcc->free_mark(markedges); + lcc->free_mark(markvertices); + lcc->free_mark(oriented_mark); +} - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - } +} // namespace draw_function + +/** + * @brief This function is responsible for filling the buffer to allow + * visualization. + * + * @param graphic_buffer + * @param m_drawing_functor + * @param alcc + */ +template +void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ + draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); +} + +template +void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer) +{ + Drawing_functor_with_volume drawing_functor_with_volume; + + add_in_graphic_buffer_lcc(alcc, graphic_buffer, drawing_functor_with_volume); +} -protected: - const LCC* lcc; - bool m_nofaces; - bool m_random_face_color; - const DrawingFunctorLCC& m_drawing_functor; -}; -*/ // Specialization of draw function. -/*#define CGAL_LCC_TYPE CGAL::Linear_cell_complex_base \ - - -template < unsigned int d_, unsigned int ambient_dim, - class Traits_, - class Items_, - class Alloc_, - template - class Map, - class Refs, - class Storage_, - class DrawingFunctorLCC=DefaultDrawingFunctorLCC> -void draw(const CGAL_LCC_TYPE& alcc, - const char* title="LCC for CMap Basic Viewer", - bool nofill=false, - const DrawingFunctorLCC& drawing_functor=DrawingFunctorLCC()) +#define CGAL_LCC_TYPE \ + CGAL::Linear_cell_complex_base + +template class Map, + class Refs, class Storage_, + class DrawingFunctor> +void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, + const char *title = "LCC for CMap Basic Viewer") { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + Graphic_buffer buffer; + add_in_graphic_buffer_lcc(alcc, buffer, drawing_functor); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"lccviewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimpleLCCViewerQt - mainwindow(app.activeWindow(), &alcc, title, nofill, drawing_functor); - mainwindow.show(); - app.exec(); - } +template class Map, + class Refs, class Storage_> +void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") +{ + Graphic_buffer buffer; + add_in_graphic_buffer_lcc(alcc, buffer); + draw_buffer(buffer); } -// Todo a function taking a const DrawingFunctorLCC& drawing_functor as parameter #undef CGAL_LCC_TYPE -*/ + } // End namespace CGAL #endif // CGAL_USE_BASIC_VIEWER From 2b0969d10e596cf553e784cdfcb68e5bdbd2f67c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:26:26 +0200 Subject: [PATCH 062/341] Removed redundant --- .../CGAL/draw_linear_cell_complex_function.h | 300 ------------------ 1 file changed, 300 deletions(-) delete mode 100644 Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h deleted file mode 100644 index e8753c5aa4d4..000000000000 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex_function.h +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright (c) 2022 GeometryFactory Sarl (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s): Guillaume Damiand -// Mostafa Ashraf - -#ifndef CGAL_DRAW_LCC_H -#define CGAL_DRAW_LCC_H - -#include -#include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include - -namespace CGAL { - - - // CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { - // CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - // return get_random_color(random); - // } - -namespace draw_function_for_lcc -{ - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; -typedef Local_kernel::Point_3 Local_point; -typedef Local_kernel::Vector_3 Local_vector; - -template -struct LCC_geom_utils; - -template -struct LCC_geom_utils -{ - static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC &lcc, typename LCC::Dart_const_handle dh) - { - typename Local_kernel::Vector_3 n = - internal::Geom_utils:: - get_local_vector(CGAL::compute_normal_of_cell_0(lcc, dh)); - n = n / (CGAL::sqrt(n * n)); - return n; - } -}; - -template -struct LCC_geom_utils -{ - static typename Local_kernel::Vector_3 - get_vertex_normal(const LCC &, typename LCC::Dart_const_handle) - { - typename Local_kernel::Vector_3 n=CGAL::NULL_VECTOR; - return n; - } -}; - -template -void compute_face(typename LCC::Dart_const_handle dh, - typename LCC::Dart_const_handle voldh, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - Graphic_buffer &graphic_buffer) -{ - if (!m_drawing_functor.are_faces_enabled() || - !m_drawing_functor.draw_face(*lcc, dh)) - { return; } - - // We fill only closed faces. - typename LCC::Dart_const_handle cur=dh; - do - { - if (!lcc->is_next_exist(cur)) - { return; } // open face=>not filled - cur = lcc->next(cur); - } - while (cur!=dh); - - if (m_drawing_functor.colored_volume(*lcc, voldh)) - { - CGAL::IO::Color c=m_drawing_functor.volume_color(*lcc, voldh); - graphic_buffer.face_begin(c); - } - else if (m_drawing_functor.colored_face(*lcc, dh)) - { - CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); - graphic_buffer.face_begin(c); - } - else - { graphic_buffer.face_begin(); } - - cur=dh; - do - { - graphic_buffer.add_point_in_face - (lcc->point(cur), - LCC_geom_utils::get_vertex_normal(*lcc, cur)); - cur=lcc->next(cur); - } - while (cur!=dh); - - graphic_buffer.face_end(); -} - -template -void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, - const DrawingFunctor &m_drawing_functor, - Graphic_buffer &graphic_buffer) -{ - if (!m_drawing_functor.are_edges_enabled() || - !m_drawing_functor.draw_edge(*lcc, dh)) - { return; } - - const typename LCC::Point& p1=lcc->point(dh); - typename LCC::Dart_const_handle d2=lcc->other_extremity(dh); - if (d2!=nullptr) - { - if (m_drawing_functor.colored_edge(*lcc, dh)) - { - graphic_buffer.add_segment(p1, lcc->point(d2), - m_drawing_functor.edge_color(*lcc, dh)); - } - else - { graphic_buffer.add_segment(p1, lcc->point(d2)); } - } -} - -template -void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - Graphic_buffer &graphic_buffer) -{ - if (!m_drawing_functor.are_vertices_enabled() || - !m_drawing_functor.draw_vertex(*lcc, dh)) - { return; } - - if (m_drawing_functor.colored_vertex(*lcc, dh)) - { - graphic_buffer.add_point(lcc->point(dh), - m_drawing_functor.vertex_color(*lcc, dh)); - } - else - { graphic_buffer.add_point(lcc->point(dh)); } -} - -template -void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) -{ - if (lcc==nullptr) - { return; } - - typename LCC::size_type markvolumes = lcc->get_new_mark(); - typename LCC::size_type markfaces = lcc->get_new_mark(); - typename LCC::size_type markedges = lcc->get_new_mark(); - typename LCC::size_type markvertices = lcc->get_new_mark(); - typename LCC::size_type oriented_mark = lcc->get_new_mark(); - - lcc->orient(oriented_mark); - - for(typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), - itend=lcc->darts().end(); it!=itend; ++it) - { - if (!lcc->is_marked(it, markvolumes) && - m_drawing_functor.draw_volume(*lcc, it)) - { - for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator - itv=lcc->template darts_of_cell_basic<3>(it, markvolumes).begin(), - itvend=lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); - itv!=itvend; ++itv) - { - lcc->mark(itv, markvolumes); - if (!lcc->is_marked(itv, markfaces) && - lcc->is_marked(itv, oriented_mark) && - m_drawing_functor.draw_face(*lcc, itv)) - { - if (!m_drawing_functor.volume_wireframe(*lcc, itv) && - !m_drawing_functor.face_wireframe(*lcc, itv)) - { compute_face(itv, it, lcc, m_drawing_functor, graphic_buffer); } - for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator - itf=lcc->template darts_of_cell_basic<2>(itv, markfaces).begin(), - itfend=lcc->template darts_of_cell_basic<2>(itv, markfaces).end(); - itf!=itfend; ++itf) - { - lcc->mark(itf, markfaces); - if (!lcc->is_marked(itf, markedges) && - m_drawing_functor.draw_edge(*lcc, itf)) - { - compute_edge(itf, lcc, m_drawing_functor, graphic_buffer); - for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator - ite=lcc->template darts_of_cell_basic<1>(itf, markedges).begin(), - iteend=lcc->template darts_of_cell_basic<1>(itf, markedges).end(); - ite!=iteend; ++ite) - { - lcc->mark(ite, markedges); - if (!lcc->is_marked(ite, markvertices) && - m_drawing_functor.draw_vertex(*lcc, ite)) - { - compute_vertex(ite, lcc, m_drawing_functor, graphic_buffer); - CGAL::mark_cell(*lcc, ite, markvertices); - } - } - } - } - } - } - } - } - - for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), - itend = lcc->darts().end(); it != itend; ++it) - { - lcc->unmark(it, markvertices); - lcc->unmark(it, markedges); - lcc->unmark(it, markfaces); - lcc->unmark(it, markvolumes); - lcc->unmark(it, oriented_mark); - } - - lcc->free_mark(markvolumes); - lcc->free_mark(markfaces); - lcc->free_mark(markedges); - lcc->free_mark(markvertices); - lcc->free_mark(oriented_mark); -} - -} // namespace draw_function - -/** - * @brief This function is responsible for filling the buffer to allow - * visualization. - * - * @param graphic_buffer - * @param m_drawing_functor - * @param alcc - */ -template -void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) -{ - draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); -} - -template -void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer) -{ - Drawing_functor_with_volume drawing_functor_with_volume; - - add_in_graphic_buffer_lcc(alcc, graphic_buffer, drawing_functor_with_volume); -} - -// Specialization of draw function. -#define CGAL_LCC_TYPE \ - CGAL::Linear_cell_complex_base - -template class Map, - class Refs, class Storage_, - class DrawingFunctor> -void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, - const char *title = "LCC for CMap Basic Viewer") -{ - Graphic_buffer buffer; - add_in_graphic_buffer_lcc(alcc, buffer, drawing_functor); - draw_buffer(buffer); -} - -template class Map, - class Refs, class Storage_> -void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") -{ - Graphic_buffer buffer; - add_in_graphic_buffer_lcc(alcc, buffer); - draw_buffer(buffer); -} - -#undef CGAL_LCC_TYPE - -} // End namespace CGAL - -#endif // CGAL_USE_BASIC_VIEWER - -#endif // CGAL_DRAW_LCC_H From 788677599642cc2d669bf882d012b73dd7ad9245 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:27:40 +0200 Subject: [PATCH 063/341] Changed Guard Name --- GraphicsView/include/CGAL/Drawing_functor.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index e0907cfc12fc..561155ac0839 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -10,8 +10,8 @@ // Author(s): Guillaume Damiand // Mostafa Ashraf -#ifndef CGAL_GENERIC_FUNCTORS_H -#define CGAL_GENERIC_FUNCTORS_H +#ifndef CGAL_DRAWING_FUNCTORS_H +#define CGAL_DRAWING_FUNCTORS_H namespace CGAL { @@ -96,4 +96,4 @@ struct Drawing_functor_with_volume : } // End namespace CGAL -#endif // CGAL_GENERIC_FUNCTORS_H \ No newline at end of file +#endif // CGAL_DRAWING_FUNCTORS_H \ No newline at end of file From 6895b91795c6f3c28a885b4e98546605da20ad12 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:28:42 +0200 Subject: [PATCH 064/341] Migrated to original file --- Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp | 4 ++-- Linear_cell_complex/demo/Linear_cell_complex/Viewer.h | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index bd48145e3a4e..fa8a55752fc9 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -38,7 +38,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor, scene->lcc); } + { CGAL::add_in_graphic_buffer_lcc(*scene->lcc, gBuffer, m_drawing_functor); } if (doredraw) { Base::redraw(); } @@ -47,7 +47,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { gBuffer.clear(); - CGAL::add_in_graphic_buffer_lcc(gBuffer, m_drawing_functor, scene->lcc); + CGAL::add_in_graphic_buffer_lcc(*scene->lcc, gBuffer, m_drawing_functor); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 1e314394d60c..53aab0e629d3 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -16,9 +16,7 @@ #include "typedefs.h" -// QUESTION: When I added this line compiler tell me "No such file or directory!" how? -#include -// #include +#include #include class Viewer : public CGAL::Basic_viewer_qt From 00d0a9da4904e2e15215f28f2e14442670fda0b7 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:29:11 +0200 Subject: [PATCH 065/341] Migrated to original file --- .../examples/Linear_cell_complex/draw_linear_cell_complex.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp index 48cc41de9d19..429d1c0a1c7b 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp +++ b/Linear_cell_complex/examples/Linear_cell_complex/draw_linear_cell_complex.cpp @@ -1,7 +1,5 @@ #include -// NOTE: deprecated, would remove -// #include -#include +#include typedef CGAL::Linear_cell_complex_for_combinatorial_map<3> LCC; typedef LCC::Dart_handle Dart_handle; From c052c1f204edfdd9d2dc3229ce463638c24380bc Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 3 Oct 2022 14:50:54 +0200 Subject: [PATCH 066/341] Added custom functor for color volume. --- .../include/CGAL/draw_linear_cell_complex.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index e8753c5aa4d4..67bc251d68c8 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -259,6 +259,17 @@ void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &grap typename LCC::Dart_const_handle, typename LCC::Dart_const_handle> drawing_functor_with_volume; + drawing_functor_with_volume.colored_volume = [](const LCC&, + typename LCC::Dart_const_handle) -> bool + { return true; }; + + drawing_functor_with_volume.volume_color = [] (const LCC& alcc, + typename LCC::Dart_const_handle dh) -> CGAL::IO::Color + { + CGAL::Random random((unsigned int)(alcc.darts().index(dh))); + return get_random_color(random); + }; + add_in_graphic_buffer_lcc(alcc, graphic_buffer, drawing_functor_with_volume); } From 7a7f39f2e8836d73c7509485886bab8068d24df7 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 4 Oct 2022 11:19:31 +0200 Subject: [PATCH 067/341] Modified --- .../include/CGAL/draw_linear_cell_complex.h | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 67bc251d68c8..3b4a0659f65e 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -1,14 +1,14 @@ -// Copyright (c) 2022 GeometryFactory Sarl (France). +// Copyright (c) 2018 CNRS and LIRIS' Establishments (France). // All rights reserved. // -// This file is part of CGAL (www.cgal.org). +// This file is part of CGAL (www.cgal.org) // // $URL$ // $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s): Guillaume Damiand -// Mostafa Ashraf +// Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H @@ -25,12 +25,6 @@ namespace CGAL { - - // CGAL::IO::Color face_color(const DS &aVal, face_handle dh) const { - // CGAL::Random random((unsigned int)(aVal.darts().index(dh))); - // return get_random_color(random); - // } - namespace draw_function_for_lcc { From 68b031e113aa7e7c15b3e94619c413bec26d134d Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 4 Oct 2022 18:43:14 +0200 Subject: [PATCH 068/341] Uses overloading functions instead of different fill_buffer names. --- .../demo/Linear_cell_complex/Viewer.cpp | 4 ++-- .../include/CGAL/draw_linear_cell_complex.h | 10 +++++----- Point_set_3/include/CGAL/draw_point_set_3.h | 4 ++-- Polygon/include/CGAL/draw_polygon_2.h | 4 ++-- .../include/CGAL/draw_straight_skeleton_2.h | 10 +++++----- Triangulation_2/include/CGAL/draw_triangulation_2.h | 10 +++++----- Triangulation_3/include/CGAL/draw_triangulation_3.h | 10 +++++----- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index fa8a55752fc9..9289ade4c088 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -38,7 +38,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphic_buffer_lcc(*scene->lcc, gBuffer, m_drawing_functor); } + { CGAL::add_in_graphic_buffer(*scene->lcc, gBuffer, m_drawing_functor); } if (doredraw) { Base::redraw(); } @@ -47,7 +47,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { gBuffer.clear(); - CGAL::add_in_graphic_buffer_lcc(*scene->lcc, gBuffer, m_drawing_functor); + CGAL::add_in_graphic_buffer(*scene->lcc, gBuffer, m_drawing_functor); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 3b4a0659f65e..53cedfd11815 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -239,14 +239,14 @@ void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer * @param alcc */ template -void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer, +void add_in_graphic_buffer(const LCC &alcc, Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); } template -void add_in_graphic_buffer_lcc(const LCC &alcc, Graphic_buffer &graphic_buffer) +void add_in_graphic_buffer(const LCC &alcc, Graphic_buffer &graphic_buffer) { Drawing_functor_with_volume &grap return get_random_color(random); }; - add_in_graphic_buffer_lcc(alcc, graphic_buffer, drawing_functor_with_volume); + add_in_graphic_buffer(alcc, graphic_buffer, drawing_functor_with_volume); } // Specialization of draw function. @@ -281,7 +281,7 @@ void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, const char *title = "LCC for CMap Basic Viewer") { Graphic_buffer buffer; - add_in_graphic_buffer_lcc(alcc, buffer, drawing_functor); + add_in_graphic_buffer(alcc, buffer, drawing_functor); draw_buffer(buffer); } @@ -292,7 +292,7 @@ template buffer; - add_in_graphic_buffer_lcc(alcc, buffer); + add_in_graphic_buffer(alcc, buffer); draw_buffer(buffer); } diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 125ffe73862c..087092a05623 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -66,7 +66,7 @@ void compute_elements(const PointSet *pointset, } // namespace draw_function_for_PointSet template -void add_in_graphic_buffer_point_set(Graphic_buffer &graphic_buffer, +void add_in_graphic_buffer(Graphic_buffer &graphic_buffer, const PointSet *aPointSet = nullptr) { if (aPointSet != nullptr) { draw_function_for_PointSet::compute_elements(aPointSet, graphic_buffer); @@ -78,7 +78,7 @@ template void draw(const Point_set_3 &apointset, const char *title = "Point_set_3 Basic Viewer") { Graphic_buffer buffer; - add_in_graphic_buffer_point_set(buffer, &apointset); + add_in_graphic_buffer(buffer, &apointset); draw_buffer(buffer); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 85c81cdafc90..2b29ee2dc4fd 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -79,7 +79,7 @@ void compute_elements(CGAL::Graphic_buffer &graphic_buffer, } // namespace draw_function_for_p2 template -void add_in_graphic_buffer_p2(CGAL::Graphic_buffer &graphic_buffer, +void add_in_graphic_buffer(CGAL::Graphic_buffer &graphic_buffer, const P2 *p2 = nullptr) { if (p2 != nullptr) { draw_function_for_p2::compute_elements(graphic_buffer, p2); @@ -99,7 +99,7 @@ void draw(const CGAL_P2_TYPE &ap2, // drawingFunctor; CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_p2(buffer, &ap2); + add_in_graphic_buffer(buffer, &ap2); draw_buffer(buffer); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 6c977a0c4f74..c489126d3185 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -112,7 +112,7 @@ void compute_elements(const SS2 *ss2, } // namespace draw_function_for_ss2 template -void add_in_graphic_buffer_ss2(const SS2 &ass2, +void add_in_graphic_buffer(const SS2 &ass2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_ss2::compute_elements(&ass2, graphic_buffer, @@ -120,14 +120,14 @@ void add_in_graphic_buffer_ss2(const SS2 &ass2, } template -void add_in_graphic_buffer_ss2( +void add_in_graphic_buffer( const SS2 &ass2, CGAL::Graphic_buffer &graphic_buffer) { Drawing_functor drawingFunctor; - add_in_graphic_buffer_ss2(ass2, graphic_buffer, drawingFunctor); + add_in_graphic_buffer(ass2, graphic_buffer, drawingFunctor); } // Specialization of draw function. @@ -137,7 +137,7 @@ template void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, const char *title = "Straight Skeleton Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_ss2(ass2, buffer, drawingfunctor); + add_in_graphic_buffer(ass2, buffer, drawingfunctor); draw_buffer(buffer); } @@ -145,7 +145,7 @@ template void draw(const CGAL_SS_TYPE &ass2, const char *title = "Straight Skeleton Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_ss2(ass2, buffer); + add_in_graphic_buffer(ass2, buffer); draw_buffer(buffer); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 3cb70e32b917..b7f9a9956c73 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -121,7 +121,7 @@ void compute_elements(const T2 *t2, } // namespace draw_function_for_t2 template -void add_in_graphic_buffer_t2(const T2 &at2, +void add_in_graphic_buffer(const T2 &at2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor, bool m_nofaces = false) { @@ -130,7 +130,7 @@ void add_in_graphic_buffer_t2(const T2 &at2, } template -void add_in_graphic_buffer_t2(const T2 &at2, +void add_in_graphic_buffer(const T2 &at2, CGAL::Graphic_buffer &graphic_buffer, bool m_nofaces = false) { @@ -152,7 +152,7 @@ void add_in_graphic_buffer_t2(const T2 &at2, return get_random_color(random); }; - add_in_graphic_buffer_t2(at2, graphic_buffer, drawingFunctor, m_nofaces); + add_in_graphic_buffer(at2, graphic_buffer, drawingFunctor, m_nofaces); } // Specialization of draw function. @@ -163,7 +163,7 @@ void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_t2(at2, buffer, drawingfunctor, nofill); + add_in_graphic_buffer(at2, buffer, drawingfunctor, nofill); draw_buffer(buffer); } @@ -172,7 +172,7 @@ void draw(const CGAL_T2_TYPE &at2, const char *title = "Triangulation_2 Basic Viewer", bool nofill = false) { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_t2(at2, buffer, nofill); + add_in_graphic_buffer(at2, buffer, nofill); draw_buffer(buffer); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index a965fb878faa..8b24306806bf 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -118,7 +118,7 @@ void compute_elements(const T3 *t3, CGAL::Graphic_buffer &graphic_bu } // namespace draw_function_for_t3 template -void add_in_graphic_buffer_t3(const T3 &at3, +void add_in_graphic_buffer(const T3 &at3, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { @@ -126,7 +126,7 @@ void add_in_graphic_buffer_t3(const T3 &at3, } template -void add_in_graphic_buffer_t3(const T3 &at3, +void add_in_graphic_buffer(const T3 &at3, CGAL::Graphic_buffer &graphic_buffer) { CGAL::Drawing_functor buffer; - add_in_graphic_buffer_t3(at3, buffer, drawingfunctor); + add_in_graphic_buffer(at3, buffer, drawingfunctor); draw_buffer(buffer); } @@ -172,7 +172,7 @@ template void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer_t3(at3, buffer); + add_in_graphic_buffer(at3, buffer); draw_buffer(buffer); } From 5be8e30cfa1710330eda8dbbcba0281b38f9c489 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 13:27:51 +0200 Subject: [PATCH 069/341] Applied new APIs version on Polygon with holes 2.y --- .../include/CGAL/draw_polygon_with_holes_2.h | 162 ++++++++---------- 1 file changed, 72 insertions(+), 90 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index be58464ebf89..560e8eaf4c30 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -13,10 +13,13 @@ // // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_POLYGON_WITH_HOLES_2_H #define CGAL_DRAW_POLYGON_WITH_HOLES_2_H +#include +#include #include #ifdef DOXYGEN_RUNNING @@ -45,113 +48,92 @@ void draw(const PH& aph); namespace CGAL { -// Viewer class for Polygon_with_holes_2 -template -class SimplePolygonWithHoles2ViewerQt : public Basic_viewer_qt +namespace draw_function_for_ph2_with_holes { + +template +void compute_one_loop_elements(const typename P2::General_polygon_2& p, Graphic_buffer &graphic_buffer, bool hole) { - typedef Basic_viewer_qt Base; - typedef typename P2::General_polygon_2::Point_2 Point; - -public: - /// Construct the viewer without drawing anything. - /// @param title the title of the window - SimplePolygonWithHoles2ViewerQt(QWidget* parent, - const char* title="Basic Polygon_with_holes_2 Viewer") : - Base(parent, title, true, true, true, false, false) - { - clear(); - } + + if (hole) + { graphic_buffer.add_point_in_face(p.vertex(p.size()-1)); } - /// Construct the viewer. - /// @param ap2 the polygon to view - /// @param title the title of the window - SimplePolygonWithHoles2ViewerQt(QWidget* parent, const P2& ap2, - const char* title="Basic Polygon_with_holes_2 Viewer") : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false) + typename P2::General_polygon_2::Vertex_const_iterator prev; + for (typename P2::General_polygon_2::Vertex_const_iterator i=p.vertices_begin(); + i!=p.vertices_end(); ++i) { - clear(); - compute_elements(ap2); + graphic_buffer.add_point(*i); // Add vertex + if (i!=p.vertices_begin()) + { graphic_buffer.add_segment(*prev, *i); } // Add segment with previous point + graphic_buffer.add_point_in_face(*i); // Add point in face + prev=i; } -protected: - void compute_one_loop_elements(const typename P2::General_polygon_2& p, bool hole) + // Add the last segment between the last point and the first one + graphic_buffer.add_segment(*prev, *(p.vertices_begin())); +} + +template +void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ + + if (p2.outer_boundary().is_empty()) return; + + // TODO: use face_color after adding a handler if exists. + CGAL::IO::Color c(75,160,255); + graphic_buffer.face_begin(c); + + compute_one_loop_elements(p2.outer_boundary(), graphic_buffer, false); + + for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { - if (hole) - { add_point_in_face(p.vertex(p.size()-1)); } - - typename P2::General_polygon_2::Vertex_const_iterator prev; - for (typename P2::General_polygon_2::Vertex_const_iterator i=p.vertices_begin(); - i!=p.vertices_end(); ++i) - { - add_point(*i); // Add vertex - if (i!=p.vertices_begin()) - { add_segment(*prev, *i); } // Add segment with previous point - add_point_in_face(*i); // Add point in face - prev=i; - } - - // Add the last segment between the last point and the first one - add_segment(*prev, *(p.vertices_begin())); + compute_one_loop_elements(*it, graphic_buffer, true); + graphic_buffer.add_point_in_face(p2.outer_boundary().vertex(p2.outer_boundary().size()-1)); } - void compute_elements(const P2& p2) - { - if (p2.outer_boundary().is_empty()) return; + graphic_buffer.face_end(); +} - CGAL::IO::Color c(75,160,255); - face_begin(c); +} // draw_function_for_ph2 - compute_one_loop_elements(p2.outer_boundary(), false); - for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) - { - compute_one_loop_elements(*it, true); - add_point_in_face(p2.outer_boundary().vertex(p2.outer_boundary().size()-1)); - } +template +void add_in_graphic_buffer(const P2 &p2, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor ) { + draw_function_for_ph2_with_holes::compute_elements(p2, graphic_buffer, m_drawing_functor); +} - face_end(); - } +template +void add_in_graphic_buffer(const P2 &p2, CGAL::Graphic_buffer &graphic_buffer) { - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - - // Call the base method to process others/classicals key - Base::keyPressEvent(e); - } -}; + // TODO: use colord_face and face_color if a handler exits. + Drawing_functor + drawing_functor; + + add_in_graphic_buffer(p2, graphic_buffer, drawing_functor); +} // Specialization of draw function. -template -void draw(const CGAL::Polygon_with_holes_2& ap2, - const char* title="Polygon_with_holes_2 Basic Viewer") +#define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 + + +template +void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_functor) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ap2, buffer, drawing_functor); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"t2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimplePolygonWithHoles2ViewerQt > - mainwindow(app.activeWindow(), ap2, title); - mainwindow.show(); - app.exec(); - } +template +void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, + const char* title="Polygon_with_holes_2 Basic Viewer") +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ap2, buffer); + draw_buffer(buffer); } } // End namespace CGAL From 7a2f8902ff9d5c6cf5add853a524915e095aa41f Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 15:13:21 +0200 Subject: [PATCH 070/341] Added CGAL namespace, new line at EOF. --- GraphicsView/include/CGAL/Drawing_functor.h | 2 +- .../include/CGAL/draw_linear_cell_complex.h | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index 561155ac0839..cff52be172da 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -96,4 +96,4 @@ struct Drawing_functor_with_volume : } // End namespace CGAL -#endif // CGAL_DRAWING_FUNCTORS_H \ No newline at end of file +#endif // CGAL_DRAWING_FUNCTORS_H diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 53cedfd11815..daa202cf9628 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -64,7 +64,7 @@ template void compute_face(typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - Graphic_buffer &graphic_buffer) + CGAL::Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_faces_enabled() || !m_drawing_functor.draw_face(*lcc, dh)) @@ -109,7 +109,7 @@ void compute_face(typename LCC::Dart_const_handle dh, template void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctor &m_drawing_functor, - Graphic_buffer &graphic_buffer) + CGAL::Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_edges_enabled() || !m_drawing_functor.draw_edge(*lcc, dh)) @@ -132,7 +132,7 @@ void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, template void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, - Graphic_buffer &graphic_buffer) + CGAL::Graphic_buffer &graphic_buffer) { if (!m_drawing_functor.are_vertices_enabled() || !m_drawing_functor.draw_vertex(*lcc, dh)) @@ -148,7 +148,7 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, } template -void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer, +void compute_elements(const LCC *lcc, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { if (lcc==nullptr) @@ -239,14 +239,14 @@ void compute_elements(const LCC *lcc, Graphic_buffer &graphic_buffer * @param alcc */ template -void add_in_graphic_buffer(const LCC &alcc, Graphic_buffer &graphic_buffer, +void add_in_graphic_buffer(const LCC &alcc, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); } template -void add_in_graphic_buffer(const LCC &alcc, Graphic_buffer &graphic_buffer) +void add_in_graphic_buffer(const LCC &alcc, CGAL::Graphic_buffer &graphic_buffer) { Drawing_functor_with_volume buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer(alcc, buffer, drawing_functor); draw_buffer(buffer); } @@ -291,7 +291,7 @@ template void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") { - Graphic_buffer buffer; + CGAL::Graphic_buffer buffer; add_in_graphic_buffer(alcc, buffer); draw_buffer(buffer); } From 7404eb629fda75cefe6786c2ca625b05d036fe7c Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 15:17:01 +0200 Subject: [PATCH 071/341] Applied new APIs version in periodic 2 triangulation 2. --- .../CGAL/draw_periodic_2_triangulation_2.h | 366 ++++++++---------- 1 file changed, 155 insertions(+), 211 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 395edef7a122..41453f1cbcd8 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -8,10 +8,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Jasmeet Singh +// Mostafa Ashraf #ifndef DRAW_PERIODIC_2_TRIANGULATION_2_H #define DRAW_PERIODIC_2_TRIANGULATION_2_H +#include +#include #include #include @@ -23,255 +26,196 @@ namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorP2T2 { - template - static CGAL::IO::Color run(const P2T2 &, - const typename P2T2::Periodic_triangle_iterator /*ti*/) { - //CGAL::Random random((unsigned int)(std::size_t)(&*ti)); - //return get_random_color(random); - return CGAL::IO::Color(73, 250, 117); - } +namespace draw_function_for_P2T2 +{ + +enum Display_type +{ + STORED = 0, + UNIQUE, // 1 + STORED_COVER_DOMAIN, // 2 + UNIQUE_COVER_DOMAIN // 3 }; -// Viewer class for P2T2 -template -class SimplePeriodic2Triangulation2ViewerQt : public Basic_viewer_qt +template +void compute_vertex(typename P2T2::Periodic_point_iterator pi, const P2T2 &p2t2, + CGAL::Graphic_buffer &graphic_buffer) { - typedef Basic_viewer_qt Base; + // Construct the point in 9-sheeted covering space and add to viewer + graphic_buffer.add_point(p2t2.point(*pi)); +} - typedef typename P2T2::Iterator_type Iterator_type; +template +void compute_edge(typename P2T2::Periodic_segment_iterator si, const P2T2 &p2t2, + CGAL::Graphic_buffer &graphic_buffer) +{ + typedef typename P2T2::Segment Segment; - // Vertex iterators - typedef typename P2T2::Periodic_point_iterator Periodic_point_iterator; + // Construct the segment in 9-sheeted covering space and add to viewer + Segment s(p2t2.segment(*si)); + graphic_buffer.add_segment(s[0], s[1]); +} - // Edge iterators - typedef typename P2T2::Periodic_segment_iterator Periodic_segment_iterator; - typedef typename P2T2::Segment Segment; +template +void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ + typedef typename P2T2::Triangle Triangle; - // Face iterators - typedef typename P2T2::Periodic_triangle_iterator Periodic_triangle_iterator; - typedef typename P2T2::Triangle Triangle; + // Construct the triangle in 9-sheeted covering space and add to viewer + Triangle t(p2t2.triangle(*ti)); - typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + if(m_drawing_functor.colored_face(p2t2, ti)) { -public: - /// Construct the viewer. - /// @param ap2t2 the p2t2 to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - SimplePeriodic2Triangulation2ViewerQt(QWidget* parent, const P2T2& ap2t2, - const char* title="Basic P2T2 Viewer", - bool anofaces=false, - const ColorFunctor& fcolor=ColorFunctor()) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - p2t2(ap2t2), - m_nofaces(anofaces), - m_fcolor(fcolor), - m_display_type(STORED_COVER_DOMAIN), - m_domain(true) - { - // Add custom key description (see keyPressEvent). - setKeyDescription(::Qt::Key_1, "STORED: Display all geometric primitives as they are stored in " - "Triangulation_data_structure_2"); - setKeyDescription(::Qt::Key_2, "UNIQUE: Display only one representative of each geometric primitive even " - "if the triangulation is computed in multiply sheeted covering space."); - setKeyDescription(::Qt::Key_3, "STORED_COVER_DOMAIN: Same as STORED but also display " - "all primitives whose intersection with the original " - "domain of the current covering space is non-empty"); - setKeyDescription(::Qt::Key_4, "UNIQUE_COVER_DOMAIN: Same as UNIQUE but also display " - "all primitives whose intersection with the original " - "domain of the current covering space is non-empty"); - setKeyDescription(::Qt::Key_D, "Toggle 9-sheeted domain display"); - - compute_elements(); + // Need CGAL::IO::Color(73, 250, 117); + CGAL::IO::Color c= m_drawing_functor.face_color(p2t2, ti); + graphic_buffer.face_begin(c); + graphic_buffer.add_point_in_face(t[0]); + graphic_buffer.add_point_in_face(t[1]); + graphic_buffer.add_point_in_face(t[2]); + graphic_buffer.face_end(); } -protected: - void compute_vertex(Periodic_point_iterator pi) - { - // Construct the point in 9-sheeted covering space and add to viewer - add_point(p2t2.point(*pi)); + + + // Display the edges of the faces as segments with a + // light gray color for better visualization + if(m_drawing_functor.colored_face(p2t2, ti)) { + + // Need CGAL::IO::Color(207, 213, 211); + CGAL::IO::Color c = m_drawing_functor.face_color(p2t2, ti); + + graphic_buffer.add_segment(t[0], t[1], c); + graphic_buffer.add_segment(t[1], t[2], c); + graphic_buffer.add_segment(t[2], t[0], c); + } +} + +template +void compute_domain(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) +{ + typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + + Kernel::Iso_rectangle_2 orig_domain = p2t2.domain(); + std::array covering_sheets = p2t2.number_of_sheets(); + + for(int i = 0; i < covering_sheets[0]; i++){ + for(int j = 0; j < covering_sheets[1]; j++){ + Kernel::Vector_2 shift(i * (orig_domain.xmax() - orig_domain.xmin()), + j * orig_domain.ymax() - orig_domain.ymin()); + Kernel::Point_2 p1((orig_domain.min)()); + Kernel::Point_2 p2(orig_domain.xmin(), orig_domain.ymax()); + Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); + Kernel::Point_2 p4((orig_domain.max)()); + + graphic_buffer.add_segment(p1 + shift, p2 + shift, CGAL::IO::Color(96, 104, 252)); + graphic_buffer.add_segment(p1 + shift, p3 + shift, CGAL::IO::Color(96, 104, 252)); + graphic_buffer.add_segment(p2 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); + graphic_buffer.add_segment(p3 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); + } } +} + +template +void compute_elements(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor, bool m_domain = true) { + + typedef typename P2T2::Iterator_type Iterator_type; - void compute_edge(Periodic_segment_iterator si) + Display_type m_display_type(Display_type::STORED_COVER_DOMAIN); + + // Get the display type, iterate through periodic elements according + // to the display type + Iterator_type it_type = (Iterator_type)m_display_type; + + // Iterate through vertices, edges and faces, add elements to buffer + for (typename P2T2::Periodic_point_iterator it = + p2t2.periodic_points_begin(it_type); + it != p2t2.periodic_points_end(it_type); it++) { - // Construct the segment in 9-sheeted covering space and add to viewer - Segment s(p2t2.segment(*si)); - add_segment(s[0], s[1]); + compute_vertex(it, p2t2, graphic_buffer); } - void compute_face(Periodic_triangle_iterator ti) + for (typename P2T2::Periodic_segment_iterator it = + p2t2.periodic_segments_begin(it_type); + it != p2t2.periodic_segments_end(it_type); it++) { - // Construct the triangle in 9-sheeted covering space and add to viewer - Triangle t(p2t2.triangle(*ti)); - - CGAL::IO::Color c=m_fcolor.run(p2t2, ti); - face_begin(c); - add_point_in_face(t[0]); - add_point_in_face(t[1]); - add_point_in_face(t[2]); - face_end(); - - // Display the edges of the faces as segments with a - // light gray color for better visualization - add_segment(t[0], t[1], CGAL::IO::Color(207, 213, 211)); - add_segment(t[1], t[2], CGAL::IO::Color(207, 213, 211)); - add_segment(t[2], t[0], CGAL::IO::Color(207, 213, 211)); + compute_edge(it, p2t2, graphic_buffer); } - void compute_domain() + for (typename P2T2::Periodic_triangle_iterator it = + p2t2.periodic_triangles_begin(it_type); + it != p2t2.periodic_triangles_end(it_type); it++) { - Kernel::Iso_rectangle_2 orig_domain = p2t2.domain(); - std::array covering_sheets = p2t2.number_of_sheets(); - - for(int i = 0; i < covering_sheets[0]; i++){ - for(int j = 0; j < covering_sheets[1]; j++){ - Kernel::Vector_2 shift(i * (orig_domain.xmax() - orig_domain.xmin()), - j * orig_domain.ymax() - orig_domain.ymin()); - Kernel::Point_2 p1((orig_domain.min)()); - Kernel::Point_2 p2(orig_domain.xmin(), orig_domain.ymax()); - Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); - Kernel::Point_2 p4((orig_domain.max)()); - - add_segment(p1 + shift, p2 + shift, CGAL::IO::Color(96, 104, 252)); - add_segment(p1 + shift, p3 + shift, CGAL::IO::Color(96, 104, 252)); - add_segment(p2 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); - add_segment(p3 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); - } - } + compute_face(it, p2t2, graphic_buffer, m_drawing_functor); } - void compute_elements() { - // Clear the buffers - clear(); + if(m_domain){ + // Compute the (9-sheet covering space) domain of the periodic triangulation + compute_domain(p2t2, graphic_buffer); + } +} - // Get the display type, iterate through periodic elements according - // to the display type - Iterator_type it_type = (Iterator_type)m_display_type; +} // namespace draw_function_for_P2T2 - // Iterate through vertices, edges and faces, add elements to buffer - for (Periodic_point_iterator it = - p2t2.periodic_points_begin(it_type); - it != p2t2.periodic_points_end(it_type); it++) - { - compute_vertex(it); - } +template +void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { + draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, m_drawing_functor); +} - for (Periodic_segment_iterator it = - p2t2.periodic_segments_begin(it_type); - it != p2t2.periodic_segments_end(it_type); it++) - { - compute_edge(it); - } +template +void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) { - for (Periodic_triangle_iterator it = - p2t2.periodic_triangles_begin(it_type); - it != p2t2.periodic_triangles_end(it_type); it++) - { - compute_face(it); - } + Drawing_functor drawing_functor; - if(m_domain){ - // Compute the (9-sheet covering space) domain of the periodic triangulation - compute_domain(); - } - } + drawing_functor.colored_face = [](const P2T2&, + typename P2T2::Periodic_triangle_iterator) -> bool + { return true; }; - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - - // Call the base method to process others/classicals key - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if (e->text()=="1") - { - m_display_type = Display_type::UNIQUE; - displayMessage(QString("Display type= UNIQUE")); - compute_elements(); - redraw(); - } else if (e->text()=="2") - { - m_display_type = Display_type::UNIQUE_COVER_DOMAIN; - displayMessage(QString("Display type= UNIQUE_COVER_DOMAIN")); - compute_elements(); - redraw(); - } else if (e->text()=="3") - { - m_display_type = Display_type::STORED; - displayMessage(QString("Display type= STORED")); - compute_elements(); - redraw(); - } else if (e->text()=="4") - { - m_display_type = Display_type::STORED_COVER_DOMAIN; - displayMessage(QString("Display type= STORED_COVER_DOMAIN")); - compute_elements(); - redraw(); - } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) - { - m_domain=!m_domain; - displayMessage(QString("Draw domain=%1.").arg(m_domain?"true":"false")); - compute_elements(); - redraw(); - } else { - Base::keyPressEvent(e); - } - } + // TODO: I think we need to add std::function like this: + // drawing_functor.face_color = [] (const P2T2&, + // typename P2T2::Periodic_triangle_iterator, + // int R, int G, int B) -> CGAL::IO::Color + // { + // return CGAL::IO::Color(R, G, B); + // }; // What do you think? -protected: - const P2T2& p2t2; - bool m_nofaces; - const ColorFunctor& m_fcolor; - enum Display_type + drawing_functor.face_color = [] (const P2T2& alcc, + typename P2T2::Periodic_triangle_iterator dh) -> CGAL::IO::Color { - STORED = 0, - UNIQUE, // 1 - STORED_COVER_DOMAIN, // 2 - UNIQUE_COVER_DOMAIN // 3 + return CGAL::IO::Color(207, 213, 211); }; - Display_type m_display_type; - bool m_domain; -}; + + add_in_graphic_buffer(p2t2, graphic_buffer, drawing_functor); +} // Specialization of draw function -#define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 \ - +#define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 + +template < class Gt, + class Tds, + class BufferType = float, + class DrawingFunctor > +void draw(const CGAL_P2T2_TYPE& ap2t2, + const DrawingFunctor &drawing_functor) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ap2t2, buffer, drawing_functor); + draw_buffer(buffer); +} template < class Gt, - class Tds > + class Tds, + class BufferType = float > void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title = "2D Periodic Triangulation Viewer", bool nofill = false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"p2t2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - DefaultColorFunctorP2T2 fcolor; - SimplePeriodic2Triangulation2ViewerQt - mainwindow(app.activeWindow(), ap2t2, title, nofill, fcolor); - mainwindow.show(); - app.exec(); - } + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ap2t2, buffer); + draw_buffer(buffer); } } // namespace CGAL From cc4aa7cd9dea55dddf5e68f3cf17089a4a5ca2b8 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 17:48:58 +0200 Subject: [PATCH 072/341] Applied new APIs version in Voronoi 2, with modifications in Basic_viewer_qt. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 2 +- .../include/CGAL/draw_voronoi_diagram_2.h | 494 +++++++++--------- 2 files changed, 247 insertions(+), 249 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index ceae3cfd1c43..728d1ed7bc1b 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -399,7 +399,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer update(); } -protected: // Shortcuts to simplify function calls. template static Local_point get_local_point(const KPoint& p) @@ -414,6 +413,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer get_local_vector(v); } +protected: void compile_shaders() { rendering_program_face.removeAllShaders(); diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index f92e9af630ea..a16714badaf2 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -8,10 +8,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Jasmeet Singh +// Mostafa Ashraf #ifndef CGAL_DRAW_VORONOI_DIAGRAM_2_H #define CGAL_DRAW_VORONOI_DIAGRAM_2_H +#include +#include #include #include @@ -28,306 +31,301 @@ namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorV2 +namespace draw_function_for_v2 { - template - static CGAL::IO::Color run(const V2 &, const typename V2::Face_iterator /*fh*/) { - //CGAL::Random random((unsigned int)(std::size_t)(&*fh)); - //return get_random_color(random); - return CGAL::IO::Color(73, 250, 117); - } -}; -// Viewer for Voronoi diagram -template -class SimpleVoronoiDiagram2ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename V2::Vertex_iterator Vertex_const_handle; - typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; - typedef typename V2::Delaunay_graph::Finite_vertices_iterator Dual_vertices_iterator; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Vector_3 Local_vector; + +template +void compute_vertex(typename V2::Vertex_iterator vh, CGAL::Graphic_buffer &graphic_buffer) { + + graphic_buffer.add_point(vh->point()); - typedef typename V2::Halfedge_iterator Halfedge_const_handle; - typedef typename V2::Ccb_halfedge_circulator Ccb_halfedge_circulator; - typedef typename V2::Halfedge_handle Halfedge_handle; +} - typedef typename V2::Face_iterator Face_const_handle; +template +void compute_dual_vertex(typename V2::Delaunay_graph::Finite_vertices_iterator vi, CGAL::Graphic_buffer &graphic_buffer) +{ + graphic_buffer.add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); +} +template +void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, CGAL::Graphic_buffer &graphic_buffer) +{ typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; -public: - /// Construct the viewer. - /// @param av2 the voronoi diagram to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this - /// can be useful for very big object where this time could be long) - SimpleVoronoiDiagram2ViewerQt(QWidget *parent, const V2 &av2, - const char *title = "Basic Voronoi Viewer", - bool anofaces = false, - bool draw_voronoi_vertices = true, - bool draw_delaunay_vertices = true, - const ColorFunctor &fcolor = ColorFunctor()) - : // First draw: vertices; half-edges; faces; multi-color; no inverse - // normal - Base(parent, title, true, true, true, false, false, true, true), - v2(av2), m_nofaces(anofaces), - m_draw_voronoi_vertices(draw_voronoi_vertices), - m_draw_dual_vertices(draw_delaunay_vertices), m_fcolor(fcolor) { - // Add custom key description (see keyPressEvent) - setKeyDescription(::Qt::Key_R, "Toggles rays display"); - setKeyDescription(::Qt::Key_D, "Toggles dual vertices display"); - setKeyDescription(::Qt::Key_V, "Toggles voronoi vertices display"); - - compute_elements(); - } + if (he->is_segment()) { + graphic_buffer.add_segment(he->source()->point(), he->target()->point()); + } else { + Delaunay_vertex_const_handle v1 = he->up(); + Delaunay_vertex_const_handle v2 = he->down(); -protected: + Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), + v2->point().x() - v1->point().x()); + if (he->is_ray()) { + Kernel::Point_2 end_point; + if (he->has_source()) { + end_point = he->source()->point(); - void compute_vertex(Vertex_const_handle vh) { add_point(vh->point()); } + // update_bounding_box_for_ray(end_point, direction); - void compute_dual_vertex(Dual_vertices_iterator vi) - { - add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); - } + // update_bounding_box_for_ray + Local_point lp = Basic_viewer_qt<>::get_local_point(end_point); + Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); + CGAL::Bbox_3 b = (lp + lv).bbox(); + graphic_buffer.update_bounding_box(b); + - void add_segments_and_update_bounding_box(Halfedge_handle he) - { - if (he->is_segment()) { - add_segment(he->source()->point(), he->target()->point()); - } else { - Delaunay_vertex_const_handle v1 = he->up(); - Delaunay_vertex_const_handle v2 = he->down(); - - Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); - if (he->is_ray()) { - Kernel::Point_2 end_point; - if (he->has_source()) { - end_point = he->source()->point(); - update_bounding_box_for_ray(end_point, direction); - } - } else if (he->is_bisector()) { - Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, - (v1->point().y() + v2->point().y()) / 2); - Kernel::Vector_2 perpendicularDirection( - v2->point().x() - v1->point().x(), - v2->point().y() - v1->point().y()); - update_bounding_box_for_line(pointOnLine, direction, - perpendicularDirection); } + } else if (he->is_bisector()) { + Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, + (v1->point().y() + v2->point().y()) / 2); + Kernel::Vector_2 perpendicularDirection( + v2->point().x() - v1->point().x(), + v2->point().y() - v1->point().y()); + + // update_bounding_box_for_line(pointOnLine, direction, + // perpendicularDirection); + + // update_bounding_box_for_line + Local_point lp = Basic_viewer_qt<>::get_local_point(pointOnLine); + Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); + Local_vector lpv = Basic_viewer_qt<>::get_local_vector(perpendicularDirection); + + CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); + graphic_buffer.update_bounding_box(b); + } } +} - Local_kernel::Point_2 get_second_point(Halfedge_handle ray) - { - Delaunay_vertex_const_handle v1 = ray->up(); - Delaunay_vertex_const_handle v2 = ray->down(); - - // calculate direction of ray and its inverse - Kernel::Vector_2 v(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); - Local_kernel::Vector_2 inv(1 / v.x(), 1 / v.y()); - - // origin of the ray - Kernel::Point_2 p; - if (ray->has_source()) { - p = ray->source()->point(); - } else { - p = ray->target()->point(); - } +template +Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, const CGAL::Bbox_3 & m_bounding_box) +{ + typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; + + Delaunay_vertex_const_handle v1 = ray->up(); + Delaunay_vertex_const_handle v2 = ray->down(); + + // calculate direction of ray and its inverse + Kernel::Vector_2 v(v1->point().y() - v2->point().y(), + v2->point().x() - v1->point().x()); + Local_kernel::Vector_2 inv(1 / v.x(), 1 / v.y()); + + // origin of the ray + Kernel::Point_2 p; + if (ray->has_source()) { + p = ray->source()->point(); + } else { + p = ray->target()->point(); + } - // get the bounding box of the viewer - Local_kernel::Vector_2 boundsMin(m_bounding_box.xmin(), - m_bounding_box.zmin()); - Local_kernel::Vector_2 boundsMax(m_bounding_box.xmax(), - m_bounding_box.zmax()); - // calculate intersection - double txmax, txmin, tymax, tymin; - - if (inv.x() >= 0) { - txmax = (boundsMax.x() - p.x()) * inv.x(); - txmin = (boundsMin.x() - p.x()) * inv.x(); - } else { - txmax = (boundsMin.x() - p.x()) * inv.x(); - txmin = (boundsMax.x() - p.x()) * inv.x(); - } + // get the bounding box of the viewer + Local_kernel::Vector_2 boundsMin(m_bounding_box.xmin(), + m_bounding_box.zmin()); + Local_kernel::Vector_2 boundsMax(m_bounding_box.xmax(), + m_bounding_box.zmax()); + // calculate intersection + double txmax, txmin, tymax, tymin; + + if (inv.x() >= 0) { + txmax = (boundsMax.x() - p.x()) * inv.x(); + txmin = (boundsMin.x() - p.x()) * inv.x(); + } else { + txmax = (boundsMin.x() - p.x()) * inv.x(); + txmin = (boundsMax.x() - p.x()) * inv.x(); + } - if (inv.y() >= 0) { - tymax = (boundsMax.y() - p.y()) * inv.y(); - tymin = (boundsMin.y() - p.y()) * inv.y(); - } else { - tymax = (boundsMin.y() - p.y()) * inv.y(); - tymin = (boundsMax.y() - p.y()) * inv.y(); - } + if (inv.y() >= 0) { + tymax = (boundsMax.y() - p.y()) * inv.y(); + tymin = (boundsMin.y() - p.y()) * inv.y(); + } else { + tymax = (boundsMin.y() - p.y()) * inv.y(); + tymin = (boundsMax.y() - p.y()) * inv.y(); + } - if (tymin > txmin) - txmin = tymin; - if (tymax < txmax) - txmax = tymax; - - Local_kernel::Point_2 p1; - if (v.x() == 0) { - p1 = Local_kernel::Point_2(p.x(), p.y() + tymax * v.y()); - } else if (v.y() == 0) { - p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y()); - } else { - p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y() + tymax * v.y()); - } - return p1; + if (tymin > txmin) + txmin = tymin; + if (tymax < txmax) + txmax = tymax; + + Local_kernel::Point_2 p1; + if (v.x() == 0) { + p1 = Local_kernel::Point_2(p.x(), p.y() + tymax * v.y()); + } else if (v.y() == 0) { + p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y()); + } else { + p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y() + tymax * v.y()); } + return p1; +} - void compute_rays_and_bisectors(Halfedge_const_handle he) - { - Delaunay_vertex_const_handle v1 = he->up(); - Delaunay_vertex_const_handle v2 = he->down(); +// Halfedge_const_handle +template +void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, CGAL::Graphic_buffer &graphic_buffer) +{ + typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; + typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; - Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); - if (he->is_ray()) { - if (he->has_source()) { - // add_ray_segment(he->source()->point(), get_second_point(he)); - add_ray(he->source()->point(), direction, CGAL::IO::Color(100, 0, 0)); - } - } else if (he->is_bisector()) { - Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, - (v1->point().y() + v2->point().y()) / 2); - add_line(pointOnLine, direction); + Delaunay_vertex_const_handle v1 = he->up(); + Delaunay_vertex_const_handle v2 = he->down(); + + Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), + v2->point().x() - v1->point().x()); + if (he->is_ray()) { + if (he->has_source()) { + // add_ray_segment(he->source()->point(), get_second_point(he, graphic_buffer.get_bounding_box())); + graphic_buffer.add_ray(he->source()->point(), direction, CGAL::IO::Color(100, 0, 0)); } + } else if (he->is_bisector()) { + Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, + (v1->point().y() + v2->point().y()) / 2); + graphic_buffer.add_line(pointOnLine, direction); } +} - void compute_face(Face_const_handle fh) - { - CGAL::IO::Color c = m_fcolor.run(v2, fh); +template +void compute_face(typename V2::Face_iterator fh, const V2& v2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) +{ + typedef typename V2::Ccb_halfedge_circulator Ccb_halfedge_circulator; - Ccb_halfedge_circulator ec_start = fh->ccb(); - Ccb_halfedge_circulator ec = ec_start; + if(m_drawing_functor.colored_face(v2, fh)) { - if (!fh->is_unbounded()) { - face_begin(c); - do { - add_point_in_face(ec->source()->point()); - } while (++ec != ec_start); - face_end(); - } - // Test: for unbounded faces - // else { - // do{ - // if( ec->has_source() ){ - // add_point_in_face(ec->source()->point()); - // } - // else{ - // add_point_in_face(get_second_point(ec->twin())); - // } - // } while(++ec != ec_start); - // } + CGAL::IO::Color c = m_drawing_functor.face_color(v2, fh); + + Ccb_halfedge_circulator ec_start = fh->ccb(); + Ccb_halfedge_circulator ec = ec_start; + + if (!fh->is_unbounded()) { + graphic_buffer.face_begin(c); + do { + graphic_buffer.add_point_in_face(ec->source()->point()); + } while (++ec != ec_start); + graphic_buffer.face_end(); } - void compute_elements() - { - clear(); + } + // Test: for unbounded faces + // else { + // do{ + // if( ec->has_source() ){ + // add_point_in_face(ec->source()->point()); + // } + // else{ + // add_point_in_face(get_second_point(ec->twin(), graphic_buffer.get_bounding_box())); + // } + // } while(++ec != ec_start); + // } +} - // Draw the voronoi vertices - if (m_draw_voronoi_vertices) { - for (typename V2::Vertex_iterator it = v2.vertices_begin(); - it != v2.vertices_end(); ++it) { - compute_vertex(it); - } - } +template +void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor , bool m_nofaces = false, bool m_draw_voronoi_vertices = true, bool m_draw_dual_vertices = true) +{ + typedef typename V2::Delaunay_graph::Finite_vertices_iterator Dual_vertices_iterator; - // Draw the dual vertices - if (m_draw_dual_vertices) { - for (Dual_vertices_iterator it = v2.dual().finite_vertices_begin(); - it != v2.dual().finite_vertices_end(); ++it) { - compute_dual_vertex(it); - } + // Draw the voronoi vertices + if (m_draw_voronoi_vertices) { + for (typename V2::Vertex_iterator it = v2.vertices_begin(); + it != v2.vertices_end(); ++it) { + compute_vertex(it, graphic_buffer); } + } - // Add segments and update bounding box - for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) { - add_segments_and_update_bounding_box(it); + // Draw the dual vertices + if (m_draw_dual_vertices) { + for (Dual_vertices_iterator it = v2.dual().finite_vertices_begin(); + it != v2.dual().finite_vertices_end(); ++it) { + compute_dual_vertex(it, graphic_buffer); } + } - for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) { - compute_rays_and_bisectors(it); - } + // Add segments and update bounding box + for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); + it != v2.halfedges_end(); ++it) { + add_segments_and_update_bounding_box(it, graphic_buffer); + } - if (!m_nofaces) { - for (typename V2::Face_iterator it = v2.faces_begin(); - it != v2.faces_end(); ++it) { - compute_face(it); - } - } + for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); + it != v2.halfedges_end(); ++it) { + compute_rays_and_bisectors(it, graphic_buffer); } - virtual void keyPressEvent(QKeyEvent *e) - { - /// [Keypress] - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { - m_draw_rays = !m_draw_rays; - displayMessage( - QString("Draw rays=%1.").arg(m_draw_rays ? "true" : "false")); - update(); - } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::NoButton)) { - m_draw_voronoi_vertices = !m_draw_voronoi_vertices; - displayMessage( - QString("Voronoi vertices=%1.").arg(m_draw_voronoi_vertices? "true" : "false")); - compute_elements(); - redraw(); - } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - m_draw_dual_vertices = !m_draw_dual_vertices; - displayMessage(QString("Dual vertices=%1.") - .arg(m_draw_dual_vertices ? "true" : "false")); - compute_elements(); - redraw(); - } else { - // Call the base method to process others/classicals key - Base::keyPressEvent(e); + if (!m_nofaces) { + for (typename V2::Face_iterator it = v2.faces_begin(); + it != v2.faces_end(); ++it) { + compute_face(it, v2, graphic_buffer, m_drawing_functor); } - /// [Keypress] } +} + +} // namespace draw_function_for_v2 + +template +void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor, bool m_nofaces = false, + bool m_draw_voronoi_vertices = true, bool m_draw_dual_vertices = true ) { + draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor, m_nofaces, m_draw_voronoi_vertices, m_draw_dual_vertices); +} + +template +void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graphic_buffer, + bool m_nofaces = false, bool m_draw_voronoi_vertices = true, + bool m_draw_dual_vertices = true ) { -protected: - const V2 &v2; - bool m_nofaces; - bool m_draw_voronoi_vertices; - bool m_draw_dual_vertices; - const ColorFunctor &m_fcolor; -}; + // Default functor; user can add his own functor. + Drawing_functor + drawing_functor; + + drawing_functor.colored_face = [](const V2&, + typename V2::Face_iterator fh) -> bool + { return true; }; + + + drawing_functor.face_color = [] (const V2& alcc, + typename V2::Face_iterator fh) -> CGAL::IO::Color + { + return CGAL::IO::Color(73, 250, 117); + }; + + add_in_graphic_buffer(v2, graphic_buffer, drawing_functor, m_nofaces, m_draw_voronoi_vertices, m_draw_dual_vertices); +} // Specialization of draw function. #define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 template + class AP, typename BufferType = float, class DrawingFunctor> +void draw(const CGAL_VORONOI_TYPE &av2, + const DrawingFunctor &drawing_functor, + bool nofill = false, + bool draw_voronoi_vertices = true, + bool draw_dual_vertices = true) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(av2, buffer, drawing_functor, nofill, draw_voronoi_vertices, draw_dual_vertices); + draw_buffer(buffer); +} + +template void draw(const CGAL_VORONOI_TYPE &av2, const char *title="2D Voronoi Diagram Basic Viewer", bool nofill = false, bool draw_voronoi_vertices = true, bool draw_dual_vertices = true) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite = true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) { - CGAL::Qt::init_ogl_context(4,3); - int argc = 1; - const char *argv[2] = {"voronoi_2_viewer", nullptr}; - QApplication app(argc, const_cast(argv)); - DefaultColorFunctorV2 fcolor; - SimpleVoronoiDiagram2ViewerQt - mainwindow(app.activeWindow(), av2, title, nofill, - draw_voronoi_vertices, draw_dual_vertices, fcolor); - mainwindow.show(); - app.exec(); - } + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(av2, buffer, nofill, draw_voronoi_vertices, draw_dual_vertices); + draw_buffer(buffer); } } // End namespace CGAL From d7a513cfb6432a92cd01ba24aef09196b6ba81e4 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 18:37:35 +0200 Subject: [PATCH 073/341] Modified --- .../CGAL/draw_periodic_2_triangulation_2.h | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 41453f1cbcd8..a1ade03cebda 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -68,7 +68,6 @@ void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2 if(m_drawing_functor.colored_face(p2t2, ti)) { - // Need CGAL::IO::Color(73, 250, 117); CGAL::IO::Color c= m_drawing_functor.face_color(p2t2, ti); graphic_buffer.face_begin(c); graphic_buffer.add_point_in_face(t[0]); @@ -80,15 +79,12 @@ void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2 // Display the edges of the faces as segments with a // light gray color for better visualization - if(m_drawing_functor.colored_face(p2t2, ti)) { + CGAL::IO::Color segment_color = CGAL::IO::Color(207, 213, 211); - // Need CGAL::IO::Color(207, 213, 211); - CGAL::IO::Color c = m_drawing_functor.face_color(p2t2, ti); + graphic_buffer.add_segment(t[0], t[1], segment_color); + graphic_buffer.add_segment(t[1], t[2], segment_color); + graphic_buffer.add_segment(t[2], t[0], segment_color); - graphic_buffer.add_segment(t[0], t[1], c); - graphic_buffer.add_segment(t[1], t[2], c); - graphic_buffer.add_segment(t[2], t[0], c); - } } template @@ -121,7 +117,7 @@ void compute_elements(const P2T2 &p2t2, CGAL::Graphic_buffer &graphi typedef typename P2T2::Iterator_type Iterator_type; - Display_type m_display_type(Display_type::STORED_COVER_DOMAIN); + draw_function_for_P2T2::Display_type m_display_type = draw_function_for_P2T2::Display_type::STORED_COVER_DOMAIN; // Get the display type, iterate through periodic elements according // to the display type @@ -160,13 +156,13 @@ void compute_elements(const P2T2 &p2t2, CGAL::Graphic_buffer &graphi template void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { - draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, m_drawing_functor); + draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, m_drawing_functor, true); } template void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) { - Drawing_functor drawing_functor; @@ -174,18 +170,10 @@ void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &g typename P2T2::Periodic_triangle_iterator) -> bool { return true; }; - // TODO: I think we need to add std::function like this: - // drawing_functor.face_color = [] (const P2T2&, - // typename P2T2::Periodic_triangle_iterator, - // int R, int G, int B) -> CGAL::IO::Color - // { - // return CGAL::IO::Color(R, G, B); - // }; // What do you think? - drawing_functor.face_color = [] (const P2T2& alcc, typename P2T2::Periodic_triangle_iterator dh) -> CGAL::IO::Color { - return CGAL::IO::Color(207, 213, 211); + return CGAL::IO::Color(73, 250, 117); }; add_in_graphic_buffer(p2t2, graphic_buffer, drawing_functor); From 74a68d469434a3bb4c940ca79e58ecc552ea2db3 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 21:22:05 +0200 Subject: [PATCH 074/341] Applied new APIs version in face graph. --- BGL/include/CGAL/draw_face_graph.h | 241 +++++++----------- Surface_mesh/include/CGAL/draw_surface_mesh.h | 34 +-- 2 files changed, 103 insertions(+), 172 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 00e22278c7ba..e78016a56f15 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -1,4 +1,4 @@ -// Copyright (c) 2018-2020 GeometryFactory (France) +// Copyright (c) 2018-2022 GeometryFactory (France) // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -9,186 +9,117 @@ // // Author(s) : Guillaume Damiand // Laurent Rineau +// Mostafa Ashraf #ifndef CGAL_DRAW_FACE_GRAPH_H #define CGAL_DRAW_FACE_GRAPH_H +#include +#include +#include + #ifdef CGAL_USE_BASIC_VIEWER #include #include #include -namespace CGAL -{ - -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorFaceGraph -{ - template - CGAL::IO::Color operator()(const Graph&, - typename boost::graph_traits::face_descriptor fh) const - { - if (fh==boost::graph_traits::null_face()) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - - return get_random_color(CGAL::get_default_random()); +namespace CGAL { + +namespace draw_function_for_SM { + +template +void compute_elements(const SM &sm, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor, bool anofaces = false) { + + using Point = + typename boost::property_map_value::type; + using Kernel = typename CGAL::Kernel_traits::Kernel; + using Vector = typename Kernel::Vector_3; + + auto vnormals = get(CGAL::dynamic_vertex_property_t(), sm); + auto point_pmap = get(CGAL::vertex_point, sm); + for (auto v : vertices(sm)) { + Vector n(NULL_VECTOR); + int i = 0; + for (auto h : halfedges_around_target(halfedge(v, sm), sm)) { + if (!is_border(h, sm)) { + Vector ni = CGAL::cross_product( + Vector(get(point_pmap, source(h, sm)), + get(point_pmap, target(h, sm))), + Vector(get(point_pmap, target(h, sm)), + get(point_pmap, target(next(h, sm), sm)))); + if (ni != NULL_VECTOR) { + n += ni; + ++i; + } + } + } + put(vnormals, v, n / i); } -}; -class SimpleFaceGraphViewerQt : public Basic_viewer_qt -{ - using Base = Basic_viewer_qt; - -public: - SimpleFaceGraphViewerQt(QWidget* parent) : - Base(parent, "", false, true, true, true, false), - m_compute_elements_impl([]{}) - { + if (!anofaces) { + for (auto fh : faces(sm)) { + if (fh != boost::graph_traits::null_face() && m_drawing_functor.colored_face(sm, fh)) { + CGAL::IO::Color c = m_drawing_functor.face_color(sm, fh); + graphic_buffer.face_begin(c); + auto hd = halfedge(fh, sm); + const auto first_hd = hd; + do { + auto v = source(hd, sm); + graphic_buffer.add_point_in_face(get(point_pmap, v), get(vnormals, v)); + hd = next(hd, sm); + } while (hd != first_hd); + graphic_buffer.face_end(); + } + } } - /// Construct the viewer. - /// @param amesh the surface mesh to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - template - SimpleFaceGraphViewerQt(QWidget* parent, - const SM& amesh, - const char* title="Basic Surface_mesh Viewer", - bool anofaces=false) : - SimpleFaceGraphViewerQt(parent, amesh, title, anofaces, DefaultColorFunctorFaceGraph()) - { + for (auto e : edges(sm)) { + graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, sm), sm)), + get(point_pmap, target(halfedge(e, sm), sm))); } - template - SimpleFaceGraphViewerQt(QWidget* parent, - const SM& amesh, - const char* title, - bool anofaces, - ColorFunctor fcolor) : - // First draw: no vertex; edges, faces; mono-color; inverse normal - Base(parent, title, false, true, true, true, false), - m_compute_elements_impl(compute_elements_functor(amesh, anofaces, fcolor)) - { + for (auto v : vertices(sm)) { + graphic_buffer.add_point(get(point_pmap, v)); } +} - void init() override { - compute_elements(); - Base::init(); - } +} // draw_function_for_SM - void compute_elements() { - m_compute_elements_impl(); - } +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { + draw_function_for_SM::compute_elements(sm, graphic_buffer, m_drawing_functor); +} - template - void set_face_graph(const SM& amesh, - bool anofaces, - ColorFunctor fcolor) { - m_compute_elements_impl = compute_elements_functor(amesh, anofaces, fcolor); - } +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { - template - void set_face_graph(const SM& amesh, - bool anofaces=false) { - set_mesh(amesh, anofaces, DefaultColorFunctorFaceGraph()); - } -protected: - template - std::function - compute_elements_functor(const SM& sm, - bool anofaces, - ColorFunctor fcolor) - { - using Point = - typename boost::property_map_value::type; - using Kernel = typename CGAL::Kernel_traits::Kernel; - using Vector = typename Kernel::Vector_3; - - auto vnormals = get(CGAL::dynamic_vertex_property_t(), sm); - auto point_pmap = get(CGAL::vertex_point, sm); - for (auto v : vertices(sm)) - { - Vector n(NULL_VECTOR); - int i=0; - for (auto h : halfedges_around_target(halfedge(v, sm), sm)) - { - if (!is_border(h, sm)) - { - Vector ni = CGAL::cross_product( - Vector(get(point_pmap, source(h, sm)), get(point_pmap, target(h, sm))), - Vector(get(point_pmap, target(h, sm)), get(point_pmap, target(next(h, sm), sm)))); - if (ni != NULL_VECTOR) - { - n+=ni; - ++i; - } - } - } - put(vnormals, v, n/i); - } + // Default functor; user can add his own functor. + Drawing_functor::face_descriptor, + typename boost::graph_traits::face_descriptor, + typename boost::graph_traits::face_descriptor> + drawing_functor; - // This function return a lambda expression, type-erased in a - // `std::function` object. - return [this, &sm, vnormals, anofaces, fcolor, point_pmap]() - { - this->clear(); - - if (!anofaces) - { - for (auto fh: faces(sm)) - { - if (fh!=boost::graph_traits::null_face()) - { - CGAL::IO::Color c=fcolor(sm, fh); - face_begin(c); - auto hd=halfedge(fh, sm); - const auto first_hd = hd; - do - { - auto v = source(hd, sm); - add_point_in_face(get(point_pmap, v), get(vnormals, v)); - hd=next(hd, sm); - } - while(hd!=first_hd); - face_end(); - } - } - } + drawing_functor.colored_face = [](const SM &, + typename boost::graph_traits::face_descriptor fh) -> bool + { return true; }; - for (auto e: edges(sm)) - { - add_segment(get(point_pmap, source(halfedge(e, sm), sm)), - get(point_pmap, target(halfedge(e, sm), sm))); - } - - for (auto v: vertices(sm)) - { - this->add_point(get(point_pmap, v)); - } - }; - } - void keyPressEvent(QKeyEvent *e) override + drawing_functor.face_color = [] (const SM &, + typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - - // Call the base method to process others/classicals key - Base::keyPressEvent(e); - } + if (fh == + boost::graph_traits::null_face()) // use to get the mono color + return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + + return get_random_color(CGAL::get_default_random()); + }; -protected: - std::function m_compute_elements_impl; -}; + add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); +} } // End namespace CGAL diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 3459392aec1c..e836ad6eb713 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -8,6 +8,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_SURFACE_MESH_H #define CGAL_DRAW_SURFACE_MESH_H @@ -28,6 +29,8 @@ void draw(const SM& asm); #else // DOXYGEN_RUNNING +#include +#include #include #include @@ -40,28 +43,25 @@ namespace CGAL { // Specialization of draw function. -template +template void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer", bool nofill=false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"surface_mesh_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimpleFaceGraphViewerQt mainwindow(app.activeWindow(), amesh, title, - nofill); - mainwindow.show(); - app.exec(); - } +template +void draw(const Surface_mesh& amesh, + const DrawingFunctor &drawing_functor, + const char* title="Surface_mesh Basic Viewer", + bool nofill=false) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer, drawing_functor); + draw_buffer(buffer); } } // End namespace CGAL From 6469319870ee97b1a8094031faacfcfd4edbf315 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 21:23:34 +0200 Subject: [PATCH 075/341] Surface mesh example. --- Surface_mesh/include/CGAL/draw_surface_mesh.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index e836ad6eb713..184d80c5a830 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -39,6 +39,7 @@ void draw(const SM& asm); #include #include #include + namespace CGAL { From f4b8db08372625ecedf4e6084152559fd4ad6fe2 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 6 Oct 2022 22:48:11 +0200 Subject: [PATCH 076/341] Used new face graph APIs in polyhedron. --- Polyhedron/include/CGAL/draw_polyhedron.h | 38 +++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 0866e27ebc0b..b6d92c56b3ae 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -8,10 +8,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_POLYHEDRON_H #define CGAL_DRAW_POLYHEDRON_H +#include +#include #include #include @@ -32,28 +35,29 @@ template class T_HDS, - class Alloc> + class Alloc, typename BufferType = float> void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer", bool nofill=false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(apoly, buffer); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"polyhedron_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimpleFaceGraphViewerQt - mainwindow(app.activeWindow(), apoly, title, nofill); - mainwindow.show(); - app.exec(); - } +template + class T_HDS, + class Alloc, typename BufferType = float, class DrawingFunctor> +void draw(const CGAL_POLY_TYPE& apoly, + const DrawingFunctor &drawing_functor, + const char* title="Polyhedron Basic Viewer", + bool nofill=false) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(apoly, buffer, drawing_functor); + draw_buffer(buffer); } #undef CGAL_POLY_TYPE From c4d612c85e2b026da65b71aa41728ca5ff498c9e Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 7 Oct 2022 03:00:19 +0200 Subject: [PATCH 077/341] Uses new APIs version in Nef_3. --- Nef_3/include/CGAL/draw_nef_3.h | 402 +++++++++++++++----------------- 1 file changed, 193 insertions(+), 209 deletions(-) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index e654ea9aae7f..f211ecc380f4 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -9,10 +9,13 @@ // // // Author(s) : Jasmeet Singh +// Mostafa Ashraf #ifndef DRAW_NEF_3_H #define DRAW_NEF_3_H +#include +#include #include #include @@ -28,268 +31,249 @@ namespace CGAL { -// Default color functor; user can change it to have its own face color -struct DefaultColorFunctorNefPolyhedron +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Vector_3 Local_vector; + +namespace draw_function_for_nef_polyhedron { - template - static CGAL::IO::Color run(const NefPolyhedron&, - typename NefPolyhedron::Halffacet_const_handle fh) - { - if (fh == nullptr) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - CGAL::Random random((unsigned int)(std::size_t)(&(*fh))); - return get_random_color(random); +template +Local_vector get_face_normal(typename Nef_Polyhedron::SHalfedge_const_handle she) +{ + typedef typename Nef_Polyhedron::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator; + + SHalfedge_around_facet_const_circulator he(she); + Local_vector normal = CGAL::NULL_VECTOR; + SHalfedge_around_facet_const_circulator end = he; + unsigned int nb = 0; + + CGAL_For_all(he, end) + { + internal::newell_single_step_3(Basic_viewer_qt<>::get_local_point + (he->next()->source()->center_vertex()->point()), + Basic_viewer_qt<>::get_local_point(he->source()->center_vertex()-> + point()), normal); + ++nb; } -}; -// Viewer class for Nef Polyhedron -template -class SimpleNefPolyhedronViewerQt : public Basic_viewer_qt + CGAL_assertion(nb > 0); + return (typename Local_kernel::Construct_scaled_vector_3()(normal, 1.0 / nb)); +} + +template +Local_vector get_vertex_normal(typename Nef_Polyhedron::Vertex_const_handle vh) { - typedef Basic_viewer_qt Base; - typedef typename Nef_Polyhedron::Kernel Kernel; + typedef typename Nef_Polyhedron::SHalfedge_const_handle SHalfedge_const_handle; + typedef typename Nef_Polyhedron::SHalfedge_const_iterator SHalfedge_const_iterator; - typedef typename Nef_Polyhedron::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator; - typedef typename Nef_Polyhedron::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator; + Local_vector normal = CGAL::NULL_VECTOR; - typedef typename Nef_Polyhedron::Shell_entry_const_iterator Shell_entry_const_iterator; - typedef typename Nef_Polyhedron::SHalfedge_const_iterator SHalfedge_const_iterator; - typedef typename Nef_Polyhedron::Volume_const_iterator Volume_const_iterator; + SHalfedge_const_iterator it = vh->shalfedges_begin(); + SHalfedge_const_handle end = it; + do { + Local_vector n = get_face_normal(it); + normal = typename Local_kernel::Construct_sum_of_vectors_3()(normal, n); + it = it->snext(); + } while( it != end ); + + if (!typename Local_kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) + { + normal = (typename Local_kernel::Construct_scaled_vector_3()( + normal, 1.0 / CGAL::sqrt(normal.squared_length()))); + } + + return normal; +} + +// Visitor class to iterate through shell objects +template +class Nef_Visitor { - typedef typename Nef_Polyhedron::Vertex_const_handle Vertex_const_handle; - typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; typedef typename Nef_Polyhedron::Halfedge_const_handle Halfedge_const_handle; typedef typename Nef_Polyhedron::Halffacet_const_handle Halffacet_const_handle; typedef typename Nef_Polyhedron::SHalfedge_const_handle SHalfedge_const_handle; + typedef typename Nef_Polyhedron::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator; + typedef typename Nef_Polyhedron::Vertex_const_handle Vertex_const_handle; + typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; typedef typename Nef_Polyhedron::SHalfloop_const_handle SHalfloop_const_handle; + typedef typename Nef_Polyhedron::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator; public: - /// Construct the viewer - /// @param anef the nef polyhedron to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not - /// computed: this can be useful for big objects) - SimpleNefPolyhedronViewerQt(QWidget* parent, - const Nef_Polyhedron& anef, - const char* title="Basic Nef Polyhedron Viewer", - bool anofaces=false, - const ColorFunctor& fcolor=ColorFunctor()) : - //First draw: vertex; edges, faces; mon-color; inverse normal - Base(parent, title, false, true, true, true, false), - nef(anef), - m_nofaces(anofaces), - m_fcolor(fcolor) - { - compute_elements(); + Nef_Visitor(const Nef_Polyhedron &_nef, + CGAL::Graphic_buffer & _graphic_buffer, + const DrawingFunctor &_drawing_functor) + : n_faces(0), n_edges(0), + nef(_nef), + graphic_buffer(_graphic_buffer), + drawing_functor(_drawing_functor) {} + + void visit(Vertex_const_handle vh) { + graphic_buffer.add_point(vh->point()); } -protected: - // Visitor class to iterate through shell objects - class Nef_Visitor { - public: - Nef_Visitor(SimpleNefPolyhedronViewerQt &v) - : n_faces(0), n_edges(0), viewer(v) {} - - void visit(Vertex_const_handle vh) { - viewer.add_point(vh->point()); - } - - void visit(Halffacet_const_handle opposite_facet) - { - Halffacet_const_handle f = opposite_facet->twin(); - if (facets_done.find(f) != facets_done.end() || - facets_done.find(opposite_facet) != facets_done.end()) { - return; - } + void visit(Halffacet_const_handle opposite_facet) + { + Halffacet_const_handle f = opposite_facet->twin(); + if (facets_done.find(f) != facets_done.end() || + facets_done.find(opposite_facet) != facets_done.end()) { + return; + } + SHalfedge_const_handle se; + Halffacet_cycle_const_iterator fc = f->facet_cycles_begin(); - SHalfedge_const_handle se; - Halffacet_cycle_const_iterator fc=f->facet_cycles_begin(); + se = SHalfedge_const_handle(fc); // non-zero if shalfedge is returned + if(se == 0) + { //return if not-shalfedge + return; + } - se = SHalfedge_const_handle(fc); // non-zero if shalfedge is returned - if(se == 0) - { //return if not-shalfedge - return; - } + if(drawing_functor.colored_face(nef, f)) { + CGAL::IO::Color c = drawing_functor.face_color(nef, f); + graphic_buffer.face_begin(c); + } - CGAL::IO::Color c = viewer.run_color(f); - viewer.face_begin(c); + SHalfedge_around_facet_const_circulator hc_start(se); + SHalfedge_around_facet_const_circulator hc_end(hc_start); + Vertex_const_handle lastvh; + CGAL_For_all(hc_start, hc_end) { + Vertex_const_handle vh=hc_start->source()->center_vertex(); + lastvh=vh; + graphic_buffer.add_point_in_face(vh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(vh)); + } - SHalfedge_around_facet_const_circulator hc_start(se); - SHalfedge_around_facet_const_circulator hc_end(hc_start); - Vertex_const_handle lastvh; + // Now iterate through holes of the face + ++fc; + while(fc!=f->facet_cycles_end()) + { + se = SHalfedge_const_handle(fc); + hc_start=se; + hc_end=hc_start; CGAL_For_all(hc_start, hc_end) { Vertex_const_handle vh=hc_start->source()->center_vertex(); - lastvh=vh; - viewer.add_point_in_face(vh->point(), - viewer.get_vertex_normal(vh)); + graphic_buffer.add_point_in_face(vh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(vh)); } - - // Now iterate through holes of the face + graphic_buffer.add_point_in_face(hc_start->source()->center_vertex()->point(), + draw_function_for_nef_polyhedron::get_vertex_normal(hc_start->source()->center_vertex())); + graphic_buffer.add_point_in_face(lastvh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(lastvh)); ++fc; - while(fc!=f->facet_cycles_end()) - { - se = SHalfedge_const_handle(fc); - hc_start=se; - hc_end=hc_start; - CGAL_For_all(hc_start, hc_end) { - Vertex_const_handle vh=hc_start->source()->center_vertex(); - viewer.add_point_in_face(vh->point(), - viewer.get_vertex_normal(vh)); - } - viewer.add_point_in_face(hc_start->source()->center_vertex()->point(), - viewer.get_vertex_normal(hc_start->source()->center_vertex())); - viewer.add_point_in_face(lastvh->point(), - viewer.get_vertex_normal(lastvh)); - ++fc; - } - - viewer.face_end(); - facets_done[f]=true; - n_faces++; } - void visit(Halfedge_const_handle he) - { - Halfedge_const_handle twin = he->twin(); - if (edges_done.find(he) != edges_done.end() || - edges_done.find(twin) != edges_done.end()) - { - // Edge already added - return; - } + graphic_buffer.face_end(); + facets_done[f]=true; + n_faces++; + } - viewer.add_segment(he->source()->point(), he->target()->point()); - edges_done[he] = true; - n_edges++; + void visit(Halfedge_const_handle he) + { + Halfedge_const_handle twin = he->twin(); + if (edges_done.find(he) != edges_done.end() || + edges_done.find(twin) != edges_done.end()) + { + // Edge already added + return; } - void visit(SHalfedge_const_handle ) {} - void visit(SHalfloop_const_handle ) {} - void visit(SFace_const_handle ) {} - int n_faces; - int n_edges; - protected: - std::unordered_map facets_done; - std::unordered_map edges_done; - SimpleNefPolyhedronViewerQt& viewer; - }; + graphic_buffer.add_segment(he->source()->point(), he->target()->point()); + edges_done[he] = true; + n_edges++; + } - void compute_elements() - { - clear(); + void visit(SHalfedge_const_handle ) {} + void visit(SHalfloop_const_handle ) {} + void visit(SFace_const_handle ) {} + int n_faces; + int n_edges; +protected: + std::unordered_map facets_done; + std::unordered_map edges_done; + CGAL::Graphic_buffer& graphic_buffer; + const DrawingFunctor& drawing_functor; + const Nef_Polyhedron &nef; +}; - Volume_const_iterator c; +template +void compute_elements(const Nef_Polyhedron &nef, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ - Nef_Visitor V(*this); - CGAL_forall_volumes(c, nef) - { - Shell_entry_const_iterator it; - CGAL_forall_shells_of(it, c) - { - nef.visit_shell_objects(SFace_const_handle(it), V); - } - } + typedef typename Nef_Polyhedron::Volume_const_iterator Volume_const_iterator; + typedef typename Nef_Polyhedron::Shell_entry_const_iterator Shell_entry_const_iterator; + typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; - negate_all_normals(); - } + Volume_const_iterator c; - CGAL::IO::Color run_color(Halffacet_const_handle fh) + Nef_Visitor V(nef, graphic_buffer, m_drawing_functor); + CGAL_forall_volumes(c, nef) { - return m_fcolor.run(nef, fh); + Shell_entry_const_iterator it; + CGAL_forall_shells_of(it, c) + { + nef.visit_shell_objects(SFace_const_handle(it), V); + } } - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - - // Call the base method to process others/classicals key - Base::keyPressEvent(e); - } + graphic_buffer.negate_all_normals(); +} -protected: - Local_vector get_face_normal(SHalfedge_const_handle she) - { - SHalfedge_around_facet_const_circulator he(she); - Local_vector normal = CGAL::NULL_VECTOR; - SHalfedge_around_facet_const_circulator end = he; - unsigned int nb = 0; +} // namespace draw_function_for_nef_polyhedron - CGAL_For_all(he, end) - { - internal::newell_single_step_3(this->get_local_point - (he->next()->source()->center_vertex()->point()), - this->get_local_point(he->source()->center_vertex()-> - point()), normal); - ++nb; - } +template +void add_in_graphic_buffer(const Nef_Polyhedron &nef, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { + draw_function_for_nef_polyhedron::compute_elements(nef, graphic_buffer, m_drawing_functor); +} - CGAL_assertion(nb > 0); - return (typename Local_kernel::Construct_scaled_vector_3()(normal, 1.0 / nb)); - } +template +void add_in_graphic_buffer(const Nef_Polyhedron &nef, CGAL::Graphic_buffer &graphic_buffer) { - Local_vector get_vertex_normal(Vertex_const_handle vh) - { - Local_vector normal = CGAL::NULL_VECTOR; + // Default functor; user can add his own functor. + Drawing_functor + drawing_functor; - SHalfedge_const_iterator it = vh->shalfedges_begin(); - SHalfedge_const_handle end = it; - do { - Local_vector n = get_face_normal(it); - normal = typename Local_kernel::Construct_sum_of_vectors_3()(normal, n); - it = it->snext(); - } while( it != end ); + drawing_functor.colored_face = [] (const Nef_Polyhedron&, + typename Nef_Polyhedron::Halffacet_const_handle fh) -> bool + { + return true; + }; - if (!typename Local_kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) - { - normal = (typename Local_kernel::Construct_scaled_vector_3()( - normal, 1.0 / CGAL::sqrt(normal.squared_length()))); - } + drawing_functor.face_color = [] (const Nef_Polyhedron&, + typename Nef_Polyhedron::Halffacet_const_handle fh) -> CGAL::IO::Color + { + if (fh == nullptr) // use to get the mono color + return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - return normal; - } + CGAL::Random random((unsigned int)(std::size_t)(&(*fh))); + return get_random_color(random); + }; -protected: - const Nef_Polyhedron &nef; - bool m_nofaces; - const ColorFunctor &m_fcolor; -}; + add_in_graphic_buffer(nef, graphic_buffer, drawing_functor); +} #define CGAL_NEF3_TYPE Nef_polyhedron_3 -template +template void draw(const CGAL_NEF3_TYPE &anef, - const char *title = "Nef Polyhedron Viewer", + const DrawingFunctor &drawing_functor, bool nofill = false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite = true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(anef, buffer, drawing_functor); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc = 1; - const char *argv[2] = {"nef_polyhedron_viewer", nullptr}; - QApplication app(argc, const_cast(argv)); - DefaultColorFunctorNefPolyhedron fcolor; - SimpleNefPolyhedronViewerQt - mainwindow(app.activeWindow(), anef, title, nofill, fcolor); - mainwindow.show(); - app.exec(); - } +template +void draw(const CGAL_NEF3_TYPE &anef, + const char *title = "Nef Polyhedron Viewer", + bool nofill = false) { + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(anef, buffer); + draw_buffer(buffer); } } // End namespace CGAL From 2f592577c1ee77c1fd81f807565d9aa2d5e5b2c4 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 7 Oct 2022 19:16:27 +0200 Subject: [PATCH 078/341] Scope changed. --- Nef_3/include/CGAL/draw_nef_3.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index f211ecc380f4..1c4e2ac1eb95 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -31,12 +31,12 @@ namespace CGAL { -typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; -typedef Local_kernel::Vector_3 Local_vector; - namespace draw_function_for_nef_polyhedron { +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Vector_3 Local_vector; + template Local_vector get_face_normal(typename Nef_Polyhedron::SHalfedge_const_handle she) { From 455c1d3b75ba866f02db374e3bff897d5684b422 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 7 Oct 2022 19:19:01 +0200 Subject: [PATCH 079/341] Changed to new API version, Compilation error"incomplete type" at get_vertex_normal. --- .../include/CGAL/draw_face_graph_with_paths.h | 542 +++++++++--------- 1 file changed, 284 insertions(+), 258 deletions(-) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 4187cd5ccc92..0e7a06bc8d22 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -8,12 +8,17 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf // #ifndef CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H #define CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H #include +#include +#include +#include + #include #include #include @@ -27,6 +32,16 @@ namespace CGAL { +namespace draw_function_for_face_graph_with_paths +{ + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Vector_3 Local_vector; + +template +struct LCC_geom_utils; + // Specialisation for face graph; otherwise use the LCC_geom_utils of LCC. template struct LCC_geom_utils, Local_kernel, 3> @@ -84,316 +99,326 @@ struct LCC_geom_utils, Local_kernel, 3> } }; -// Viewer class for Face_graph with paths. -template -class Face_graph_with_path_viewer : public Basic_viewer_qt +// Destructor. +// lcc.free_mark(m_oriented_mark); + + + +template +const typename CGAL::Get_traits::Point& get_point(typename Get_map::type::Dart_const_handle dh, const Mesh &mesh) +{ + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; + + return CGAL::Get_traits::get_point(mesh, dh); + +} + +template +void compute_face(typename Get_map::type::Dart_const_handle dh, + const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const typename Get_map::storage_type& lcc) { - typedef Basic_viewer_qt Base; typedef typename Get_map::type LCC; - typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::size_type size_type; + + typedef typename LCC::Dart_const_handle Dart_const_handle; typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; -public: - /// Construct the viewer. - /// @param alcc the lcc to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; - /// this can be usefull for very big object where this time could be long) - Face_graph_with_path_viewer(QWidget* parent, - const Mesh& amesh, - const std::vector - > - *paths=nullptr, - size_type amark=LCC::INVALID_MARK, - const char* title="", bool anofaces=false, - const DrawingFunctorLCC& - drawing_functor=DrawingFunctorLCC()) : - Base(parent, title, true, true, true, false, true), - mesh(amesh), - lcc(amesh), - m_oriented_mark(lcc.get_new_mark()), - m_nofaces(anofaces), - m_drawing_functor(drawing_functor), - m_paths(paths), - m_current_path(m_paths->size()), - m_current_dart(lcc.darts().end()), - m_draw_marked_darts(true), - m_amark(amark==(std::numeric_limits::max)()? - LCC::INVALID_MARK:amark) + // We fill only closed faces. + Dart_const_handle cur=dh; + Dart_const_handle min=dh; + do { - lcc.orient(m_oriented_mark); - compute_elements(); + if (!lcc.is_next_exist(cur)) return; // open face=>not filled + if (cur:: + get_vertex_normal(lcc, cur)); + cur=lcc.next(cur); } + while(cur!=dh); -protected: + graphic_buffer.face_end(); +} - const Point& get_point(Dart_const_handle dh) const - { return CGAL::Get_traits::get_point(mesh, dh); } - void compute_elements() - { - clear(); + // typename LCC::size_type m_amark; // If !=INVALID_MARK, show darts marked with this mark - typename LCC::size_type markfaces = lcc.get_new_mark(); - typename LCC::size_type markedges = lcc.get_new_mark(); - typename LCC::size_type markvertices = lcc.get_new_mark(); - - if (m_current_dart!=lcc.darts().end()) - { // We want to draw only one dart - Dart_const_handle selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); - compute_edge(selected_dart, CGAL::IO::Color(255,0,0)); - lcc.template mark_cell<1>(selected_dart, markedges); - compute_vertex(selected_dart); +template +void compute_edge(typename Get_map::type::Dart_const_handle dh, + const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const typename Get_map::storage_type& lcc, + typename Get_map::type::size_type m_amark, + bool m_draw_marked_darts = true) +{ + typedef typename Get_map::type LCC; + typedef typename LCC::size_type size_type; - if ( !m_nofaces ) - { compute_face(selected_dart); } + typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; - for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), - itend=lcc.darts().end(); it!=itend; ++it ) - { - if ( !lcc.is_marked(it, markedges) ) - { - compute_edge(it); - lcc.template mark_cell<1>(it, markedges); - } - } - } + Point p1 = get_point(dh, mesh); + Dart_const_handle d2 = lcc.other_extremity(dh); + if (d2!=LCC::null_handle) + { + if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && + (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) + { graphic_buffer.add_segment(p1, get_point(d2, mesh), CGAL::IO::Color(0, 0, 255)); } else - { - if (m_current_path==m_paths->size()) - { - for (std::size_t i=0; isize(); ++i) - { compute_path(i, markedges); } - } - else if (m_current_path!=m_paths->size()+1) - { compute_path(m_current_path, markedges); } + { graphic_buffer.add_segment(p1, get_point(d2, mesh)); } + } +} - for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), - itend=lcc.darts().end(); it!=itend; ++it ) - { - if (!m_nofaces && !lcc.is_marked(it, markfaces) && - !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) - { - compute_face(it); - lcc.template mark_cell<2>(it, markfaces); - } - - if ( !lcc.is_marked(it, markedges) ) - { - compute_edge(it); - lcc.template mark_cell<1>(it, markedges); - } - - if ( !lcc.is_marked(it, markvertices) ) - { - compute_vertex(it); - lcc.template mark_cell<0>(it, markvertices); - } - } - } +template +void compute_edge(typename Get_map::type::Dart_const_handle dh, + const CGAL::IO::Color& color, + const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const typename Get_map::storage_type& lcc) +{ + typedef typename Get_map::type LCC; + typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; - lcc.free_mark(markfaces); - lcc.free_mark(markedges); - lcc.free_mark(markvertices); - } + Point p1 = get_point(dh, mesh); + Dart_const_handle d2 = lcc.other_extremity(dh); + if (d2!=LCC::null_handle) + { graphic_buffer.add_segment(p1, get_point(d2, mesh), color); } +} - void compute_face(Dart_const_handle dh) - { - // We fill only closed faces. - Dart_const_handle cur=dh; - Dart_const_handle min=dh; - do - { - if (!lcc.is_next_exist(cur)) return; // open face=>not filled - if (cur +void compute_vertex(typename Get_map::type::Dart_const_handle dh, + const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer) +{ + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; + graphic_buffer.add_point(get_point(dh, mesh)); +} - // CGAL::IO::Color c=m_fcolor.run(*lcc, dh); - face_begin(); //c); +template +void compute_path(std::size_t i, + typename Get_map::type::size_type amark, + const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const std::vector>* m_paths, + const typename Get_map::storage_type& lcc) +{ - cur=dh; - do - { - add_point_in_face(get_point(cur), - LCC_geom_utils:: - get_vertex_normal(lcc, cur)); - cur=lcc.next(cur); - } - while(cur!=dh); + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; - face_end(); - } + if ((*m_paths)[i].is_empty()) + { return; } + + CGAL::Random random(static_cast(i)); + CGAL::IO::Color color = get_random_color(random); - void compute_edge(Dart_const_handle dh) + graphic_buffer.add_point(get_point((*m_paths)[i].get_ith_dart(0), mesh), color); + for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) { - Point p1 = get_point(dh); - Dart_const_handle d2 = lcc.other_extremity(dh); - if (d2!=LCC::null_handle) + if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) { - if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && - (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) - { add_segment(p1, get_point(d2), CGAL::IO::Color(0, 0, 255)); } - else - { add_segment(p1, get_point(d2)); } + compute_edge((*m_paths)[i].get_ith_dart(j), color, mesh, graphic_buffer, lcc); + lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); } } +} - void compute_edge(Dart_const_handle dh, const CGAL::IO::Color& color) - { - Point p1 = get_point(dh); - Dart_const_handle d2 = lcc.other_extremity(dh); - if (d2!=LCC::null_handle) - { add_segment(p1, get_point(d2), color); } - } +template +void compute_elements(const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor, + // TODO: I think I need to use smart pointers with lcc, right? + const typename Get_map::storage_type& lcc, + const std::vector>* m_paths, + typename Get_map::type::size_type amark /*= typename Get_map::type::INVALID_MARK*/, + bool m_nofaces = false, + bool m_draw_marked_darts = true) +{ + typedef typename Get_map::type LCC; + typedef typename LCC::size_type size_type; - void compute_vertex(Dart_const_handle dh) - { add_point(get_point(dh)); } + typedef typename CGAL::Get_traits::Kernel Kernel; + typedef typename CGAL::Get_traits::Point Point; + typedef typename CGAL::Get_traits::Vector Vector; - virtual void init() - { - Base::init(); - setKeyDescription(::Qt::Key_D, "Increase current dart drawing"); - setKeyDescription(::Qt::ControlModifier, ::Qt::Key_D, "Decrease current dart drawing"); - setKeyDescription(::Qt::ShiftModifier, ::Qt::Key_D, "Draw all darts"); + typedef typename LCC::Dart_const_handle Dart_const_handle; - setKeyDescription(::Qt::Key_X, "Toggles marked darts display"); + typename LCC::Dart_range::const_iterator m_current_dart = lcc.darts().end(); + typename LCC::size_type m_oriented_mark = lcc.get_new_mark(); + std::size_t m_current_path = m_paths->size(); + typename LCC::size_type m_amark = amark==(std::numeric_limits::max)()? + LCC::INVALID_MARK:amark; // If !=INVALID_MARK, show darts marked with this mark - setKeyDescription(::Qt::Key_P, "Increase current path drawing"); - setKeyDescription(::Qt::ControlModifier, ::Qt::Key_P, "Decrease current path drawing"); - setKeyDescription(::Qt::ShiftModifier, ::Qt::Key_P, "Draw all paths"); - } + lcc.orient(m_oriented_mark); - virtual void keyPressEvent(QKeyEvent *e) - { - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key()==::Qt::Key_D) && (modifiers==::Qt::NoButton)) - { - if (m_current_dart==lcc.darts().end()) - { m_current_dart=lcc.darts().begin(); } - else - { ++m_current_dart; } - if (m_current_dart==lcc.darts().end()) - { displayMessage(QString("Draw all darts.")); } - else - { displayMessage(QString("Draw dart=%1.").arg(lcc.darts().index(m_current_dart))); } - compute_elements(); - redraw(); - } - else if ((e->key()==::Qt::Key_D) && (modifiers==::Qt::ControlModifier)) - { - if (m_current_dart==lcc.darts().begin()) - { m_current_dart=lcc.darts().end(); } - else - { --m_current_dart; } - if (m_current_dart==lcc.darts().end()) - { displayMessage(QString("Draw all darts.")); } - else - { displayMessage(QString("Draw dart=%1.").arg(lcc.darts().index(m_current_dart))); } - compute_elements(); - redraw(); - } - else if ((e->key()==::Qt::Key_D) && (modifiers==::Qt::ShiftModifier)) - { - m_current_dart=lcc.darts().end(); - displayMessage(QString("Draw all darts.")); - compute_elements(); - redraw(); - } - else if ((e->key()==::Qt::Key_P) && (modifiers==::Qt::NoButton)) - { - m_current_path=(m_current_path+1)%(m_paths->size()+2); - if (m_current_path==m_paths->size()) - { displayMessage(QString("Draw all paths.")); } - else if (m_current_path==m_paths->size()+1) - { displayMessage(QString("Do not draw paths.")); } - else - { displayMessage(QString("Draw path=%1, nb_darts=%2."). - arg(m_current_path). - arg((*m_paths)[m_current_path].length())); } - compute_elements(); - redraw(); - } - else if ((e->key()==::Qt::Key_P) && (modifiers==::Qt::ControlModifier)) + typename LCC::size_type markfaces = lcc.get_new_mark(); + typename LCC::size_type markedges = lcc.get_new_mark(); + typename LCC::size_type markvertices = lcc.get_new_mark(); + + if (m_current_dart!=lcc.darts().end()) + { // We want to draw only one dart + Dart_const_handle selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); + compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphic_buffer, lcc); + lcc.template mark_cell<1>(selected_dart, markedges); + compute_vertex(selected_dart, mesh, graphic_buffer); + + if ( !m_nofaces ) + { compute_face(selected_dart, mesh, graphic_buffer, lcc); } + + for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it ) { - m_current_path=(m_current_path==0?m_paths->size()+1:m_current_path-1); - if (m_current_path==m_paths->size()) - { displayMessage(QString("Draw all paths.")); } - else if (m_current_path==m_paths->size()+1) - { displayMessage(QString("Do not draw paths.")); } - else - { displayMessage(QString("Draw path=%1, nb_darts=%2."). - arg(m_current_path). - arg((*m_paths)[m_current_path].length())); } - compute_elements(); - redraw(); + if ( !lcc.is_marked(it, markedges) ) + { + compute_edge(it, mesh, graphic_buffer, lcc, m_amark, m_draw_marked_darts); + lcc.template mark_cell<1>(it, markedges); + } } - else if ((e->key()==::Qt::Key_P) && (modifiers==::Qt::ShiftModifier)) + } + else + { + if (m_current_path==m_paths->size()) { - m_current_path=m_paths->size(); - displayMessage(QString("Draw all paths.")); - compute_elements(); - redraw(); + for (std::size_t i=0; isize(); ++i) + { compute_path(i, markedges, mesh, graphic_buffer, m_paths, lcc); } } - else if ((e->key()==::Qt::Key_X) && (modifiers==::Qt::NoButton)) - { - m_draw_marked_darts=!m_draw_marked_darts; + else if (m_current_path!=m_paths->size()+1) + { compute_path(m_current_path, markedges, mesh, graphic_buffer, m_paths, lcc); } - if (m_draw_marked_darts) - { displayMessage(QString("Draw marked darts in blue.")); } - else + for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it ) + { + if (!m_nofaces && !lcc.is_marked(it, markfaces) && + !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) { - displayMessage(QString("Do not draw marked darts in different color.")); + compute_face(it, mesh, graphic_buffer, lcc); + lcc.template mark_cell<2>(it, markfaces); } - compute_elements(); - redraw(); - } - else - { Base::keyPressEvent(e); } - } - void compute_path(std::size_t i, typename LCC::size_type amark) - { - if ((*m_paths)[i].is_empty()) - { return; } - - CGAL::Random random(static_cast(i)); - CGAL::IO::Color color=get_random_color(random); + if ( !lcc.is_marked(it, markedges) ) + { + compute_edge(it, mesh, graphic_buffer, lcc, m_amark, m_draw_marked_darts); + lcc.template mark_cell<1>(it, markedges); + } - add_point(get_point((*m_paths)[i].get_ith_dart(0)), color); - for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) - { - if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) + if ( !lcc.is_marked(it, markvertices) ) { - compute_edge((*m_paths)[i].get_ith_dart(j), color); - lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); + compute_vertex(it, mesh, graphic_buffer); + lcc.template mark_cell<0>(it, markvertices); } } } -protected: - const Mesh& mesh; - const typename Get_map::storage_type lcc; - typename LCC::size_type m_oriented_mark; - bool m_nofaces; - const DrawingFunctorLCC& m_drawing_functor; - const std::vector >* m_paths; - std::size_t m_current_path; - typename LCC::Dart_range::const_iterator m_current_dart; - bool m_draw_marked_darts; - typename LCC::size_type m_amark; // If !=INVALID_MARK, show darts marked with this mark -}; + lcc.free_mark(markfaces); + lcc.free_mark(markedges); + lcc.free_mark(markvertices); +} + +} // namespace draw_function_for_face_graph_with_paths + +template +void add_in_graphic_buffer(const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor, + // TODO: I think I need to use smart pointers with lcc, right? + const typename Get_map::storage_type& lcc, + const std::vector>* m_paths, + typename Get_map::type::size_type amark= /*typename*/ Get_map::type::INVALID_MARK, + bool m_nofaces = false) { + draw_function_for_face_graph_with_paths::compute_elements(mesh, graphic_buffer, m_drawing_functor, lcc, m_paths, amark, m_nofaces); +} + +template +void add_in_graphic_buffer(const Mesh &mesh, + CGAL::Graphic_buffer &graphic_buffer, + // TODO: I think I need to use smart pointers with lcc, right? + const typename Get_map::storage_type& lcc, + const std::vector>* m_paths, + typename Get_map::type::size_type amark= /*typename*/ Get_map::type::INVALID_MARK, + bool m_nofaces = false) { + + // Default functor; user can add his own functor. + Drawing_functor + drawing_functor; + + add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, lcc, m_paths, amark, m_nofaces); +} + + +template +void draw(const Mesh& alcc, + const std::vector >& paths, + typename Get_map::type::size_type amark= + (std::numeric_limits::type::size_type>::max)(), + const char* title="Mesh Viewer With Path", + bool nofill=false) { + + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(alcc, buffer, alcc, &paths, amark, nofill); + draw_buffer(buffer); +} + + +template +void draw(const Mesh& alcc, + const std::vector >& paths, + const DrawingFunctor& drawing_functor, + typename Get_map::type::size_type amark= + (std::numeric_limits::type::size_type>::max)(), + const char* title="Mesh Viewer With Path", + bool nofill=false) { + + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(alcc, buffer, drawing_functor, alcc, &paths, amark, nofill); + draw_buffer(buffer); +} + + +template +void draw(const Mesh& alcc, + std::initializer_list> l, + typename Get_map::type::size_type amark= + (std::numeric_limits::type::size_type>::max)(), + const char* title="Mesh Viewer With Path", + bool nofill=false) +{ + std::vector> paths=l; + + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(alcc, buffer, alcc, &paths, amark, nofill); + draw_buffer(buffer); +} +/* template void draw(const Mesh& alcc, const std::vector >& paths, @@ -447,6 +472,7 @@ void draw(const Mesh& alcc, std::vector > paths=l; draw(alcc, paths, title, amark, nofill); } +*/ } // End namespace CGAL From 9033e598ca81cf1f8973b4f3294d1b955478d031 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 7 Oct 2022 20:45:01 +0200 Subject: [PATCH 080/341] correct some errors --- .../Surface_mesh_topology/draw_facewidth.h | 2 +- .../include/CGAL/draw_face_graph_with_paths.h | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index c23906f10b32..d08955e2622b 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -8,7 +8,7 @@ #include template -struct Facewidth_draw_functor : public CGAL::DefaultDrawingFunctorLCC +struct Facewidth_draw_functor //: public CGAL::DefaultDrawingFunctorLCC { Facewidth_draw_functor(typename ALCC::size_type amark1, typename ALCC::size_type amark2) : m_vertex_mark(amark1), m_face_mark(amark2) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 0e7a06bc8d22..e448968ec622 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -32,15 +32,13 @@ namespace CGAL { -namespace draw_function_for_face_graph_with_paths + +namespace draw_function_for_lcc { - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; -typedef Local_kernel::Point_3 Local_point; -typedef Local_kernel::Vector_3 Local_vector; - -template -struct LCC_geom_utils; + // We need to re-use the namespace draw_function_for_lcc because we want to specialize + // the previous struct LCC_geom_utils +// template +// struct LCC_geom_utils; // Specialisation for face graph; otherwise use the LCC_geom_utils of LCC. template @@ -88,17 +86,26 @@ struct LCC_geom_utils, Local_kernel, 3> ++nb; } - if ( nb<2 ) return internal::Geom_utils + if ( nb<2 ) return draw_function_for_lcc::LCC_geom_utils ::Kernel, Local_kernel>:: get_local_vector(normal); - return internal::Geom_utils + return draw_function_for_lcc::LCC_geom_utils ::Kernel, Local_kernel>:: get_local_vector(typename Get_traits::Kernel:: Construct_scaled_vector_3()(normal, 1.0/nb)); } }; +} // namespace draw_function_for_lcc + +namespace draw_function_for_face_graph_with_paths +{ + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; +typedef Local_kernel::Point_3 Local_point; +typedef Local_kernel::Vector_3 Local_vector; + // Destructor. // lcc.free_mark(m_oriented_mark); @@ -148,7 +155,7 @@ void compute_face(typename Get_map::type::Dart_const_handle dh, do { graphic_buffer.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(cur, mesh), - LCC_geom_utils:: + draw_function_for_lcc::LCC_geom_utils:: get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } @@ -365,9 +372,9 @@ void add_in_graphic_buffer(const Mesh &mesh, // Default functor; user can add his own functor. Drawing_functor + typename CGAL::Face_graph_wrapper::Dart_const_handle /*vh*/, + typename CGAL::Face_graph_wrapper::Dart_const_handle /*eh*/, + typename CGAL::Face_graph_wrapper::Dart_const_handle /*fh*/> drawing_functor; add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, lcc, m_paths, amark, m_nofaces); From 7e1e6d52668d05ae54a2cde3ae871154b8f19b86 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 8 Oct 2022 12:33:24 +0200 Subject: [PATCH 081/341] Added custom drawing functor for Voronoi diagram. --- .../include/CGAL/draw_voronoi_diagram_2.h | 117 +++++++++++++----- 1 file changed, 83 insertions(+), 34 deletions(-) diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index a16714badaf2..638eed475281 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -34,25 +34,73 @@ namespace CGAL { namespace draw_function_for_v2 { +template +struct Drawing_functor_voronoi : + public CGAL::Drawing_functor +{ + Drawing_functor_voronoi() : m_draw_rays(true), + m_draw_voronoi_vertices(true), + m_draw_dual_vertices(true), + m_nofaces(false) + { + + draw_voronoi_vertices=[](const DS &, vertex_handle)->bool { return true; }; + draw_dual_vertices=[](const DS &, vertex_handle)->bool { return true; }; + draw_rays=[](const DS &, vertex_handle)->bool { return true; }; + + } + + std::function draw_voronoi_vertices; + std::function draw_dual_vertices; + std::function draw_rays; + + + void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } + void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } + bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } + + void disable_dual_vertices() { m_draw_dual_vertices=false; } + void enable_dual_vertices() { m_draw_dual_vertices=true; } + bool are_dual_vertices_enabled() const { return m_draw_dual_vertices; } + + void disable_rays() { m_draw_rays=false; } + void enable_rays() { m_draw_rays=true; } + bool are_rays_enabled() const { return m_draw_rays; } + + + void disable_nofaces() { m_nofaces=false; } + void enable_nofaces() { m_nofaces=true; } + bool are_nofaces_enabled() const { return m_nofaces; } + +protected: + bool m_draw_rays; + bool m_draw_voronoi_vertices; + bool m_draw_dual_vertices; + bool m_nofaces; +}; + typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; template -void compute_vertex(typename V2::Vertex_iterator vh, CGAL::Graphic_buffer &graphic_buffer) { - +void compute_vertex(typename V2::Vertex_iterator vh, + CGAL::Graphic_buffer &graphic_buffer) { graphic_buffer.add_point(vh->point()); - } template -void compute_dual_vertex(typename V2::Delaunay_graph::Finite_vertices_iterator vi, CGAL::Graphic_buffer &graphic_buffer) -{ +void compute_dual_vertex(typename V2::Delaunay_graph::Finite_vertices_iterator vi, + CGAL::Graphic_buffer &graphic_buffer) { graphic_buffer.add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); } template -void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, CGAL::Graphic_buffer &graphic_buffer) +void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, + CGAL::Graphic_buffer &graphic_buffer) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -103,7 +151,8 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, CGAL: } template -Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, const CGAL::Bbox_3 & m_bounding_box) +Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, + const CGAL::Bbox_3 & m_bounding_box) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -166,7 +215,8 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, const C // Halfedge_const_handle template -void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, CGAL::Graphic_buffer &graphic_buffer) +void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, + CGAL::Graphic_buffer &graphic_buffer) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -189,7 +239,10 @@ void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, CGAL::Graphic } template -void compute_face(typename V2::Face_iterator fh, const V2& v2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) +void compute_face(typename V2::Face_iterator fh, + const V2& v2, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { typedef typename V2::Ccb_halfedge_circulator Ccb_halfedge_circulator; @@ -224,12 +277,12 @@ void compute_face(typename V2::Face_iterator fh, const V2& v2, CGAL::Graphic_buf template void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor , bool m_nofaces = false, bool m_draw_voronoi_vertices = true, bool m_draw_dual_vertices = true) + const DrawingFunctor &m_drawing_functor) { typedef typename V2::Delaunay_graph::Finite_vertices_iterator Dual_vertices_iterator; // Draw the voronoi vertices - if (m_draw_voronoi_vertices) { + if (m_drawing_functor.are_voronoi_vertices_enabled()) { for (typename V2::Vertex_iterator it = v2.vertices_begin(); it != v2.vertices_end(); ++it) { compute_vertex(it, graphic_buffer); @@ -237,7 +290,7 @@ void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_bu } // Draw the dual vertices - if (m_draw_dual_vertices) { + if (m_drawing_functor.are_dual_vertices_enabled()) { for (Dual_vertices_iterator it = v2.dual().finite_vertices_begin(); it != v2.dual().finite_vertices_end(); ++it) { compute_dual_vertex(it, graphic_buffer); @@ -250,12 +303,14 @@ void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_bu add_segments_and_update_bounding_box(it, graphic_buffer); } - for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) { - compute_rays_and_bisectors(it, graphic_buffer); + if(m_drawing_functor.are_rays_enabled()) { + for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); + it != v2.halfedges_end(); ++it) { + compute_rays_and_bisectors(it, graphic_buffer); + } } - if (!m_nofaces) { + if (!m_drawing_functor.are_nofaces_enabled()) { for (typename V2::Face_iterator it = v2.faces_begin(); it != v2.faces_end(); ++it) { compute_face(it, v2, graphic_buffer, m_drawing_functor); @@ -267,9 +322,9 @@ void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_bu template void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor, bool m_nofaces = false, - bool m_draw_voronoi_vertices = true, bool m_draw_dual_vertices = true ) { - draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor, m_nofaces, m_draw_voronoi_vertices, m_draw_dual_vertices); + const DrawingFunctor &m_drawing_functor) +{ + draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor); } template @@ -278,10 +333,10 @@ void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graph bool m_draw_dual_vertices = true ) { // Default functor; user can add his own functor. - Drawing_functor - drawing_functor; + CGAL::draw_function_for_v2::Drawing_functor_voronoi + drawing_functor; drawing_functor.colored_face = [](const V2&, typename V2::Face_iterator fh) -> bool @@ -294,7 +349,7 @@ void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graph return CGAL::IO::Color(73, 250, 117); }; - add_in_graphic_buffer(v2, graphic_buffer, drawing_functor, m_nofaces, m_draw_voronoi_vertices, m_draw_dual_vertices); + add_in_graphic_buffer(v2, graphic_buffer, drawing_functor); } // Specialization of draw function. @@ -304,13 +359,10 @@ template void draw(const CGAL_VORONOI_TYPE &av2, - const DrawingFunctor &drawing_functor, - bool nofill = false, - bool draw_voronoi_vertices = true, - bool draw_dual_vertices = true) + const DrawingFunctor &drawing_functor) { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(av2, buffer, drawing_functor, nofill, draw_voronoi_vertices, draw_dual_vertices); + add_in_graphic_buffer(av2, buffer, drawing_functor); draw_buffer(buffer); } @@ -318,13 +370,10 @@ template void draw(const CGAL_VORONOI_TYPE &av2, - const char *title="2D Voronoi Diagram Basic Viewer", - bool nofill = false, - bool draw_voronoi_vertices = true, - bool draw_dual_vertices = true) + const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(av2, buffer, nofill, draw_voronoi_vertices, draw_dual_vertices); + add_in_graphic_buffer(av2, buffer); draw_buffer(buffer); } From 0e2586f83dbc14fa11fcf9f27defb0640af79cbe Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 8 Oct 2022 12:34:46 +0200 Subject: [PATCH 082/341] Added template arg. --- GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 728d1ed7bc1b..205f08149d00 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -1740,7 +1740,7 @@ void draw_buffer(Graphic_buffer &graphic_buffer) { const char *argv[2] = {"lccviewer", nullptr}; QApplication app(argc, const_cast(argv)); - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); basic_viewer.show(); app.exec(); From a00f1c490ec7deb1b08940c12b2351b1a53f647e Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sat, 8 Oct 2022 14:58:27 +0200 Subject: [PATCH 083/341] Migrated to new viewer APIs version, SM small faces. --- .../draw_surface_mesh_small_faces.h | 397 ++++++++---------- 1 file changed, 186 insertions(+), 211 deletions(-) diff --git a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h index b8eeac5b008e..079b96fa8331 100644 --- a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h +++ b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h @@ -8,10 +8,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H #define CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H +#include +#include #include #include @@ -22,266 +25,238 @@ #include -template -class SimpleSurfaceMeshWithSmallFacesViewerQt : public CGAL::Basic_viewer_qt +namespace draw_function_for_surface_mesh { - typedef CGAL::Basic_viewer_qt Base; +template +typename CGAL::Kernel_traits::Kernel::Vector_3 get_face_normal(typename SM::Halfedge_index he, + const SM &sm) +{ + typedef typename SM::Halfedge_index halfedge_descriptor; typedef typename SM::Point Point; typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Vertex_index vertex_descriptor; - typedef typename SM::Face_index face_descriptor; - typedef typename SM::Edge_index edge_descriptor; - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename Kernel::FT FT; -public: - /// Construct the viewer. - /// @param amesh the surface mesh to view - SimpleSurfaceMeshWithSmallFacesViewerQt(QWidget* parent, - SM& amesh) : - // First draw: no vertex; no edge, faces; multi-color; inverse normal - Base(parent, "Surface mesh viewer with small faces", false, false, true, false, false), - sm(amesh), - m_threshold(85), - m_draw_small_faces(true), - m_draw_big_faces(true) + typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; + + halfedge_descriptor end=he; + unsigned int nb=0; + do { - // Add custom key description (see keyPressEvent). - setKeyDescription(Qt::Key_I, "Increment threshold for small faces"); - setKeyDescription(Qt::Key_D, "Decrement threshold for small faces"); - setKeyDescription(Qt::Key_S, "Draw small faces only , big faces only, both"); + CGAL::internal::newell_single_step_3(sm.point(sm.source(he)), + sm.point(sm.target(he)), normal); + ++nb; + he=sm.next(he); + } + while (he!=end); + assert(nb>0); + return (typename Kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); +} + +template +typename CGAL::Kernel_traits::Kernel::Vector_3 get_vertex_normal(typename SM::Halfedge_index he, + const SM &sm) +{ + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + typedef typename SM::Halfedge_index halfedge_descriptor; - if (sm.faces().begin()!=sm.faces().end()) + typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; + + halfedge_descriptor end=he; + do + { + if (!sm.is_border(he)) { - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - m_min_size=faces_size[*(sm.faces().begin())]; - m_max_size=m_min_size; - FT cur_size; - - for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) - { - cur_size=faces_size[*f]; - if (cur_sizem_max_size) m_max_size=cur_size; - } + typename Kernel::Vector_3 n=get_face_normal(he, sm); + normal=typename Kernel::Construct_sum_of_vectors_3()(normal, n); } - - compute_elements(); + he=sm.next(sm.opposite(he)); } + while (he!=end); -protected: - void compute_face(face_descriptor fh) - { - // [Face creation] - bool issmall=false; + if (!typename Kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) + { normal=(typename Kernel::Construct_scaled_vector_3() + (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } - // Default color of faces - CGAL::IO::Color c(75,160,255); + return normal; +} - // Compare the size of the face with the % m_threshold - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); +template +void compute_face(typename SM::Face_index fh, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer, + typename CGAL::Kernel_traits::Kernel::FT & m_min_size, + typename CGAL::Kernel_traits::Kernel::FT & m_max_size) +{ - // It it is smaller, color the face in red. - if (get(faces_size, fh)::Kernel Kernel; + typedef typename SM::Face_index face_descriptor; + typedef typename SM::Halfedge_index halfedge_descriptor; + typedef typename Kernel::FT FT; - if ((issmall && !m_draw_small_faces) || (!issmall && !m_draw_big_faces)) - { return; } + // TODO: add custom functor, right? + bool m_draw_small_faces = true; + bool m_draw_big_faces = true; - // Add the color of the face, then all its points. - face_begin(c); - halfedge_descriptor hd=sm.halfedge(fh); - do - { - add_point_in_face(sm.point(sm.source(hd)), get_vertex_normal(hd)); - hd=sm.next(hd); - } - while(hd!=sm.halfedge(fh)); - face_end(); - /// [Face creation] - } + unsigned int m_threshold = 85; + + // [Face creation] + bool issmall=false; - // Copy from draw_surface_mesh.h - void compute_edge(edge_descriptor e) + // Default color of faces + CGAL::IO::Color c(75,160,255); + + // Compare the size of the face with the % m_threshold + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); + + // It it is smaller, color the face in red. + if (get(faces_size, fh) +void compute_edge(typename SM::Edge_index e, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer) +{ + /// [Edge creation] + graphic_buffer.add_segment(sm.point(sm.source(sm.halfedge(e))), + sm.point(sm.target(sm.halfedge(e)))); + /// [Edge creation] +} - for (typename SM::Face_range::iterator f=sm.faces().begin(); - f!=sm.faces().end(); ++f) - { - if (*f!=boost::graph_traits::null_face()) - { compute_face(*f); } - } +template +void compute_vertex(typename SM::Vertex_index vh, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer) +{ + /// [Vertex creation] + graphic_buffer.add_point(sm.point(vh)); + /// [Vertex creation] +} + +template +void compute_elements(const SM &sm, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ - for (typename SM::Edge_range::iterator e=sm.edges().begin(); - e!=sm.edges().end(); ++e) - { compute_edge(*e); } + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + typedef typename SM::Vertex_index vertex_descriptor; + typedef typename SM::Face_index face_descriptor; + typedef typename SM::Edge_index edge_descriptor; + typedef typename SM::Halfedge_index halfedge_descriptor; + typedef typename Kernel::FT FT; - for (typename SM::Vertex_range::iterator v=sm.vertices().begin(); - v!=sm.vertices().end(); ++v) - { compute_vertex(*v); } - } + FT m_min_size, m_max_size; - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - virtual void keyPressEvent(QKeyEvent *e) + if (sm.faces().begin()!=sm.faces().end()) { - /// [Keypress] - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key()==Qt::Key_I) && (modifiers==Qt::NoButton)) - { - if (m_threshold<100) { ++m_threshold; } - displayMessage(QString("Threshold percent=%1%.").arg(m_threshold)); - compute_elements(); - redraw(); - } - else if ((e->key()==Qt::Key_D) && (modifiers==Qt::NoButton)) - { - if (m_threshold>0) { --m_threshold; } - displayMessage(QString("Threshold percent=%1%.").arg(m_threshold)); - compute_elements(); - redraw(); - } - else if ((e->key()==Qt::Key_S) && (modifiers==Qt::NoButton)) - { - QString msg; - if (m_draw_small_faces) - { - if (m_draw_big_faces) - { - m_draw_big_faces=false; - msg=QString("Draw small faces only."); - } - else - { - m_draw_big_faces=true; m_draw_small_faces=false; - msg=QString("Draw big faces only."); - } - } - else - { - assert(m_draw_big_faces); - m_draw_small_faces=true; - msg=QString("Draw small and big faces."); - } - - displayMessage(msg); - compute_elements(); - redraw(); - } - else + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); + + m_min_size=faces_size[*(sm.faces().begin())]; + m_max_size=m_min_size; + FT cur_size; + + for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) { - // Call the base method to process others/classicals key - Base::keyPressEvent(e); + cur_size=faces_size[*f]; + if (cur_sizem_max_size) m_max_size=cur_size; } - /// [Keypress] } -protected: - typename Kernel::Vector_3 get_face_normal(halfedge_descriptor he) + for (typename SM::Face_range::iterator f=sm.faces().begin(); + f!=sm.faces().end(); ++f) { - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - halfedge_descriptor end=he; - unsigned int nb=0; - do - { - CGAL::internal::newell_single_step_3(sm.point(sm.source(he)), - sm.point(sm.target(he)), normal); - ++nb; - he=sm.next(he); - } - while (he!=end); - assert(nb>0); - return (typename Kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); + if (*f!=boost::graph_traits::null_face()) + { compute_face(*f, sm, graphic_buffer, m_min_size, m_max_size); } } - typename Kernel::Vector_3 get_vertex_normal(halfedge_descriptor he) - { - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - halfedge_descriptor end=he; - do - { - if (!sm.is_border(he)) - { - typename Kernel::Vector_3 n=get_face_normal(he); - normal=typename Kernel::Construct_sum_of_vectors_3()(normal, n); - } - he=sm.next(sm.opposite(he)); - } - while (he!=end); + for (typename SM::Edge_range::iterator e=sm.edges().begin(); + e!=sm.edges().end(); ++e) + { compute_edge(*e, sm, graphic_buffer); } - if (!typename Kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) - { normal=(typename Kernel::Construct_scaled_vector_3() - (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } + for (typename SM::Vertex_range::iterator v=sm.vertices().begin(); + v!=sm.vertices().end(); ++v) + { compute_vertex(*v, sm, graphic_buffer); } +} - return normal; - } +} // draw_function_for_surface_mesh -protected: - SM& sm; - unsigned int m_threshold; - FT m_min_size, m_max_size; - bool m_draw_small_faces; - bool m_draw_big_faces; -}; +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { + draw_function_for_surface_mesh::compute_elements(sm, graphic_buffer, m_drawing_functor); +} -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh) +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { + + CGAL::Drawing_functor drawing_functor; + + add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); +} + +template +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh, + const DrawingFunctor &drawing_functor) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer, drawing_functor); + draw_buffer(buffer); +} - if (!cgal_test_suite) - { - int argc=1; - const char* argv[2]={"surface_mesh_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimpleSurfaceMeshWithSmallFacesViewerQt> - mainwindow(app.activeWindow(), amesh); - mainwindow.show(); - app.exec(); - } +template +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer); + draw_buffer(buffer); } #else // CGAL_USE_BASIC_VIEWER -template +template void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&) { std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&, const DrawingFunctor &drawing_functor) +{ + std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Sun, 9 Oct 2022 01:49:45 +0200 Subject: [PATCH 084/341] Initial commit to adding custom KeyPressEvent. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 41 ++++++++++++- .../include/CGAL/draw_voronoi_diagram_2.h | 58 ++++++++++++++++++- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 205f08149d00..d4a4550d04b1 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -1357,8 +1357,14 @@ class Basic_viewer_qt : public CGAL::QGLViewer virtual void keyPressEvent(QKeyEvent *e) { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if(_onPress) { + _onPress(e, this); + } +else { + if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) { if (!isOpenGL_4_3()) return; @@ -1573,6 +1579,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer } else CGAL::QGLViewer::keyPressEvent(e); +} } virtual QString helpString() const @@ -1609,7 +1616,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer text += "Press Escape to exit the viewer."; return text; } - +public: + // std::function _onPress; + std::function *)> _onPress; protected: Graphic_buffer& gBuffer; @@ -1747,6 +1756,36 @@ void draw_buffer(Graphic_buffer &graphic_buffer) { } } + +template +void draw_buffer(Graphic_buffer &graphic_buffer,const std::function *)>& onPress) { + +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite = true; +#else + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (!cgal_test_suite) { + CGAL::Qt::init_ogl_context(4, 3); + // Qt::init_ogl_context(4, 3); + + int argc = 1; + const char *argv[2] = {"lccviewer", nullptr}; + QApplication app(argc, const_cast(argv)); + + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); + + basic_viewer._onPress = onPress; + + basic_viewer.show(); + app.exec(); + } +} + + + + } // End namespace CGAL #else // CGAL_USE_BASIC_VIEWER diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 638eed475281..4d79dc8362d7 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -352,6 +352,58 @@ void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graph add_in_graphic_buffer(v2, graphic_buffer, drawing_functor); } +// TODO: I'll add a description after idea verification +// Add custom key description (see keyPressEvent) +// setKeyDescription(::Qt::Key_R, "Toggles rays display"); +// setKeyDescription(::Qt::Key_D, "Toggles dual vertices display"); +// setKeyDescription(::Qt::Key_V, "Toggles voronoi vertices display"); + + +// TODO: Expected solution, I need to add reference to drawing_functor, OR, pass m_draw_rays, m_draw_voronoi_vertices, m_draw_dual_vertices +std::function *)> VoronoiKeyPressEvent = [] (QKeyEvent *e, CGAL::Basic_viewer_qt *_this) +{ + /// [Keypress] + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { + // m_draw_rays = !m_draw_rays; + std::cout << "R Pressed\n"; + + _this->displayMessage( + QString("Draw rays=%1."));//.arg(m_draw_rays ? "true" : "false")); + // _this.update(); + } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::NoButton)) { + + std::cout << "V Pressed\n"; + + // m_draw_voronoi_vertices = !m_draw_voronoi_vertices; + + _this->displayMessage( + QString("Voronoi vertices=%1."));//.arg(m_draw_voronoi_vertices? "true" : "false")); + + // TODO: What are the expected args? I think I need a kind of function wrapper to wrap drawing_functor, mesh, and buffer. + // draw_function_for_v2::compute_elements(); + + // _this->redraw(); + } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { + + std::cout << "D Pressed\n"; + + // m_draw_dual_vertices = !m_draw_dual_vertices; + + _this->displayMessage(QString("Dual vertices=%1.")); + //.arg(m_draw_dual_vertices ? "true" : "false")); + + // TODO: What are the expected args? I think I need a kind of function wrapper to wrap drawing_functor, mesh, and buffer. + // draw_function_for_v2::compute_elements(); + + // _this->redraw(); + } else { + // Call the base method to process others/classicals key + // Base::keyPressEvent(e); + } + /// [Keypress] +}; + // Specialization of draw function. #define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 @@ -374,7 +426,11 @@ void draw(const CGAL_VORONOI_TYPE &av2, { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(av2, buffer); - draw_buffer(buffer); + // draw_buffer(buffer); + + // Test + draw_buffer(buffer, VoronoiKeyPressEvent); + } } // End namespace CGAL From 56eeaa1134c80965935f0e40a7678ed078767d41 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 10 Oct 2022 16:42:29 +0200 Subject: [PATCH 085/341] error correction --- .../include/CGAL/draw_face_graph_with_paths.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index e448968ec622..925755f2d658 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -372,9 +372,9 @@ void add_in_graphic_buffer(const Mesh &mesh, // Default functor; user can add his own functor. Drawing_functor::Dart_const_handle /*vh*/, - typename CGAL::Face_graph_wrapper::Dart_const_handle /*eh*/, - typename CGAL::Face_graph_wrapper::Dart_const_handle /*fh*/> + typename Get_map::type::Dart_const_handle /*vh*/, + typename Get_map::type::Dart_const_handle /*eh*/, + typename Get_map::type::Dart_const_handle /*fh*/> drawing_functor; add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, lcc, m_paths, amark, m_nofaces); From f1274c637ca915541230e549dd002b400b788a79 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Tue, 11 Oct 2022 18:28:46 +0200 Subject: [PATCH 086/341] Solved custom KeyPressEvent callback. --- .../include/CGAL/Qt/Basic_viewer_qt.h | 17 ++- .../include/CGAL/draw_voronoi_diagram_2.h | 132 ++++++++++++------ 2 files changed, 96 insertions(+), 53 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index d4a4550d04b1..2eb5e9b62dd2 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -378,6 +378,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer return gBuffer.add_point_in_face(kp, p_normal); } + Graphic_buffer& get_graphic_buffer() { + return gBuffer; + } + void face_end() { if (gBuffer.get_buffer_for_mono_faces().is_a_face_started()) @@ -1361,9 +1365,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if(_onPress) { - _onPress(e, this); - } -else { + bool is_pressed = _onPress(e, this); + if(!is_pressed) { if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) { @@ -1579,9 +1582,9 @@ else { } else CGAL::QGLViewer::keyPressEvent(e); -} } - + } + } virtual QString helpString() const { return helpString("CGAL Basic Viewer"); } @@ -1618,7 +1621,7 @@ else { } public: // std::function _onPress; - std::function *)> _onPress; + std::function *)> _onPress; protected: Graphic_buffer& gBuffer; @@ -1758,7 +1761,7 @@ void draw_buffer(Graphic_buffer &graphic_buffer) { template -void draw_buffer(Graphic_buffer &graphic_buffer,const std::function *)>& onPress) { +void draw_buffer(Graphic_buffer &graphic_buffer,const std::function *)>& onPress) { #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 4d79dc8362d7..640a75b86c3e 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -359,50 +359,7 @@ void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graph // setKeyDescription(::Qt::Key_V, "Toggles voronoi vertices display"); -// TODO: Expected solution, I need to add reference to drawing_functor, OR, pass m_draw_rays, m_draw_voronoi_vertices, m_draw_dual_vertices -std::function *)> VoronoiKeyPressEvent = [] (QKeyEvent *e, CGAL::Basic_viewer_qt *_this) -{ - /// [Keypress] - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { - // m_draw_rays = !m_draw_rays; - std::cout << "R Pressed\n"; - - _this->displayMessage( - QString("Draw rays=%1."));//.arg(m_draw_rays ? "true" : "false")); - // _this.update(); - } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::NoButton)) { - - std::cout << "V Pressed\n"; - - // m_draw_voronoi_vertices = !m_draw_voronoi_vertices; - - _this->displayMessage( - QString("Voronoi vertices=%1."));//.arg(m_draw_voronoi_vertices? "true" : "false")); - - // TODO: What are the expected args? I think I need a kind of function wrapper to wrap drawing_functor, mesh, and buffer. - // draw_function_for_v2::compute_elements(); - // _this->redraw(); - } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - - std::cout << "D Pressed\n"; - - // m_draw_dual_vertices = !m_draw_dual_vertices; - - _this->displayMessage(QString("Dual vertices=%1.")); - //.arg(m_draw_dual_vertices ? "true" : "false")); - - // TODO: What are the expected args? I think I need a kind of function wrapper to wrap drawing_functor, mesh, and buffer. - // draw_function_for_v2::compute_elements(); - - // _this->redraw(); - } else { - // Call the base method to process others/classicals key - // Base::keyPressEvent(e); - } - /// [Keypress] -}; // Specialization of draw function. #define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 @@ -425,10 +382,93 @@ void draw(const CGAL_VORONOI_TYPE &av2, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(av2, buffer); - // draw_buffer(buffer); - // Test + CGAL::draw_function_for_v2::Drawing_functor_voronoi + drawing_functor; + + drawing_functor.colored_face = [](const CGAL_VORONOI_TYPE&, + typename CGAL_VORONOI_TYPE::Face_iterator fh) -> bool + { return true; }; + + + drawing_functor.face_color = [] (const CGAL_VORONOI_TYPE& alcc, + typename CGAL_VORONOI_TYPE::Face_iterator fh) -> CGAL::IO::Color + { + return CGAL::IO::Color(73, 250, 117); + }; + + add_in_graphic_buffer(av2, buffer, drawing_functor); + + std::function *)> VoronoiKeyPressEvent = + [&av2, &drawing_functor] (QKeyEvent *e, CGAL::Basic_viewer_qt *_this) -> bool + { + /// [Keypress] + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { + + // This is like m_draw_rays = !m_draw_rays; + if(drawing_functor.are_rays_enabled()) + { + drawing_functor.disable_rays(); + } + else { + drawing_functor.enable_rays(); + } + + std::cout << "R Pressed\n"; + + _this->displayMessage( + QString("Draw rays=%1.").arg(drawing_functor.are_rays_enabled() ? "true" : "false")); + _this->update(); + + } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::NoButton)) { + + std::cout << "V Pressed\n"; + + // This is like m_draw_voronoi_vertices = !m_draw_voronoi_vertices; + if(drawing_functor.are_voronoi_vertices_enabled()) + { + drawing_functor.disable_voronoi_vertices(); + } + else { + drawing_functor.enable_voronoi_vertices(); + } + + _this->displayMessage( + QString("Voronoi vertices=%1.").arg(drawing_functor.are_voronoi_vertices_enabled()? "true" : "false")); + + draw_function_for_v2::compute_elements(av2, _this->get_graphic_buffer(), drawing_functor); + + _this->redraw(); + } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { + + std::cout << "D Pressed\n"; + + // m_draw_dual_vertices = !m_draw_dual_vertices; + if(drawing_functor.are_dual_vertices_enabled()) + { + drawing_functor.disable_dual_vertices(); + } + else { + drawing_functor.enable_dual_vertices(); + } + + _this->displayMessage(QString("Dual vertices=%1.") + .arg(drawing_functor.are_dual_vertices_enabled() ? "true" : "false")); + + draw_function_for_v2::compute_elements(av2, _this->get_graphic_buffer(), drawing_functor); + + _this->redraw(); + } else { + // Return false will call the base method to process others/classicals key + return false; + } + /// [Keypress] + return true; + }; draw_buffer(buffer, VoronoiKeyPressEvent); } From c4a48f5094836b11249fd07e3f9bfb01ca59c990 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 12 Oct 2022 22:07:29 +0200 Subject: [PATCH 087/341] Correction of compilation error for draw_face_graph_with_paths --- .../examples/Surface_mesh_topology/draw_facewidth.h | 2 +- .../include/CGAL/draw_face_graph_with_paths.h | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index d08955e2622b..dd9d2ad0fcbc 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -5,7 +5,7 @@ #ifdef CGAL_USE_BASIC_VIEWER -#include +#include template struct Facewidth_draw_functor //: public CGAL::DefaultDrawingFunctorLCC diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 925755f2d658..864a33e89a55 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -86,11 +86,11 @@ struct LCC_geom_utils, Local_kernel, 3> ++nb; } - if ( nb<2 ) return draw_function_for_lcc::LCC_geom_utils + if ( nb<2 ) return internal::Geom_utils ::Kernel, Local_kernel>:: get_local_vector(normal); - return draw_function_for_lcc::LCC_geom_utils + return internal::Geom_utils ::Kernel, Local_kernel>:: get_local_vector(typename Get_traits::Kernel:: Construct_scaled_vector_3()(normal, 1.0/nb)); @@ -119,7 +119,6 @@ const typename CGAL::Get_traits::Point& get_point(typename Get_map::Vector Vector; return CGAL::Get_traits::get_point(mesh, dh); - } template @@ -259,7 +258,6 @@ template void compute_elements(const Mesh &mesh, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor, - // TODO: I think I need to use smart pointers with lcc, right? const typename Get_map::storage_type& lcc, const std::vector>* m_paths, typename Get_map::type::size_type amark /*= typename Get_map::type::INVALID_MARK*/, @@ -411,7 +409,7 @@ void draw(const Mesh& alcc, template -void draw(const Mesh& alcc, +void draw(const Mesh& mesh, std::initializer_list> l, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), @@ -421,7 +419,8 @@ void draw(const Mesh& alcc, std::vector> paths=l; CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(alcc, buffer, alcc, &paths, amark, nofill); + typename Get_map::storage_type alcc(mesh); + add_in_graphic_buffer(mesh, buffer, alcc, &paths, amark, nofill); draw_buffer(buffer); } From 6e06646825d2f1b93e971e6af214a3673a73d4dd Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 13 Oct 2022 01:12:40 +0200 Subject: [PATCH 088/341] Modified custom functors, uses new APIs. --- .../Surface_mesh_topology/draw_facewidth.h | 45 ++++++++++++++++++- .../unsew_edgewidth_repeatedly.cpp | 44 +++++++++++++++++- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index dd9d2ad0fcbc..ca773a2fa7ff 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -6,9 +6,10 @@ #ifdef CGAL_USE_BASIC_VIEWER #include +#include template -struct Facewidth_draw_functor //: public CGAL::DefaultDrawingFunctorLCC +struct Facewidth_draw_functor { Facewidth_draw_functor(typename ALCC::size_type amark1, typename ALCC::size_type amark2) : m_vertex_mark(amark1), m_face_mark(amark2) @@ -47,6 +48,46 @@ struct Facewidth_draw_functor //: public CGAL::DefaultDrawingFunctorLCC typename LCC::Dart_const_handle /* dh */) const { return false; } + template + bool draw_volume (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool draw_face (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return true; } + + template + bool draw_edge (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return true; } + + template + bool volume_wireframe (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool face_wireframe (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool draw_vertex (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return true; } + + template + CGAL::IO::Color volume_color(const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const { + return CGAL::IO::Color(20, 10, 30); + } + + bool are_edges_enabled() const { return true; } + bool are_vertices_enabled() const { return true; } + bool are_faces_enabled() const { return true; } + typename ALCC::size_type m_vertex_mark, m_face_mark; }; @@ -68,7 +109,7 @@ void draw_facewidth(const LCC& lcc, } Facewidth_draw_functor df(vertex_mark, face_mark); - CGAL::draw(lcc, "Face width", false, df); + CGAL::draw(lcc, df, "Face width"); lcc.free_mark(vertex_mark); lcc.free_mark(face_mark); diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp index 5c18a4a0ec2a..e631d7e279b2 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp @@ -34,7 +34,7 @@ struct Weight_functor #ifdef CGAL_USE_BASIC_VIEWER -struct Draw_functor : public CGAL::DefaultDrawingFunctorLCC +struct Draw_functor { Draw_functor(LCC_3::size_type am1, LCC_3::size_type am2) : is_root(am1), belong_to_cycle(am2) @@ -71,6 +71,46 @@ struct Draw_functor : public CGAL::DefaultDrawingFunctorLCC bool colored_volume(const LCC& /* alcc */, typename LCC::Dart_const_handle /* dh */) const { return false; } + template + bool draw_volume (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool draw_face (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool draw_edge (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool volume_wireframe (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool face_wireframe (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + bool draw_vertex (const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const + { return false; } + + template + CGAL::IO::Color volume_color(const LCC& /* alcc */, + typename LCC::Dart_const_handle /* dh */) const { + return CGAL::IO::Color(10, 20, 20); + } + + bool are_edges_enabled() const { return true; } + bool are_vertices_enabled() const { return true; } + bool are_faces_enabled() const { return true; } + LCC_3::size_type is_root; LCC_3::size_type belong_to_cycle; }; @@ -159,7 +199,7 @@ int main(int argc, char* argv[]) if (draw) { Draw_functor df(is_root, belong_to_cycle); - CGAL::draw(lccoriginal, "Unsew edge width repeatdly", false, df); + CGAL::draw(lccoriginal, df, "Unsew edge width repeatdly"); } #endif // CGAL_USE_BASIC_VIEWER From 0cad38a50810407b7729c95c87af2c07fa01e951 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 13 Oct 2022 05:25:45 +0200 Subject: [PATCH 089/341] Doc initial commit. --- .../doc/CGAL_basic_viewers/CGAL_basic_viewers.txt | 13 +++++++++++++ .../doc/CGAL_basic_viewers/Doxyfile.in | 3 +++ .../doc/CGAL_basic_viewers/PackageDescription.txt | 0 .../doc/CGAL_basic_viewers/dependencies | 0 .../doc/CGAL_basic_viewers/examples.txt | 0 Documentation/doc/Documentation/packages.txt | 1 + 6 files changed, 17 insertions(+) create mode 100644 CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt create mode 100644 CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in create mode 100644 CGAL_basic_viewers/doc/CGAL_basic_viewers/PackageDescription.txt create mode 100644 CGAL_basic_viewers/doc/CGAL_basic_viewers/dependencies create mode 100644 CGAL_basic_viewers/doc/CGAL_basic_viewers/examples.txt diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt new file mode 100644 index 000000000000..3cf6e4188ae2 --- /dev/null +++ b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt @@ -0,0 +1,13 @@ +namespace CGAL { +/*! + +\mainpage User Manual +\anchor Chapter_CGAL_Basic_viewers +\anchor +\cgalAutoToc +\author Guillaume Damiand, Mostafa Ashraf + + +*/ + +} /* namespace CGAL */ \ No newline at end of file diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in b/CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in new file mode 100644 index 000000000000..78014f4c59e4 --- /dev/null +++ b/CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in @@ -0,0 +1,3 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - CGAL and Basic Viewers" diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/PackageDescription.txt b/CGAL_basic_viewers/doc/CGAL_basic_viewers/PackageDescription.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/dependencies b/CGAL_basic_viewers/doc/CGAL_basic_viewers/dependencies new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/examples.txt b/CGAL_basic_viewers/doc/CGAL_basic_viewers/examples.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Documentation/doc/Documentation/packages.txt b/Documentation/doc/Documentation/packages.txt index ae1d9c9ab0ba..e871abca7e98 100644 --- a/Documentation/doc/Documentation/packages.txt +++ b/Documentation/doc/Documentation/packages.txt @@ -166,5 +166,6 @@ \package_listing{GraphicsView} \package_listing{CGAL_ipelets} +\package_listing{CGAL_basic_viewers} */ From 61a3711c19e490401b96df14eba32985dd195999 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 13 Oct 2022 08:48:11 +0200 Subject: [PATCH 090/341] Review and indent. --- GraphicsView/include/CGAL/Graphic_buffer.h | 210 ++++++++++----------- 1 file changed, 104 insertions(+), 106 deletions(-) diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index 538898df76e2..33ab61b80b86 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -7,7 +7,8 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s): Mostafa Ashraf +// Author(s): Guillaume Damiand +// Mostafa Ashraf #ifndef CGAL_GRAPHIC_BUFFER_H #define CGAL_GRAPHIC_BUFFER_H @@ -40,8 +41,8 @@ namespace CGAL { // This class is responsible for dealing with available CGAL data structures and // handling buffers. template -class Graphic_buffer { - +class Graphic_buffer +{ public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; @@ -70,7 +71,8 @@ class Graphic_buffer { m_buffer_for_colored_faces(&pos[POS_COLORED_FACES], nullptr, &bbox, &pos[COLOR_FACES], &pos[FLAT_NORMAL_COLORED_FACES], - &pos[SMOOTH_NORMAL_COLORED_FACES]) {} + &pos[SMOOTH_NORMAL_COLORED_FACES]) + {} Graphic_buffer() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, @@ -99,61 +101,50 @@ class Graphic_buffer { m_buffer_for_colored_faces(&arrays[POS_COLORED_FACES], nullptr, &m_bounding_box, &arrays[COLOR_FACES], &arrays[FLAT_NORMAL_COLORED_FACES], - &arrays[SMOOTH_NORMAL_COLORED_FACES]) {} + &arrays[SMOOTH_NORMAL_COLORED_FACES]) + {} - const Buffer_for_vao &get_buffer_for_mono_points() const { - return m_buffer_for_mono_points; - } + const Buffer_for_vao &get_buffer_for_mono_points() const + { return m_buffer_for_mono_points; } - const Buffer_for_vao &get_buffer_for_colored_points() const { - return m_buffer_for_colored_points; - } + const Buffer_for_vao &get_buffer_for_colored_points() const + { return m_buffer_for_colored_points; } - const Buffer_for_vao &get_buffer_for_mono_segments() const { - return m_buffer_for_mono_segments; - } + const Buffer_for_vao &get_buffer_for_mono_segments() const + { return m_buffer_for_mono_segments; } - const Buffer_for_vao &get_buffer_for_colored_segments() const { - return m_buffer_for_colored_segments; - } + const Buffer_for_vao &get_buffer_for_colored_segments() const + { return m_buffer_for_colored_segments; } - const Buffer_for_vao &get_buffer_for_mono_rays() const { - return m_buffer_for_mono_rays; - } + const Buffer_for_vao &get_buffer_for_mono_rays() const + { return m_buffer_for_mono_rays; } - const Buffer_for_vao &get_buffer_for_colored_rays() const { - return m_buffer_for_colored_rays; - } + const Buffer_for_vao &get_buffer_for_colored_rays() const + { return m_buffer_for_colored_rays; } - const Buffer_for_vao &get_buffer_for_mono_lines() const { - return m_buffer_for_mono_lines; - } + const Buffer_for_vao &get_buffer_for_mono_lines() const + { return m_buffer_for_mono_lines; } - const Buffer_for_vao &get_buffer_for_colored_lines() const { - return m_buffer_for_colored_lines; - } + const Buffer_for_vao &get_buffer_for_colored_lines() const + { return m_buffer_for_colored_lines; } - const Buffer_for_vao &get_buffer_for_mono_faces() const { - return m_buffer_for_mono_faces; - } + const Buffer_for_vao &get_buffer_for_mono_faces() const + { return m_buffer_for_mono_faces; } - const Buffer_for_vao &get_buffer_for_colored_faces() const { - return m_buffer_for_colored_faces; - } + const Buffer_for_vao &get_buffer_for_colored_faces() const + { return m_buffer_for_colored_faces; } - const Buffer_for_vao &get_buffer_for_clipping_plane() const { - return m_buffer_for_clipping_plane; - } + const Buffer_for_vao &get_buffer_for_clipping_plane() const + { return m_buffer_for_clipping_plane; } const CGAL::Bbox_3 &get_bounding_box() const { return m_bounding_box; } std::vector &get_array_of_index(int index) { return arrays[index]; } - void update_bounding_box(CGAL::Bbox_3 &box) { m_bounding_box += box; } + void update_bounding_box(const CGAL::Bbox_3 &box) { m_bounding_box+=box; } - void initiate_bounding_box(CGAL::Bbox_3 new_bounding_box) { - m_bounding_box = new_bounding_box; - } + void initiate_bounding_box(const CGAL::Bbox_3& new_bounding_box) + { m_bounding_box = new_bounding_box; } void negate_all_normals() { @@ -161,41 +152,40 @@ class Graphic_buffer { m_buffer_for_colored_faces.negate_normals(); } - template void add_point(const KPoint &p) { - m_buffer_for_mono_points.add_point(p); - } + template void add_point(const KPoint &p) + { m_buffer_for_mono_points.add_point(p); } template - void add_point(const KPoint &p, const CGAL::IO::Color &acolor) { - m_buffer_for_colored_points.add_point(p, acolor); - } + void add_point(const KPoint &p, const CGAL::IO::Color &acolor) + { m_buffer_for_colored_points.add_point(p, acolor); } template - void add_segment(const KPoint &p1, const KPoint &p2) { - m_buffer_for_mono_segments.add_segment(p1, p2); - } + void add_segment(const KPoint &p1, const KPoint &p2) + { m_buffer_for_mono_segments.add_segment(p1, p2); } template void add_segment(const KPoint &p1, const KPoint &p2, - const CGAL::IO::Color &acolor) { - m_buffer_for_colored_segments.add_segment(p1, p2, acolor); - } + const CGAL::IO::Color &acolor) + { m_buffer_for_colored_segments.add_segment(p1, p2, acolor); } template - void add_ray(const KPoint &p, const KVector &v) { + void add_ray(const KPoint &p, const KVector &v) + { double bigNumber = 1e30; m_buffer_for_mono_rays.add_ray_segment(p, (p + (bigNumber)*v)); } template void add_ray(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor) { + const CGAL::IO::Color &acolor) + { double bigNumber = 1e30; m_buffer_for_colored_rays.add_ray_segment(p, (p + (bigNumber)*v), acolor); } template - void add_line(const KPoint &p, const KVector &v) { + void add_line(const KPoint &p, const KVector &v) + { double bigNumber = 1e30; m_buffer_for_mono_lines.add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v)); @@ -203,65 +193,72 @@ class Graphic_buffer { template void add_line(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor) { + const CGAL::IO::Color &acolor) + { double bigNumber = 1e30; m_buffer_for_colored_lines.add_line_segment((p - (bigNumber)*v), (p + (bigNumber)*v), acolor); } - template bool add_point_in_face(const KPoint &kp) { - if (m_buffer_for_mono_faces.is_a_face_started()) { - return m_buffer_for_mono_faces.add_point_in_face(kp); - } else if (m_buffer_for_colored_faces.is_a_face_started()) { - return m_buffer_for_colored_faces.add_point_in_face(kp); - } + template bool add_point_in_face(const KPoint &kp) + { + if (m_buffer_for_mono_faces.is_a_face_started()) + { return m_buffer_for_mono_faces.add_point_in_face(kp); } + else if (m_buffer_for_colored_faces.is_a_face_started()) + { return m_buffer_for_colored_faces.add_point_in_face(kp); } return false; } template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal) { - if (m_buffer_for_mono_faces.is_a_face_started()) { - return m_buffer_for_mono_faces.add_point_in_face(kp, p_normal); - } else if (m_buffer_for_colored_faces.is_a_face_started()) { - return m_buffer_for_colored_faces.add_point_in_face(kp, p_normal); - } + bool add_point_in_face(const KPoint &kp, const KVector &p_normal) + { + if (m_buffer_for_mono_faces.is_a_face_started()) + { return m_buffer_for_mono_faces.add_point_in_face(kp, p_normal); } + else if (m_buffer_for_colored_faces.is_a_face_started()) + { return m_buffer_for_colored_faces.add_point_in_face(kp, p_normal); } return false; } - bool is_a_face_started() const { + bool is_a_face_started() const + { return m_buffer_for_mono_faces.is_a_face_started() || m_buffer_for_colored_faces.is_a_face_started(); } - void face_begin() { - if (is_a_face_started()) { + void face_begin() + { + if (is_a_face_started()) + { std::cerr << "You cannot start a new face before to finish the previous one." << std::endl; - } else { - m_buffer_for_mono_faces.face_begin(); } + else + { m_buffer_for_mono_faces.face_begin(); } } - void face_begin(const CGAL::IO::Color &acolor) { - if (is_a_face_started()) { + void face_begin(const CGAL::IO::Color &acolor) + { + if (is_a_face_started()) + { std::cerr << "You cannot start a new face before to finish the previous one." << std::endl; - } else { - m_buffer_for_colored_faces.face_begin(acolor); } + else + { m_buffer_for_colored_faces.face_begin(acolor); } } - void face_end() { - if (m_buffer_for_mono_faces.is_a_face_started()) { - m_buffer_for_mono_faces.face_end(); - } else if (m_buffer_for_colored_faces.is_a_face_started()) { - return m_buffer_for_colored_faces.face_end(); - } + void face_end() + { + if (m_buffer_for_mono_faces.is_a_face_started()) + { m_buffer_for_mono_faces.face_end(); } + else if (m_buffer_for_colored_faces.is_a_face_started()) + { m_buffer_for_colored_faces.face_end(); } } - bool is_empty() const { + bool is_empty() const + { return (m_buffer_for_mono_points.is_empty() && m_buffer_for_colored_points.is_empty() && m_buffer_for_mono_segments.is_empty() && @@ -274,7 +271,8 @@ class Graphic_buffer { m_buffer_for_colored_faces.is_empty()); } - bool has_zero_x() const { + bool has_zero_x() const + { return m_buffer_for_mono_points.has_zero_x() && m_buffer_for_colored_points.has_zero_x() && m_buffer_for_mono_segments.has_zero_x() && @@ -287,7 +285,8 @@ class Graphic_buffer { m_buffer_for_colored_lines.has_zero_x(); } - bool has_zero_y() const { + bool has_zero_y() const + { return m_buffer_for_mono_points.has_zero_y() && m_buffer_for_colored_points.has_zero_y() && m_buffer_for_mono_segments.has_zero_y() && @@ -300,7 +299,8 @@ class Graphic_buffer { m_buffer_for_colored_lines.has_zero_y(); } - bool has_zero_z() const { + bool has_zero_z() const + { return m_buffer_for_mono_points.has_zero_z() && m_buffer_for_colored_points.has_zero_z() && m_buffer_for_mono_segments.has_zero_z() && @@ -327,40 +327,38 @@ class Graphic_buffer { m_buffer_for_colored_faces.clear(); m_buffer_for_clipping_plane.clear(); m_texts.clear(); + m_bounding_box=CGAL::Bbox_3(); } template - static Local_point get_local_point(const KPoint &p) { + static Local_point get_local_point(const KPoint &p) + { return internal::Geom_utils::Kernel, Local_kernel>::get_local_point(p); } template - void add_text(const KPoint &kp, const QString &txt) { + void add_text(const KPoint &kp, const QString &txt) + { Local_point p = get_local_point(kp); m_texts.push_back(std::make_tuple(p, txt)); } - template void add_text(const KPoint &kp, const char *txt) { - add_text(kp, QString(txt)); - } + template void add_text(const KPoint &kp, const char *txt) + { add_text(kp, QString(txt)); } template - void add_text(const KPoint &kp, const std::string &txt) { - add_text(kp, txt.c_str()); - } + void add_text(const KPoint &kp, const std::string &txt) + { add_text(kp, txt.c_str()); } - void m_texts_clear() { - m_texts.clear(); - } + void m_texts_clear() + { m_texts.clear(); } - int m_texts_size() { - return m_texts.size(); - } + int m_texts_size() + { return m_texts.size(); } - std::vector>& get_m_texts() { - return m_texts; - } + std::vector>& get_m_texts() + { return m_texts; } protected: // The following enum gives the indices of different elements of arrays From 733711384b79052cf8cf65891df1b6988e2ce7a2 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 13 Oct 2022 08:51:41 +0200 Subject: [PATCH 091/341] review + comment --- GraphicsView/include/CGAL/Drawing_functor.h | 26 ++++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index cff52be172da..b5516a63afb0 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -15,37 +15,39 @@ namespace CGAL { +// Drawing functor for a 2D combinatorial data structure +// (with vertices, edges and faces) template + typename face_handle> struct Drawing_functor { Drawing_functor(): m_enabled_vertices(true), - m_enabled_edges(true), - m_enabled_faces(true) + m_enabled_edges(true), + m_enabled_faces(true) { draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; draw_edge=[](const DS &, edge_handle)->bool { return true; }; draw_face=[](const DS &, face_handle)->bool { return true; }; - + colored_vertex=[](const DS &, vertex_handle)->bool { return false; }; colored_edge=[](const DS &, edge_handle)->bool { return false; }; colored_face=[](const DS &, face_handle)->bool { return false; }; face_wireframe=[](const DS &, face_handle)->bool { return false; }; } - + std::function draw_vertex; std::function draw_edge; std::function draw_face; - + std::function colored_vertex; std::function colored_edge; std::function colored_face; - + std::function face_wireframe; - + std::function vertex_color; std::function edge_color; std::function face_color; @@ -61,13 +63,15 @@ struct Drawing_functor void disable_faces() { m_enabled_faces=false; } void enable_faces() { m_enabled_faces=true; } bool are_faces_enabled() const { return m_enabled_faces; } - + protected: bool m_enabled_vertices, m_enabled_edges, m_enabled_faces; }; -template From 91016007cd6f6a562fd08dd117cbd00fe3446bbf Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 13 Oct 2022 11:11:57 +0200 Subject: [PATCH 092/341] Some cleanup --- .../include/CGAL/Qt/Basic_viewer_qt.h | 637 ++++++++---------- 1 file changed, 276 insertions(+), 361 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 2eb5e9b62dd2..2f702781ddb1 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -56,8 +56,12 @@ #include #include +#define CGAL_BASIC_VIEWER_INIT_SIZE_X 500 +#define CGAL_BASIC_VIEWER_INIT_SIZE_Y 450 + namespace CGAL { + //------------------------------------------------------------------------------ inline CGAL::IO::Color get_random_color(CGAL::Random& random) { @@ -71,7 +75,6 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) while(res.red()==255 && res.green()==255 && res.blue()==255); return res; } - //------------------------------------------------------------------------------ template class Basic_viewer_qt : public CGAL::QGLViewer @@ -141,9 +144,12 @@ class Basic_viewer_qt : public CGAL::QGLViewer setKeyDescription(::Qt::Key_O, "Toggles 2D mode only"); // Add custom mouse description - setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::LeftButton, "Rotate the clipping plane when enabled"); - setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::RightButton, "Translate the clipping plane when enabled"); - setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::MiddleButton, "Control the clipping plane transparency when enabled"); + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::LeftButton, + "Rotate the clipping plane when enabled"); + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::RightButton, + "Translate the clipping plane when enabled"); + setMouseBindingDescription(::Qt::Key_C, ::Qt::ControlModifier, ::Qt::MiddleButton, + "Control the clipping plane transparency when enabled"); setMouseBinding(::Qt::ControlModifier, ::Qt::LeftButton, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); setMouseBinding(::Qt::ControlModifier, ::Qt::RightButton, qglviewer::FRAME, qglviewer::NO_MOUSE_ACTION); @@ -160,7 +166,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer else setWindowTitle(title); - resize(500, 450); + resize(CGAL_BASIC_VIEWER_INIT_SIZE_X, CGAL_BASIC_VIEWER_INIT_SIZE_Y); if (inverse_normal) { negate_all_normals(); } @@ -176,30 +182,22 @@ class Basic_viewer_qt : public CGAL::QGLViewer vao[i].destroy(); } - void set_draw_vertices(bool b) { - m_draw_vertices = b; - } - void set_draw_edges(bool b) { - m_draw_edges = b; - } - void set_draw_rays(bool b) { - m_draw_rays = b; - } - void set_draw_lines(bool b) { - m_draw_lines = b; - } - void set_draw_faces(bool b) { - m_draw_faces = b; - } - void set_use_mono_color(bool b) { - m_use_mono_color = b; - } - void set_inverse_normal(bool b) { - m_inverse_normal = b; - } - void set_draw_text(bool b) { - m_draw_text = b; - } + void set_draw_vertices(bool b) + { m_draw_vertices = b; } + void set_draw_edges(bool b) + { m_draw_edges = b; } + void set_draw_rays(bool b) + { m_draw_rays = b; } + void set_draw_lines(bool b) + { m_draw_lines = b; } + void set_draw_faces(bool b) + { m_draw_faces = b; } + void set_use_mono_color(bool b) + { m_use_mono_color = b; } + void set_inverse_normal(bool b) + { m_inverse_normal = b; } + void set_draw_text(bool b) + { m_draw_text = b; } void clear() { @@ -214,30 +212,19 @@ class Basic_viewer_qt : public CGAL::QGLViewer } bool is_empty() const - { - return gBuffer.is_empty(); - } + { return gBuffer.is_empty(); } const CGAL::Bbox_3& bounding_box() const - { - const auto& bounding_box = gBuffer.get_bounding_box(); - return bounding_box; - } + { return gBuffer.get_bounding_box(); } bool has_zero_x() const - { - return gBuffer.has_zero_x(); - } + { return gBuffer.has_zero_x(); } bool has_zero_y() const - { - return gBuffer.has_zero_y(); - } + { return gBuffer.has_zero_y(); } bool has_zero_z() const - { - return gBuffer.has_zero_z(); - } + { return gBuffer.has_zero_z(); } Local_kernel::Plane_3 clipping_plane() const { @@ -265,68 +252,27 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_segment(const KPoint& p1, const KPoint& p2, const CGAL::IO::Color& acolor) - { gBuffer.add_segment(p1, p2, acolor);}//get_buffer_for_colored_segments().add_segment(p1, p2, acolor); } - - template - void update_bounding_box_for_ray(const KPoint &p, const KVector &v) - { - Local_point lp = get_local_point(p); - Local_vector lv = get_local_vector(v); - CGAL::Bbox_3 b = (lp + lv).bbox(); - gBuffer.update_bounding_box(b); - } - - template - void update_bounding_box_for_line(const KPoint &p, const KVector &v, - const KVector &pv) - { - Local_point lp = get_local_point(p); - Local_vector lv = get_local_vector(v); - Local_vector lpv = get_local_vector(pv); - - CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - gBuffer.update_bounding_box(b); - } + { gBuffer.add_segment(p1, p2, acolor);} template void add_ray(const KPoint &p, const KVector &v) - { - double bigNumber = 1e30; - gBuffer.get_buffer_for_mono_rays().add_ray_segment(p, (p + (bigNumber)*v)); - // gBuffer.get_buffer_for_mono_rays().add_ray(p, v); - } + { gBuffer.add_ray(p, v); } template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) - { - // gBuffer.get_buffer_for_colored_rays().add_ray(p, v, acolor); - double bigNumber = 1e30; - gBuffer.get_buffer_for_colored_lines().add_ray_segment(p, (p + (bigNumber)*v), acolor); - } + { gBuffer.add_ray(p, v, acolor); } template void add_line(const KPoint &p, const KVector &v) - { - // gBuffer.add_line(p,v); - double bigNumber = 1e30; - gBuffer.get_buffer_for_mono_lines().add_line_segment((p - (bigNumber)*v), - (p + (bigNumber)*v)); - } + { gBuffer.add_line(p, v); } template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) - { - // gBuffer.add_line(p,v,acolor); - double bigNumber = 1e30; - gBuffer.get_buffer_for_colored_lines().add_line_segment((p - (bigNumber)*v), - (p + (bigNumber)*v), acolor); - } + { gBuffer.add_line(p, v, acolor); } template void add_text(const KPoint& kp, const QString& txt) - { - gBuffer.add_text(kp, txt); - } + { gBuffer.add_text(kp, txt); } template void add_text(const KPoint& kp, const char* txt) @@ -336,6 +282,27 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_text(const KPoint& kp, const std::string& txt) { gBuffer.add_text(kp, txt.c_str()); } + template + void update_bounding_box_for_ray(const KPoint &p, const KVector &v) + { + Local_point lp = get_local_point(p); + Local_vector lv = get_local_vector(v); + CGAL::Bbox_3 b = (lp + lv).bbox(); + gBuffer.update_bounding_box(b); + } + + template + void update_bounding_box_for_line(const KPoint &p, const KVector &v, + const KVector &pv) + { + Local_point lp = get_local_point(p); + Local_vector lv = get_local_vector(v); + Local_vector lpv = get_local_vector(pv); + + CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); + gBuffer.update_bounding_box(b); + } + bool is_a_face_started() const { return gBuffer.get_buffer_for_mono_faces().is_a_face_started() || @@ -343,59 +310,24 @@ class Basic_viewer_qt : public CGAL::QGLViewer } void face_begin() - { - if (is_a_face_started()) - { - std::cerr<<"You cannot start a new face before to finish the previous one."< - bool add_point_in_face(const KPoint &kp) { - return gBuffer.add_point_in_face(kp); - } + bool add_point_in_face(const KPoint &kp) + { return gBuffer.add_point_in_face(kp); } template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal) { - return gBuffer.add_point_in_face(kp, p_normal); - } - - Graphic_buffer& get_graphic_buffer() { - return gBuffer; - } + bool add_point_in_face(const KPoint &kp, const KVector &p_normal) + { return gBuffer.add_point_in_face(kp, p_normal); } void face_end() - { - if (gBuffer.get_buffer_for_mono_faces().is_a_face_started()) - { - auto mono_faces = gBuffer.get_buffer_for_mono_faces(); - mono_faces.face_end(); - } - else if (gBuffer.get_buffer_for_colored_faces().is_a_face_started()) - { - auto colored_faces = gBuffer.get_buffer_for_colored_faces(); - // return colored_faces.face_end(); - colored_faces.face_end(); - } - } + { gBuffer.face_end(); } + + Graphic_buffer& get_graphic_buffer() + { return gBuffer; } virtual void redraw() { @@ -1355,93 +1287,87 @@ class Basic_viewer_qt : public CGAL::QGLViewer } void negate_all_normals() - { - gBuffer.negate_all_normals(); - } + { gBuffer.negate_all_normals(); } virtual void keyPressEvent(QKeyEvent *e) { - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - - if(_onPress) { - bool is_pressed = _onPress(e, this); - if(!is_pressed) { - - if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) + if(!_onPress || !_onPress(e, this)) { - if (!isOpenGL_4_3()) return; - if (!is_two_dimensional()) + if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) { - // toggle clipping plane - m_use_clipping_plane = (m_use_clipping_plane + 1) % CLIPPING_PLANE_END_INDEX; - if (m_use_clipping_plane==CLIPPING_PLANE_OFF) - { setManipulatedFrame(nullptr); } - else - { setManipulatedFrame(m_frame_plane); } + if (!isOpenGL_4_3()) return; + if (!is_two_dimensional()) + { + // toggle clipping plane + m_use_clipping_plane = (m_use_clipping_plane + 1) % CLIPPING_PLANE_END_INDEX; + if (m_use_clipping_plane==CLIPPING_PLANE_OFF) + { setManipulatedFrame(nullptr); } + else + { setManipulatedFrame(m_frame_plane); } + + switch(m_use_clipping_plane) + { + case CLIPPING_PLANE_OFF: displayMessage(QString("Draw clipping = false")); break; + case CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF: clipping_plane_rendering=true; displayMessage(QString("Draw clipping = solid half & transparent half")); break; + case CLIPPING_PLANE_SOLID_HALF_WIRE_HALF: displayMessage(QString("Draw clipping = solid half & wireframe half")); break; + case CLIPPING_PLANE_SOLID_HALF_ONLY: displayMessage(QString("Draw clipping = solid half only")); break; + default: break; + } + update(); + } + } - switch(m_use_clipping_plane) + else if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::AltModifier)) + { + if (!isOpenGL_4_3()) return; + if (m_use_clipping_plane!=CLIPPING_PLANE_OFF) { - case CLIPPING_PLANE_OFF: displayMessage(QString("Draw clipping = false")); break; - case CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF: clipping_plane_rendering=true; displayMessage(QString("Draw clipping = solid half & transparent half")); break; - case CLIPPING_PLANE_SOLID_HALF_WIRE_HALF: displayMessage(QString("Draw clipping = solid half & wireframe half")); break; - case CLIPPING_PLANE_SOLID_HALF_ONLY: displayMessage(QString("Draw clipping = solid half only")); break; - default: break; + clipping_plane_rendering = !clipping_plane_rendering; + displayMessage(QString("Draw clipping plane=%1.").arg(clipping_plane_rendering?"true":"false")); + update(); } + } + else if ((e->key()==::Qt::Key_E) && (modifiers==::Qt::NoButton)) + { + m_draw_edges=!m_draw_edges; + displayMessage(QString("Draw edges=%1.").arg(m_draw_edges?"true":"false")); update(); } - } - - else if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::AltModifier)) - { - if (!isOpenGL_4_3()) return; - if (m_use_clipping_plane!=CLIPPING_PLANE_OFF) + else if ((e->key()==::Qt::Key_M) && (modifiers==::Qt::NoButton)) { - clipping_plane_rendering = !clipping_plane_rendering; - displayMessage(QString("Draw clipping plane=%1.").arg(clipping_plane_rendering?"true":"false")); + m_use_mono_color=!m_use_mono_color; + displayMessage(QString("Mono color=%1.").arg(m_use_mono_color?"true":"false")); update(); } - } - else if ((e->key()==::Qt::Key_E) && (modifiers==::Qt::NoButton)) - { - m_draw_edges=!m_draw_edges; - displayMessage(QString("Draw edges=%1.").arg(m_draw_edges?"true":"false")); - update(); - } - else if ((e->key()==::Qt::Key_M) && (modifiers==::Qt::NoButton)) - { - m_use_mono_color=!m_use_mono_color; - displayMessage(QString("Mono color=%1.").arg(m_use_mono_color?"true":"false")); - update(); - } - else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) - { - m_inverse_normal=!m_inverse_normal; - displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); - negate_all_normals(); - redraw(); - } - else if ((e->key()==::Qt::Key_S) && (modifiers==::Qt::NoButton)) - { - m_flatShading=!m_flatShading; - if (m_flatShading) - displayMessage("Flat shading."); - else - displayMessage("Gouraud shading."); - redraw(); - } - else if ((e->key()==::Qt::Key_T) && (modifiers==::Qt::NoButton)) - { - m_draw_text=!m_draw_text; - displayMessage(QString("Draw text=%1.").arg(m_draw_text?"true":"false")); - update(); - } - else if ((e->key()==::Qt::Key_U) && (modifiers==::Qt::NoButton)) - { - if (is_two_dimensional()) + else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) + { + m_inverse_normal=!m_inverse_normal; + displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); + negate_all_normals(); + redraw(); + } + else if ((e->key()==::Qt::Key_S) && (modifiers==::Qt::NoButton)) + { + m_flatShading=!m_flatShading; + if (m_flatShading) + displayMessage("Flat shading."); + else + displayMessage("Gouraud shading."); + redraw(); + } + else if ((e->key()==::Qt::Key_T) && (modifiers==::Qt::NoButton)) + { + m_draw_text=!m_draw_text; + displayMessage(QString("Draw text=%1.").arg(m_draw_text?"true":"false")); + update(); + } + else if ((e->key()==::Qt::Key_U) && (modifiers==::Qt::NoButton)) { - displayMessage(QString("Move camera direction upside down.")); - /* CGAL::qglviewer::Vec cur=camera()->viewDirection(); + if (is_two_dimensional()) + { + displayMessage(QString("Move camera direction upside down.")); + /* CGAL::qglviewer::Vec cur=camera()->viewDirection(); // TODO ! double cx=cur.x, cy=cur.y, cz=cur.z; if (has_zero_x()) { cx=-cx; } else if (has_zero_y()) { cy=-cy; } @@ -1451,140 +1377,140 @@ class Basic_viewer_qt : public CGAL::QGLViewer else if (has_zero_y()) { cy=(cur.y<0?-1.:1); } else { cz=(cur.z<0?-1.:1); }*/ - camera()->setUpVector(-camera()->upVector()); + camera()->setUpVector(-camera()->upVector()); //camera()->frame()->setConstraint(NULL); // camera()->setViewDirection(CGAL::qglviewer::Vec(-cx,-cy,-cz)); //constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(cx, cy, cz)); //camera()->frame()->setConstraint(&constraint); //update(); - redraw(); + redraw(); + } } - } - else if ((e->key()==::Qt::Key_V) && (modifiers==::Qt::NoButton)) - { - m_draw_vertices=!m_draw_vertices; - displayMessage(QString("Draw vertices=%1.").arg(m_draw_vertices?"true":"false")); - update(); - } - else if ((e->key()==::Qt::Key_W) && (modifiers==::Qt::NoButton)) - { - m_draw_faces=!m_draw_faces; - displayMessage(QString("Draw faces=%1.").arg(m_draw_faces?"true":"false")); - update(); - } - else if ((e->key()==::Qt::Key_Plus) && (!modifiers.testFlag(::Qt::ControlModifier))) // No ctrl - { - m_size_edges+=.5; - displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); - update(); - } - else if ((e->key()==::Qt::Key_Minus) && (!modifiers.testFlag(::Qt::ControlModifier))) // No ctrl - { - if (m_size_edges>.5) m_size_edges-=.5; - displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); - update(); - } - else if ((e->key()==::Qt::Key_Plus) && (modifiers.testFlag(::Qt::ControlModifier))) - { - m_size_points+=.5; - displayMessage(QString("Size of points=%1.").arg(m_size_points)); - update(); - } - else if ((e->key()==::Qt::Key_Minus) && (modifiers.testFlag(::Qt::ControlModifier))) - { - if (m_size_points>.5) m_size_points-=.5; - displayMessage(QString("Size of points=%1.").arg(m_size_points)); - update(); - } - else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::NoButton)) - { - m_ambient_color.setX(m_ambient_color.x()+.1); - if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); - m_ambient_color.setY(m_ambient_color.x()+.1); - if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); - m_ambient_color.setZ(m_ambient_color.x()+.1); - if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::NoButton)) - { - m_ambient_color.setX(m_ambient_color.x()-.1); - if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); - m_ambient_color.setY(m_ambient_color.y()-.1); - if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); - m_ambient_color.setZ(m_ambient_color.z()-.1); - if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::ShiftModifier)) - { - m_ambient_color.setX(m_ambient_color.x()+.1); - if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::AltModifier)) - { - m_ambient_color.setY(m_ambient_color.y()+.1); - if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::ControlModifier)) - { - m_ambient_color.setZ(m_ambient_color.z()+.1); - if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::ShiftModifier)) - { - m_ambient_color.setX(m_ambient_color.x()-.1); - if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::AltModifier)) - { - m_ambient_color.setY(m_ambient_color.y()-.1); - if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::ControlModifier)) - { - m_ambient_color.setZ(m_ambient_color.z()-.1); - if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - update(); - } - else if ((e->key()==::Qt::Key_O) && (modifiers==::Qt::NoButton)) - { - bool old_2D=is_two_dimensional(); - m_no_2D_mode=!m_no_2D_mode; - if (old_2D!=is_two_dimensional()) + else if ((e->key()==::Qt::Key_V) && (modifiers==::Qt::NoButton)) { - if (is_two_dimensional()) - { displayMessage(QString("Viewer is in 2D mode.")); } - else { displayMessage(QString("Viewer is in 3D mode.")); } + m_draw_vertices=!m_draw_vertices; + displayMessage(QString("Draw vertices=%1.").arg(m_draw_vertices?"true":"false")); + update(); + } + else if ((e->key()==::Qt::Key_W) && (modifiers==::Qt::NoButton)) + { + m_draw_faces=!m_draw_faces; + displayMessage(QString("Draw faces=%1.").arg(m_draw_faces?"true":"false")); update(); } + else if ((e->key()==::Qt::Key_Plus) && (!modifiers.testFlag(::Qt::ControlModifier))) // No ctrl + { + m_size_edges+=.5; + displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); + update(); + } + else if ((e->key()==::Qt::Key_Minus) && (!modifiers.testFlag(::Qt::ControlModifier))) // No ctrl + { + if (m_size_edges>.5) m_size_edges-=.5; + displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); + update(); + } + else if ((e->key()==::Qt::Key_Plus) && (modifiers.testFlag(::Qt::ControlModifier))) + { + m_size_points+=.5; + displayMessage(QString("Size of points=%1.").arg(m_size_points)); + update(); + } + else if ((e->key()==::Qt::Key_Minus) && (modifiers.testFlag(::Qt::ControlModifier))) + { + if (m_size_points>.5) m_size_points-=.5; + displayMessage(QString("Size of points=%1.").arg(m_size_points)); + update(); + } + else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::NoButton)) + { + m_ambient_color.setX(m_ambient_color.x()+.1); + if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); + m_ambient_color.setY(m_ambient_color.x()+.1); + if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); + m_ambient_color.setZ(m_ambient_color.x()+.1); + if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::NoButton)) + { + m_ambient_color.setX(m_ambient_color.x()-.1); + if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); + m_ambient_color.setY(m_ambient_color.y()-.1); + if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); + m_ambient_color.setZ(m_ambient_color.z()-.1); + if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::ShiftModifier)) + { + m_ambient_color.setX(m_ambient_color.x()+.1); + if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::AltModifier)) + { + m_ambient_color.setY(m_ambient_color.y()+.1); + if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageUp) && (modifiers==::Qt::ControlModifier)) + { + m_ambient_color.setZ(m_ambient_color.z()+.1); + if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::ShiftModifier)) + { + m_ambient_color.setX(m_ambient_color.x()-.1); + if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::AltModifier)) + { + m_ambient_color.setY(m_ambient_color.y()-.1); + if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_PageDown) && (modifiers==::Qt::ControlModifier)) + { + m_ambient_color.setZ(m_ambient_color.z()-.1); + if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); + displayMessage(QString("Light color=(%1 %2 %3)."). + arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); + update(); + } + else if ((e->key()==::Qt::Key_O) && (modifiers==::Qt::NoButton)) + { + bool old_2D=is_two_dimensional(); + m_no_2D_mode=!m_no_2D_mode; + if (old_2D!=is_two_dimensional()) + { + if (is_two_dimensional()) + { displayMessage(QString("Viewer is in 2D mode.")); } + else { displayMessage(QString("Viewer is in 3D mode.")); } + update(); + } + } + else + { CGAL::QGLViewer::keyPressEvent(e); } // By default call QGLViewer key press } - else - CGAL::QGLViewer::keyPressEvent(e); - } - } } + virtual QString helpString() const { return helpString("CGAL Basic Viewer"); } @@ -1620,10 +1546,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer return text; } public: - // std::function _onPress; std::function *)> _onPress; -protected: +protected: Graphic_buffer& gBuffer; bool m_draw_vertices; @@ -1729,56 +1654,49 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; -/** - * @brief - * - * @tparam BufferType - * @param graphic_buffer - */ template -void draw_buffer(Graphic_buffer &graphic_buffer) { - +void draw_buffer(Graphic_buffer &graphic_buffer, + const char *title="CGAL Basic Viewer") +{ #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; #else bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); #endif - if (!cgal_test_suite) { - CGAL::Qt::init_ogl_context(4, 3); - // Qt::init_ogl_context(4, 3); + if (!cgal_test_suite) + { + Qt::init_ogl_context(4, 3); int argc = 1; - const char *argv[2] = {"lccviewer", nullptr}; + const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); basic_viewer.show(); app.exec(); } } - template -void draw_buffer(Graphic_buffer &graphic_buffer,const std::function *)>& onPress) { - +void draw_buffer(Graphic_buffer &graphic_buffer, + const std::function *)>& onPress, + const char *title="CGAL Basic Viewer") +{ #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; #else bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); #endif - if (!cgal_test_suite) { - CGAL::Qt::init_ogl_context(4, 3); - // Qt::init_ogl_context(4, 3); + if (!cgal_test_suite) + { + Qt::init_ogl_context(4, 3); int argc = 1; - const char *argv[2] = {"lccviewer", nullptr}; + const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer); - + Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); basic_viewer._onPress = onPress; basic_viewer.show(); @@ -1786,9 +1704,6 @@ void draw_buffer(Graphic_buffer &graphic_buffer,const std::function< } } - - - } // End namespace CGAL #else // CGAL_USE_BASIC_VIEWER From 09ce35d9baa637943752bb85129cce5a11cf6aa9 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 13 Oct 2022 11:18:32 +0200 Subject: [PATCH 093/341] Correct template specialisation for add_in_graphic_buffer functions, lcc and voronoi 2 --- .../include/CGAL/Qt/Basic_viewer_qt.h | 4 +- .../include/CGAL/draw_linear_cell_complex.h | 83 ++++---- .../include/CGAL/draw_voronoi_diagram_2.h | 181 +++++++++--------- 3 files changed, 137 insertions(+), 131 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 2f702781ddb1..aca0bfc1c140 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -1305,7 +1305,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer { setManipulatedFrame(nullptr); } else { setManipulatedFrame(m_frame_plane); } - + switch(m_use_clipping_plane) { case CLIPPING_PLANE_OFF: displayMessage(QString("Draw clipping = false")); break; @@ -1510,7 +1510,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer { CGAL::QGLViewer::keyPressEvent(e); } // By default call QGLViewer key press } } - + virtual QString helpString() const { return helpString("CGAL Basic Viewer"); } diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index daa202cf9628..280d9e7cd080 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -13,13 +13,12 @@ #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H -#include -#include #include -#include #ifdef CGAL_USE_BASIC_VIEWER +#include +#include #include #include @@ -90,7 +89,7 @@ void compute_face(typename LCC::Dart_const_handle dh, CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); graphic_buffer.face_begin(c); } - else + else { graphic_buffer.face_begin(); } cur=dh; @@ -148,7 +147,7 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, } template -void compute_elements(const LCC *lcc, CGAL::Graphic_buffer &graphic_buffer, +void compute_elements(const LCC *lcc, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { if (lcc==nullptr) @@ -228,37 +227,48 @@ void compute_elements(const LCC *lcc, CGAL::Graphic_buffer &graphic_ lcc->free_mark(oriented_mark); } -} // namespace draw_function +} // namespace draw_function_for_lcc -/** - * @brief This function is responsible for filling the buffer to allow - * visualization. - * - * @param graphic_buffer - * @param m_drawing_functor - * @param alcc - */ -template -void add_in_graphic_buffer(const LCC &alcc, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +#define CGAL_LCC_TYPE \ + CGAL::Linear_cell_complex_base + +// add_in_graphic_buffer: to add a LCC in the given graphic buffer, with a +// drawing functor. +template class Map, + class Refs, class Storage_, + typename BufferType=float, class DrawingFunctor> +void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); } -template -void add_in_graphic_buffer(const LCC &alcc, CGAL::Graphic_buffer &graphic_buffer) +// add_in_graphic_buffer: to add a LCC in the given graphic buffer, without a +// drawing functor. Use default drawing values. +template class Map, + class Refs, class Storage_, typename BufferType=float> +void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, + CGAL::Graphic_buffer &graphic_buffer) { - Drawing_functor_with_volume drawing_functor_with_volume; - - drawing_functor_with_volume.colored_volume = [](const LCC&, - typename LCC::Dart_const_handle) -> bool + CGAL::Drawing_functor_with_volume + drawing_functor_with_volume; + + drawing_functor_with_volume.colored_volume = [](const CGAL_LCC_TYPE&, + typename CGAL_LCC_TYPE::Dart_const_handle) -> bool { return true; }; - drawing_functor_with_volume.volume_color = [] (const LCC& alcc, - typename LCC::Dart_const_handle dh) -> CGAL::IO::Color + drawing_functor_with_volume.volume_color = [] (const CGAL_LCC_TYPE& alcc, + typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color { CGAL::Random random((unsigned int)(alcc.darts().index(dh))); return get_random_color(random); @@ -267,33 +277,30 @@ void add_in_graphic_buffer(const LCC &alcc, CGAL::Graphic_buffer &gr add_in_graphic_buffer(alcc, graphic_buffer, drawing_functor_with_volume); } -// Specialization of draw function. -#define CGAL_LCC_TYPE \ - CGAL::Linear_cell_complex_base - +// Specialization of draw function for a LCC, with a drawing functor. template class Map, class Refs, class Storage_, class DrawingFunctor> -void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, - const char *title = "LCC for CMap Basic Viewer") +void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, + const char *title="LCC Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(alcc, buffer, drawing_functor); - draw_buffer(buffer); + draw_buffer(buffer, title); } +// Specialization of draw function for a LCC, without a drawing functor. template class Map, class Refs, class Storage_> -void draw(const CGAL_LCC_TYPE &alcc, const char *title = "LCC for CMap Basic Viewer") +void draw(const CGAL_LCC_TYPE &alcc, const char *title="LCC Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(alcc, buffer); - draw_buffer(buffer); + draw_buffer(buffer, title); } #undef CGAL_LCC_TYPE diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 640a75b86c3e..662a261b27bf 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -57,7 +57,6 @@ struct Drawing_functor_voronoi : std::function draw_dual_vertices; std::function draw_rays; - void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } @@ -70,7 +69,6 @@ struct Drawing_functor_voronoi : void enable_rays() { m_draw_rays=true; } bool are_rays_enabled() const { return m_draw_rays; } - void disable_nofaces() { m_nofaces=false; } void enable_nofaces() { m_nofaces=true; } bool are_nofaces_enabled() const { return m_nofaces; } @@ -88,15 +86,13 @@ typedef Local_kernel::Vector_3 Local_vector; template void compute_vertex(typename V2::Vertex_iterator vh, - CGAL::Graphic_buffer &graphic_buffer) { - graphic_buffer.add_point(vh->point()); -} + CGAL::Graphic_buffer &graphic_buffer) +{ graphic_buffer.add_point(vh->point()); } template void compute_dual_vertex(typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphic_buffer &graphic_buffer) { - graphic_buffer.add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); -} + CGAL::Graphic_buffer &graphic_buffer) +{ graphic_buffer.add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); } template void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, @@ -105,30 +101,33 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; - if (he->is_segment()) { - graphic_buffer.add_segment(he->source()->point(), he->target()->point()); - } else { + if (he->is_segment()) + { graphic_buffer.add_segment(he->source()->point(), he->target()->point()); } + else + { Delaunay_vertex_const_handle v1 = he->up(); Delaunay_vertex_const_handle v2 = he->down(); Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); - if (he->is_ray()) { + v2->point().x() - v1->point().x()); + if (he->is_ray()) + { Kernel::Point_2 end_point; - if (he->has_source()) { + if (he->has_source()) + { end_point = he->source()->point(); - // update_bounding_box_for_ray(end_point, direction); - - // update_bounding_box_for_ray - Local_point lp = Basic_viewer_qt<>::get_local_point(end_point); - Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); - CGAL::Bbox_3 b = (lp + lv).bbox(); - graphic_buffer.update_bounding_box(b); - + // update_bounding_box_for_ray(end_point, direction); + // update_bounding_box_for_ray + Local_point lp = Basic_viewer_qt<>::get_local_point(end_point); + Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); + CGAL::Bbox_3 b = (lp + lv).bbox(); + graphic_buffer.update_bounding_box(b); } - } else if (he->is_bisector()) { + } + else if (he->is_bisector()) + { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); Kernel::Vector_2 perpendicularDirection( @@ -145,7 +144,6 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); graphic_buffer.update_bounding_box(b); - } } } @@ -167,32 +165,37 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, // origin of the ray Kernel::Point_2 p; - if (ray->has_source()) { - p = ray->source()->point(); - } else { - p = ray->target()->point(); - } + if (ray->has_source()) + { p = ray->source()->point(); } + else + { p = ray->target()->point(); } // get the bounding box of the viewer Local_kernel::Vector_2 boundsMin(m_bounding_box.xmin(), - m_bounding_box.zmin()); + m_bounding_box.zmin()); Local_kernel::Vector_2 boundsMax(m_bounding_box.xmax(), - m_bounding_box.zmax()); + m_bounding_box.zmax()); // calculate intersection double txmax, txmin, tymax, tymin; - if (inv.x() >= 0) { + if (inv.x() >= 0) + { txmax = (boundsMax.x() - p.x()) * inv.x(); txmin = (boundsMin.x() - p.x()) * inv.x(); - } else { + } + else + { txmax = (boundsMin.x() - p.x()) * inv.x(); txmin = (boundsMax.x() - p.x()) * inv.x(); } - if (inv.y() >= 0) { + if (inv.y() >= 0) + { tymax = (boundsMax.y() - p.y()) * inv.y(); tymin = (boundsMin.y() - p.y()) * inv.y(); - } else { + } + else + { tymax = (boundsMin.y() - p.y()) * inv.y(); tymin = (boundsMax.y() - p.y()) * inv.y(); } @@ -203,20 +206,19 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, txmax = tymax; Local_kernel::Point_2 p1; - if (v.x() == 0) { - p1 = Local_kernel::Point_2(p.x(), p.y() + tymax * v.y()); - } else if (v.y() == 0) { - p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y()); - } else { - p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y() + tymax * v.y()); - } + if (v.x() == 0) + { p1 = Local_kernel::Point_2(p.x(), p.y() + tymax * v.y()); } + else if (v.y() == 0) + { p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y()); } + else + { p1 = Local_kernel::Point_2(p.x() + txmax * v.x(), p.y() + tymax * v.y()); } return p1; } // Halfedge_const_handle template void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_buffer &graphic_buffer) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -225,7 +227,7 @@ void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, Delaunay_vertex_const_handle v2 = he->down(); Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); + v2->point().x() - v1->point().x()); if (he->is_ray()) { if (he->has_source()) { // add_ray_segment(he->source()->point(), get_second_point(he, graphic_buffer.get_bounding_box())); @@ -276,7 +278,7 @@ void compute_face(typename V2::Face_iterator fh, } template -void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_buffer, +void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { typedef typename V2::Delaunay_graph::Finite_vertices_iterator Dual_vertices_iterator; @@ -290,61 +292,65 @@ void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_bu } // Draw the dual vertices - if (m_drawing_functor.are_dual_vertices_enabled()) { + if (m_drawing_functor.are_dual_vertices_enabled()) + { for (Dual_vertices_iterator it = v2.dual().finite_vertices_begin(); - it != v2.dual().finite_vertices_end(); ++it) { - compute_dual_vertex(it, graphic_buffer); - } + it != v2.dual().finite_vertices_end(); ++it) + { compute_dual_vertex(it, graphic_buffer); } } // Add segments and update bounding box for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) { - add_segments_and_update_bounding_box(it, graphic_buffer); - } + it != v2.halfedges_end(); ++it) + { add_segments_and_update_bounding_box(it, graphic_buffer); } - if(m_drawing_functor.are_rays_enabled()) { + if(m_drawing_functor.are_rays_enabled()) + { for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) { - compute_rays_and_bisectors(it, graphic_buffer); - } + it != v2.halfedges_end(); ++it) + { compute_rays_and_bisectors(it, graphic_buffer); } } - if (!m_drawing_functor.are_nofaces_enabled()) { + if (!m_drawing_functor.are_nofaces_enabled()) + { for (typename V2::Face_iterator it = v2.faces_begin(); - it != v2.faces_end(); ++it) { - compute_face(it, v2, graphic_buffer, m_drawing_functor); - } + it != v2.faces_end(); ++it) + { compute_face(it, v2, graphic_buffer, m_drawing_functor); } } } } // namespace draw_function_for_v2 -template -void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +#define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 + +template +void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor); } -template -void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graphic_buffer, +template +void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, + CGAL::Graphic_buffer &graphic_buffer, bool m_nofaces = false, bool m_draw_voronoi_vertices = true, - bool m_draw_dual_vertices = true ) { - + bool m_draw_dual_vertices = true ) +{ // Default functor; user can add his own functor. - CGAL::draw_function_for_v2::Drawing_functor_voronoi + CGAL::draw_function_for_v2::Drawing_functor_voronoi drawing_functor; - drawing_functor.colored_face = [](const V2&, - typename V2::Face_iterator fh) -> bool + drawing_functor.colored_face = [](const CGAL_VORONOI_TYPE&, + typename CGAL_VORONOI_TYPE::Face_iterator fh) -> bool { return true; }; - - drawing_functor.face_color = [] (const V2& alcc, - typename V2::Face_iterator fh) -> CGAL::IO::Color + drawing_functor.face_color = [] (const CGAL_VORONOI_TYPE& alcc, + typename CGAL_VORONOI_TYPE::Face_iterator fh) -> CGAL::IO::Color { return CGAL::IO::Color(73, 250, 117); }; @@ -358,32 +364,25 @@ void add_in_graphic_buffer(const V2 &v2, CGAL::Graphic_buffer &graph // setKeyDescription(::Qt::Key_D, "Toggles dual vertices display"); // setKeyDescription(::Qt::Key_V, "Toggles voronoi vertices display"); - - - // Specialization of draw function. -#define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 - -template +template void draw(const CGAL_VORONOI_TYPE &av2, - const DrawingFunctor &drawing_functor) + const DrawingFunctor &drawing_functor, + const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(av2, buffer, drawing_functor); - draw_buffer(buffer); + draw_buffer(buffer, title); } -template +template void draw(const CGAL_VORONOI_TYPE &av2, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; - CGAL::draw_function_for_v2::Drawing_functor_voronoi @@ -402,7 +401,7 @@ void draw(const CGAL_VORONOI_TYPE &av2, add_in_graphic_buffer(av2, buffer, drawing_functor); - std::function *)> VoronoiKeyPressEvent = + std::function *)> VoronoiKeyPressEvent = [&av2, &drawing_functor] (QKeyEvent *e, CGAL::Basic_viewer_qt *_this) -> bool { /// [Keypress] @@ -469,7 +468,7 @@ void draw(const CGAL_VORONOI_TYPE &av2, /// [Keypress] return true; }; - draw_buffer(buffer, VoronoiKeyPressEvent); + draw_buffer(buffer, VoronoiKeyPressEvent, title); } From 331bc5c305449d883bab3a974968a14d2f6937f2 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 09:07:19 +0200 Subject: [PATCH 094/341] add missing licence header --- GraphicsView/include/CGAL/Drawing_functor.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index b5516a63afb0..139e93e76388 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -13,6 +13,9 @@ #ifndef CGAL_DRAWING_FUNCTORS_H #define CGAL_DRAWING_FUNCTORS_H +#include +#include + namespace CGAL { // Drawing functor for a 2D combinatorial data structure From 744986f2a119bfb34a47a6fda25cc6e768838a2c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 09:34:51 +0200 Subject: [PATCH 095/341] spaces --- .../doc/CGAL_basic_viewers/CGAL_basic_viewers.txt | 2 +- GraphicsView/include/CGAL/Buffer_for_vao.h | 2 +- Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp | 2 +- .../include/CGAL/draw_periodic_2_triangulation_2.h | 8 ++++---- Polygon/include/CGAL/draw_polygon_with_holes_2.h | 4 ++-- .../include/CGAL/draw_face_graph_with_paths.h | 6 +++--- Triangulation_3/include/CGAL/draw_triangulation_3.h | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt index 3cf6e4188ae2..7f268458568a 100644 --- a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt +++ b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt @@ -3,7 +3,7 @@ namespace CGAL { \mainpage User Manual \anchor Chapter_CGAL_Basic_viewers -\anchor +\anchor \cgalAutoToc \author Guillaume Damiand, Mostafa Ashraf diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index 6847863fc64e..6589800a9a23 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -164,7 +164,7 @@ class Buffer_for_vao if (m_flat_normal_buffer!=nullptr) { m_flat_normal_buffer->clear(); } if (m_gouraud_normal_buffer!=nullptr) { m_gouraud_normal_buffer->clear(); } if (m_bb!=nullptr) { (*m_bb)=CGAL::Bbox_3(); } - + m_zero_x=true; m_zero_y=true; m_zero_z=true; diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 9289ade4c088..a773ebdb3f18 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -16,7 +16,7 @@ #include Viewer::Viewer(QWidget *parent) - : Base(parent, m_graphic_buffer, ""), + : Base(parent, m_graphic_buffer, ""), m_previous_scene_empty(true) { m_drawing_functor.volume_color=[](const LCC & alcc, diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index a1ade03cebda..6818134aebf4 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -38,7 +38,7 @@ enum Display_type }; template -void compute_vertex(typename P2T2::Periodic_point_iterator pi, const P2T2 &p2t2, +void compute_vertex(typename P2T2::Periodic_point_iterator pi, const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) { // Construct the point in 9-sheeted covering space and add to viewer @@ -46,7 +46,7 @@ void compute_vertex(typename P2T2::Periodic_point_iterator pi, const P2T2 &p2t2, } template -void compute_edge(typename P2T2::Periodic_segment_iterator si, const P2T2 &p2t2, +void compute_edge(typename P2T2::Periodic_segment_iterator si, const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) { typedef typename P2T2::Segment Segment; @@ -57,8 +57,8 @@ void compute_edge(typename P2T2::Periodic_segment_iterator si, const P2T2 &p2t2, } template -void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2, - CGAL::Graphic_buffer &graphic_buffer, +void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { typedef typename P2T2::Triangle Triangle; diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 560e8eaf4c30..8c8ca0c75c7b 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -53,7 +53,7 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const typename P2::General_polygon_2& p, Graphic_buffer &graphic_buffer, bool hole) { - + if (hole) { graphic_buffer.add_point_in_face(p.vertex(p.size()-1)); } @@ -73,7 +73,7 @@ void compute_one_loop_elements(const typename P2::General_polygon_2& p, Graphic_ } template -void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, +void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index c3fa6ea0b754..e27f4784b787 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -32,7 +32,7 @@ namespace CGAL { - + namespace draw_function_for_lcc { // We need to re-use the namespace draw_function_for_lcc because we want to specialize @@ -98,14 +98,14 @@ struct LCC_geom_utils, Local_kernel, 3> }; } // namespace draw_function_for_lcc - + namespace draw_function_for_face_graph_with_paths { typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - + // Destructor. // lcc.free_mark(m_oriented_mark); diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 8b24306806bf..2f78eb6db50f 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -114,7 +114,7 @@ void compute_elements(const T3 *t3, CGAL::Graphic_buffer &graphic_bu compute_vertex(it, graphic_buffer, drawing_functor, t3); } } - + } // namespace draw_function_for_t3 template @@ -149,10 +149,10 @@ void add_in_graphic_buffer(const T3 &at3, CGAL::Random random((unsigned int)((std::size_t)(&*(fh->first)) + (std::size_t)(fh->second))); - + return get_random_color(random); }; - + add_in_graphic_buffer(at3, graphic_buffer, drawing_functor); } From 47f01c77bc7ee948975ad0a88de80cccff002dbc Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 11:32:58 +0200 Subject: [PATCH 096/341] Remove enum duplication --- GraphicsView/include/CGAL/Graphic_buffer.h | 11 +- .../include/CGAL/Qt/Basic_viewer_qt.h | 153 +++++++----------- 2 files changed, 69 insertions(+), 95 deletions(-) diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index 33ab61b80b86..84c934f33748 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -141,6 +141,12 @@ class Graphic_buffer std::vector &get_array_of_index(int index) { return arrays[index]; } + int get_size_of_index(int index) const + { return static_cast(arrays[index].size()*sizeof(BufferType)); } + + unsigned int number_of_elements(int index) const + { return static_cast(arrays[index].size()/3); } + void update_bounding_box(const CGAL::Bbox_3 &box) { m_bounding_box+=box; } void initiate_bounding_box(const CGAL::Bbox_3& new_bounding_box) @@ -360,10 +366,10 @@ class Graphic_buffer std::vector>& get_m_texts() { return m_texts; } -protected: +public: // The following enum gives the indices of different elements of arrays // vectors. - enum { + enum Buffers { BEGIN_POS = 0, POS_MONO_POINTS = BEGIN_POS, POS_COLORED_POINTS, @@ -393,6 +399,7 @@ class Graphic_buffer LAST_INDEX = END_NORMAL }; +protected: Buffer_for_vao m_buffer_for_mono_points; Buffer_for_vao m_buffer_for_colored_points; Buffer_for_vao m_buffer_for_mono_segments; diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index bb0666e24bb5..96737de517b2 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -83,6 +83,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; + using GB=Graphic_buffer; // Constructor/Destructor Basic_viewer_qt(QWidget* parent, @@ -201,9 +202,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer void clear() { - for (unsigned int i=0; i(gBuffer.get_array_of_index(POS_MONO_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_MONO_POINTS).data(), + gBuffer.get_size_of_index(GB::POS_MONO_POINTS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); + // TODO/QUESTION can we use double for BufferType? + // if not remove the template parameter and use float everywhere. buffers[bufn].release(); @@ -497,8 +500,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_COLORED_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_COLORED_POINTS).data(), + gBuffer.get_size_of_index(GB::POS_COLORED_POINTS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); buffers[bufn].release(); @@ -506,8 +509,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(COLOR_POINTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::COLOR_POINTS).data(), + gBuffer.get_size_of_index(GB::COLOR_POINTS)); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -522,8 +525,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_MONO_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_MONO_SEGMENTS).data(), + gBuffer.get_size_of_index(GB::POS_MONO_SEGMENTS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -539,8 +542,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_COLORED_SEGMENTS).data(), + gBuffer.get_size_of_index(GB::POS_COLORED_SEGMENTS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -549,8 +552,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(COLOR_SEGMENTS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::COLOR_SEGMENTS).data(), + gBuffer.get_size_of_index(GB::COLOR_SEGMENTS)); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -567,8 +570,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_MONO_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_MONO_RAYS).data(), + gBuffer.get_size_of_index(GB::POS_MONO_RAYS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -585,8 +588,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_COLORED_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_COLORED_RAYS).data(), + gBuffer.get_size_of_index(GB::POS_COLORED_RAYS)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -595,8 +598,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(COLOR_RAYS).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::COLOR_RAYS).data(), + gBuffer.get_size_of_index(GB::COLOR_RAYS)); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -612,8 +615,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_MONO_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_MONO_LINES).data(), + gBuffer.get_size_of_index(GB::POS_MONO_LINES)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeArray("vertex",GL_FLOAT,0,3); @@ -630,8 +633,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_COLORED_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_COLORED_LINES).data(), + gBuffer.get_size_of_index(GB::POS_COLORED_LINES)); rendering_program_p_l.enableAttributeArray("vertex"); rendering_program_p_l.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -640,8 +643,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(COLOR_LINES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::COLOR_LINES).data(), + gBuffer.get_size_of_index(GB::COLOR_LINES)); rendering_program_p_l.enableAttributeArray("color"); rendering_program_p_l.setAttributeBuffer("color",GL_FLOAT,0,3); buffers[bufn].release(); @@ -660,8 +663,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_MONO_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_MONO_FACES).data(), + gBuffer.get_size_of_index(GB::POS_MONO_FACES)); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -673,15 +676,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(gBuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).data(), - static_cast(gBuffer.get_array_of_index(FLAT_NORMAL_MONO_FACES).size()* - sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::FLAT_NORMAL_MONO_FACES).data(), + gBuffer.get_size_of_index(GB::FLAT_NORMAL_MONO_FACES)); } else { - buffers[bufn].allocate(gBuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).data(), - static_cast(gBuffer.get_array_of_index(SMOOTH_NORMAL_MONO_FACES).size()* - sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::SMOOTH_NORMAL_MONO_FACES).data(), + gBuffer.get_size_of_index(GB::SMOOTH_NORMAL_MONO_FACES)); } rendering_program_face.enableAttributeArray("normal"); rendering_program_face.setAttributeBuffer("normal",GL_FLOAT,0,3); @@ -699,8 +700,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(POS_COLORED_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_COLORED_FACES).data(), + gBuffer.get_size_of_index(GB::POS_COLORED_FACES)); rendering_program_face.enableAttributeArray("vertex"); rendering_program_face.setAttributeBuffer("vertex",GL_FLOAT,0,3); @@ -712,15 +713,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer buffers[bufn].bind(); if (m_flatShading) { - buffers[bufn].allocate(gBuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).data(), - static_cast(gBuffer.get_array_of_index(FLAT_NORMAL_COLORED_FACES).size()* - sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::FLAT_NORMAL_COLORED_FACES).data(), + gBuffer.get_size_of_index(GB::FLAT_NORMAL_COLORED_FACES)); } else { - buffers[bufn].allocate(gBuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).data(), - static_cast(gBuffer.get_array_of_index(SMOOTH_NORMAL_COLORED_FACES).size()* - sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::SMOOTH_NORMAL_COLORED_FACES).data(), + gBuffer.get_size_of_index(GB::SMOOTH_NORMAL_COLORED_FACES)); } rendering_program_face.enableAttributeArray("normal"); rendering_program_face.setAttributeBuffer("normal",GL_FLOAT,0,3); @@ -731,8 +730,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn(gBuffer.get_array_of_index(COLOR_FACES).size()*sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::COLOR_FACES).data(), + gBuffer.get_size_of_index(GB::COLOR_FACES)); rendering_program_face.enableAttributeArray("color"); rendering_program_face.setAttributeBuffer("color",GL_FLOAT,0,3); @@ -754,8 +753,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer ++bufn; CGAL_assertion(bufn < NB_VBO_BUFFERS); buffers[bufn].bind(); - buffers[bufn].allocate(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).data(), - static_cast(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).size() * sizeof(float))); + buffers[bufn].allocate(gBuffer.get_array_of_index(GB::POS_CLIPPING_PLANE).data(), + gBuffer.get_size_of_index(GB::POS_CLIPPING_PLANE)); rendering_program_clipping_plane.enableAttributeArray("vertex"); rendering_program_clipping_plane.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); @@ -912,7 +911,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_POINTS).size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_POINTS))); vao[VAO_MONO_POINTS].release(); vao[VAO_COLORED_POINTS].bind(); @@ -932,7 +931,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_POINTS).size()/3)); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_POINTS))); vao[VAO_COLORED_POINTS].release(); }; @@ -971,7 +970,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_SEGMENTS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_SEGMENTS))); vao[VAO_MONO_SEGMENTS].release(); vao[VAO_COLORED_SEGMENTS].bind(); @@ -991,7 +990,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_SEGMENTS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_SEGMENTS))); vao[VAO_COLORED_SEGMENTS].release(); }; @@ -1023,7 +1022,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_rays_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_RAYS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_RAYS))); vao[VAO_MONO_RAYS].release(); vao[VAO_COLORED_RAYS].bind(); @@ -1040,7 +1039,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_RAYS).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_RAYS))); vao[VAO_COLORED_RAYS].release(); rendering_program_p_l.release(); @@ -1056,7 +1055,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_lines_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_LINES).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_LINES))); vao[VAO_MONO_LINES].release(); rendering_program_p_l.release(); @@ -1075,7 +1074,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_LINES).size()/3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_LINES))); vao[VAO_COLORED_LINES].release(); rendering_program_p_l.release(); @@ -1109,7 +1108,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.get_array_of_index(POS_MONO_FACES).size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_FACES))); vao[VAO_MONO_FACES].release(); vao[VAO_COLORED_FACES].bind(); @@ -1129,7 +1128,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.get_array_of_index(POS_COLORED_FACES).size()/3)); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_FACES))); vao[VAO_COLORED_FACES].release(); }; @@ -1140,7 +1139,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.bind(); vao[VAO_CLIPPING_PLANE].bind(); glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.get_array_of_index(POS_CLIPPING_PLANE).size() / 3)); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_CLIPPING_PLANE))); glLineWidth(1.0f); vao[VAO_CLIPPING_PLANE].release(); rendering_program_clipping_plane.release(); @@ -1268,11 +1267,11 @@ class Basic_viewer_qt : public CGAL::QGLViewer (bounding_box().zmax() - bounding_box().zmin())); const unsigned int nbSubdivisions=30; - gBuffer.get_array_of_index(POS_CLIPPING_PLANE).clear(); + auto& array = gBuffer.get_array_of_index(GB::POS_CLIPPING_PLANE); + array.clear(); for (unsigned int i=0; i<=nbSubdivisions; ++i) { const float pos = float(size*(2.0*i/nbSubdivisions-1.0)); - auto& array = gBuffer.get_array_of_index(POS_CLIPPING_PLANE); array.push_back(pos); array.push_back(float(-size)); array.push_back(0.f); @@ -1595,40 +1594,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer // CGAL::qglviewer::LocalConstraint constraint; CGAL::qglviewer::WorldConstraint constraint; - // The following enum gives the indices of different elements of arrays vectors. - enum - { - BEGIN_POS=0, - POS_MONO_POINTS=BEGIN_POS, - POS_COLORED_POINTS, - POS_MONO_SEGMENTS, - POS_COLORED_SEGMENTS, - POS_MONO_RAYS, - POS_COLORED_RAYS, - POS_MONO_LINES, - POS_COLORED_LINES, - POS_MONO_FACES, - POS_COLORED_FACES, - POS_CLIPPING_PLANE, - END_POS, - BEGIN_COLOR=END_POS, - COLOR_POINTS=BEGIN_COLOR, - COLOR_SEGMENTS, - COLOR_RAYS, - COLOR_LINES, - COLOR_FACES, - END_COLOR, - BEGIN_NORMAL=END_COLOR, - SMOOTH_NORMAL_MONO_FACES=BEGIN_NORMAL, - FLAT_NORMAL_MONO_FACES, - SMOOTH_NORMAL_COLORED_FACES, - FLAT_NORMAL_COLORED_FACES, - END_NORMAL, - LAST_INDEX=END_NORMAL - }; - - static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ - (END_COLOR-BEGIN_COLOR)+2; // +2 for 2 vectors of normals + static const unsigned int NB_VBO_BUFFERS=(GB::END_POS-GB::BEGIN_POS)+ + (GB::END_COLOR-GB::BEGIN_COLOR)+2; // +2 for 2 vectors of normals QGLBuffer buffers[NB_VBO_BUFFERS]; From 9c77619fde20f3291a22e7433a3dfc586a87aeac Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 15:08:05 +0200 Subject: [PATCH 097/341] Remove unused constructor; move function that does not depend on Qt --- GraphicsView/include/CGAL/Graphic_buffer.h | 42 +++++++------------ .../include/CGAL/Qt/Basic_viewer_qt.h | 14 ------- 2 files changed, 15 insertions(+), 41 deletions(-) diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index 84c934f33748..c12b5aaa1ab0 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -38,6 +39,20 @@ namespace CGAL { +//------------------------------------------------------------------------------ +inline CGAL::IO::Color get_random_color(CGAL::Random& random) +{ + CGAL::IO::Color res; + do + { + res=CGAL::IO::Color(random.get_int(0,256), + random.get_int(0,256), + random.get_int(0,256)); + } + while(res.red()==255 && res.green()==255 && res.blue()==255); + return res; +} +//------------------------------------------------------------------------------ // This class is responsible for dealing with available CGAL data structures and // handling buffers. template @@ -47,33 +62,6 @@ class Graphic_buffer typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; - Graphic_buffer(std::vector (&pos)[20], CGAL::Bbox_3 &bbox) - : m_buffer_for_mono_points(&pos[POS_MONO_POINTS], nullptr, &bbox, nullptr, - nullptr, nullptr), - m_buffer_for_colored_points(&pos[POS_COLORED_POINTS], nullptr, &bbox, - &pos[COLOR_POINTS], nullptr, nullptr), - m_buffer_for_mono_segments(&pos[POS_MONO_SEGMENTS], nullptr, &bbox, - nullptr, nullptr, nullptr), - m_buffer_for_colored_segments(&pos[POS_COLORED_SEGMENTS], nullptr, - &bbox, &pos[COLOR_SEGMENTS], nullptr, - nullptr), - m_buffer_for_mono_rays(&pos[POS_MONO_RAYS], nullptr, &bbox, nullptr, - nullptr), - m_buffer_for_colored_rays(&pos[POS_COLORED_RAYS], nullptr, &bbox, - &pos[COLOR_RAYS], nullptr, nullptr), - m_buffer_for_mono_lines(&pos[POS_MONO_RAYS], nullptr, &bbox, nullptr, - nullptr), - m_buffer_for_colored_lines(&pos[POS_COLORED_LINES], nullptr, &bbox, - &pos[COLOR_LINES], nullptr, nullptr), - m_buffer_for_mono_faces(&pos[POS_MONO_FACES], nullptr, &bbox, nullptr, - &pos[FLAT_NORMAL_MONO_FACES], - &pos[SMOOTH_NORMAL_MONO_FACES]), - m_buffer_for_colored_faces(&pos[POS_COLORED_FACES], nullptr, &bbox, - &pos[COLOR_FACES], - &pos[FLAT_NORMAL_COLORED_FACES], - &pos[SMOOTH_NORMAL_COLORED_FACES]) - {} - Graphic_buffer() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, &m_bounding_box, nullptr, nullptr, nullptr), diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 96737de517b2..2f11a7b7489b 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -52,7 +52,6 @@ #include #include #include -#include #include #include @@ -62,19 +61,6 @@ namespace CGAL { -//------------------------------------------------------------------------------ -inline CGAL::IO::Color get_random_color(CGAL::Random& random) -{ - CGAL::IO::Color res; - do - { - res=CGAL::IO::Color(random.get_int(0,256), - random.get_int(0,256), - random.get_int(0,256)); - } - while(res.red()==255 && res.green()==255 && res.blue()==255); - return res; -} //------------------------------------------------------------------------------ template class Basic_viewer_qt : public CGAL::QGLViewer From afc0eaedf5a00bc96f1fd33c69a19426b56219ad Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 15:08:32 +0200 Subject: [PATCH 098/341] Review of draw for face graph, polyhedron and sm --- BGL/include/CGAL/draw_face_graph.h | 149 +++++++++++------- Polyhedron/include/CGAL/draw_polyhedron.h | 64 +++++--- Surface_mesh/include/CGAL/draw_surface_mesh.h | 48 +++--- 3 files changed, 164 insertions(+), 97 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index e78016a56f15..f5784dc2a794 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -16,41 +16,40 @@ #include #include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - #include #include #include namespace CGAL { -namespace draw_function_for_SM { +namespace draw_function_for_FG { -template -void compute_elements(const SM &sm, +template +void compute_elements(const FG &fg, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor, bool anofaces = false) { - - using Point = - typename boost::property_map_value::type; + const DrawingFunctor &m_drawing_functor) +{ + using Point=typename boost::property_map_value::type; using Kernel = typename CGAL::Kernel_traits::Kernel; using Vector = typename Kernel::Vector_3; - auto vnormals = get(CGAL::dynamic_vertex_property_t(), sm); - auto point_pmap = get(CGAL::vertex_point, sm); - for (auto v : vertices(sm)) { + auto vnormals = get(CGAL::dynamic_vertex_property_t(), fg); + auto point_pmap = get(CGAL::vertex_point, fg); + for (auto v : vertices(fg)) + { Vector n(NULL_VECTOR); int i = 0; - for (auto h : halfedges_around_target(halfedge(v, sm), sm)) { - if (!is_border(h, sm)) { + for (auto h : halfedges_around_target(halfedge(v, fg), fg)) + { + if (!is_border(h, fg)) + { Vector ni = CGAL::cross_product( - Vector(get(point_pmap, source(h, sm)), - get(point_pmap, target(h, sm))), - Vector(get(point_pmap, target(h, sm)), - get(point_pmap, target(next(h, sm), sm)))); - if (ni != NULL_VECTOR) { + Vector(get(point_pmap, source(h, fg)), + get(point_pmap, target(h, fg))), + Vector(get(point_pmap, target(h, fg)), + get(point_pmap, target(next(h, fg), fg)))); + if (ni != NULL_VECTOR) + { n += ni; ++i; } @@ -59,70 +58,104 @@ void compute_elements(const SM &sm, put(vnormals, v, n / i); } - if (!anofaces) { - for (auto fh : faces(sm)) { - if (fh != boost::graph_traits::null_face() && m_drawing_functor.colored_face(sm, fh)) { - CGAL::IO::Color c = m_drawing_functor.face_color(sm, fh); - graphic_buffer.face_begin(c); - auto hd = halfedge(fh, sm); + if (m_drawing_functor.are_faces_enabled()) + { + for (auto fh : faces(fg)) + { + if (fh != boost::graph_traits::null_face() && // face exists + m_drawing_functor.colored_face && // std::function is not null + m_drawing_functor.colored_face(fg, fh)) // and face is colored + { + graphic_buffer.face_begin(m_drawing_functor.face_color(fg, fh)); + auto hd = halfedge(fh, fg); const auto first_hd = hd; - do { - auto v = source(hd, sm); + do + { + auto v = source(hd, fg); graphic_buffer.add_point_in_face(get(point_pmap, v), get(vnormals, v)); - hd = next(hd, sm); - } while (hd != first_hd); + hd = next(hd, fg); + } + while (hd != first_hd); graphic_buffer.face_end(); } } } - for (auto e : edges(sm)) { - graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, sm), sm)), - get(point_pmap, target(halfedge(e, sm), sm))); + if(m_drawing_functor.are_edges_enabled()) + { + for (auto e : edges(fg)) + { + if(m_drawing_functor.colored_edge && // std::function is not null + m_drawing_functor.colored_edge(fg, e)) // and edge is colored + { + graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + get(point_pmap, target(halfedge(e, fg), fg)), + m_drawing_functor.edge_color(fg, e)); + } + else + { + graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + get(point_pmap, target(halfedge(e, fg), fg))); + } + } } - for (auto v : vertices(sm)) { - graphic_buffer.add_point(get(point_pmap, v)); + if(m_drawing_functor.are_vertices_enabled()) + { + for (auto v : vertices(fg)) + { + if(m_drawing_functor.colored_vertex && // std::function is not null + m_drawing_functor.colored_vertex(fg, v)) // and vertex is colored + { + graphic_buffer.add_point(get(point_pmap, v), + m_drawing_functor.vertex_color(fg, v)); + } + else + { + graphic_buffer.add_point(get(point_pmap, v)); + } + } } } -} // draw_function_for_SM +} // draw_function_for_FG -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) { - draw_function_for_SM::compute_elements(sm, graphic_buffer, m_drawing_functor); +template +void add_in_graphic_buffer_for_fg(const FG &fg, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &drawing_functor) +{ + draw_function_for_FG::compute_elements(fg, graphic_buffer, drawing_functor); } -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { - - // Default functor; user can add his own functor. - Drawing_functor::face_descriptor, - typename boost::graph_traits::face_descriptor, - typename boost::graph_traits::face_descriptor> +template +void add_in_graphic_buffer_for_fg(const FG &fg, + CGAL::Graphic_buffer &graphic_buffer) +{ + Drawing_functor::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor> drawing_functor; - drawing_functor.colored_face = [](const SM &, - typename boost::graph_traits::face_descriptor fh) -> bool + drawing_functor.colored_face = [](const FG&, + typename boost::graph_traits::face_descriptor) -> bool { return true; }; - drawing_functor.face_color = [] (const SM &, - typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color + drawing_functor.face_color = [] (const FG&, + typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color { - if (fh == - boost::graph_traits::null_face()) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + if (fh==boost::graph_traits::null_face()) + { return CGAL::IO::Color(100, 125, 200); } + // TODO (?) use a seed given fh (cannot directly cast because FG is either a polyhedron or a surface mesh) return get_random_color(CGAL::get_default_random()); }; - add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); + add_in_graphic_buffer_for_fg(fg, graphic_buffer, drawing_functor); } } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_SURFACE_MESH_H diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index b6d92c56b3ae..826a2b7a6e3c 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -13,57 +13,81 @@ #ifndef CGAL_DRAW_POLYHEDRON_H #define CGAL_DRAW_POLYHEDRON_H +#include #include #include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER -#include #include #include -#include + +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif namespace CGAL { -// Specialization of draw function. #define CGAL_POLY_TYPE CGAL::Polyhedron_3 \ +// Specialization of add_in_graphic_buffer function. template class T_HDS, - class Alloc, typename BufferType = float> + class Alloc, + typename BufferType=float, + class DrawingFunctor> +void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &drawing_functor) +{ add_in_graphic_buffer_for_fg(apoly, graphic_buffer, drawing_functor); } + +template + class T_HDS, + class Alloc, + typename BufferType=float> +void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, + CGAL::Graphic_buffer &graphic_buffer) +{ add_in_graphic_buffer_for_fg(apoly, graphic_buffer); } + +// Specialization of draw function: require Qt and the CGAL basic viewer. +#ifdef CGAL_USE_BASIC_VIEWER + +template + class T_HDS, + class Alloc, + typename BufferType=float> void draw(const CGAL_POLY_TYPE& apoly, - const char* title="Polyhedron Basic Viewer", - bool nofill=false) + const char* title="Polyhedron Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(apoly, buffer); - draw_buffer(buffer); + add_in_graphic_buffer_for_fg(apoly, buffer); + draw_buffer(buffer, title); } template class T_HDS, - class Alloc, typename BufferType = float, class DrawingFunctor> + class Alloc, + typename BufferType=float, + class DrawingFunctor> void draw(const CGAL_POLY_TYPE& apoly, const DrawingFunctor &drawing_functor, - const char* title="Polyhedron Basic Viewer", - bool nofill=false) + const char* title="Polyhedron Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(apoly, buffer, drawing_functor); - draw_buffer(buffer); + add_in_graphic_buffer_for_fg(apoly, buffer, drawing_functor); + draw_buffer(buffer, title); } - +#endif // CGAL_USE_BASIC_VIEWER + #undef CGAL_POLY_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_POLYHEDRON_H diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 184d80c5a830..c6a545a5bf85 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -29,46 +29,56 @@ void draw(const SM& asm); #else // DOXYGEN_RUNNING +#include #include #include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include #include #include +#ifdef CGAL_USE_BASIC_VIEWER +#include +#endif + namespace CGAL { -// Specialization of draw function. -template +template +void add_in_graphic_buffer(const Surface_mesh& amesh, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &drawing_functor) +{ add_in_graphic_buffer_for_fg(amesh, graphic_buffer, drawing_functor); } + +template +void add_in_graphic_buffer(const Surface_mesh& amesh, + CGAL::Graphic_buffer &graphic_buffer) +{ add_in_graphic_buffer_for_fg(amesh, graphic_buffer); } + +#ifdef CGAL_USE_BASIC_VIEWER + + // Specialization of draw function. +template void draw(const Surface_mesh& amesh, - const char* title="Surface_mesh Basic Viewer", - bool nofill=false) + const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer); - draw_buffer(buffer); + add_in_graphic_buffer_for_fg(amesh, buffer); + draw_buffer(buffer, title); } -template +template void draw(const Surface_mesh& amesh, const DrawingFunctor &drawing_functor, - const char* title="Surface_mesh Basic Viewer", - bool nofill=false) + const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer, drawing_functor); - draw_buffer(buffer); + add_in_graphic_buffer_for_fg(amesh, buffer, drawing_functor); + draw_buffer(buffer, title); } -} // End namespace CGAL - #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // DOXYGEN_RUNNING #endif // CGAL_DRAW_SURFACE_MESH_H From 0db66d139c84fa187fa38fc29c394cae3c2a0555 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 15:09:37 +0200 Subject: [PATCH 099/341] example draw sm --- Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp index cbd42788fcc5..c8010cc05875 100644 --- a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp +++ b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp @@ -1,8 +1,6 @@ #include #include - #include - #include typedef CGAL::Simple_cartesian Kernel; From 549fe77b63bde7714bf7cb07787d5afdb1809d99 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 14 Oct 2022 15:16:19 +0200 Subject: [PATCH 100/341] create examples directory for basic viewer --- .../CGAL_basic_viewers/CMakeLists.txt | 21 ++ .../draw_surface_mesh_small_faces.cpp | 27 ++ .../draw_surface_mesh_small_faces.h | 262 ------------------ 3 files changed, 48 insertions(+), 262 deletions(-) create mode 100644 CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt create mode 100644 CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp delete mode 100644 Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt b/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt new file mode 100644 index 000000000000..acfeb6e89425 --- /dev/null +++ b/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt @@ -0,0 +1,21 @@ +# Created by the script cgal_create_cmake_script +# This is the CMake script for compiling a CGAL application. + +#/!\ /!\ +#/!\ /!\ +# Used in /CGAL/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt. +# Careful when modifying + +cmake_minimum_required(VERSION 3.1...3.23) +project(CGAL_basic_viewers) + +#CGAL_Qt5 is needed for the drawing. +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) + +create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") +if(CGAL_Qt5_FOUND) + #link it with the required CGAL libraries + target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) +endif() + +#end of the file diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp new file mode 100644 index 000000000000..2fb9ab9c7c8f --- /dev/null +++ b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point; +typedef CGAL::Surface_mesh Mesh; + +int main(int argc, char* argv[]) +{ + const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); + + Mesh sm; + if(!CGAL::IO::read_polygon_mesh(filename, sm)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + + CGAL::draw(sm); + + return EXIT_SUCCESS; +} diff --git a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h deleted file mode 100644 index 079b96fa8331..000000000000 --- a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh_small_faces.h +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright (c) 2018 GeometryFactory (France) -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Guillaume Damiand -// Mostafa Ashraf - -#ifndef CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H -#define CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H - -#include -#include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include - -#include - -namespace draw_function_for_surface_mesh -{ -template -typename CGAL::Kernel_traits::Kernel::Vector_3 get_face_normal(typename SM::Halfedge_index he, - const SM &sm) -{ - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - - halfedge_descriptor end=he; - unsigned int nb=0; - do - { - CGAL::internal::newell_single_step_3(sm.point(sm.source(he)), - sm.point(sm.target(he)), normal); - ++nb; - he=sm.next(he); - } - while (he!=end); - assert(nb>0); - return (typename Kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); -} - -template -typename CGAL::Kernel_traits::Kernel::Vector_3 get_vertex_normal(typename SM::Halfedge_index he, - const SM &sm) -{ - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Halfedge_index halfedge_descriptor; - - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - - halfedge_descriptor end=he; - do - { - if (!sm.is_border(he)) - { - typename Kernel::Vector_3 n=get_face_normal(he, sm); - normal=typename Kernel::Construct_sum_of_vectors_3()(normal, n); - } - he=sm.next(sm.opposite(he)); - } - while (he!=end); - - if (!typename Kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) - { normal=(typename Kernel::Construct_scaled_vector_3() - (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } - - return normal; -} - -template -void compute_face(typename SM::Face_index fh, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer, - typename CGAL::Kernel_traits::Kernel::FT & m_min_size, - typename CGAL::Kernel_traits::Kernel::FT & m_max_size) -{ - - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Face_index face_descriptor; - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename Kernel::FT FT; - - // TODO: add custom functor, right? - bool m_draw_small_faces = true; - bool m_draw_big_faces = true; - - unsigned int m_threshold = 85; - - // [Face creation] - bool issmall=false; - - // Default color of faces - CGAL::IO::Color c(75,160,255); - - // Compare the size of the face with the % m_threshold - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - // It it is smaller, color the face in red. - if (get(faces_size, fh) -void compute_edge(typename SM::Edge_index e, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer) -{ - /// [Edge creation] - graphic_buffer.add_segment(sm.point(sm.source(sm.halfedge(e))), - sm.point(sm.target(sm.halfedge(e)))); - /// [Edge creation] -} - -template -void compute_vertex(typename SM::Vertex_index vh, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer) -{ - /// [Vertex creation] - graphic_buffer.add_point(sm.point(vh)); - /// [Vertex creation] -} - -template -void compute_elements(const SM &sm, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) -{ - - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Vertex_index vertex_descriptor; - typedef typename SM::Face_index face_descriptor; - typedef typename SM::Edge_index edge_descriptor; - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename Kernel::FT FT; - - FT m_min_size, m_max_size; - - if (sm.faces().begin()!=sm.faces().end()) - { - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - m_min_size=faces_size[*(sm.faces().begin())]; - m_max_size=m_min_size; - FT cur_size; - - for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) - { - cur_size=faces_size[*f]; - if (cur_sizem_max_size) m_max_size=cur_size; - } - } - - for (typename SM::Face_range::iterator f=sm.faces().begin(); - f!=sm.faces().end(); ++f) - { - if (*f!=boost::graph_traits::null_face()) - { compute_face(*f, sm, graphic_buffer, m_min_size, m_max_size); } - } - - for (typename SM::Edge_range::iterator e=sm.edges().begin(); - e!=sm.edges().end(); ++e) - { compute_edge(*e, sm, graphic_buffer); } - - for (typename SM::Vertex_range::iterator v=sm.vertices().begin(); - v!=sm.vertices().end(); ++v) - { compute_vertex(*v, sm, graphic_buffer); } -} - -} // draw_function_for_surface_mesh - -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) { - draw_function_for_surface_mesh::compute_elements(sm, graphic_buffer, m_drawing_functor); -} - -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { - - CGAL::Drawing_functor drawing_functor; - - add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); -} - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh, - const DrawingFunctor &drawing_functor) -{ - CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer, drawing_functor); - draw_buffer(buffer); -} - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh) -{ - CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer); - draw_buffer(buffer); -} - -#else // CGAL_USE_BASIC_VIEWER - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&) -{ - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&, const DrawingFunctor &drawing_functor) -{ - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Fri, 14 Oct 2022 16:03:25 +0200 Subject: [PATCH 101/341] some drawing functor are necessary non null; review of draw for lcc. --- BGL/include/CGAL/draw_face_graph.h | 8 +++---- GraphicsView/include/CGAL/Drawing_functor.h | 3 +++ .../include/CGAL/Qt/Basic_viewer_qt.h | 8 ++++++- .../include/CGAL/draw_linear_cell_complex.h | 22 +++++++++---------- Polyhedron/include/CGAL/draw_polyhedron.h | 3 --- Surface_mesh/include/CGAL/draw_surface_mesh.h | 3 --- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index f5784dc2a794..b47de2b34ee5 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -63,7 +63,7 @@ void compute_elements(const FG &fg, for (auto fh : faces(fg)) { if (fh != boost::graph_traits::null_face() && // face exists - m_drawing_functor.colored_face && // std::function is not null + !m_drawing_functor.face_wireframe(fg, fh) && // face is not wireframe m_drawing_functor.colored_face(fg, fh)) // and face is colored { graphic_buffer.face_begin(m_drawing_functor.face_color(fg, fh)); @@ -85,8 +85,7 @@ void compute_elements(const FG &fg, { for (auto e : edges(fg)) { - if(m_drawing_functor.colored_edge && // std::function is not null - m_drawing_functor.colored_edge(fg, e)) // and edge is colored + if(m_drawing_functor.colored_edge(fg, e)) // edge is colored { graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), @@ -104,8 +103,7 @@ void compute_elements(const FG &fg, { for (auto v : vertices(fg)) { - if(m_drawing_functor.colored_vertex && // std::function is not null - m_drawing_functor.colored_vertex(fg, v)) // and vertex is colored + if(m_drawing_functor.colored_vertex(fg, v)) // vertex is colored { graphic_buffer.add_point(get(point_pmap, v), m_drawing_functor.vertex_color(fg, v)); diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index 139e93e76388..0a9ff09cb1df 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -41,6 +41,7 @@ struct Drawing_functor face_wireframe=[](const DS &, face_handle)->bool { return false; }; } + // The seven following functions should not be null std::function draw_vertex; std::function draw_edge; std::function draw_face; @@ -51,6 +52,8 @@ struct Drawing_functor std::function face_wireframe; + // These functions must be non null if the corresponding colored_XXX function + // returns true. std::function vertex_color; std::function edge_color; std::function face_color; diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 2f11a7b7489b..9da5555e705d 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -1670,7 +1670,13 @@ namespace CGAL { template - void draw(const T&, const char* ="", bool=false) + void draw(const T&, const char* ="") + { + std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + void draw(const T&, const DrawingFunctor &, const char* ="") { std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< - -#ifdef CGAL_USE_BASIC_VIEWER - #include #include #include @@ -81,13 +78,11 @@ void compute_face(typename LCC::Dart_const_handle dh, if (m_drawing_functor.colored_volume(*lcc, voldh)) { - CGAL::IO::Color c=m_drawing_functor.volume_color(*lcc, voldh); - graphic_buffer.face_begin(c); + graphic_buffer.face_begin(m_drawing_functor.volume_color(*lcc, voldh)); } else if (m_drawing_functor.colored_face(*lcc, dh)) { - CGAL::IO::Color c=m_drawing_functor.face_color(*lcc, dh); - graphic_buffer.face_begin(c); + graphic_buffer.face_begin(m_drawing_functor.face_color(*lcc, dh)); } else { graphic_buffer.face_begin(); } @@ -128,7 +123,7 @@ void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, } } -template +template void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, const DrawingFunctorLCC &m_drawing_functor, CGAL::Graphic_buffer &graphic_buffer) @@ -146,8 +141,9 @@ void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, { graphic_buffer.add_point(lcc->point(dh)); } } -template -void compute_elements(const LCC *lcc, CGAL::Graphic_buffer &graphic_buffer, +template +void compute_elements(const LCC *lcc, + CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { if (lcc==nullptr) @@ -277,6 +273,8 @@ void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, add_in_graphic_buffer(alcc, graphic_buffer, drawing_functor_with_volume); } +#ifdef CGAL_USE_BASIC_VIEWER + // Specialization of draw function for a LCC, with a drawing functor. template #include #include - -#ifdef CGAL_USE_BASIC_VIEWER #include -#endif namespace CGAL { diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index c6a545a5bf85..06edfe14e63c 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -34,10 +34,7 @@ void draw(const SM& asm); #include #include #include - -#ifdef CGAL_USE_BASIC_VIEWER #include -#endif namespace CGAL { From 1e8ef8f05ad704ea73dc56a10ce1cff762ef5076 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 17 Oct 2022 16:21:02 +0200 Subject: [PATCH 102/341] Update LCC demo to use a 'better' color for faces. --- .../demo/Linear_cell_complex/MainWindow.ui | 52 +++++++++---------- .../demo/Linear_cell_complex/Viewer.cpp | 30 ++++++++--- .../demo/Linear_cell_complex/Viewer.h | 8 +-- .../include/CGAL/draw_linear_cell_complex.h | 9 ++-- 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.ui b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.ui index d63b9d7c9b1e..6a9f06c68d25 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.ui +++ b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.ui @@ -38,7 +38,7 @@ - &File + File @@ -55,7 +55,7 @@ - &Operations + Operations @@ -75,7 +75,7 @@ - &Creations + Creations @@ -88,7 +88,7 @@ - &View + View @@ -103,67 +103,67 @@ - &Import OFF + Import OFF - &Quit + Quit - &Subdivide all volumes + Subdivide all volumes - &Subdivide all volumes - by Pqq + Subdivide all volumes - by Pqq - Create &3 cubes + Create 3 cubes - Import 3D&TS + Import 3DTS - &Clear + Clear - Create &2 volumes + Create 2 volumes - &Dual + Dual - &Close all volumes + Close all volumes - Create &cube + Create cube - S&ew3 all same facets + Sew3 all same facets - Create &mesh + Create mesh @@ -173,22 +173,22 @@ - &Remove volumes + Remove volumes - &Triangulate facets + Triangulate facets - &Unsew3 volumes + Unsew3 volumes - Reverse &orientation + Reverse orientation @@ -201,12 +201,12 @@ - Extend &filled volumes + Extend filled volumes - Extend &hidden volumes + Extend hidden volumes @@ -216,7 +216,7 @@ - &Merge volumes + Merge volumes @@ -231,12 +231,12 @@ - &Load + Load - &Save + Save diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index a773ebdb3f18..6a7ba68de51f 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -19,17 +19,32 @@ Viewer::Viewer(QWidget *parent) : Base(parent, m_graphic_buffer, ""), m_previous_scene_empty(true) { - m_drawing_functor.volume_color=[](const LCC & alcc, - Dart_const_handle dh)->CGAL::IO::Color - { return alcc.template info<3>(dh).color(); }; + m_drawing_functor.face_color=[](const LCC & alcc, + Dart_const_descriptor dh)->CGAL::IO::Color + { + if(alcc.template is_free<3>(dh)) + { return alcc.template info<3>(dh).color(); } - m_drawing_functor.colored_volume=[](const LCC &, Dart_const_handle)->bool + if(!alcc.template info<3>(dh).is_visible() || + !alcc.template info<3>(dh).is_filled()) + { return alcc.template info<3>(alcc.template beta<3>(dh)).color(); } + + if(!alcc.template info<3>(alcc.template beta<3>(dh)).is_visible() || + !alcc.template info<3>(alcc.template beta<3>(dh)).is_filled()) + { return alcc.template info<3>(dh).color(); } + + const CGAL::IO::Color& c1=alcc.template info<3>(dh).color(); + const CGAL::IO::Color& c2=alcc.template info<3>(alcc.template beta<3>(dh)).color(); + return CGAL::IO::Color((c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2); + }; + + m_drawing_functor.colored_face=[](const LCC &, Dart_const_descriptor)->bool { return true; }; - m_drawing_functor.draw_volume=[](const LCC & alcc, Dart_const_handle dh)->bool + m_drawing_functor.draw_volume=[](const LCC & alcc, Dart_const_descriptor dh)->bool { return alcc.template info<3>(dh).is_visible(); }; - m_drawing_functor.volume_wireframe=[](const LCC& alcc, Dart_const_handle dh)->bool + m_drawing_functor.volume_wireframe=[](const LCC& alcc, Dart_const_descriptor dh)->bool { return !(alcc.template info<3>(dh).is_filled()); }; } @@ -69,4 +84,5 @@ void Viewer::keyPressEvent(QKeyEvent *e) Base::keyPressEvent(e); } -QString Viewer::helpString() const { return Base::helpString("LCC Demo"); } +QString Viewer::helpString() const +{ return Base::helpString("LCC Demo"); } diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 3b782fe09a82..c72feee6f32b 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -35,10 +35,10 @@ public Q_SLOTS: private: CGAL::Drawing_functor_with_volume m_drawing_functor; + Dart_const_descriptor, + Dart_const_descriptor, + Dart_const_descriptor, + Dart_const_descriptor> m_drawing_functor; CGAL::Graphic_buffer m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index d3718681031a..add255dfa6e0 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -111,7 +111,7 @@ void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, const typename LCC::Point& p1=lcc->point(dh); typename LCC::Dart_const_handle d2=lcc->other_extremity(dh); - if (d2!=nullptr) + if (d2!=LCC::null_descriptor) { if (m_drawing_functor.colored_edge(*lcc, dh)) { @@ -173,7 +173,9 @@ void compute_elements(const LCC *lcc, lcc->is_marked(itv, oriented_mark) && m_drawing_functor.draw_face(*lcc, itv)) { - if (!m_drawing_functor.volume_wireframe(*lcc, itv) && + if ((!m_drawing_functor.volume_wireframe(*lcc, itv) || + (!lcc->template is_free<3>(itv) && + !m_drawing_functor.volume_wireframe(*lcc, lcc->template beta<3>(itv)))) && !m_drawing_functor.face_wireframe(*lcc, itv)) { compute_face(itv, it, lcc, m_drawing_functor, graphic_buffer); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator @@ -240,7 +242,8 @@ void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor) { - draw_function_for_lcc::compute_elements(&alcc, graphic_buffer, m_drawing_functor); + draw_function_for_lcc::compute_elements(static_cast(&alcc), + graphic_buffer, m_drawing_functor); } // add_in_graphic_buffer: to add a LCC in the given graphic buffer, without a From 58fead22b1c2a3ba40ec7e1f48b605bf9051e610 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 17 Oct 2022 17:53:56 +0200 Subject: [PATCH 103/341] draw nef3 review --- .../CGAL_basic_viewers/CMakeLists.txt | 2 +- Nef_3/include/CGAL/draw_nef_3.h | 252 ++++++++++-------- 2 files changed, 139 insertions(+), 115 deletions(-) diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt b/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt index acfeb6e89425..e5a6aa07ad8b 100644 --- a/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt +++ b/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt @@ -7,7 +7,7 @@ # Careful when modifying cmake_minimum_required(VERSION 3.1...3.23) -project(CGAL_basic_viewers) +project(CGAL_basic_viewers_Examples) #CGAL_Qt5 is needed for the drawing. find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 1c4e2ac1eb95..ccff10a5ef7c 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -14,14 +14,10 @@ #ifndef DRAW_NEF_3_H #define DRAW_NEF_3_H -#include -#include #include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include +#include +#include #include #include #include @@ -40,46 +36,44 @@ typedef Local_kernel::Vector_3 Local_vector; template Local_vector get_face_normal(typename Nef_Polyhedron::SHalfedge_const_handle she) { - typedef typename Nef_Polyhedron::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator; - - SHalfedge_around_facet_const_circulator he(she); - Local_vector normal = CGAL::NULL_VECTOR; - SHalfedge_around_facet_const_circulator end = he; - unsigned int nb = 0; + typename Nef_Polyhedron::SHalfedge_around_facet_const_circulator he(she), end(he); + Local_vector normal=CGAL::NULL_VECTOR; + unsigned int nb=0; + using GU=internal::Geom_utils::Kernel, + Local_kernel>; CGAL_For_all(he, end) { - internal::newell_single_step_3(Basic_viewer_qt<>::get_local_point - (he->next()->source()->center_vertex()->point()), - Basic_viewer_qt<>::get_local_point(he->source()->center_vertex()-> - point()), normal); + internal::newell_single_step_3(GU::get_local_point(he->next()->source()-> + center_vertex()->point()), + GU::get_local_point(he->source()->center_vertex()-> + point()), normal); ++nb; } CGAL_assertion(nb > 0); - return (typename Local_kernel::Construct_scaled_vector_3()(normal, 1.0 / nb)); + return (typename Local_kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); } template Local_vector get_vertex_normal(typename Nef_Polyhedron::Vertex_const_handle vh) { - typedef typename Nef_Polyhedron::SHalfedge_const_handle SHalfedge_const_handle; - typedef typename Nef_Polyhedron::SHalfedge_const_iterator SHalfedge_const_iterator; - - Local_vector normal = CGAL::NULL_VECTOR; - - SHalfedge_const_iterator it = vh->shalfedges_begin(); - SHalfedge_const_handle end = it; - do { - Local_vector n = get_face_normal(it); - normal = typename Local_kernel::Construct_sum_of_vectors_3()(normal, n); - it = it->snext(); - } while( it != end ); + typename Nef_Polyhedron::SHalfedge_const_iterator it=vh->shalfedges_begin(); + typename Nef_Polyhedron::SHalfedge_const_handle end=it; + Local_vector normal=CGAL::NULL_VECTOR; + do + { + Local_vector n=get_face_normal(it); + normal=typename Local_kernel::Construct_sum_of_vectors_3()(normal, n); + it=it->snext(); + } + while(it!=end); if (!typename Local_kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) { - normal = (typename Local_kernel::Construct_scaled_vector_3()( - normal, 1.0 / CGAL::sqrt(normal.squared_length()))); + normal=(typename Local_kernel::Construct_scaled_vector_3() + (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } return normal; @@ -96,51 +90,63 @@ class Nef_Visitor { typedef typename Nef_Polyhedron::Vertex_const_handle Vertex_const_handle; typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; typedef typename Nef_Polyhedron::SHalfloop_const_handle SHalfloop_const_handle; - typedef typename Nef_Polyhedron::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator; + typedef typename Nef_Polyhedron::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator; public: - Nef_Visitor(const Nef_Polyhedron &_nef, - CGAL::Graphic_buffer & _graphic_buffer, - const DrawingFunctor &_drawing_functor) - : n_faces(0), n_edges(0), + Nef_Visitor(const Nef_Polyhedron&_nef, + CGAL::Graphic_buffer& _graphic_buffer, + const DrawingFunctor&_drawing_functor) : + n_faces(0), n_edges(0), nef(_nef), graphic_buffer(_graphic_buffer), - drawing_functor(_drawing_functor) {} + drawing_functor(_drawing_functor) + {} - void visit(Vertex_const_handle vh) { - graphic_buffer.add_point(vh->point()); + void visit(Vertex_const_handle vh) + { + if (!drawing_functor.are_vertices_enabled() || + !drawing_functor.draw_vertex(nef, vh)) + { return; } + + if(drawing_functor.colored_vertex(nef, vh)) + { graphic_buffer.add_point(vh->point(), + drawing_functor.vertex_color(nef, vh)); } + else + { graphic_buffer.add_point(vh->point()); } } void visit(Halffacet_const_handle opposite_facet) { - Halffacet_const_handle f = opposite_facet->twin(); + if (!drawing_functor.are_faces_enabled() || + !drawing_functor.draw_face(nef, opposite_facet)) + { return; } - if (facets_done.find(f) != facets_done.end() || - facets_done.find(opposite_facet) != facets_done.end()) { - return; - } + Halffacet_const_handle f=opposite_facet->twin(); + if (facets_done.find(f)!=facets_done.end() || + facets_done.find(opposite_facet)!=facets_done.end()) + { return; } SHalfedge_const_handle se; Halffacet_cycle_const_iterator fc = f->facet_cycles_begin(); se = SHalfedge_const_handle(fc); // non-zero if shalfedge is returned - if(se == 0) - { //return if not-shalfedge - return; - } + if(se==0) + { return; } //return if not-shalfedge - if(drawing_functor.colored_face(nef, f)) { - CGAL::IO::Color c = drawing_functor.face_color(nef, f); - graphic_buffer.face_begin(c); - } + if(drawing_functor.colored_face(nef, f)) + { graphic_buffer.face_begin(drawing_functor.face_color(nef, f)); } + else + { graphic_buffer.face_begin(); } SHalfedge_around_facet_const_circulator hc_start(se); SHalfedge_around_facet_const_circulator hc_end(hc_start); Vertex_const_handle lastvh; - CGAL_For_all(hc_start, hc_end) { + CGAL_For_all(hc_start, hc_end) + { Vertex_const_handle vh=hc_start->source()->center_vertex(); lastvh=vh; - graphic_buffer.add_point_in_face(vh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(vh)); + graphic_buffer.add_point_in_face(vh->point(), + get_vertex_normal(vh)); } // Now iterate through holes of the face @@ -150,34 +156,43 @@ class Nef_Visitor { se = SHalfedge_const_handle(fc); hc_start=se; hc_end=hc_start; - CGAL_For_all(hc_start, hc_end) { + CGAL_For_all(hc_start, hc_end) + { Vertex_const_handle vh=hc_start->source()->center_vertex(); - graphic_buffer.add_point_in_face(vh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(vh)); + graphic_buffer.add_point_in_face(vh->point(), + get_vertex_normal(vh)); } graphic_buffer.add_point_in_face(hc_start->source()->center_vertex()->point(), - draw_function_for_nef_polyhedron::get_vertex_normal(hc_start->source()->center_vertex())); - graphic_buffer.add_point_in_face(lastvh->point(), draw_function_for_nef_polyhedron::get_vertex_normal(lastvh)); + get_vertex_normal + (hc_start->source()->center_vertex())); + graphic_buffer.add_point_in_face(lastvh->point(), + get_vertex_normal(lastvh)); ++fc; } graphic_buffer.face_end(); facets_done[f]=true; - n_faces++; + ++n_faces; } void visit(Halfedge_const_handle he) { - Halfedge_const_handle twin = he->twin(); - if (edges_done.find(he) != edges_done.end() || - edges_done.find(twin) != edges_done.end()) - { - // Edge already added - return; - } - - graphic_buffer.add_segment(he->source()->point(), he->target()->point()); - edges_done[he] = true; - n_edges++; + if (!drawing_functor.are_edges_enabled() || + !drawing_functor.draw_edge(nef, he)) + { return; } + + Halfedge_const_handle twin=he->twin(); + if (edges_done.find(he)!=edges_done.end() || + edges_done.find(twin)!=edges_done.end()) + { return; } // Edge already added + + if(drawing_functor.colored_edge(nef, he)) + { graphic_buffer.add_segment(he->source()->point(), he->target()->point(), + drawing_functor.edge_color(nef, he)); } + else + { graphic_buffer.add_segment(he->source()->point(), he->target()->point()); } + edges_done[he]=true; + ++n_edges; } void visit(SHalfedge_const_handle ) {} @@ -190,28 +205,27 @@ class Nef_Visitor { std::unordered_map edges_done; CGAL::Graphic_buffer& graphic_buffer; const DrawingFunctor& drawing_functor; - const Nef_Polyhedron &nef; + const Nef_Polyhedron& nef; }; -template -void compute_elements(const Nef_Polyhedron &nef, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +template +void compute_elements(const Nef_Polyhedron &nef, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &drawing_functor) { - typedef typename Nef_Polyhedron::Volume_const_iterator Volume_const_iterator; - typedef typename Nef_Polyhedron::Shell_entry_const_iterator Shell_entry_const_iterator; - typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; + typedef typename Nef_Polyhedron::Volume_const_iterator Volume_const_iterator; + typedef typename Nef_Polyhedron::Shell_entry_const_iterator Shell_entry_const_iterator; + typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; Volume_const_iterator c; - - Nef_Visitor V(nef, graphic_buffer, m_drawing_functor); + Nef_Visitor + V(nef, graphic_buffer, drawing_functor); CGAL_forall_volumes(c, nef) { Shell_entry_const_iterator it; CGAL_forall_shells_of(it, c) - { - nef.visit_shell_objects(SFace_const_handle(it), V); - } + { nef.visit_shell_objects(SFace_const_handle(it), V); } } graphic_buffer.negate_all_normals(); @@ -219,65 +233,75 @@ void compute_elements(const Nef_Polyhedron &nef, CGAL::Graphic_buffer -void add_in_graphic_buffer(const Nef_Polyhedron &nef, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) { - draw_function_for_nef_polyhedron::compute_elements(nef, graphic_buffer, m_drawing_functor); -} +#define CGAL_NEF3_TYPE Nef_polyhedron_3 -template -void add_in_graphic_buffer(const Nef_Polyhedron &nef, CGAL::Graphic_buffer &graphic_buffer) { +// add_in_graphic_buffer +template +void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &drawing_functor) +{ + draw_function_for_nef_polyhedron::compute_elements(anef, + graphic_buffer, + drawing_functor); +} +template +void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, + CGAL::Graphic_buffer &graphic_buffer) +{ // Default functor; user can add his own functor. - Drawing_functor + Drawing_functor drawing_functor; - drawing_functor.colored_face = [] (const Nef_Polyhedron&, - typename Nef_Polyhedron::Halffacet_const_handle fh) -> bool - { - return true; - }; + drawing_functor.colored_face = [] (const CGAL_NEF3_TYPE&, + typename CGAL_NEF3_TYPE::Halffacet_const_handle) -> bool + { return true; }; - drawing_functor.face_color = [] (const Nef_Polyhedron&, - typename Nef_Polyhedron::Halffacet_const_handle fh) -> CGAL::IO::Color + drawing_functor.face_color = [] (const CGAL_NEF3_TYPE&, + typename CGAL_NEF3_TYPE::Halffacet_const_handle fh) -> CGAL::IO::Color { - if (fh == nullptr) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + if (fh==nullptr) // use to get the mono color + { return CGAL::IO::Color(100, 125, 200); } CGAL::Random random((unsigned int)(std::size_t)(&(*fh))); return get_random_color(random); }; - add_in_graphic_buffer(nef, graphic_buffer, drawing_functor); + add_in_graphic_buffer(anef, graphic_buffer, drawing_functor); } -#define CGAL_NEF3_TYPE Nef_polyhedron_3 +#ifdef CGAL_USE_BASIC_VIEWER +// Specialization of draw function template + typename BufferType=float, class DrawingFunctor> void draw(const CGAL_NEF3_TYPE &anef, const DrawingFunctor &drawing_functor, - bool nofill = false) { + const char *title="Nef Polyhedron Viewer") +{ CGAL::Graphic_buffer buffer; add_in_graphic_buffer(anef, buffer, drawing_functor); - draw_buffer(buffer); + draw_buffer(buffer, title); } -template +template void draw(const CGAL_NEF3_TYPE &anef, - const char *title = "Nef Polyhedron Viewer", - bool nofill = false) { + const char *title="Nef Polyhedron Viewer") +{ CGAL::Graphic_buffer buffer; add_in_graphic_buffer(anef, buffer); - draw_buffer(buffer); + draw_buffer(buffer, title); } -} // End namespace CGAL - #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // DRAW_NEF_3_H From 8e93b8ccbc4c609cfd24543a3148e2ec2cafac23 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 17 Oct 2022 18:02:52 +0200 Subject: [PATCH 104/341] spaces --- BGL/include/CGAL/draw_face_graph.h | 6 +++--- Polyhedron/include/CGAL/draw_polyhedron.h | 4 ++-- Surface_mesh/include/CGAL/draw_surface_mesh.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index b47de2b34ee5..a691e0c2fcf7 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -86,7 +86,7 @@ void compute_elements(const FG &fg, for (auto e : edges(fg)) { if(m_drawing_functor.colored_edge(fg, e)) // edge is colored - { + { graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), m_drawing_functor.edge_color(fg, e)); @@ -104,12 +104,12 @@ void compute_elements(const FG &fg, for (auto v : vertices(fg)) { if(m_drawing_functor.colored_vertex(fg, v)) // vertex is colored - { + { graphic_buffer.add_point(get(point_pmap, v), m_drawing_functor.vertex_color(fg, v)); } else - { + { graphic_buffer.add_point(get(point_pmap, v)); } } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 85e3b363f086..81bbdb4370f2 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -51,7 +51,7 @@ void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, // Specialization of draw function: require Qt and the CGAL basic viewer. #ifdef CGAL_USE_BASIC_VIEWER - + template @@ -82,7 +82,7 @@ void draw(const CGAL_POLY_TYPE& apoly, draw_buffer(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER - + #undef CGAL_POLY_TYPE } // End namespace CGAL diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 06edfe14e63c..cad60c4e87d4 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -44,12 +44,12 @@ void add_in_graphic_buffer(const Surface_mesh& amesh, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &drawing_functor) { add_in_graphic_buffer_for_fg(amesh, graphic_buffer, drawing_functor); } - + template void add_in_graphic_buffer(const Surface_mesh& amesh, CGAL::Graphic_buffer &graphic_buffer) { add_in_graphic_buffer_for_fg(amesh, graphic_buffer); } - + #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. From 1b1e6999e1644ffb7a4bc9d2838dad19c1bafb9e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 17 Oct 2022 19:44:26 +0200 Subject: [PATCH 105/341] Review point set 3 --- Point_set_3/include/CGAL/draw_point_set_3.h | 96 +++++++++++++-------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 087092a05623..80e372ca7446 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -14,8 +14,11 @@ #ifndef CGAL_DRAW_POINT_SET_3_H #define CGAL_DRAW_POINT_SET_3_H -#include #include +#include +#include +#include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -35,55 +38,80 @@ void draw(const PS& aps); } /* namespace CGAL */ #endif -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include -#include - namespace CGAL { namespace draw_function_for_PointSet { -template -void compute_vertex(const typename PointSet::Point_map::value_type &p, - Graphic_buffer &graphic_buffer) { - graphic_buffer.add_point(p); - - // We can use add_point(p, c) with c a CGAL::IO::Color to add a colored point - // E.g: graphic_buffer.add_point(p, CGAL::IO::Color(100, 125, 200)); -} - -template -void compute_elements(const PointSet *pointset, - Graphic_buffer &graphic_buffer) { - for (typename PointSet::const_iterator it = pointset->begin(); - it != pointset->end(); ++it) { - compute_vertex(pointset->point(*it), graphic_buffer); +template +void compute_elements(const PointSet& pointset, + Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.are_vertices_enabled()) + { return; } + + for (typename PointSet::const_iterator it=pointset.begin(); + it!=pointset.end(); ++it) + { + if(drawing_functor.draw_vertex(pointset, it)) + { + if (drawing_functor.colored_vertex(pointset, it)) + { + graphic_buffer.add_point(pointset.point(*it), + drawing_functor.vertex_color(pointset, it)); + } + else + { graphic_buffer.add_point(pointset.point(*it)); } + } } } } // namespace draw_function_for_PointSet -template -void add_in_graphic_buffer(Graphic_buffer &graphic_buffer, - const PointSet *aPointSet = nullptr) { - if (aPointSet != nullptr) { - draw_function_for_PointSet::compute_elements(aPointSet, graphic_buffer); - } +template +void add_in_graphic_buffer(const Point_set_3& apointset, + Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + draw_function_for_PointSet::compute_elements(apointset, + graphic_buffer, + drawing_functor); } +template +void add_in_graphic_buffer(const Point_set_3& apointset, + Graphic_buffer& graphic_buffer) +{ + CGAL::Drawing_functor, + typename Point_set_3::const_iterator, + int, int> drawing_functor; + add_in_graphic_buffer(apointset, graphic_buffer, drawing_functor); +} + +#ifdef CGAL_USE_BASIC_VIEWER + // Specialization of draw function. -template -void draw(const Point_set_3 &apointset, - const char *title = "Point_set_3 Basic Viewer") { + template +void draw(const Point_set_3& apointset, + const DrawingFunctor& drawing_functor, + const char *title="Point_set_3 Basic Viewer") +{ Graphic_buffer buffer; - add_in_graphic_buffer(buffer, &apointset); - draw_buffer(buffer); + add_in_graphic_buffer(apointset, buffer, drawing_functor); + draw_buffer(buffer, title); } -} // End namespace CGAL +template +void draw(const Point_set_3& apointset, + const char *title="Point_set_3 Basic Viewer") +{ + Graphic_buffer buffer; + add_in_graphic_buffer(apointset, buffer); + draw_buffer(buffer, title); +} #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // CGAL_DRAW_POINT_SET_3_H From 72c760845ae9866c475991a053eca0310a9ebdf2 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 08:42:53 +0200 Subject: [PATCH 106/341] review draw polygon2 --- Polygon/include/CGAL/draw_polygon_2.h | 120 +++++++++++++++++--------- 1 file changed, 79 insertions(+), 41 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 2b29ee2dc4fd..e97a29bcd597 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -18,9 +18,10 @@ #ifndef CGAL_DRAW_POLYGON_2_H #define CGAL_DRAW_POLYGON_2_H -#include -#include #include +#include +#include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -41,70 +42,107 @@ void draw(const P& ap); #endif -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include -#include - namespace CGAL { namespace draw_function_for_p2 { -template -void compute_elements(CGAL::Graphic_buffer &graphic_buffer, - const P2 *p2) { - - typedef typename P2::Point_2 Point; - - if (p2->is_empty()) +template +void compute_elements(const P2& p2, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (p2.is_empty()) return; - Point prev = p2->vertex(p2->size() - 1); + typename P2::Point_2 prev=p2.vertex(p2.size()-1); - CGAL::IO::Color c(75, 160, 255); - graphic_buffer.face_begin(c); + if (drawing_functor.are_faces_enabled()) + { + if(drawing_functor.colored_face(p2, nullptr)) + { graphic_buffer.face_begin(drawing_functor.face_color(p2, nullptr)); } + else + { graphic_buffer.face_begin(); } + } + + for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); + i!=p2.vertices_end(); ++i) + { + if(drawing_functor.are_vertices_enabled() && + drawing_functor.draw_vertex(p2, i)) + { // Add vertex + if(drawing_functor.colored_vertex(p2, i)) + { graphic_buffer.add_point(*i, drawing_functor.vertex_color(p2, i)); } + else + { graphic_buffer.add_point(*i); } + } + + if(drawing_functor.are_edges_enabled() && + drawing_functor.draw_edge(p2, i)) + { // Add edge with previous point + if(drawing_functor.colored_vertex(p2, i)) + { graphic_buffer.add_segment(prev, *i, drawing_functor.edge_color(p2, i)); } + else + { graphic_buffer.add_segment(prev, *i); } + } + + if(drawing_functor.are_faces_enabled()) + { graphic_buffer.add_point_in_face(*i); } // Add point in face - for (typename P2::Vertex_const_iterator i = p2->vertices_begin(); - i != p2->vertices_end(); ++i) { - graphic_buffer.add_point(*i); // Add vertex - graphic_buffer.add_segment(prev, *i); // Add segment with previous point - graphic_buffer.add_point_in_face(*i); // Add point in face prev = *i; } - graphic_buffer.face_end(); + if (drawing_functor.are_faces_enabled()) + { graphic_buffer.face_end(); } } } // namespace draw_function_for_p2 -template -void add_in_graphic_buffer(CGAL::Graphic_buffer &graphic_buffer, - const P2 *p2 = nullptr) { - if (p2 != nullptr) { - draw_function_for_p2::compute_elements(graphic_buffer, p2); - } +#define CGAL_P2_TYPE CGAL::Polygon_2 + +// Specializations of add_in_graphic_buffer function + +template +void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawingfunctor) +{ draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); } + +template +void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, + CGAL::Graphic_buffer &graphic_buffer) +{ + CGAL::Drawing_functor drawingfunctor; + draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); } // Specialization of draw function. -#define CGAL_P2_TYPE CGAL::Polygon_2 + +#ifdef CGAL_USE_BASIC_VIEWER template void draw(const CGAL_P2_TYPE &ap2, - const char *title = "Polygon_2 Basic Viewer") { - - // Drawing_functor - // drawingFunctor; - + const char *title="Polygon_2 Basic Viewer") +{ CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(buffer, &ap2); - draw_buffer(buffer); + add_in_graphic_buffer(ap2, buffer); + draw_buffer(buffer, title); } -} // End namespace CGAL +template +void draw(const CGAL_P2_TYPE &ap2, + const DrawingFunctor& drawingfunctor, + const char *title="Polygon_2 Basic Viewer") +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ap2, buffer, drawingfunctor); + draw_buffer(buffer, title); +} #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // CGAL_DRAW_POLYGON_2_H From 199499b1dcc195d4d7c1841056c10a738f0303ae Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 09:23:18 +0200 Subject: [PATCH 107/341] Review draw polygon with holes --- .../include/CGAL/draw_polygon_with_holes_2.h | 136 +++++++++++------- 1 file changed, 84 insertions(+), 52 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 8c8ca0c75c7b..b90e2ba2d481 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -18,9 +18,10 @@ #ifndef CGAL_DRAW_POLYGON_WITH_HOLES_2_H #define CGAL_DRAW_POLYGON_WITH_HOLES_2_H -#include -#include #include +#include +#include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -40,104 +41,135 @@ void draw(const PH& aph); } /* namespace CGAL */ #endif -#ifdef CGAL_USE_BASIC_VIEWER -#include -#include -#include - namespace CGAL { namespace draw_function_for_ph2_with_holes { -template -void compute_one_loop_elements(const typename P2::General_polygon_2& p, Graphic_buffer &graphic_buffer, bool hole) +template +void compute_one_loop_elements(const P2& ap2, + const typename P2::General_polygon_2& aloop, + Graphic_buffer &graphic_buffer, + bool hole, + const DrawingFunctor& drawing_functor) { - - if (hole) - { graphic_buffer.add_point_in_face(p.vertex(p.size()-1)); } + if (hole && drawing_functor.are_faces_enabled()) + { graphic_buffer.add_point_in_face(aloop.vertex(aloop.size()-1)); } typename P2::General_polygon_2::Vertex_const_iterator prev; - for (typename P2::General_polygon_2::Vertex_const_iterator i=p.vertices_begin(); - i!=p.vertices_end(); ++i) + for(typename P2::General_polygon_2::Vertex_const_iterator i=aloop.vertices_begin(); + i!=aloop.vertices_end(); ++i) { - graphic_buffer.add_point(*i); // Add vertex - if (i!=p.vertices_begin()) - { graphic_buffer.add_segment(*prev, *i); } // Add segment with previous point - graphic_buffer.add_point_in_face(*i); // Add point in face + if(drawing_functor.are_vertices_enabled() && + drawing_functor.draw_vertex(ap2, i)) + { // Add vertex + if(drawing_functor.colored_vertex(ap2, i)) + { graphic_buffer.add_point(*i, drawing_functor.vertex_color(ap2, i)); } + else + { graphic_buffer.add_point(*i); } + } + + if(i!=aloop.vertices_begin() && + drawing_functor.are_edges_enabled() && + drawing_functor.draw_edge(ap2, i)) + { // Add segment with previous point + if(drawing_functor.colored_vertex(ap2, i)) + { graphic_buffer.add_segment(*prev, *i, drawing_functor.edge_color(ap2, i)); } + else + { graphic_buffer.add_segment(*prev, *i); } + } + + if(drawing_functor.are_faces_enabled()) + { graphic_buffer.add_point_in_face(*i); } // Add point in face + prev=i; } // Add the last segment between the last point and the first one - graphic_buffer.add_segment(*prev, *(p.vertices_begin())); + if(drawing_functor.are_edges_enabled() && + drawing_functor.draw_edge(ap2, aloop.vertices_begin())) + { graphic_buffer.add_segment(*prev, *(aloop.vertices_begin())); } } -template +template void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) + const DrawingFunctor& drawing_functor) { - if (p2.outer_boundary().is_empty()) return; - // TODO: use face_color after adding a handler if exists. - CGAL::IO::Color c(75,160,255); - graphic_buffer.face_begin(c); + if (drawing_functor.are_faces_enabled()) + { + if(drawing_functor.colored_face(p2, nullptr)) + { graphic_buffer.face_begin(drawing_functor.face_color(p2, nullptr)); } + else + { graphic_buffer.face_begin(); } + } - compute_one_loop_elements(p2.outer_boundary(), graphic_buffer, false); + compute_one_loop_elements(p2, p2.outer_boundary(), graphic_buffer, + false, drawing_functor); for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { - compute_one_loop_elements(*it, graphic_buffer, true); - graphic_buffer.add_point_in_face(p2.outer_boundary().vertex(p2.outer_boundary().size()-1)); + compute_one_loop_elements(p2, *it, graphic_buffer, + true, drawing_functor); + if (drawing_functor.are_faces_enabled()) + { graphic_buffer.add_point_in_face(p2.outer_boundary().vertex + (p2.outer_boundary().size()-1)); + } } - graphic_buffer.face_end(); + if (drawing_functor.are_faces_enabled()) + { graphic_buffer.face_end(); } } } // draw_function_for_ph2 +#define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 -template -void add_in_graphic_buffer(const P2 &p2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor ) { - draw_function_for_ph2_with_holes::compute_elements(p2, graphic_buffer, m_drawing_functor); +template +void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor &drawing_functor) +{ + draw_function_for_ph2_with_holes::compute_elements(p2, graphic_buffer, + drawing_functor); } -template -void add_in_graphic_buffer(const P2 &p2, CGAL::Graphic_buffer &graphic_buffer) { - - // TODO: use colord_face and face_color if a handler exits. - Drawing_functor - drawing_functor; +template +void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, + CGAL::Graphic_buffer& graphic_buffer) +{ + Drawing_functor drawing_functor; add_in_graphic_buffer(p2, graphic_buffer, drawing_functor); } -// Specialization of draw function. -#define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 - +#ifdef CGAL_USE_BASIC_VIEWER -template -void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_functor) +// Specialization of draw function. +template +void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_functor, + const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(ap2, buffer, drawing_functor); - draw_buffer(buffer); + draw_buffer(buffer, title); } -template +template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, - const char* title="Polygon_with_holes_2 Basic Viewer") + const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(ap2, buffer); - draw_buffer(buffer); + draw_buffer(buffer, title); } -} // End namespace CGAL - #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // CGAL_DRAW_POLYGON_WITH_HOLES_2_H From 2970aa585b2e9ed64233d038261635c3d6f155f1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 11:23:34 +0200 Subject: [PATCH 108/341] review draw triangulation2 --- .../include/CGAL/draw_triangulation_2.h | 217 +++++++++--------- 1 file changed, 104 insertions(+), 113 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 8d141854f148..2ae142e3d3f6 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -13,42 +13,30 @@ #ifndef CGAL_DRAW_T2_H #define CGAL_DRAW_T2_H -#include -#include -#include #include - -#include - +#include +#include +#include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include #include -#include namespace CGAL { namespace draw_function_for_t2 { -template -void compute_face(typename T2::Finite_faces_iterator fh, - const DrawingFunctor &drawing_functor, - CGAL::Graphic_buffer &graphic_buffer, - const T2 *t2) { - - if (!drawing_functor.draw_face(*t2, fh)) { - return; - } - - if (drawing_functor.colored_face(*t2, fh) && drawing_functor.face_color) { - CGAL::IO::Color c = drawing_functor.face_color(*t2, fh); - graphic_buffer.face_begin(c); +template +void compute_face(const T2& t2, + typename T2::Finite_faces_iterator fh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.draw_face(t2, fh)) + { return; } - } else { - graphic_buffer.face_begin(); - } + if (drawing_functor.colored_face(t2, fh)) + { graphic_buffer.face_begin(drawing_functor.face_color(t2, fh)); } + else + { graphic_buffer.face_begin(); } graphic_buffer.add_point_in_face(fh->vertex(0)->point()); graphic_buffer.add_point_in_face(fh->vertex(1)->point()); @@ -57,133 +45,136 @@ void compute_face(typename T2::Finite_faces_iterator fh, graphic_buffer.face_end(); } -template -void compute_edge(typename T2::Finite_edges_iterator eh, - const DrawingFunctor &drawing_functor, const T2 *t2, - CGAL::Graphic_buffer &graphic_buffer) { - - if (!drawing_functor.draw_edge(*t2, eh)) { - return; +template +void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.draw_edge(t2, eh)) + { return; } + + if (drawing_functor.colored_edge(t2, eh)) + { + graphic_buffer.add_segment + (eh->first->vertex(eh->first->cw(eh->second))->point(), + eh->first->vertex(eh->first->ccw(eh->second))->point(), + drawing_functor.edge_color(t2, eh)); } - - if (drawing_functor.colored_edge(*t2, eh) && drawing_functor.edge_color) { - - CGAL::IO::Color c = drawing_functor.edge_color(*t2, eh); - graphic_buffer.add_segment( - eh->first->vertex(eh->first->cw(eh->second))->point(), - eh->first->vertex(eh->first->ccw(eh->second))->point(), c); - } - - else { - graphic_buffer.add_segment( - eh->first->vertex(eh->first->cw(eh->second))->point(), - eh->first->vertex(eh->first->ccw(eh->second))->point()); + else + { + graphic_buffer.add_segment + (eh->first->vertex(eh->first->cw(eh->second))->point(), + eh->first->vertex(eh->first->ccw(eh->second))->point()); } } -template -void compute_vertex(typename T2::Vertex_handle vh, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor, const T2 *t2) { - - if (!drawing_functor.draw_vertex(*t2, vh)) { - return; +template +void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.draw_vertex(t2, vh)) + { return; } + + if (drawing_functor.colored_vertex(t2, vh)) + { + graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(t2, vh)); } - - if (drawing_functor.colored_vertex(*t2, vh) && drawing_functor.vertex_color) { - CGAL::IO::Color c = drawing_functor.vertex_color(*t2, vh); - graphic_buffer.add_point(vh->point(), c); - } else { + else + { graphic_buffer.add_point(vh->point()); } } -template -void compute_elements(const T2 *t2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor, - bool m_nofaces = false) { - - if (!m_nofaces) { - for (typename T2::Finite_faces_iterator it = t2->finite_faces_begin(); - it != t2->finite_faces_end(); ++it) { - compute_face(it, drawing_functor, graphic_buffer, t2); - } +template +void compute_elements(const T2& t2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (drawing_functor.are_faces_enabled()) + { + for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); + it!=t2.finite_faces_end(); ++it) + { compute_face(t2, it, graphic_buffer, drawing_functor); } } - for (typename T2::Finite_edges_iterator it = t2->finite_edges_begin(); - it != t2->finite_edges_end(); ++it) { - compute_edge(it, drawing_functor, t2, graphic_buffer); + if (drawing_functor.are_edges_enabled()) + { + for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); + it!=t2.finite_edges_end(); ++it) + { compute_edge(t2, it, graphic_buffer, drawing_functor); } } - for (typename T2::Finite_vertices_iterator it = t2->finite_vertices_begin(); - it != t2->finite_vertices_end(); ++it) { - compute_vertex(it, graphic_buffer, drawing_functor, t2); + if (drawing_functor.are_vertices_enabled()) + { + for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); + it!=t2.finite_vertices_end(); ++it) + { compute_vertex(t2, it, graphic_buffer, drawing_functor); } } } } // namespace draw_function_for_t2 -template -void add_in_graphic_buffer(const T2 &at2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor, - bool m_nofaces = false) { - draw_function_for_t2::compute_elements(&at2, graphic_buffer, drawing_functor, - m_nofaces); -} +#define CGAL_T2_TYPE CGAL::Triangulation_2 -template -void add_in_graphic_buffer(const T2 &at2, - CGAL::Graphic_buffer &graphic_buffer, - bool m_nofaces = false) { +template +void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + draw_function_for_t2::compute_elements(at2, graphic_buffer, drawing_functor); +} +template +void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, + CGAL::Graphic_buffer& graphic_buffer) +{ CGAL::Graphic_buffer buffer; - Drawing_functor + Drawing_functor drawingFunctor; drawingFunctor.colored_face = - [](const T2 &at2, const typename T2::Finite_faces_iterator fh) -> bool { - return true; - }; + [](const CGAL_T2_TYPE&, const typename CGAL_T2_TYPE::Finite_faces_iterator) -> bool + { return true; }; drawingFunctor.face_color = - [](const T2 &at2, - const typename T2::Finite_faces_iterator fh) -> CGAL::IO::Color { - CGAL::Random random((unsigned int)(std::size_t)(&*fh)); - return get_random_color(random); - }; + [](const CGAL_T2_TYPE&, const typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> CGAL::IO::Color + { + CGAL::Random random((unsigned int)(std::size_t)(&*fh)); + return get_random_color(random); + }; - add_in_graphic_buffer(at2, graphic_buffer, drawingFunctor, m_nofaces); + add_in_graphic_buffer(at2, graphic_buffer, drawingFunctor); } -// Specialization of draw function. -#define CGAL_T2_TYPE CGAL::Triangulation_2 +#ifdef CGAL_USE_BASIC_VIEWER +// Specialization of draw function. template void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, - const char *title = "Triangulation_2 Basic Viewer", - bool nofill = false) { + const char *title="Triangulation_2 Basic Viewer") +{ CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(at2, buffer, drawingfunctor, nofill); - draw_buffer(buffer); + add_in_graphic_buffer(at2, buffer, drawingfunctor); + draw_buffer(buffer, title); } template -void draw(const CGAL_T2_TYPE &at2, - const char *title = "Triangulation_2 Basic Viewer", - bool nofill = false) { +void draw(const CGAL_T2_TYPE& at2, + const char *title="Triangulation_2 Basic Viewer") +{ CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(at2, buffer, nofill); - draw_buffer(buffer); + add_in_graphic_buffer(at2, buffer); + draw_buffer(buffer, title); } +#endif // CGAL_USE_BASIC_VIEWER + #undef CGAL_T2_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_T2_H From 0d49e61847f2ed9e4508969076f01a88637e1288 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 13:15:21 +0200 Subject: [PATCH 109/341] add missing include --- GraphicsView/include/CGAL/Drawing_functor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/GraphicsView/include/CGAL/Drawing_functor.h index 0a9ff09cb1df..ce69a05a45fc 100644 --- a/GraphicsView/include/CGAL/Drawing_functor.h +++ b/GraphicsView/include/CGAL/Drawing_functor.h @@ -14,6 +14,7 @@ #define CGAL_DRAWING_FUNCTORS_H #include +#include #include namespace CGAL { From 999d496cdf5367b0dbcd727b8a3cdb5f0b715d39 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 13:23:08 +0200 Subject: [PATCH 110/341] review draw triangulation3 --- .../include/CGAL/draw_triangulation_3.h | 150 +++++++++--------- 1 file changed, 74 insertions(+), 76 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 2f78eb6db50f..51a082dd43c7 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -13,14 +13,10 @@ #ifndef CGAL_DRAW_T3_H #define CGAL_DRAW_T3_H -#include -#include -#include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include +#include +#include +#include #include #include @@ -29,157 +25,159 @@ namespace CGAL { namespace draw_function_for_t3 { -template +template void compute_face(typename T3::Finite_facets_iterator fh, - const DrawingFunctor &drawing_functor, - CGAL::Graphic_buffer &graphic_buffer, const T3 *t3) + const DrawingFunctor& drawing_functor, + CGAL::Graphic_buffer& graphic_buffer, const T3 *t3) { if(!drawing_functor.draw_face(*t3, fh)) { return; } - if(drawing_functor.colored_face(*t3, fh) && drawing_functor.face_color) - { - CGAL::IO::Color c = drawing_functor.face_color(*t3, fh); - graphic_buffer.face_begin(c); - } + if(drawing_functor.colored_face(*t3, fh)) + { graphic_buffer.face_begin(drawing_functor.face_color(*t3, fh)); } else { graphic_buffer.face_begin(); } - graphic_buffer.add_point_in_face( - fh->first->vertex((fh->second + 1) % 4)->point()); - graphic_buffer.add_point_in_face( - fh->first->vertex((fh->second + 2) % 4)->point()); - graphic_buffer.add_point_in_face( - fh->first->vertex((fh->second + 3) % 4)->point()); + graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 1) % 4)-> + point()); + graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 2) % 4)-> + point()); + graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 3) % 4)-> + point()); graphic_buffer.face_end(); } -template +template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor, const T3 *t3) + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_edge(*t3, eh)) { return; } - if(drawing_functor.colored_edge(*t3, eh) && drawing_functor.edge_color) + if(drawing_functor.colored_edge(*t3, eh)) { - CGAL::IO::Color c = drawing_functor.edge_color(*t3, eh); graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), - eh->first->vertex(eh->third)->point(), c); + eh->first->vertex(eh->third)->point(), + drawing_functor.edge_color(*t3, eh)); } else { graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), - eh->first->vertex(eh->third)->point()); + eh->first->vertex(eh->third)->point()); } } -template +template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor, const T3 *t3) + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_vertex(*t3, vh)) { return; } - if(drawing_functor.colored_vertex(*t3, vh) && drawing_functor.vertex_color) + if(drawing_functor.colored_vertex(*t3, vh)) { - CGAL::IO::Color c = drawing_functor.vertex_color(*t3, vh); - graphic_buffer.add_point(vh->point(), c); + graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(*t3, vh)); } else { graphic_buffer.add_point(vh->point()); } } -template -void compute_elements(const T3 *t3, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor) +template +void compute_elements(const T3* t3, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - for (typename T3::Finite_facets_iterator it = t3->finite_facets_begin(); - it != t3->finite_facets_end(); ++it) + if (drawing_functor.are_faces_enabled()) { - compute_face(it, drawing_functor, graphic_buffer, t3); + for (typename T3::Finite_facets_iterator it=t3->finite_facets_begin(); + it!=t3->finite_facets_end(); ++it) + { compute_face(it, drawing_functor, graphic_buffer, t3); } } - for (typename T3::Finite_edges_iterator it = t3->finite_edges_begin(); - it != t3->finite_edges_end(); ++it) + if (drawing_functor.are_edges_enabled()) { - compute_edge(it, graphic_buffer,drawing_functor , t3); + for (typename T3::Finite_edges_iterator it=t3->finite_edges_begin(); + it!=t3->finite_edges_end(); ++it) + { compute_edge(it, graphic_buffer,drawing_functor, t3); } } - for (typename T3::Finite_vertices_iterator it = t3->finite_vertices_begin(); - it != t3->finite_vertices_end(); ++it) + if (drawing_functor.are_vertices_enabled()) { - compute_vertex(it, graphic_buffer, drawing_functor, t3); + for (typename T3::Finite_vertices_iterator it=t3->finite_vertices_begin(); + it!=t3->finite_vertices_end(); ++it) + { compute_vertex(it, graphic_buffer, drawing_functor, t3); } } } } // namespace draw_function_for_t3 -template -void add_in_graphic_buffer(const T3 &at3, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor) +#define CGAL_T3_TYPE CGAL::Triangulation_3 + +template +void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { draw_function_for_t3::compute_elements(&at3, graphic_buffer, drawing_functor); } -template -void add_in_graphic_buffer(const T3 &at3, - CGAL::Graphic_buffer &graphic_buffer) +template +void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, + CGAL::Graphic_buffer& graphic_buffer) { - CGAL::Drawing_functor + CGAL::Drawing_functor drawing_functor; drawing_functor.colored_face = - [](const T3 &at3, const typename T3::Finite_facets_iterator fh) - -> bool + [](const CGAL_T3_TYPE &, const typename CGAL_T3_TYPE::Finite_facets_iterator) -> bool { return true; }; - drawing_functor.face_color = - [](const T3 &at3, const typename T3::Finite_facets_iterator fh) - -> CGAL::IO::Color + drawing_functor.face_color = + [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) -> CGAL::IO::Color { - if (fh==at3.finite_facets_end()) // use to get the mono color - return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 + if (fh==at3.finite_facets_end()) // use to get the mono color + return CGAL::IO::Color(100, 125, 200); // R G B between 0-255 - CGAL::Random random((unsigned int)((std::size_t)(&*(fh->first)) + - (std::size_t)(fh->second))); + CGAL::Random random((unsigned int)((std::size_t)(&*(fh->first)) + + (std::size_t)(fh->second))); - return get_random_color(random); - }; + return get_random_color(random); + }; add_in_graphic_buffer(at3, graphic_buffer, drawing_functor); } -// Specialization of draw function. -#define CGAL_T3_TYPE CGAL::Triangulation_3 +#ifdef CGAL_USE_BASIC_VIEWER +// Specialization of draw function. template void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, - const char *title = "T3 Basic Viewer") + const char *title="T3 Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(at3, buffer, drawingfunctor); - draw_buffer(buffer); + draw_buffer(buffer, title); } template -void draw(const CGAL_T3_TYPE &at3, const char *title = "T3 Basic Viewer") +void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(at3, buffer); - draw_buffer(buffer); + draw_buffer(buffer, title); } +#endif // CGAL_USE_BASIC_VIEWER + #undef CGAL_T3_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_T3_H From 8c546efe71b518a7a5fa02ea31e0ee9784e7beca Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 15:28:19 +0200 Subject: [PATCH 111/341] code review for polygon triangulation --- .../Triangulation_2/polygon_triangulation.cpp | 6 +- .../polygon_triangulation_drawing_functor.h | 88 +++++++++ .../CGAL/draw_constrained_triangulation_2.h | 180 ------------------ 3 files changed, 92 insertions(+), 182 deletions(-) create mode 100644 Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h delete mode 100644 Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp b/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp index 405f7eb5516b..7d19420679d1 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp @@ -1,8 +1,9 @@ #include #include -#include #include #include +#include +#include "polygon_triangulation_drawing_functor.h" #include #include @@ -57,6 +58,7 @@ int main( ) assert(count > 0); assert(count < cdt.number_of_faces()); - CGAL::draw(cdt, in_domain); + CGAL::Polygon_triangulation_drawing_functor myfunctor(in_domain); + CGAL::draw(cdt, myfunctor); return 0; } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h new file mode 100644 index 000000000000..983ae936a8dc --- /dev/null +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -0,0 +1,88 @@ +// Copyright(c) 2022 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Andreas Fabri + +#ifndef CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H +#define CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H + +#include +#include +#include +#include +#include + +namespace CGAL +{ + +template +struct Polygon_triangulation_drawing_functor : + public CGAL::Drawing_functor +{ + template + Polygon_triangulation_drawing_functor(IPM ipm) + { + this->colored_face = + [](const PT&, const typename PT::Finite_faces_iterator) -> bool + { return true; }; + + this->face_color = + [](const PT&, const typename PT::Finite_faces_iterator fh) -> CGAL::IO::Color + { + CGAL::Random random((unsigned int)(std::size_t)(&*fh)); + return get_random_color(random); + }; + + this->draw_face= + [ipm](const PT&, const typename PT::Finite_faces_iterator fh) -> bool + { return get(ipm, fh); }; + + this->draw_edge= + [ipm](const PT& pt, const typename PT::Finite_edges_iterator eh) -> bool + { + typename PT::Face_handle fh1=eh->first; + typename PT::Face_handle fh2=pt.mirror_edge(*eh).first; + return get(ipm, fh1) || get(ipm, fh2); + }; + } +}; + +#define CGAL_CT2_TYPE CGAL::Constrained_Delaunay_triangulation_2 + +template +void add_in_graphic_buffer(const CGAL_CT2_TYPE& ct2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + draw_function_for_t2::compute_elements(ct2, graphic_buffer, drawing_functor); +} + +#ifdef CGAL_USE_BASIC_VIEWER + +// Specialization of draw function. +template +void draw(const CGAL_CT2_TYPE &ct2, const DrawingFunctor &drawingfunctor, + const char *title="Constrained Triangulation_2 Basic Viewer") +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(ct2, buffer, drawingfunctor); + draw_buffer(buffer, title); +} + +#endif // CGAL_USE_BASIC_VIEWER + +#undef CGAL_CT2_TYPE + +}; // end namespace CGAL + +#endif // CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h deleted file mode 100644 index 7bc3856bc9de..000000000000 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright(c) 2022 GeometryFactory (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Andreas Fabri - -#ifndef CGAL_DRAW_CT2_H -#define CGAL_DRAW_CT2_H - -#include -#include - -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include - -namespace CGAL -{ - -// Viewer class for T2 - template -class SimpleConstrainedTriangulation2ViewerQt : public Basic_viewer_qt -{ - typedef Basic_viewer_qt Base; - typedef typename T2::Vertex_handle Vertex_const_handle; - typedef typename T2::Finite_edges_iterator Edge_const_handle; - typedef typename T2::Finite_faces_iterator Facet_const_handle; - typedef typename T2::Point Point; - -public: - /// Construct the viewer. - /// @param at2 the t2 to view - /// @param title the title of the window - /// @param anofaces if true, do not draw faces (faces are not computed; this can be - /// usefull for very big object where this time could be long) - SimpleConstrainedTriangulation2ViewerQt(QWidget* parent, const T2& at2, - InDomainPmap ipm, - const char* title="Basic CDT2 Viewer", - bool anofaces=false) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, title, true, true, true, false, false), - t2(at2), - ipm(ipm), - m_nofaces(anofaces) - { - compute_elements(); - } - -protected: - void compute_face(Facet_const_handle fh) - { - CGAL::IO::Color c = get(ipm, fh)? CGAL::yellow() : CGAL::white(); - face_begin(c); - - add_point_in_face(fh->vertex(0)->point()); - add_point_in_face(fh->vertex(1)->point()); - add_point_in_face(fh->vertex(2)->point()); - - face_end(); - } - - void compute_edge(Edge_const_handle eh) - { - CGAL::IO::Color c = t2.is_constrained(*eh)? CGAL::green() : CGAL::black(); - add_segment(eh->first->vertex(eh->first->cw(eh->second))->point(), - eh->first->vertex(eh->first->ccw(eh->second))->point(), - c); - } - - void compute_vertex(Vertex_const_handle vh) - { add_point(vh->point()); } - - void compute_elements() - { - clear(); - - if (!m_nofaces) - { - for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); - it!=t2.finite_faces_end(); ++it) - { compute_face(it); } - } - - for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); - it!=t2.finite_edges_end(); ++it) - { compute_edge(it); } - - for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); - it!=t2.finite_vertices_end(); ++it) - { compute_vertex(it); } - } - - virtual void keyPressEvent(QKeyEvent *e) - { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } - - // Call: * compute_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing - - // Call the base method to process others/classicals key - Base::keyPressEvent(e); - } - -protected: - const T2& t2; - InDomainPmap ipm; - bool m_nofaces; -}; - -// Specialization of draw function. -#define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 - -template -void draw(const CGAL_T2_TYPE& at2, - InDomainPmap ipm) -{ - const char* title="Constrained_triangulation_2 Basic Viewer"; - bool nofill=false; - -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[2]={"t2_viewer", nullptr}; - QApplication app(argc,const_cast(argv)); - SimpleConstrainedTriangulation2ViewerQt - mainwindow(app.activeWindow(), at2, ipm, title, nofill); - mainwindow.show(); - app.exec(); - } -} - - -template -void draw(const CGAL_T2_TYPE& at2) -{ - internal::In_domain in_domain; - draw(at2, in_domain); -} - -#undef CGAL_T2_TYPE - -} // End namespace CGAL - -#else - -namespace CGAL { -// Specialization of draw function. -#define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 - -template -void draw(const CGAL_T2_TYPE& , - InDomainPmap ) -{} -#undef CGAL_T2_TYPE - -} // End namespace CGAL - -#endif // CGAL_USE_BASIC_VIEWER - -#endif // CGAL_DRAW_CT2_H From d1eed1dc0ff4897c44652d9b7aa133afc27114a3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 18 Oct 2022 16:14:23 +0200 Subject: [PATCH 112/341] start straight skeleton 2, NYF --- .../include/CGAL/draw_straight_skeleton_2.h | 209 +++++++++++------- 1 file changed, 130 insertions(+), 79 deletions(-) diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index c489126d3185..3557378d6206 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -13,46 +13,49 @@ #ifndef CGAL_DRAW_SS2_H #define CGAL_DRAW_SS2_H -#include -#include -#include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include +#include +#include +#include #include - #include namespace CGAL { namespace draw_function_for_ss2 { -template -void compute_edge(typename SS2::Halfedge_const_handle eh, - const DrawingFunctor &drawing_functor, const SS2 *ss2, - CGAL::Graphic_buffer &graphic_buffer) { - - if (!drawing_functor.draw_edge(*ss2, eh)) { - return; +template +void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.draw_edge(ss2, eh)) + { return; } + + if (drawing_functor.colored_edge(ss2, eh)) + { + graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + eh->vertex()->point(), + drawing_functor.edge_color(ss2, eh)); } - - if (drawing_functor.colored_edge(*ss2, eh)) { - if (eh->is_bisector()) - graphic_buffer.add_segment(eh->opposite()->vertex()->point(), - eh->vertex()->point(), CGAL::IO::red()); - else - graphic_buffer.add_segment(eh->opposite()->vertex()->point(), - eh->vertex()->point(), CGAL::IO::black()); + else + { + graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + eh->vertex()->point()); } } -template -void print_halfedge_labels(typename SS2::Halfedge_const_handle h, - CGAL::Graphic_buffer &graphic_buffer) { - std::stringstream label; +template +void print_halfedge_labels(const SS2& ss2, + typename SS2::Halfedge_const_handle h, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + // TODO? a functor different from draw_edge to allow to show only some labels ?? + if(!drawing_functor.draw_edge(ss2, h)) + { return; } + std::stringstream label; label << "H" << h->id() << " (V" << h->vertex()->id() << ") "; label << "H" << h->opposite()->id() << " (V" << h->opposite()->vertex()->id() << ") "; @@ -63,96 +66,144 @@ void print_halfedge_labels(typename SS2::Halfedge_const_handle h, } template -void compute_vertex(typename SS2::Vertex_const_handle vh, - const DrawingFunctor &drawing_functor, const SS2 *ss2, - CGAL::Graphic_buffer &graphic_buffer) { - - if (!drawing_functor.draw_vertex(*ss2, vh)) { - return; - } - if (drawing_functor.colored_vertex(*ss2, vh)) { - if (vh->is_split()) - graphic_buffer.add_point( - vh->point(), CGAL::IO::Color(10, 10, 180)); // blue, but not flashy - else if (vh->has_infinite_time()) - graphic_buffer.add_point(vh->point(), CGAL::IO::orange()); - else - graphic_buffer.add_point( - vh->point(), CGAL::IO::Color(10, 180, 10)); // green, but not flashy +void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.draw_vertex(ss2, vh)) + { return; } + + if (drawing_functor.colored_vertex(ss2, vh)) + { + graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(ss2, vh)); } + else + { graphic_buffer.add_point(vh->point()); } } -template -void print_vertex_label(typename SS2::Vertex_const_handle vh, - CGAL::Graphic_buffer &graphic_buffer) { +template +void print_vertex_label(const SS2& ss2, + typename SS2::Vertex_const_handle vh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + // TODO? a functor different from draw_vertex to allow to show only some labels ?? + if (!drawing_functor.draw_vertex(ss2, vh)) + { return; } + std::stringstream label; label << "V" << vh->id() << std::ends; graphic_buffer.add_text(vh->point(), label.str()); } -template -void compute_elements(const SS2 *ss2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor) { - - for (typename SS2::Halfedge_const_iterator it = ss2->halfedges_begin(); - it != ss2->halfedges_end(); ++it) { - if (it->id() < it->opposite()->id()) { - compute_edge(it, drawing_functor, ss2, graphic_buffer); - print_halfedge_labels(it, graphic_buffer); +template +void compute_elements(const SS2& ss2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if (!drawing_functor.are_edges_enabled()) + { + for (typename SS2::Halfedge_const_iterator it=ss2.halfedges_begin(); + it != ss2.halfedges_end(); ++it) + { + if (it->id()opposite()->id()) + { + compute_edge(ss2, it, graphic_buffer, drawing_functor); + print_halfedge_labels(ss2, it, graphic_buffer, drawing_functor); + } } } - for (typename SS2::Vertex_const_iterator it = ss2->vertices_begin(); - it != ss2->vertices_end(); ++it) { - compute_vertex(it, drawing_functor, ss2, graphic_buffer); - print_vertex_label(it, graphic_buffer); + + if (!drawing_functor.are_vertices_enabled()) + { + for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); + it!=ss2.vertices_end(); ++it) + { + compute_vertex(ss2, it, graphic_buffer, drawing_functor); + print_vertex_label(ss2, it, graphic_buffer, drawing_functor); + } } } } // namespace draw_function_for_ss2 -template -void add_in_graphic_buffer(const SS2 &ass2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &drawing_functor) { - draw_function_for_ss2::compute_elements(&ass2, graphic_buffer, +#define CGAL_SS_TYPE CGAL::Straight_skeleton_2 + +template +void add_in_graphic_buffer(const CGAL_SS_TYPE &ass2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + draw_function_for_ss2::compute_elements(ass2, graphic_buffer, drawing_functor); } -template -void add_in_graphic_buffer( - const SS2 &ass2, CGAL::Graphic_buffer &graphic_buffer) { - Drawing_functor - drawingFunctor; +template +void add_in_graphic_buffer(const CGAL_SS_TYPE& ass2, + CGAL::Graphic_buffer& graphic_buffer) +{ + Drawing_functor + drawingFunctor; + + drawingFunctor.colored_edge = [] + (const CGAL_SS_TYPE&, typename CGAL_SS_TYPE::Halfedge_const_handle) -> bool + { return true; }; + + drawingFunctor.colored_vertex = [] + (const CGAL_SS_TYPE&, typename CGAL_SS_TYPE::Vertex_const_handle) -> bool + { return true; }; + + drawingFunctor.edge_color = [] + (const CGAL_SS_TYPE&, typename CGAL_SS_TYPE::Halfedge_const_handle eh) -> CGAL::IO::Color + { + if (eh->is_bisector()) + { return CGAL::IO::red(); } + + return CGAL::IO::black(); + }; + + drawingFunctor.vertex_color = [] + (const CGAL_SS_TYPE&, typename CGAL_SS_TYPE::Vertex_const_handle vh) -> CGAL::IO::Color + { + if (vh->is_split()) + { return CGAL::IO::Color(10, 10, 180); } // blue, but not flashy + else if (vh->has_infinite_time()) + { return CGAL::IO::orange(); } + + return CGAL::IO::Color(10, 180, 10); // green, but not flashy + }; add_in_graphic_buffer(ass2, graphic_buffer, drawingFunctor); } // Specialization of draw function. -#define CGAL_SS_TYPE CGAL::Straight_skeleton_2 +#ifdef CGAL_USE_BASIC_VIEWER template void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, - const char *title = "Straight Skeleton Basic Viewer") { + const char *title="Straight Skeleton Basic Viewer") +{ CGAL::Graphic_buffer buffer; add_in_graphic_buffer(ass2, buffer, drawingfunctor); - draw_buffer(buffer); + draw_buffer(buffer, title); } template void draw(const CGAL_SS_TYPE &ass2, - const char *title = "Straight Skeleton Basic Viewer") { + const char *title="Straight Skeleton Basic Viewer") +{ CGAL::Graphic_buffer buffer; add_in_graphic_buffer(ass2, buffer); - draw_buffer(buffer); + draw_buffer(buffer, title); } +#endif // CGAL_USE_BASIC_VIEWER + #undef CGAL_SS_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_SS2_H From 14848d450869c7fe5e4d2737154fc6e8f83b65bb Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 13:44:36 +0200 Subject: [PATCH 113/341] Add a class allowing to create a qt application and a basic viewer, which can be ran latter. This allows modification of the viewer (for example add shortcuts description). --- .../include/CGAL/Qt/Basic_viewer_qt.h | 177 +++++++++++++++--- 1 file changed, 147 insertions(+), 30 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 9da5555e705d..50388985edb4 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -62,7 +62,7 @@ namespace CGAL { //------------------------------------------------------------------------------ -template +template class Basic_viewer_qt : public CGAL::QGLViewer { public: @@ -181,11 +181,63 @@ class Basic_viewer_qt : public CGAL::QGLViewer { m_draw_faces = b; } void set_use_mono_color(bool b) { m_use_mono_color = b; } - void set_inverse_normal(bool b) - { m_inverse_normal = b; } void set_draw_text(bool b) { m_draw_text = b; } + void set_vertices_mono_color(const CGAL::IO::Color& c) + { m_vertices_mono_color=c; } + void set_edges_mono_color(const CGAL::IO::Color& c) + { m_edges_mono_color=c; } + void set_rays_mono_color(const CGAL::IO::Color& c) + { m_rays_mono_color=c; } + void set_lines_mono_color(const CGAL::IO::Color& c) + { m_lines_mono_color=c; } + void set_faces_mono_color(const CGAL::IO::Color& c) + { m_faces_mono_color=c; } + + void negate_draw_vertices() + { m_draw_vertices = !m_draw_vertices; } + void negate_draw_edges() + { m_draw_edges = !m_draw_edges; } + void negate_draw_rays() + { m_draw_rays = !m_draw_rays; } + void negate_draw_lines() + { m_draw_lines = !m_draw_lines; } + void negate_draw_faces() + { m_draw_faces = !m_draw_faces; } + void negate_use_mono_color() + { m_use_mono_color = !m_use_mono_color; } + void negate_draw_text() + { m_draw_text = !m_draw_text; } + + bool get_draw_vertices() const + { return m_draw_vertices; } + bool get_draw_edges() const + { return m_draw_edges; } + bool get_draw_rays() const + { return m_draw_rays; } + bool get_draw_lines() const + { return m_draw_lines; } + bool get_draw_faces() const + { return m_draw_faces; } + bool get_use_mono_color() const + { return m_use_mono_color; } + bool get_inverse_normal() const + { return m_inverse_normal; } + bool get_draw_text() const + { return m_draw_text; } + + const CGAL::IO::Color& get_vertices_mono_color() const + { return m_vertices_mono_color; } + const CGAL::IO::Color& get_edges_mono_color() const + { return m_edges_mono_color; } + const CGAL::IO::Color& get_rays_mono_color() const + { return m_rays_mono_color; } + const CGAL::IO::Color& get_lines_mono_color() const + { return m_lines_mono_color; } + const CGAL::IO::Color& get_faces_mono_color() const + { return m_faces_mono_color; } + void clear() { for (unsigned int i=0; imodifiers(); - if(!_onPress || !_onPress(e, this)) + if(!on_key_pressed || !on_key_pressed(e, this)) { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key()==::Qt::Key_C) && (modifiers==::Qt::NoButton)) { if (!isOpenGL_4_3()) return; @@ -1332,9 +1387,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer } else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) { - m_inverse_normal=!m_inverse_normal; - displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); negate_all_normals(); + displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); redraw(); } else if ((e->key()==::Qt::Key_S) && (modifiers==::Qt::NoButton)) @@ -1536,7 +1590,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer return text; } public: - std::function *)> _onPress; + std::function *)> on_key_pressed; protected: Graphic_buffer& gBuffer; @@ -1612,8 +1666,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; -template -void draw_buffer(Graphic_buffer &graphic_buffer, +template +void draw_buffer(Graphic_buffer& graphic_buffer, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1629,38 +1683,101 @@ void draw_buffer(Graphic_buffer &graphic_buffer, int argc = 1; const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); + Basic_viewer_qt basic_viewer(app.activeWindow(), + graphic_buffer, title); basic_viewer.show(); app.exec(); } } -template -void draw_buffer(Graphic_buffer &graphic_buffer, - const std::function *)>& onPress, - const char *title="CGAL Basic Viewer") +// template +// void draw_buffer(Graphic_buffer &graphic_buffer, +// const std::function *)>& onPress, +// const char *title="CGAL Basic Viewer") +// { +// #if defined(CGAL_TEST_SUITE) +// bool cgal_test_suite = true; +// #else +// bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +// #endif + +// if (!cgal_test_suite) +// { +// Qt::init_ogl_context(4, 3); + +// int argc = 1; +// const char *argv[2] = {title, nullptr}; +// QApplication app(argc, const_cast(argv)); +// Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); +// basic_viewer._onPress = onPress; + +// basic_viewer.show(); +// app.exec(); +// } +// } + +//------------------------------------------------------------------------------ +template +class QApplication_and_basic_viewer { +public: + QApplication_and_basic_viewer(CGAL::Graphic_buffer& buffer, + const char* title="CGAL Basic Viewer"): + m_application(nullptr), + m_basic_viewer(nullptr), + m_argc(1) + { + m_argv[0]=new char[strlen(title)+1]; + strcpy(m_argv[0], title); + m_argv[1]=nullptr; + #if defined(CGAL_TEST_SUITE) - bool cgal_test_suite = true; + bool cgal_test_suite = true; #else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); #endif - if (!cgal_test_suite) - { + if (cgal_test_suite) + { return; } + Qt::init_ogl_context(4, 3); + m_application=new QApplication(m_argc, const_cast(m_argv)); + m_basic_viewer=new Basic_viewer_qt(m_application->activeWindow(), + buffer, title); + } - int argc = 1; - const char *argv[2] = {title, nullptr}; - QApplication app(argc, const_cast(argv)); - Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); - basic_viewer._onPress = onPress; + ~QApplication_and_basic_viewer() + { + delete[] m_argv[0]; + delete m_basic_viewer; + delete m_application; + } - basic_viewer.show(); - app.exec(); + operator bool() const + { return m_application!=nullptr; } + + void run() + { + if (m_application!=nullptr) + { + m_basic_viewer->show(); + m_application->exec(); + } } -} + + Basic_viewer_qt& basic_viewer() + { + CGAL_assertion(m_basic_viewer!=nullptr); + return *m_basic_viewer; + } + +protected: + QApplication* m_application; + Basic_viewer_qt* m_basic_viewer; + char *m_argv[2]; + int m_argc; +}; } // End namespace CGAL From 2f07ea2a1651aba14a051cb2ef8896d8bd31968c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 13:46:10 +0200 Subject: [PATCH 114/341] review draw voronoi 2 --- .../include/CGAL/draw_voronoi_diagram_2.h | 396 +++++++++--------- 1 file changed, 188 insertions(+), 208 deletions(-) diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 662a261b27bf..3f6e93a71721 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -13,15 +13,10 @@ #ifndef CGAL_DRAW_VORONOI_DIAGRAM_2_H #define CGAL_DRAW_VORONOI_DIAGRAM_2_H +#include +#include #include #include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include #include #include #include @@ -34,6 +29,8 @@ namespace CGAL { namespace draw_function_for_v2 { +// We need a specific functor for voronoi2 in order to allow to differentiate +// voronoi and dual vertices, and to manage rays. template { - Drawing_functor_voronoi() : m_draw_rays(true), - m_draw_voronoi_vertices(true), + Drawing_functor_voronoi() : m_draw_voronoi_vertices(true), m_draw_dual_vertices(true), - m_nofaces(false) - { - - draw_voronoi_vertices=[](const DS &, vertex_handle)->bool { return true; }; - draw_dual_vertices=[](const DS &, vertex_handle)->bool { return true; }; - draw_rays=[](const DS &, vertex_handle)->bool { return true; }; - - } - - std::function draw_voronoi_vertices; - std::function draw_dual_vertices; - std::function draw_rays; + dual_vertex_color(CGAL::IO::Color(50, 100, 180)), + ray_color(CGAL::IO::Color(100, 0, 0)), + bisector_color(CGAL::IO::Color(0, 100, 0)) + {} void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } + void negate_draw_voronoi_vertices() { m_draw_voronoi_vertices=!m_draw_voronoi_vertices; } void disable_dual_vertices() { m_draw_dual_vertices=false; } void enable_dual_vertices() { m_draw_dual_vertices=true; } bool are_dual_vertices_enabled() const { return m_draw_dual_vertices; } + void negate_draw_dual_vertices() { m_draw_dual_vertices=!m_draw_dual_vertices; } - void disable_rays() { m_draw_rays=false; } - void enable_rays() { m_draw_rays=true; } - bool are_rays_enabled() const { return m_draw_rays; } - - void disable_nofaces() { m_nofaces=false; } - void enable_nofaces() { m_nofaces=true; } - bool are_nofaces_enabled() const { return m_nofaces; } + CGAL::IO::Color dual_vertex_color; + CGAL::IO::Color ray_color; + CGAL::IO::Color bisector_color; protected: - bool m_draw_rays; bool m_draw_voronoi_vertices; bool m_draw_dual_vertices; - bool m_nofaces; }; typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; -template -void compute_vertex(typename V2::Vertex_iterator vh, - CGAL::Graphic_buffer &graphic_buffer) -{ graphic_buffer.add_point(vh->point()); } +template +void compute_vertex(const V2& v2, + typename V2::Vertex_iterator vh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + if(!drawing_functor.draw_vertex(v2, vh)) + { return; } -template -void compute_dual_vertex(typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphic_buffer &graphic_buffer) -{ graphic_buffer.add_point(vi->point(), CGAL::IO::Color(50, 100, 180)); } + if(drawing_functor.colored_vertex(v2, vh)) + { graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(v2, vh)); } + else + { graphic_buffer.add_point(vh->point()); } +} -template -void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, - CGAL::Graphic_buffer &graphic_buffer) +template +void compute_dual_vertex(const V2& /*v2*/, + typename V2::Delaunay_graph::Finite_vertices_iterator vi, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor& drawing_functor) +{ graphic_buffer.add_point(vi->point(), drawing_functor.dual_vertex_color); } + +template +void add_segments_and_update_bounding_box(const V2& v2, + typename V2::Halfedge_iterator he, + CGAL::Graphic_buffer& graphic_buffer, + DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; if (he->is_segment()) - { graphic_buffer.add_segment(he->source()->point(), he->target()->point()); } + { + if(drawing_functor.colored_edge(v2, he)) + { + graphic_buffer.add_segment(he->source()->point(), he->target()->point(), + drawing_functor.edge_color(v2, he)); + } + else + { + graphic_buffer.add_segment(he->source()->point(), he->target()->point()); + } + } else { Delaunay_vertex_const_handle v1 = he->up(); @@ -118,8 +126,6 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, end_point = he->source()->point(); // update_bounding_box_for_ray(end_point, direction); - - // update_bounding_box_for_ray Local_point lp = Basic_viewer_qt<>::get_local_point(end_point); Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); CGAL::Bbox_3 b = (lp + lv).bbox(); @@ -136,8 +142,6 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, // update_bounding_box_for_line(pointOnLine, direction, // perpendicularDirection); - - // update_bounding_box_for_line Local_point lp = Basic_viewer_qt<>::get_local_point(pointOnLine); Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); Local_vector lpv = Basic_viewer_qt<>::get_local_vector(perpendicularDirection); @@ -150,7 +154,7 @@ void add_segments_and_update_bounding_box(typename V2::Halfedge_handle he, template Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, - const CGAL::Bbox_3 & m_bounding_box) + const CGAL::Bbox_3 & m_bounding_box) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -160,7 +164,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, // calculate direction of ray and its inverse Kernel::Vector_2 v(v1->point().y() - v2->point().y(), - v2->point().x() - v1->point().x()); + v2->point().x() - v1->point().x()); Local_kernel::Vector_2 inv(1 / v.x(), 1 / v.y()); // origin of the ray @@ -216,9 +220,11 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, } // Halfedge_const_handle -template -void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, - CGAL::Graphic_buffer &graphic_buffer) +template +void compute_rays_and_bisectors(const V2&, + typename V2::Halfedge_iterator he, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -228,43 +234,45 @@ void compute_rays_and_bisectors(typename V2::Halfedge_iterator he, Kernel::Vector_2 direction(v1->point().y() - v2->point().y(), v2->point().x() - v1->point().x()); - if (he->is_ray()) { - if (he->has_source()) { + if (he->is_ray()) + { + if (he->has_source()) + { // add_ray_segment(he->source()->point(), get_second_point(he, graphic_buffer.get_bounding_box())); - graphic_buffer.add_ray(he->source()->point(), direction, CGAL::IO::Color(100, 0, 0)); + graphic_buffer.add_ray(he->source()->point(), direction, drawing_functor.ray_color); } - } else if (he->is_bisector()) { + } + else if (he->is_bisector()) + { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); - graphic_buffer.add_line(pointOnLine, direction); + graphic_buffer.add_line(pointOnLine, direction, drawing_functor.bisector_color); } } -template -void compute_face(typename V2::Face_iterator fh, - const V2& v2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +template +void compute_face(const V2& v2, + typename V2::Face_iterator fh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& m_drawing_functor) { - typedef typename V2::Ccb_halfedge_circulator Ccb_halfedge_circulator; - - if(m_drawing_functor.colored_face(v2, fh)) { + if(fh->is_unbounded() || !m_drawing_functor.draw_face(v2, fh)) + { return; } - CGAL::IO::Color c = m_drawing_functor.face_color(v2, fh); + if(m_drawing_functor.colored_face(v2, fh)) + { graphic_buffer.face_begin(m_drawing_functor.face_color(v2, fh)); } + else { graphic_buffer.face_begin(); } - Ccb_halfedge_circulator ec_start = fh->ccb(); - Ccb_halfedge_circulator ec = ec_start; - - if (!fh->is_unbounded()) { - graphic_buffer.face_begin(c); - do { - graphic_buffer.add_point_in_face(ec->source()->point()); - } while (++ec != ec_start); - graphic_buffer.face_end(); + typename V2::Ccb_halfedge_circulator ec_start=fh->ccb(); + typename V2::Ccb_halfedge_circulator ec=ec_start; + do + { + graphic_buffer.add_point_in_face(ec->source()->point()); } + while (++ec!=ec_start); + graphic_buffer.face_end(); - } - // Test: for unbounded faces + // Test: for unbounded faces (??) // else { // do{ // if( ec->has_source() ){ @@ -277,45 +285,48 @@ void compute_face(typename V2::Face_iterator fh, // } } -template -void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +template +void compute_elements(const V2& v2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - typedef typename V2::Delaunay_graph::Finite_vertices_iterator Dual_vertices_iterator; + if(drawing_functor.are_vertices_enabled()) + { + // Draw the voronoi vertices + if (drawing_functor.are_voronoi_vertices_enabled()) + { + for (typename V2::Vertex_iterator it=v2.vertices_begin(); + it!=v2.vertices_end(); ++it) + { compute_vertex(v2, it, graphic_buffer, drawing_functor); } + } - // Draw the voronoi vertices - if (m_drawing_functor.are_voronoi_vertices_enabled()) { - for (typename V2::Vertex_iterator it = v2.vertices_begin(); - it != v2.vertices_end(); ++it) { - compute_vertex(it, graphic_buffer); + // Draw the dual vertices + if (drawing_functor.are_dual_vertices_enabled()) + { + for (typename V2::Delaunay_graph::Finite_vertices_iterator + it=v2.dual().finite_vertices_begin(); + it!=v2.dual().finite_vertices_end(); ++it) + { compute_dual_vertex(v2, it, graphic_buffer, drawing_functor); } } } - // Draw the dual vertices - if (m_drawing_functor.are_dual_vertices_enabled()) + if(drawing_functor.are_edges_enabled()) { - for (Dual_vertices_iterator it = v2.dual().finite_vertices_begin(); - it != v2.dual().finite_vertices_end(); ++it) - { compute_dual_vertex(it, graphic_buffer); } + // Add segments and update bounding box + for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); + it!=v2.halfedges_end(); ++it) + { add_segments_and_update_bounding_box(v2, it, + graphic_buffer, drawing_functor); } } - // Add segments and update bounding box - for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) - { add_segments_and_update_bounding_box(it, graphic_buffer); } - - if(m_drawing_functor.are_rays_enabled()) - { - for (typename V2::Halfedge_iterator it = v2.halfedges_begin(); - it != v2.halfedges_end(); ++it) - { compute_rays_and_bisectors(it, graphic_buffer); } - } + for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); + it!=v2.halfedges_end(); ++it) + { compute_rays_and_bisectors(v2, it, graphic_buffer, drawing_functor); } - if (!m_drawing_functor.are_nofaces_enabled()) + if (drawing_functor.are_faces_enabled()) { - for (typename V2::Face_iterator it = v2.faces_begin(); - it != v2.faces_end(); ++it) - { compute_face(it, v2, graphic_buffer, m_drawing_functor); } + for (typename V2::Face_iterator it=v2.faces_begin(); it!=v2.faces_end(); ++it) + { compute_face(v2, it, graphic_buffer, drawing_functor); } } } @@ -326,17 +337,15 @@ void compute_elements(const V2& v2, CGAL::Graphic_buffer &graphic_bu template void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& m_drawing_functor) { draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor); } template -void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphic_buffer &graphic_buffer, - bool m_nofaces = false, bool m_draw_voronoi_vertices = true, - bool m_draw_dual_vertices = true ) +void add_in_graphic_buffer(const CGAL_VORONOI_TYPE& v2, + CGAL::Graphic_buffer& graphic_buffer) { // Default functor; user can add his own functor. CGAL::draw_function_for_v2::Drawing_functor_voronoi drawing_functor; - drawing_functor.colored_face = [](const CGAL_VORONOI_TYPE&, - typename CGAL_VORONOI_TYPE::Face_iterator fh) -> bool - { return true; }; - - drawing_functor.face_color = [] (const CGAL_VORONOI_TYPE& alcc, - typename CGAL_VORONOI_TYPE::Face_iterator fh) -> CGAL::IO::Color - { - return CGAL::IO::Color(73, 250, 117); - }; - add_in_graphic_buffer(v2, graphic_buffer, drawing_functor); } -// TODO: I'll add a description after idea verification -// Add custom key description (see keyPressEvent) -// setKeyDescription(::Qt::Key_R, "Toggles rays display"); -// setKeyDescription(::Qt::Key_D, "Toggles dual vertices display"); -// setKeyDescription(::Qt::Key_V, "Toggles voronoi vertices display"); +#ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. template -void draw(const CGAL_VORONOI_TYPE &av2, - const DrawingFunctor &drawing_functor, +void draw(const CGAL_VORONOI_TYPE& av2, + const DrawingFunctor& drawing_functor, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; @@ -377,7 +372,7 @@ void draw(const CGAL_VORONOI_TYPE &av2, } template -void draw(const CGAL_VORONOI_TYPE &av2, +void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_buffer buffer; @@ -388,92 +383,77 @@ void draw(const CGAL_VORONOI_TYPE &av2, typename CGAL_VORONOI_TYPE::Face_iterator> drawing_functor; - drawing_functor.colored_face = [](const CGAL_VORONOI_TYPE&, - typename CGAL_VORONOI_TYPE::Face_iterator fh) -> bool - { return true; }; - - - drawing_functor.face_color = [] (const CGAL_VORONOI_TYPE& alcc, - typename CGAL_VORONOI_TYPE::Face_iterator fh) -> CGAL::IO::Color - { - return CGAL::IO::Color(73, 250, 117); - }; - add_in_graphic_buffer(av2, buffer, drawing_functor); - std::function *)> VoronoiKeyPressEvent = - [&av2, &drawing_functor] (QKeyEvent *e, CGAL::Basic_viewer_qt *_this) -> bool + QApplication_and_basic_viewer app(buffer, title); + if(app) { - /// [Keypress] - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { - - // This is like m_draw_rays = !m_draw_rays; - if(drawing_functor.are_rays_enabled()) - { - drawing_functor.disable_rays(); - } - else { - drawing_functor.enable_rays(); - } - - std::cout << "R Pressed\n"; - - _this->displayMessage( - QString("Draw rays=%1.").arg(drawing_functor.are_rays_enabled() ? "true" : "false")); - _this->update(); - - } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::NoButton)) { - - std::cout << "V Pressed\n"; - - // This is like m_draw_voronoi_vertices = !m_draw_voronoi_vertices; - if(drawing_functor.are_voronoi_vertices_enabled()) + // Here we define the std::function to capture key pressed. + app.basic_viewer().on_key_pressed= + [&av2, &drawing_functor] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { - drawing_functor.disable_voronoi_vertices(); - } - else { - drawing_functor.enable_voronoi_vertices(); - } - - _this->displayMessage( - QString("Voronoi vertices=%1.").arg(drawing_functor.are_voronoi_vertices_enabled()? "true" : "false")); - - draw_function_for_v2::compute_elements(av2, _this->get_graphic_buffer(), drawing_functor); - - _this->redraw(); - } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - - std::cout << "D Pressed\n"; - - // m_draw_dual_vertices = !m_draw_dual_vertices; - if(drawing_functor.are_dual_vertices_enabled()) - { - drawing_functor.disable_dual_vertices(); - } - else { - drawing_functor.enable_dual_vertices(); - } - - _this->displayMessage(QString("Dual vertices=%1.") - .arg(drawing_functor.are_dual_vertices_enabled() ? "true" : "false")); - - draw_function_for_v2::compute_elements(av2, _this->get_graphic_buffer(), drawing_functor); + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) + { + basic_viewer->negate_draw_rays(); + basic_viewer->displayMessage + (QString("Draw rays=%1.").arg(basic_viewer->get_draw_rays()?"true":"false")); + + basic_viewer->redraw(); + } + else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::ShiftModifier)) + { + if(drawing_functor.are_voronoi_vertices_enabled()) + { drawing_functor.disable_voronoi_vertices(); } + else { drawing_functor.enable_voronoi_vertices(); } + + basic_viewer->displayMessage + (QString("Voronoi vertices=%1."). + arg(drawing_functor.are_voronoi_vertices_enabled()?"true":"false")); + + basic_viewer->clear(); + draw_function_for_v2::compute_elements(av2, + basic_viewer->get_graphic_buffer(), + drawing_functor); + basic_viewer->redraw(); + } + else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) + { + if(drawing_functor.are_dual_vertices_enabled()) + { drawing_functor.disable_dual_vertices(); } + else { drawing_functor.enable_dual_vertices(); } + + basic_viewer->displayMessage(QString("Dual vertices=%1."). + arg(drawing_functor.are_dual_vertices_enabled()?"true":"false")); + + basic_viewer->clear(); + draw_function_for_v2::compute_elements(av2, + basic_viewer->get_graphic_buffer(), + drawing_functor); + basic_viewer->redraw(); + } + else + { + // Return false will call the base method to process others/classicals key + return false; + } + return true; // the key was captured + }; + + // Here we add shortcut descriptions + app.basic_viewer().setKeyDescription(::Qt::Key_R, "Toggles rays display"); + app.basic_viewer().setKeyDescription(::Qt::Key_D, "Toggles dual vertices display"); + app.basic_viewer().setKeyDescription(::Qt::ShiftModifier, ::Qt::Key_V, "Toggles voronoi vertices display"); + + // Then we run the app + app.run(); + } +} - _this->redraw(); - } else { - // Return false will call the base method to process others/classicals key - return false; - } - /// [Keypress] - return true; - }; - draw_buffer(buffer, VoronoiKeyPressEvent, title); +#endif // CGAL_USE_BASIC_VIEWER -} +#undef CGAL_VORONOI_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_VORONOI_DIAGRAM_2_H From 09eaba29450d80b1bedc7d33e83f5a58d516676f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 14:10:48 +0200 Subject: [PATCH 115/341] move functor for voronoi --- .../include/CGAL/draw_voronoi_diagram_2.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 3f6e93a71721..139e37dc73e3 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -26,9 +26,6 @@ namespace CGAL { -namespace draw_function_for_v2 -{ - // We need a specific functor for voronoi2 in order to allow to differentiate // voronoi and dual vertices, and to manage rays. template & graphic_buffer) { // Default functor; user can add his own functor. - CGAL::draw_function_for_v2::Drawing_functor_voronoi + CGAL::Drawing_functor_voronoi drawing_functor; add_in_graphic_buffer(v2, graphic_buffer, drawing_functor); @@ -377,11 +377,11 @@ void draw(const CGAL_VORONOI_TYPE& av2, { CGAL::Graphic_buffer buffer; - CGAL::draw_function_for_v2::Drawing_functor_voronoi - drawing_functor; + CGAL::Drawing_functor_voronoi + drawing_functor; add_in_graphic_buffer(av2, buffer, drawing_functor); From 655b0c8064b223e69c2a9a555fd513f76859763d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 15:18:31 +0200 Subject: [PATCH 116/341] review draw periodic triangulation 2 --- .../CGAL/draw_periodic_2_triangulation_2.h | 305 +++++++++++------- 1 file changed, 190 insertions(+), 115 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 6818134aebf4..8381cfad821e 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -13,201 +13,276 @@ #ifndef DRAW_PERIODIC_2_TRIANGULATION_2_H #define DRAW_PERIODIC_2_TRIANGULATION_2_H -#include -#include #include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include +#include +#include #include -#include namespace CGAL { -namespace draw_function_for_P2T2 +// We need a specific functor for periodic_2_triangulation_2 for the parameter +// of the domain. +template +struct Drawing_functor_periodic_2_triangulation_2 : + public CGAL::Drawing_functor { + Drawing_functor_periodic_2_triangulation_2(): + domain_color(CGAL::IO::Color(96, 104, 252)), + m_draw_domain(true), + m_current_display_type(DS::STORED) + {} + + bool get_draw_domain() const + { return m_draw_domain; } + void set_draw_domain(bool b) + { m_draw_domain=b; } + void negate_draw_domain() + { m_draw_domain=!m_draw_domain; } + + typename DS::Iterator_type current_display_type() const + { return m_current_display_type; } + + void increase_current_display_type() + { + if(m_current_display_type==DS::UNIQUE_COVER_DOMAIN) + { m_current_display_type=DS::STORED; } + else + { m_current_display_type=typename DS::Iterator_type(static_cast(m_current_display_type)+1); } + } -enum Display_type -{ - STORED = 0, - UNIQUE, // 1 - STORED_COVER_DOMAIN, // 2 - UNIQUE_COVER_DOMAIN // 3 +public: + CGAL::IO::Color domain_color; + +protected: + bool m_draw_domain; + typename DS::Iterator_type m_current_display_type; }; -template -void compute_vertex(typename P2T2::Periodic_point_iterator pi, const P2T2 &p2t2, - CGAL::Graphic_buffer &graphic_buffer) +namespace draw_function_for_P2T2 +{ + +template +void compute_vertex(const P2T2 &p2t2, + typename P2T2::Periodic_point_iterator pi, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { // Construct the point in 9-sheeted covering space and add to viewer - graphic_buffer.add_point(p2t2.point(*pi)); + if(!drawing_functor.draw_vertex(p2t2, pi)) + { return; } + + if(drawing_functor.colored_vertex(p2t2, pi)) + { graphic_buffer.add_point(p2t2.point(*pi), + drawing_functor.vertex_color(p2t2, pi)); } + else + { graphic_buffer.add_point(p2t2.point(*pi)); } } -template -void compute_edge(typename P2T2::Periodic_segment_iterator si, const P2T2 &p2t2, - CGAL::Graphic_buffer &graphic_buffer) +template +void compute_edge(const P2T2 &p2t2, + typename P2T2::Periodic_segment_iterator si, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - typedef typename P2T2::Segment Segment; + if(!drawing_functor.draw_edge(p2t2, si)) + { return; } // Construct the segment in 9-sheeted covering space and add to viewer - Segment s(p2t2.segment(*si)); - graphic_buffer.add_segment(s[0], s[1]); + typename P2T2::Segment s(p2t2.segment(*si)); + if(drawing_functor.colored_edge(p2t2, si)) + { graphic_buffer.add_segment(s[0], s[1], + drawing_functor.edge_color(p2t2, si)); } + else + { graphic_buffer.add_segment(s[0], s[1]); } } -template -void compute_face(typename P2T2::Periodic_triangle_iterator ti, const P2T2 &p2t2, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +template +void compute_face(const P2T2 &p2t2, + typename P2T2::Periodic_triangle_iterator ti, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - typedef typename P2T2::Triangle Triangle; + if(!drawing_functor.draw_face(p2t2, ti)) + { return; } // Construct the triangle in 9-sheeted covering space and add to viewer - Triangle t(p2t2.triangle(*ti)); - - if(m_drawing_functor.colored_face(p2t2, ti)) { - - CGAL::IO::Color c= m_drawing_functor.face_color(p2t2, ti); - graphic_buffer.face_begin(c); - graphic_buffer.add_point_in_face(t[0]); - graphic_buffer.add_point_in_face(t[1]); - graphic_buffer.add_point_in_face(t[2]); - graphic_buffer.face_end(); - } + typename P2T2::Triangle t(p2t2.triangle(*ti)); + if(drawing_functor.colored_face(p2t2, ti)) + { graphic_buffer.face_begin(drawing_functor.face_color(p2t2, ti)); } + else + { graphic_buffer.face_begin(); } - // Display the edges of the faces as segments with a - // light gray color for better visualization - CGAL::IO::Color segment_color = CGAL::IO::Color(207, 213, 211); - - graphic_buffer.add_segment(t[0], t[1], segment_color); - graphic_buffer.add_segment(t[1], t[2], segment_color); - graphic_buffer.add_segment(t[2], t[0], segment_color); - + graphic_buffer.add_point_in_face(t[0]); + graphic_buffer.add_point_in_face(t[1]); + graphic_buffer.add_point_in_face(t[2]); + graphic_buffer.face_end(); } -template -void compute_domain(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) +template +void compute_domain(const P2T2& p2t2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; Kernel::Iso_rectangle_2 orig_domain = p2t2.domain(); std::array covering_sheets = p2t2.number_of_sheets(); - for(int i = 0; i < covering_sheets[0]; i++){ - for(int j = 0; j < covering_sheets[1]; j++){ + for(int i = 0; i < covering_sheets[0]; i++) + { + for(int j = 0; j < covering_sheets[1]; j++) + { Kernel::Vector_2 shift(i * (orig_domain.xmax() - orig_domain.xmin()), - j * orig_domain.ymax() - orig_domain.ymin()); + j * orig_domain.ymax() - orig_domain.ymin()); Kernel::Point_2 p1((orig_domain.min)()); Kernel::Point_2 p2(orig_domain.xmin(), orig_domain.ymax()); Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); Kernel::Point_2 p4((orig_domain.max)()); - graphic_buffer.add_segment(p1 + shift, p2 + shift, CGAL::IO::Color(96, 104, 252)); - graphic_buffer.add_segment(p1 + shift, p3 + shift, CGAL::IO::Color(96, 104, 252)); - graphic_buffer.add_segment(p2 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); - graphic_buffer.add_segment(p3 + shift, p4 + shift, CGAL::IO::Color(96, 104, 252)); + graphic_buffer.add_segment(p1 + shift, p2 + shift, drawing_functor.domain_color); + graphic_buffer.add_segment(p1 + shift, p3 + shift, drawing_functor.domain_color); + graphic_buffer.add_segment(p2 + shift, p4 + shift, drawing_functor.domain_color); + graphic_buffer.add_segment(p3 + shift, p4 + shift, drawing_functor.domain_color); } } } -template -void compute_elements(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor, bool m_domain = true) { - - typedef typename P2T2::Iterator_type Iterator_type; - - draw_function_for_P2T2::Display_type m_display_type = draw_function_for_P2T2::Display_type::STORED_COVER_DOMAIN; - +template +void compute_elements(const P2T2& p2t2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ // Get the display type, iterate through periodic elements according // to the display type - Iterator_type it_type = (Iterator_type)m_display_type; + typedef typename P2T2::Iterator_type Iterator_type; + Iterator_type it_type = (Iterator_type)drawing_functor.current_display_type(); // Iterate through vertices, edges and faces, add elements to buffer - for (typename P2T2::Periodic_point_iterator it = - p2t2.periodic_points_begin(it_type); - it != p2t2.periodic_points_end(it_type); it++) + if(drawing_functor.are_vertices_enabled()) { - compute_vertex(it, p2t2, graphic_buffer); + for (typename P2T2::Periodic_point_iterator it=p2t2.periodic_points_begin(it_type); + it!=p2t2.periodic_points_end(it_type); ++it) + { compute_vertex(p2t2, it, graphic_buffer, drawing_functor); } } - for (typename P2T2::Periodic_segment_iterator it = - p2t2.periodic_segments_begin(it_type); - it != p2t2.periodic_segments_end(it_type); it++) + if(drawing_functor.are_edges_enabled()) { - compute_edge(it, p2t2, graphic_buffer); + for (typename P2T2::Periodic_segment_iterator it=p2t2.periodic_segments_begin(it_type); + it!=p2t2.periodic_segments_end(it_type); ++it) + { compute_edge(p2t2, it, graphic_buffer, drawing_functor); } } - for (typename P2T2::Periodic_triangle_iterator it = - p2t2.periodic_triangles_begin(it_type); - it != p2t2.periodic_triangles_end(it_type); it++) + if (drawing_functor.are_faces_enabled()) { - compute_face(it, p2t2, graphic_buffer, m_drawing_functor); + for (typename P2T2::Periodic_triangle_iterator it=p2t2.periodic_triangles_begin(it_type); + it!=p2t2.periodic_triangles_end(it_type); ++it) + { compute_face(p2t2, it, graphic_buffer, drawing_functor); } } - if(m_domain){ + if(drawing_functor.get_draw_domain()) + { // Compute the (9-sheet covering space) domain of the periodic triangulation - compute_domain(p2t2, graphic_buffer); + compute_domain(p2t2, graphic_buffer, drawing_functor); } } } // namespace draw_function_for_P2T2 -template -void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) { - draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, m_drawing_functor, true); -} - -template -void add_in_graphic_buffer(const P2T2 &p2t2, CGAL::Graphic_buffer &graphic_buffer) { - - CGAL::Drawing_functor drawing_functor; +#define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 - drawing_functor.colored_face = [](const P2T2&, - typename P2T2::Periodic_triangle_iterator) -> bool - { return true; }; +template +void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) +{ + draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, drawing_functor); +} - drawing_functor.face_color = [] (const P2T2& alcc, - typename P2T2::Periodic_triangle_iterator dh) -> CGAL::IO::Color - { - return CGAL::IO::Color(73, 250, 117); - }; +template +void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, + CGAL::Graphic_buffer& graphic_buffer) +{ + CGAL::Drawing_functor_periodic_2_triangulation_2 + drawing_functor; add_in_graphic_buffer(p2t2, graphic_buffer, drawing_functor); } -// Specialization of draw function -#define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 +#ifdef CGAL_USE_BASIC_VIEWER -template < class Gt, - class Tds, - class BufferType = float, - class DrawingFunctor > +// Specialization of draw function +template void draw(const CGAL_P2T2_TYPE& ap2t2, - const DrawingFunctor &drawing_functor) + const DrawingFunctor& drawing_functor, + const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(ap2t2, buffer, drawing_functor); draw_buffer(buffer); } -template < class Gt, - class Tds, - class BufferType = float > +template void draw(const CGAL_P2T2_TYPE& ap2t2, - const char* title = "2D Periodic Triangulation Viewer", - bool nofill = false) + const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(ap2t2, buffer); - draw_buffer(buffer); -} + CGAL::Drawing_functor_periodic_2_triangulation_2 + drawing_functor; -} // namespace CGAL + add_in_graphic_buffer(ap2t2, buffer, drawing_functor); + QApplication_and_basic_viewer app(buffer, title); + if(app) + { + // Here we define the std::function to capture key pressed. + app.basic_viewer().on_key_pressed= + [&ap2t2, &drawing_functor] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) + { + drawing_functor.increase_current_display_type(); + basic_viewer->displayMessage + (QString("Display type=%1.").arg(drawing_functor.current_display_type()==0?"Stored": + (drawing_functor.current_display_type()==1?"Unique": + (drawing_functor.current_display_type()==2?"Stored cover": + "Unique cover")))); + basic_viewer->clear(); + draw_function_for_P2T2::compute_elements(ap2t2, + basic_viewer->get_graphic_buffer(), + drawing_functor); + basic_viewer->redraw(); + } + else + { + // Return false will call the base method to process others/classicals key + return false; + } + return true; // the key was captured + }; + + // Here we add shortcut descriptions + app.basic_viewer().setKeyDescription(::Qt::Key_D, "Next display type"); + + // Then we run the app + app.run(); + } +} #endif // CGAL_USE_BASIC_VIEWER +#undef CGAL_P2T2_TYPE + +} // namespace CGAL + #endif // DRAW_PERIODIC_2_TRIANGULATION_2_H From e18a573cc1de164347b218abb4e7354a7fbb069f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 15:22:09 +0200 Subject: [PATCH 117/341] add missing include --- Nef_3/include/CGAL/draw_nef_3.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index ccff10a5ef7c..96c1093ec4de 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include From 9da6a6d376a3dc82a9699401de660a21fc8e549a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 15:45:36 +0200 Subject: [PATCH 118/341] add missing include --- Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index add255dfa6e0..7d7f0785f01b 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include From 779fea48de1b6311d326da1a1289dea072a44647 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 16:01:37 +0200 Subject: [PATCH 119/341] use references --- .../include/CGAL/draw_linear_cell_complex.h | 192 +++++++++--------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 7d7f0785f01b..f2934937c2c9 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -58,32 +58,33 @@ struct LCC_geom_utils }; template -void compute_face(typename LCC::Dart_const_handle dh, - typename LCC::Dart_const_handle voldh, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - CGAL::Graphic_buffer &graphic_buffer) +void compute_face(const LCC& lcc, + typename LCC::Dart_const_handle dh, + typename LCC::Dart_const_handle voldh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctorLCC& drawing_functor) { - if (!m_drawing_functor.are_faces_enabled() || - !m_drawing_functor.draw_face(*lcc, dh)) + if (!drawing_functor.are_faces_enabled() || + !drawing_functor.draw_face(lcc, dh)) { return; } // We fill only closed faces. typename LCC::Dart_const_handle cur=dh; do { - if (!lcc->is_next_exist(cur)) + if (!lcc.is_next_exist(cur)) { return; } // open face=>not filled - cur = lcc->next(cur); + cur = lcc.next(cur); } while (cur!=dh); - if (m_drawing_functor.colored_volume(*lcc, voldh)) + if (drawing_functor.colored_volume(lcc, voldh)) { - graphic_buffer.face_begin(m_drawing_functor.volume_color(*lcc, voldh)); + graphic_buffer.face_begin(drawing_functor.volume_color(lcc, voldh)); } - else if (m_drawing_functor.colored_face(*lcc, dh)) + else if (drawing_functor.colored_face(lcc, dh)) { - graphic_buffer.face_begin(m_drawing_functor.face_color(*lcc, dh)); + graphic_buffer.face_begin(drawing_functor.face_color(lcc, dh)); } else { graphic_buffer.face_begin(); } @@ -92,9 +93,9 @@ void compute_face(typename LCC::Dart_const_handle dh, do { graphic_buffer.add_point_in_face - (lcc->point(cur), - LCC_geom_utils::get_vertex_normal(*lcc, cur)); - cur=lcc->next(cur); + (lcc.point(cur), + LCC_geom_utils::get_vertex_normal(lcc, cur)); + cur=lcc.next(cur); } while (cur!=dh); @@ -102,104 +103,103 @@ void compute_face(typename LCC::Dart_const_handle dh, } template -void compute_edge(typename LCC::Dart_const_handle dh, const LCC *lcc, - const DrawingFunctor &m_drawing_functor, - CGAL::Graphic_buffer &graphic_buffer) +void compute_edge(const LCC& lcc, + typename LCC::Dart_const_handle dh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - if (!m_drawing_functor.are_edges_enabled() || - !m_drawing_functor.draw_edge(*lcc, dh)) + if (!drawing_functor.are_edges_enabled() || + !drawing_functor.draw_edge(lcc, dh)) { return; } - const typename LCC::Point& p1=lcc->point(dh); - typename LCC::Dart_const_handle d2=lcc->other_extremity(dh); + const typename LCC::Point& p1=lcc.point(dh); + typename LCC::Dart_const_handle d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (m_drawing_functor.colored_edge(*lcc, dh)) + if (drawing_functor.colored_edge(lcc, dh)) { - graphic_buffer.add_segment(p1, lcc->point(d2), - m_drawing_functor.edge_color(*lcc, dh)); + graphic_buffer.add_segment(p1, lcc.point(d2), + drawing_functor.edge_color(lcc, dh)); } else - { graphic_buffer.add_segment(p1, lcc->point(d2)); } + { graphic_buffer.add_segment(p1, lcc.point(d2)); } } } template -void compute_vertex(typename LCC::Dart_const_handle dh, const LCC *lcc, - const DrawingFunctorLCC &m_drawing_functor, - CGAL::Graphic_buffer &graphic_buffer) +void compute_vertex(const LCC& lcc, + typename LCC::Dart_const_handle dh, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctorLCC& drawing_functor) { - if (!m_drawing_functor.are_vertices_enabled() || - !m_drawing_functor.draw_vertex(*lcc, dh)) + if (!drawing_functor.are_vertices_enabled() || + !drawing_functor.draw_vertex(lcc, dh)) { return; } - if (m_drawing_functor.colored_vertex(*lcc, dh)) + if (drawing_functor.colored_vertex(lcc, dh)) { - graphic_buffer.add_point(lcc->point(dh), - m_drawing_functor.vertex_color(*lcc, dh)); + graphic_buffer.add_point(lcc.point(dh), + drawing_functor.vertex_color(lcc, dh)); } else - { graphic_buffer.add_point(lcc->point(dh)); } + { graphic_buffer.add_point(lcc.point(dh)); } } template -void compute_elements(const LCC *lcc, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +void compute_elements(const LCC& lcc, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - if (lcc==nullptr) - { return; } - - typename LCC::size_type markvolumes = lcc->get_new_mark(); - typename LCC::size_type markfaces = lcc->get_new_mark(); - typename LCC::size_type markedges = lcc->get_new_mark(); - typename LCC::size_type markvertices = lcc->get_new_mark(); - typename LCC::size_type oriented_mark = lcc->get_new_mark(); + typename LCC::size_type markvolumes = lcc.get_new_mark(); + typename LCC::size_type markfaces = lcc.get_new_mark(); + typename LCC::size_type markedges = lcc.get_new_mark(); + typename LCC::size_type markvertices = lcc.get_new_mark(); + typename LCC::size_type oriented_mark = lcc.get_new_mark(); - lcc->orient(oriented_mark); + lcc.orient(oriented_mark); - for(typename LCC::Dart_range::const_iterator it=lcc->darts().begin(), - itend=lcc->darts().end(); it!=itend; ++it) + for(typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it) { - if (!lcc->is_marked(it, markvolumes) && - m_drawing_functor.draw_volume(*lcc, it)) + if (!lcc.is_marked(it, markvolumes) && + drawing_functor.draw_volume(lcc, it)) { for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator - itv=lcc->template darts_of_cell_basic<3>(it, markvolumes).begin(), - itvend=lcc->template darts_of_cell_basic<3>(it, markvolumes).end(); + itv=lcc.template darts_of_cell_basic<3>(it, markvolumes).begin(), + itvend=lcc.template darts_of_cell_basic<3>(it, markvolumes).end(); itv!=itvend; ++itv) { - lcc->mark(itv, markvolumes); - if (!lcc->is_marked(itv, markfaces) && - lcc->is_marked(itv, oriented_mark) && - m_drawing_functor.draw_face(*lcc, itv)) + lcc.mark(itv, markvolumes); + if (!lcc.is_marked(itv, markfaces) && + lcc.is_marked(itv, oriented_mark) && + drawing_functor.draw_face(lcc, itv)) { - if ((!m_drawing_functor.volume_wireframe(*lcc, itv) || - (!lcc->template is_free<3>(itv) && - !m_drawing_functor.volume_wireframe(*lcc, lcc->template beta<3>(itv)))) && - !m_drawing_functor.face_wireframe(*lcc, itv)) - { compute_face(itv, it, lcc, m_drawing_functor, graphic_buffer); } + if ((!drawing_functor.volume_wireframe(lcc, itv) || + (!lcc.template is_free<3>(itv) && + !drawing_functor.volume_wireframe(lcc, lcc.template beta<3>(itv)))) && + !drawing_functor.face_wireframe(lcc, itv)) + { compute_face(lcc, itv, it, graphic_buffer, drawing_functor); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator - itf=lcc->template darts_of_cell_basic<2>(itv, markfaces).begin(), - itfend=lcc->template darts_of_cell_basic<2>(itv, markfaces).end(); + itf=lcc.template darts_of_cell_basic<2>(itv, markfaces).begin(), + itfend=lcc.template darts_of_cell_basic<2>(itv, markfaces).end(); itf!=itfend; ++itf) { - lcc->mark(itf, markfaces); - if (!lcc->is_marked(itf, markedges) && - m_drawing_functor.draw_edge(*lcc, itf)) + lcc.mark(itf, markfaces); + if (!lcc.is_marked(itf, markedges) && + drawing_functor.draw_edge(lcc, itf)) { - compute_edge(itf, lcc, m_drawing_functor, graphic_buffer); + compute_edge(lcc, itf, graphic_buffer, drawing_functor); for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator - ite=lcc->template darts_of_cell_basic<1>(itf, markedges).begin(), - iteend=lcc->template darts_of_cell_basic<1>(itf, markedges).end(); + ite=lcc.template darts_of_cell_basic<1>(itf, markedges).begin(), + iteend=lcc.template darts_of_cell_basic<1>(itf, markedges).end(); ite!=iteend; ++ite) { - lcc->mark(ite, markedges); - if (!lcc->is_marked(ite, markvertices) && - m_drawing_functor.draw_vertex(*lcc, ite)) + lcc.mark(ite, markedges); + if (!lcc.is_marked(ite, markvertices) && + drawing_functor.draw_vertex(lcc, ite)) { - compute_vertex(ite, lcc, m_drawing_functor, graphic_buffer); - CGAL::mark_cell(*lcc, ite, markvertices); + compute_vertex(lcc, ite, graphic_buffer, drawing_functor); + CGAL::mark_cell(lcc, ite, markvertices); } } } @@ -209,21 +209,21 @@ void compute_elements(const LCC *lcc, } } - for (typename LCC::Dart_range::const_iterator it = lcc->darts().begin(), - itend = lcc->darts().end(); it != itend; ++it) + for (typename LCC::Dart_range::const_iterator it = lcc.darts().begin(), + itend = lcc.darts().end(); it != itend; ++it) { - lcc->unmark(it, markvertices); - lcc->unmark(it, markedges); - lcc->unmark(it, markfaces); - lcc->unmark(it, markvolumes); - lcc->unmark(it, oriented_mark); + lcc.unmark(it, markvertices); + lcc.unmark(it, markedges); + lcc.unmark(it, markfaces); + lcc.unmark(it, markvolumes); + lcc.unmark(it, oriented_mark); } - lcc->free_mark(markvolumes); - lcc->free_mark(markfaces); - lcc->free_mark(markedges); - lcc->free_mark(markvertices); - lcc->free_mark(oriented_mark); + lcc.free_mark(markvolumes); + lcc.free_mark(markfaces); + lcc.free_mark(markedges); + lcc.free_mark(markvertices); + lcc.free_mark(oriented_mark); } } // namespace draw_function_for_lcc @@ -239,12 +239,12 @@ template class Map, class Refs, class Storage_, typename BufferType=float, class DrawingFunctor> -void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) +void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, + CGAL::Graphic_buffer& graphic_buffer, + const DrawingFunctor& drawing_functor) { - draw_function_for_lcc::compute_elements(static_cast(&alcc), - graphic_buffer, m_drawing_functor); + draw_function_for_lcc::compute_elements(static_cast(alcc), + graphic_buffer, drawing_functor); } // add_in_graphic_buffer: to add a LCC in the given graphic buffer, without a @@ -253,8 +253,8 @@ template class Map, class Refs, class Storage_, typename BufferType=float> -void add_in_graphic_buffer(const CGAL_LCC_TYPE &alcc, - CGAL::Graphic_buffer &graphic_buffer) +void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, + CGAL::Graphic_buffer& graphic_buffer) { CGAL::Drawing_functor_with_volume class Map, class Refs, class Storage_, class DrawingFunctor> -void draw(const CGAL_LCC_TYPE &alcc, const DrawingFunctor &drawing_functor, +void draw(const CGAL_LCC_TYPE& alcc, const DrawingFunctor& drawing_functor, const char *title="LCC Basic Viewer") { CGAL::Graphic_buffer buffer; @@ -298,7 +298,7 @@ template class Map, class Refs, class Storage_> -void draw(const CGAL_LCC_TYPE &alcc, const char *title="LCC Basic Viewer") +void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") { CGAL::Graphic_buffer buffer; add_in_graphic_buffer(alcc, buffer); From fb80b2f3c44e5f261c5769551f984a406f858482 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 16:26:03 +0200 Subject: [PATCH 120/341] add missing include --- .../include/CGAL/draw_periodic_2_triangulation_2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 8381cfad821e..5ca4e9c4bb3f 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace CGAL { From 4377f527bc37a750d413636edb1b00ad00a67d0f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 16:27:11 +0200 Subject: [PATCH 121/341] add missing include --- Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 139e37dc73e3..d25ff88e78e6 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include From 534e7894b4bea359de436cdf1e02c03ee047d49f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 16:34:08 +0200 Subject: [PATCH 122/341] replace use of get_local_point --- GraphicsView/include/CGAL/Graphic_buffer.h | 8 ++++++++ .../include/CGAL/draw_voronoi_diagram_2.h | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/GraphicsView/include/CGAL/Graphic_buffer.h index c12b5aaa1ab0..425597cfcdb4 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/GraphicsView/include/CGAL/Graphic_buffer.h @@ -61,6 +61,7 @@ class Graphic_buffer public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; + typedef Local_kernel::Vector_3 Local_vector; Graphic_buffer() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, @@ -331,6 +332,13 @@ class Graphic_buffer Local_kernel>::get_local_point(p); } + template + static Local_vector get_local_vector(const KVector &v) + { + return internal::Geom_utils::Kernel, + Local_kernel>::get_local_vector(v); + } + template void add_text(const KPoint &kp, const QString &txt) { diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index d25ff88e78e6..b1e4ad3de924 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -127,8 +127,8 @@ void add_segments_and_update_bounding_box(const V2& v2, end_point = he->source()->point(); // update_bounding_box_for_ray(end_point, direction); - Local_point lp = Basic_viewer_qt<>::get_local_point(end_point); - Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); + Local_point lp = graphic_buffer.get_local_point(end_point); + Local_vector lv = graphic_buffer.get_local_vector(direction); CGAL::Bbox_3 b = (lp + lv).bbox(); graphic_buffer.update_bounding_box(b); } @@ -143,9 +143,9 @@ void add_segments_and_update_bounding_box(const V2& v2, // update_bounding_box_for_line(pointOnLine, direction, // perpendicularDirection); - Local_point lp = Basic_viewer_qt<>::get_local_point(pointOnLine); - Local_vector lv = Basic_viewer_qt<>::get_local_vector(direction); - Local_vector lpv = Basic_viewer_qt<>::get_local_vector(perpendicularDirection); + Local_point lp = graphic_buffer.get_local_point(pointOnLine); + Local_vector lv = graphic_buffer.get_local_vector(direction); + Local_vector lpv = graphic_buffer.get_local_vector(perpendicularDirection); CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); graphic_buffer.update_bounding_box(b); From de846fc8d39d01ac43f24f02f897fdb88ec5f2bc Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 19 Oct 2022 17:19:37 +0200 Subject: [PATCH 123/341] do not use beta in lcc --- Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index f2934937c2c9..d047aed5f3d7 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -176,7 +176,7 @@ void compute_elements(const LCC& lcc, { if ((!drawing_functor.volume_wireframe(lcc, itv) || (!lcc.template is_free<3>(itv) && - !drawing_functor.volume_wireframe(lcc, lcc.template beta<3>(itv)))) && + !drawing_functor.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && !drawing_functor.face_wireframe(lcc, itv)) { compute_face(lcc, itv, it, graphic_buffer, drawing_functor); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator From 8550ce6ec48b5736d444b56a6dceca61b7cf11a1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Sat, 5 Nov 2022 17:27:15 +0100 Subject: [PATCH 124/341] draw_surface_mesh_small_faces and draw_face_graph_with_paths NYF --- .../draw_surface_mesh_small_faces.cpp | 24 +- .../include/CGAL/draw_face_graph_with_paths.h | 308 ++++++++---------- 2 files changed, 165 insertions(+), 167 deletions(-) diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp index 2fb9ab9c7c8f..b24e54801b9d 100644 --- a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp +++ b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp @@ -10,6 +10,23 @@ typedef CGAL::Simple_cartesian Kernel; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh Mesh; +struct Drawing_functor_small_face: public CGAL::Drawing_functor + +{ + drawing_functor.colored_face = [](const FG&, + typename boost::graph_traits::face_descriptor fg) -> bool + { return is_small(fg); }; + + drawing_functor.face_color = [] (const FG&, + typename boost::graph_traits::face_descriptor) -> CGAL::IO::Color + { return CGAL::IO::Color(200, 60, 60); }; // Red + + unsigned int m_threshold; + FT m_min_size, m_max_size; + bool m_draw_small_faces; + bool m_draw_big_faces; +}; + int main(int argc, char* argv[]) { const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); @@ -21,7 +38,12 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - CGAL::draw(sm); + Drawing_functor_small_face drawing_functor; + CGAL::draw(sm, drawing_functor); + + // setKeyDescription(Qt::Key_I, "Increment threshold for small faces"); + // setKeyDescription(Qt::Key_D, "Decrement threshold for small faces"); + // setKeyDescription(Qt::Key_S, "Draw small faces only , big faces only, both"); return EXIT_SUCCESS; } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index e27f4784b787..e117e5b54a52 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -15,23 +15,47 @@ #include +#include #include #include -#include #include #include +#include + #include #include #include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include #include namespace CGAL { +// Specific drawing functor +template +struct Drawing_functor_face_graph_with_paths : + public CGAL::Drawing_functor +{ + Drawing_functor_face_graph_with_paths(std::size_t nbpaths): m_nbpaths(nbpaths) + { + color_of_path=[](std::size_t i)->CGAL::IO::Color + { + CGAL::Random random(static_cast(i)); + return get_random_color(random); + }; + + draw_path=[](std::size_t)->bool + { return true; } + } + + std::function color_of_path; + std::function draw_path; + +protected: + std::size_t m_nbpaths; +}; namespace draw_function_for_lcc { @@ -106,13 +130,9 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; -// Destructor. -// lcc.free_mark(m_oriented_mark); - - - template -const typename CGAL::Get_traits::Point& get_point(typename Get_map::type::Dart_const_handle dh, const Mesh &mesh) +const typename CGAL::Get_traits::Point& get_point +(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; @@ -121,12 +141,16 @@ const typename CGAL::Get_traits::Point& get_point(typename Get_map::get_point(mesh, dh); } -template -void compute_face(typename Get_map::type::Dart_const_handle dh, - const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, - const typename Get_map::storage_type& lcc) +template +void compute_face(const Mesh& mesh, + const typename Get_map::storage_type& lcc, + typename Get_map::type::Dart_const_descriptor dh, + CGAL::Graphic_buffer& graphic_buffer, + DrawingFunctor& drawing_functor) { + if(!drawing_functor.draw_face(lcc, dh)) + { return; } + typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; typedef typename LCC::size_type size_type; @@ -146,15 +170,17 @@ void compute_face(typename Get_map::type::Dart_const_handle dh, } while(cur!=dh); - // CGAL::IO::Color c=m_fcolor.run(*lcc, dh); - graphic_buffer.face_begin(); //c); + if(drawing_functor.colored_face(lcc, dh)) + { graphic_buffer.face_begin(drawing_functor.face_color(lcc, dh)); } + else + { graphic_buffer.face_begin(); } cur=dh; do { - graphic_buffer.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(cur, mesh), + graphic_buffer.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(mesh, cur), draw_function_for_lcc::LCC_geom_utils:: - get_vertex_normal(lcc, cur)); + get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } while(cur!=dh); @@ -162,88 +188,93 @@ void compute_face(typename Get_map::type::Dart_const_handle dh, graphic_buffer.face_end(); } -template -void compute_edge(typename Get_map::type::Dart_const_handle dh, - const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, +template +void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, + typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - bool m_draw_marked_darts = true) + CGAL::Graphic_buffer& graphic_buffer, + DrawingFunctor& drawing_functor, + bool draw_marked_darts=true) { + if(!drawing_functor.draw_edge(lcc, dh)) + { return; } + typedef typename Get_map::type LCC; typedef typename LCC::size_type size_type; - typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - Point p1 = get_point(dh, mesh); - Dart_const_handle d2 = lcc.other_extremity(dh); - if (d2!=LCC::null_handle) + Point p1=get_point(mesh, dh); + Dart_const_descriptor d2 = lcc.other_extremity(dh); + if (d2!=LCC::null_descriptor) { if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) - { graphic_buffer.add_segment(p1, get_point(d2, mesh), CGAL::IO::Color(0, 0, 255)); } + { graphic_buffer.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } else - { graphic_buffer.add_segment(p1, get_point(d2, mesh)); } + { graphic_buffer.add_segment(p1, get_point(mesh, d2)); } } } template -void compute_edge(typename Get_map::type::Dart_const_handle dh, +void compute_edge(const Mesh &mesh, + const typename Get_map::storage_type& lcc, + typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, - const typename Get_map::storage_type& lcc) + CGAL::Graphic_buffer& graphic_buffer) { typedef typename Get_map::type LCC; - typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - Point p1 = get_point(dh, mesh); - Dart_const_handle d2 = lcc.other_extremity(dh); - if (d2!=LCC::null_handle) - { graphic_buffer.add_segment(p1, get_point(d2, mesh), color); } + Point p1=get_point(mesh, dh); + Dart_const_descriptor d2=lcc.other_extremity(dh); + if (d2!=LCC::null_descriptor) + { graphic_buffer.add_segment(p1, get_point(mesh, d2), color); } } template -void compute_vertex(typename Get_map::type::Dart_const_handle dh, - const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer) +void compute_vertex(const Mesh &mesh, + typename Get_map::type::Dart_const_descriptor dh, + CGAL::Graphic_buffer& graphic_buffer, + DrawingFunctor& drawing_functor) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - graphic_buffer.add_point(get_point(dh, mesh)); + graphic_buffer.add_point(get_point(mesh, dh)); } template -void compute_path(std::size_t i, - typename Get_map::type::size_type amark, - const Mesh &mesh, +void compute_path(const Mesh &mesh, + const typename Get_map::storage_type& lcc, CGAL::Graphic_buffer &graphic_buffer, const std::vector>* m_paths, - const typename Get_map::storage_type& lcc) + std::size_t i, + typename Get_map::type::size_type amark) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - if ((*m_paths)[i].is_empty()) + if ((*m_paths)[i].is_empty() || !drawing_functor.draw_path(i)) { return; } CGAL::Random random(static_cast(i)); CGAL::IO::Color color = get_random_color(random); - graphic_buffer.add_point(get_point((*m_paths)[i].get_ith_dart(0), mesh), color); + graphic_buffer.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) { if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) { - compute_edge((*m_paths)[i].get_ith_dart(j), color, mesh, graphic_buffer, lcc); + compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphic_buffer, lcc); lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); } } @@ -253,11 +284,8 @@ template void compute_elements(const Mesh &mesh, CGAL::Graphic_buffer &graphic_buffer, const DrawingFunctor &m_drawing_functor, - const typename Get_map::storage_type& lcc, const std::vector>* m_paths, - typename Get_map::type::size_type amark /*= typename Get_map::type::INVALID_MARK*/, - bool m_nofaces = false, - bool m_draw_marked_darts = true) + typename Get_map::type::size_type amark) { typedef typename Get_map::type LCC; typedef typename LCC::size_type size_type; @@ -265,24 +293,24 @@ void compute_elements(const Mesh &mesh, typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - typedef typename LCC::Dart_const_handle Dart_const_handle; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; + typename Get_map::storage_type alcc(mesh); typename LCC::Dart_range::const_iterator m_current_dart = lcc.darts().end(); typename LCC::size_type m_oriented_mark = lcc.get_new_mark(); std::size_t m_current_path = m_paths->size(); - typename LCC::size_type m_amark = amark==(std::numeric_limits::max)()? + typename LCC::size_type m_amark=amark==(std::numeric_limits::max)()? LCC::INVALID_MARK:amark; // If !=INVALID_MARK, show darts marked with this mark lcc.orient(m_oriented_mark); - typename LCC::size_type markfaces = lcc.get_new_mark(); typename LCC::size_type markedges = lcc.get_new_mark(); typename LCC::size_type markvertices = lcc.get_new_mark(); if (m_current_dart!=lcc.darts().end()) { // We want to draw only one dart - Dart_const_handle selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); + Dart_const_descriptor selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphic_buffer, lcc); lcc.template mark_cell<1>(selected_dart, markedges); compute_vertex(selected_dart, mesh, graphic_buffer); @@ -341,139 +369,77 @@ void compute_elements(const Mesh &mesh, } // namespace draw_function_for_face_graph_with_paths -template -void add_in_graphic_buffer(const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor, - // TODO: I think I need to use smart pointers with lcc, right? - const typename Get_map::storage_type& lcc, - const std::vector>* m_paths, - typename Get_map::type::size_type amark= /*typename*/ Get_map::type::INVALID_MARK, - bool m_nofaces = false) { - draw_function_for_face_graph_with_paths::compute_elements(mesh, graphic_buffer, m_drawing_functor, lcc, m_paths, amark, m_nofaces); +template +void add_in_graphic_buffer(const Mesh& mesh, + CGAL::Graphic_buffer& graphic_buffer, + const std::vector>* paths, + const DrawingFunctor& drawing_functor, + typename Get_map::type::size_type amark= + typename Get_map::type::INVALID_MARK) +{ + draw_function_for_face_graph_with_paths::compute_elements(mesh, + graphic_buffer, + drawing_functor, + paths, amark); } template -void add_in_graphic_buffer(const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, - // TODO: I think I need to use smart pointers with lcc, right? - const typename Get_map::storage_type& lcc, - const std::vector>* m_paths, - typename Get_map::type::size_type amark= /*typename*/ Get_map::type::INVALID_MARK, - bool m_nofaces = false) { - +void add_in_graphic_buffer(const Mesh& mesh, + CGAL::Graphic_buffer& graphic_buffer, + const std::vector>* paths, + typename Get_map::type::size_type amark= + typename Get_map::type::INVALID_MARK) +{ // Default functor; user can add his own functor. Drawing_functor::type::Dart_const_handle /*vh*/, - typename Get_map::type::Dart_const_handle /*eh*/, - typename Get_map::type::Dart_const_handle /*fh*/> + typename Get_map::type::Dart_const_descriptor /*vh*/, + typename Get_map::type::Dart_const_descriptor /*eh*/, + typename Get_map::type::Dart_const_descriptor /*fh*/> drawing_functor; - add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, lcc, m_paths, amark, m_nofaces); + add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, paths, amark); } +#ifdef CGAL_USE_BASIC_VIEWER -template -void draw(const Mesh& alcc, +template +void draw(const Mesh& mesh, const std::vector >& paths, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path", - bool nofill=false) { - + const char* title="Mesh Viewer With Path") +{ CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(alcc, buffer, alcc, &paths, amark, nofill); - draw_buffer(buffer); + add_in_graphic_buffer(mesh, buffer, &paths, amark); + draw_buffer(buffer, title); } - -template -void draw(const Mesh& alcc, +template +void draw(const Mesh& mesh, const std::vector >& paths, const DrawingFunctor& drawing_functor, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path", - bool nofill=false) { - + const char* title="Mesh Viewer With Path") +{ CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(alcc, buffer, drawing_functor, alcc, &paths, amark, nofill); - draw_buffer(buffer); + add_in_graphic_buffer(mesh, buffer, drawing_functor, &paths, amark); + draw_buffer(buffer, title); } - -template +template void draw(const Mesh& mesh, std::initializer_list> l, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path", - bool nofill=false) + const char* title="Mesh Viewer With Path") { std::vector> paths=l; - CGAL::Graphic_buffer buffer; - typename Get_map::storage_type alcc(mesh); - add_in_graphic_buffer(mesh, buffer, alcc, &paths, amark, nofill); - draw_buffer(buffer); -} - -/* -template -void draw(const Mesh& alcc, - const std::vector >& paths, - const char* title="Mesh Viewer With Path", - typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - bool nofill=false, - const DrawingFunctor& drawing_functor=DrawingFunctor()) -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - CGAL::Qt::init_ogl_context(4,3); - int argc=1; - const char* argv[1]={"lccviewer"}; - QApplication app(argc,const_cast(argv)); - Face_graph_with_path_viewer mainwindow(app.activeWindow(), - alcc, &paths, amark, - title, nofill, - drawing_functor); - mainwindow.show(); - app.exec(); - } + add_in_graphic_buffer(mesh, buffer, &paths, amark); + draw_buffer(buffer, title); } -template -void draw(const Mesh& alcc, - const std::vector >& paths, - const char* title="Mesh Viewer With Path", - typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - bool nofill=false) -{ - DefaultDrawingFunctorLCC f; - draw(alcc, paths, title, amark, nofill, f); -} - -template -void draw(const Mesh& alcc, - std::initializer_list> l, - const char* title="Mesh Viewer With Path", - typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - bool nofill=false) -{ - std::vector > paths=l; - draw(alcc, paths, title, amark, nofill); -} -*/ - } // End namespace CGAL #else // CGAL_USE_BASIC_VIEWER @@ -481,24 +447,34 @@ void draw(const Mesh& alcc, namespace CGAL { - template + template void draw(const Mesh&, - const std::vector >& , - const char* ="", + const std::vector >&, + typename Get_map::type::size_type= + (std::numeric_limits::type::size_type>::max)(), + const char* ="") + { + std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + void draw(const Mesh&, + const std::vector >&, + const DrawingFunctor&, typename Get_map::type::size_type= (std::numeric_limits::type::size_type>::max)(), - bool=false) + const char* ="") { std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + template void draw(const Mesh&, std::initializer_list>, const char* ="", typename Get_map::type::size_type= (std::numeric_limits::type::size_type>::max)(), - bool=false) + const char* ="") { std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Wed, 16 Nov 2022 16:49:54 +0200 Subject: [PATCH 125/341] Test push --- CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt index 7f268458568a..db97fdc64402 100644 --- a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt +++ b/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt @@ -8,6 +8,7 @@ namespace CGAL { \author Guillaume Damiand, Mostafa Ashraf + */ } /* namespace CGAL */ \ No newline at end of file From 9fcd8f73d578506957bf4db7c59a75ccdde8c08b Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Thu, 8 Dec 2022 17:11:30 +0200 Subject: [PATCH 126/341] bugs fixed, added TODO --- .../draw_surface_mesh_small_faces.cpp | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp index b24e54801b9d..0037cfb34997 100644 --- a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp +++ b/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp @@ -4,23 +4,40 @@ #include #include #include +#include "CGAL/draw_surface_mesh_small_faces.h" + #include typedef CGAL::Simple_cartesian Kernel; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh Mesh; +typedef Kernel::FT FT; struct Drawing_functor_small_face: public CGAL::Drawing_functor - + { - drawing_functor.colored_face = [](const FG&, - typename boost::graph_traits::face_descriptor fg) -> bool + Drawing_functor_small_face() { + + // TODO: change threshold in realtime. + m_threshold = 2000; + + // Return false if face value less than threshold. + is_small = [=] (typename boost::graph_traits::face_descriptor fg) -> bool { + return fg <= m_threshold; + }; + + colored_face = [=](const Mesh&, + typename boost::graph_traits::face_descriptor fg) -> bool { return is_small(fg); }; - drawing_functor.face_color = [] (const FG&, - typename boost::graph_traits::face_descriptor) -> CGAL::IO::Color + face_color = [] (const Mesh&, + typename boost::graph_traits::face_descriptor) -> CGAL::IO::Color { return CGAL::IO::Color(200, 60, 60); }; // Red + } + + std::function::face_descriptor)> is_small; + unsigned int m_threshold; FT m_min_size, m_max_size; bool m_draw_small_faces; From 5948fc19fef319559f5ed4016407354e94a6fccb Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 9 Dec 2022 14:05:38 +0200 Subject: [PATCH 127/341] Initial Commit --- .../CGAL/draw_surface_mesh_small_faces.h | 264 ++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h b/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h new file mode 100644 index 000000000000..dfbfc89f4307 --- /dev/null +++ b/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h @@ -0,0 +1,264 @@ +// Copyright (c) 2018 GeometryFactory (France) +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Guillaume Damiand +// Mostafa Ashraf + +#ifndef CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H +#define CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H + +#include +#include +#include +#include + +#ifdef CGAL_USE_BASIC_VIEWER + +#include +#include + +#include + +namespace draw_function_for_surface_mesh +{ +template +typename CGAL::Kernel_traits::Kernel::Vector_3 get_face_normal(typename SM::Halfedge_index he, + const SM &sm) +{ + typedef typename SM::Halfedge_index halfedge_descriptor; + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + + typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; + + halfedge_descriptor end=he; + unsigned int nb=0; + do + { + CGAL::internal::newell_single_step_3(sm.point(sm.source(he)), + sm.point(sm.target(he)), normal); + ++nb; + he=sm.next(he); + } + while (he!=end); + assert(nb>0); + return (typename Kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); +} + +template +typename CGAL::Kernel_traits::Kernel::Vector_3 get_vertex_normal(typename SM::Halfedge_index he, + const SM &sm) +{ + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + typedef typename SM::Halfedge_index halfedge_descriptor; + + typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; + + halfedge_descriptor end=he; + do + { + if (!sm.is_border(he)) + { + typename Kernel::Vector_3 n=get_face_normal(he, sm); + normal=typename Kernel::Construct_sum_of_vectors_3()(normal, n); + } + he=sm.next(sm.opposite(he)); + } + while (he!=end); + + if (!typename Kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) + { normal=(typename Kernel::Construct_scaled_vector_3() + (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } + + return normal; +} + +template +void compute_face(typename SM::Face_index fh, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer, + typename CGAL::Kernel_traits::Kernel::FT & m_min_size, + typename CGAL::Kernel_traits::Kernel::FT & m_max_size) +{ + + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + typedef typename SM::Face_index face_descriptor; + typedef typename SM::Halfedge_index halfedge_descriptor; + typedef typename Kernel::FT FT; + + // TODO: add custom functor, right? + bool m_draw_small_faces = true; + bool m_draw_big_faces = true; + + unsigned int m_threshold = 85; + + // [Face creation] + bool issmall=false; + + // Default color of faces + CGAL::IO::Color c(75,160,255); + + // Compare the size of the face with the % m_threshold + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); + + // It it is smaller, color the face in red. + if (get(faces_size, fh) +void compute_edge(typename SM::Edge_index e, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer) +{ + /// [Edge creation] + graphic_buffer.add_segment(sm.point(sm.source(sm.halfedge(e))), + sm.point(sm.target(sm.halfedge(e)))); + /// [Edge creation] +} + +template +void compute_vertex(typename SM::Vertex_index vh, + const SM &sm, + CGAL::Graphic_buffer &graphic_buffer) +{ + /// [Vertex creation] + graphic_buffer.add_point(sm.point(vh)); + /// [Vertex creation] +} + +template +void compute_elements(const SM &sm, + CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) +{ + + typedef typename SM::Point Point; + typedef typename CGAL::Kernel_traits::Kernel Kernel; + typedef typename SM::Vertex_index vertex_descriptor; + typedef typename SM::Face_index face_descriptor; + typedef typename SM::Edge_index edge_descriptor; + typedef typename SM::Halfedge_index halfedge_descriptor; + typedef typename Kernel::FT FT; + + FT m_min_size, m_max_size; + + if (sm.faces().begin()!=sm.faces().end()) + { + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); + + m_min_size=faces_size[*(sm.faces().begin())]; + m_max_size=m_min_size; + FT cur_size; + + for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) + { + cur_size=faces_size[*f]; + if (cur_sizem_max_size) m_max_size=cur_size; + } + } + + for (typename SM::Face_range::iterator f=sm.faces().begin(); + f!=sm.faces().end(); ++f) + { + if (*f!=boost::graph_traits::null_face()) + { compute_face(*f, sm, graphic_buffer, m_min_size, m_max_size); } + } + + for (typename SM::Edge_range::iterator e=sm.edges().begin(); + e!=sm.edges().end(); ++e) + { compute_edge(*e, sm, graphic_buffer); } + + for (typename SM::Vertex_range::iterator v=sm.vertices().begin(); + v!=sm.vertices().end(); ++v) + { compute_vertex(*v, sm, graphic_buffer); } +} + +} // draw_function_for_surface_mesh + +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, + const DrawingFunctor &m_drawing_functor) { + draw_function_for_surface_mesh::compute_elements(sm, graphic_buffer, m_drawing_functor); +} + +template +void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { + + CGAL::Drawing_functor drawing_functor; + + add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); +} + +template +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh, + const DrawingFunctor &drawing_functor) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer, drawing_functor); + draw_buffer(buffer); +} + +template +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh) +{ + CGAL::Graphic_buffer buffer; + add_in_graphic_buffer(amesh, buffer); + draw_buffer(buffer); +} + + + +#else // CGAL_USE_BASIC_VIEWER + +template +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&) +{ + std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< +void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&, const DrawingFunctor &drawing_functor) +{ + std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Fri, 9 Dec 2022 14:07:48 +0200 Subject: [PATCH 128/341] Path handled --- Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp b/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp index 5d6c3b3d54ee..3e81bd0bf67d 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp @@ -5,7 +5,7 @@ #include #include #include -#include "draw_surface_mesh_small_faces.h" +#include "CGAL/draw_surface_mesh_small_faces.h" typedef CGAL::Simple_cartesian K; typedef CGAL::Surface_mesh Mesh; From d780acb988361e7602dc3d079236ef5e220794d0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 25 Apr 2023 17:05:13 +0200 Subject: [PATCH 129/341] Example for basic viewer draw small faces --- .../Surface_mesh/sm_draw_small_faces.cpp | 116 +++++++- .../CGAL/draw_surface_mesh_small_faces.h | 264 ------------------ 2 files changed, 114 insertions(+), 266 deletions(-) delete mode 100644 Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h diff --git a/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp b/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp index 3e81bd0bf67d..a8cd5ad72901 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp @@ -5,7 +5,7 @@ #include #include #include -#include "CGAL/draw_surface_mesh_small_faces.h" +#include typedef CGAL::Simple_cartesian K; typedef CGAL::Surface_mesh Mesh; @@ -13,6 +13,71 @@ typedef Mesh::Vertex_index vertex_descriptor; typedef Mesh::Face_index face_descriptor; typedef K::FT FT; +template +struct Drawing_functor_small_faces: + public CGAL::Drawing_functor::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor> +{ + using Self=Drawing_functor_small_faces; + using Base=CGAL::Drawing_functor::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor>; + + Drawing_functor_small_faces(const SM& sm): Base(), m_sm(sm) + { + typename SM::template Property_map faces_size; + boost::tie(faces_size, m_with_size)=sm.template property_map("f:size"); + if(!m_with_size) + { return; } + + m_min_size=faces_size[*(sm.faces().begin())]; + m_max_size=m_min_size; + FT cur_size; + for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) + { + cur_size=faces_size[*f]; + if (cur_sizem_max_size) m_max_size=cur_size; + } + + this->face_color=[=](const SM& sm, + typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color + { return this->get_face_color(sm, fh); }; + + this->colored_face = [](const SM&, + typename boost::graph_traits::face_descriptor) -> bool + { return true; }; + } + + CGAL::IO::Color get_face_color(const SM& sm, + typename boost::graph_traits::face_descriptor fh) + { + // Default color of faces + CGAL::IO::Color c(75,160,255); + if(!m_with_size) { return c; } + + // Compare the size of the face with the % m_threshold + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); + + // If the face is small, color it in red. + if (get(faces_size, fh)1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); @@ -34,8 +99,55 @@ int main(int argc, char* argv[]) for(face_descriptor fd : sm.faces()) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } - draw_surface_mesh_with_small_faces(sm); + Drawing_functor_small_faces df(sm); + CGAL::Graphic_buffer buffer; + + add_in_graphic_buffer(sm, buffer, df); + CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); + if(app) + { + app.basic_viewer().on_key_pressed= + [&sm, &df, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) + { + df.m_threshold+=5; + if(df.m_threshold>100) { df.m_threshold=100; } + basic_viewer->displayMessage + (QString("Small faces threshold=%1.").arg(df.m_threshold)); + + basic_viewer->clear(); + add_in_graphic_buffer(sm, buffer, df); + basic_viewer->redraw(); + } + else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) + { + if(df.m_threshold<5) { df.m_threshold=0; } + else { df.m_threshold-=5; } + basic_viewer->displayMessage + (QString("Small faces threshold=%1.").arg(df.m_threshold)); + + basic_viewer->clear(); + add_in_graphic_buffer(sm, buffer, df); + basic_viewer->redraw(); + } + else + { + // Return false will call the base method to process others/classicals key + return false; + } + return true; + }; + // Here we add shortcut descriptions + app.basic_viewer().setKeyDescription(::Qt::Key_I, "Increase threshold for small faces"); + app.basic_viewer().setKeyDescription(::Qt::Key_D, "Decrease threshold for small faces"); + + // Then we run the app + app.run(); + } + sm.remove_property_map(faces_size); return EXIT_SUCCESS; diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h b/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h deleted file mode 100644 index dfbfc89f4307..000000000000 --- a/Surface_mesh/include/CGAL/draw_surface_mesh_small_faces.h +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright (c) 2018 GeometryFactory (France) -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Guillaume Damiand -// Mostafa Ashraf - -#ifndef CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H -#define CGAL_DRAW_SURFACE_MESH_SMALL_FACES_H - -#include -#include -#include -#include - -#ifdef CGAL_USE_BASIC_VIEWER - -#include -#include - -#include - -namespace draw_function_for_surface_mesh -{ -template -typename CGAL::Kernel_traits::Kernel::Vector_3 get_face_normal(typename SM::Halfedge_index he, - const SM &sm) -{ - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - - halfedge_descriptor end=he; - unsigned int nb=0; - do - { - CGAL::internal::newell_single_step_3(sm.point(sm.source(he)), - sm.point(sm.target(he)), normal); - ++nb; - he=sm.next(he); - } - while (he!=end); - assert(nb>0); - return (typename Kernel::Construct_scaled_vector_3()(normal, 1.0/nb)); -} - -template -typename CGAL::Kernel_traits::Kernel::Vector_3 get_vertex_normal(typename SM::Halfedge_index he, - const SM &sm) -{ - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Halfedge_index halfedge_descriptor; - - typename Kernel::Vector_3 normal=CGAL::NULL_VECTOR; - - halfedge_descriptor end=he; - do - { - if (!sm.is_border(he)) - { - typename Kernel::Vector_3 n=get_face_normal(he, sm); - normal=typename Kernel::Construct_sum_of_vectors_3()(normal, n); - } - he=sm.next(sm.opposite(he)); - } - while (he!=end); - - if (!typename Kernel::Equal_3()(normal, CGAL::NULL_VECTOR)) - { normal=(typename Kernel::Construct_scaled_vector_3() - (normal, 1.0/CGAL::sqrt(normal.squared_length()))); } - - return normal; -} - -template -void compute_face(typename SM::Face_index fh, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer, - typename CGAL::Kernel_traits::Kernel::FT & m_min_size, - typename CGAL::Kernel_traits::Kernel::FT & m_max_size) -{ - - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Face_index face_descriptor; - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename Kernel::FT FT; - - // TODO: add custom functor, right? - bool m_draw_small_faces = true; - bool m_draw_big_faces = true; - - unsigned int m_threshold = 85; - - // [Face creation] - bool issmall=false; - - // Default color of faces - CGAL::IO::Color c(75,160,255); - - // Compare the size of the face with the % m_threshold - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - // It it is smaller, color the face in red. - if (get(faces_size, fh) -void compute_edge(typename SM::Edge_index e, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer) -{ - /// [Edge creation] - graphic_buffer.add_segment(sm.point(sm.source(sm.halfedge(e))), - sm.point(sm.target(sm.halfedge(e)))); - /// [Edge creation] -} - -template -void compute_vertex(typename SM::Vertex_index vh, - const SM &sm, - CGAL::Graphic_buffer &graphic_buffer) -{ - /// [Vertex creation] - graphic_buffer.add_point(sm.point(vh)); - /// [Vertex creation] -} - -template -void compute_elements(const SM &sm, - CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) -{ - - typedef typename SM::Point Point; - typedef typename CGAL::Kernel_traits::Kernel Kernel; - typedef typename SM::Vertex_index vertex_descriptor; - typedef typename SM::Face_index face_descriptor; - typedef typename SM::Edge_index edge_descriptor; - typedef typename SM::Halfedge_index halfedge_descriptor; - typedef typename Kernel::FT FT; - - FT m_min_size, m_max_size; - - if (sm.faces().begin()!=sm.faces().end()) - { - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - m_min_size=faces_size[*(sm.faces().begin())]; - m_max_size=m_min_size; - FT cur_size; - - for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) - { - cur_size=faces_size[*f]; - if (cur_sizem_max_size) m_max_size=cur_size; - } - } - - for (typename SM::Face_range::iterator f=sm.faces().begin(); - f!=sm.faces().end(); ++f) - { - if (*f!=boost::graph_traits::null_face()) - { compute_face(*f, sm, graphic_buffer, m_min_size, m_max_size); } - } - - for (typename SM::Edge_range::iterator e=sm.edges().begin(); - e!=sm.edges().end(); ++e) - { compute_edge(*e, sm, graphic_buffer); } - - for (typename SM::Vertex_range::iterator v=sm.vertices().begin(); - v!=sm.vertices().end(); ++v) - { compute_vertex(*v, sm, graphic_buffer); } -} - -} // draw_function_for_surface_mesh - -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer, - const DrawingFunctor &m_drawing_functor) { - draw_function_for_surface_mesh::compute_elements(sm, graphic_buffer, m_drawing_functor); -} - -template -void add_in_graphic_buffer(const SM &sm, CGAL::Graphic_buffer &graphic_buffer) { - - CGAL::Drawing_functor drawing_functor; - - add_in_graphic_buffer(sm, graphic_buffer, drawing_functor); -} - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh, - const DrawingFunctor &drawing_functor) -{ - CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer, drawing_functor); - draw_buffer(buffer); -} - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh& amesh) -{ - CGAL::Graphic_buffer buffer; - add_in_graphic_buffer(amesh, buffer); - draw_buffer(buffer); -} - - - -#else // CGAL_USE_BASIC_VIEWER - -template -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&) -{ - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< -void draw_surface_mesh_with_small_faces(CGAL::Surface_mesh&, const DrawingFunctor &drawing_functor) -{ - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Thu, 27 Apr 2023 12:25:56 +0200 Subject: [PATCH 130/341] Rename package basic viewer; move example --- .../doc/CGAL_basic_viewers/CGAL_basic_viewers.txt | 0 .../doc/CGAL_basic_viewers/Doxyfile.in | 0 .../doc/CGAL_basic_viewers/PackageDescription.txt | 0 .../doc/CGAL_basic_viewers/dependencies | 0 .../doc/CGAL_basic_viewers/examples.txt | 0 .../examples/Basic_viewer}/CMakeLists.txt | 0 .../examples/Basic_viewer}/draw_surface_mesh_small_faces.cpp | 0 .../examples/Basic_viewer}/sm_draw_small_faces.cpp | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {CGAL_basic_viewers => Basic_viewer}/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt (100%) rename {CGAL_basic_viewers => Basic_viewer}/doc/CGAL_basic_viewers/Doxyfile.in (100%) rename {CGAL_basic_viewers => Basic_viewer}/doc/CGAL_basic_viewers/PackageDescription.txt (100%) rename {CGAL_basic_viewers => Basic_viewer}/doc/CGAL_basic_viewers/dependencies (100%) rename {CGAL_basic_viewers => Basic_viewer}/doc/CGAL_basic_viewers/examples.txt (100%) rename {CGAL_basic_viewers/examples/CGAL_basic_viewers => Basic_viewer/examples/Basic_viewer}/CMakeLists.txt (100%) rename {CGAL_basic_viewers/examples/CGAL_basic_viewers => Basic_viewer/examples/Basic_viewer}/draw_surface_mesh_small_faces.cpp (100%) rename {Surface_mesh/examples/Surface_mesh => Basic_viewer/examples/Basic_viewer}/sm_draw_small_faces.cpp (100%) diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt b/Basic_viewer/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt similarity index 100% rename from CGAL_basic_viewers/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt rename to Basic_viewer/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in b/Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in similarity index 100% rename from CGAL_basic_viewers/doc/CGAL_basic_viewers/Doxyfile.in rename to Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/PackageDescription.txt b/Basic_viewer/doc/CGAL_basic_viewers/PackageDescription.txt similarity index 100% rename from CGAL_basic_viewers/doc/CGAL_basic_viewers/PackageDescription.txt rename to Basic_viewer/doc/CGAL_basic_viewers/PackageDescription.txt diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/dependencies b/Basic_viewer/doc/CGAL_basic_viewers/dependencies similarity index 100% rename from CGAL_basic_viewers/doc/CGAL_basic_viewers/dependencies rename to Basic_viewer/doc/CGAL_basic_viewers/dependencies diff --git a/CGAL_basic_viewers/doc/CGAL_basic_viewers/examples.txt b/Basic_viewer/doc/CGAL_basic_viewers/examples.txt similarity index 100% rename from CGAL_basic_viewers/doc/CGAL_basic_viewers/examples.txt rename to Basic_viewer/doc/CGAL_basic_viewers/examples.txt diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt similarity index 100% rename from CGAL_basic_viewers/examples/CGAL_basic_viewers/CMakeLists.txt rename to Basic_viewer/examples/Basic_viewer/CMakeLists.txt diff --git a/CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp similarity index 100% rename from CGAL_basic_viewers/examples/CGAL_basic_viewers/draw_surface_mesh_small_faces.cpp rename to Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp diff --git a/Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp similarity index 100% rename from Surface_mesh/examples/Surface_mesh/sm_draw_small_faces.cpp rename to Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp From 5709abc61c175723057ace0a9fc5f11f78542807 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 27 Apr 2023 14:53:48 +0200 Subject: [PATCH 131/341] example basic viewer --- .../examples/Basic_viewer/CMakeLists.txt | 11 +- .../Basic_viewer/draw_mesh_and_points.cpp | 67 ++++++++ .../draw_surface_mesh_small_faces.cpp | 162 ++++++++++++++---- .../Basic_viewer/sm_draw_small_faces.cpp | 154 ----------------- .../package_info/Basic_viewer/dependencies | 3 + .../package_info/Basic_viewer/description.txt | 1 + .../package_info/Basic_viewer/license.txt | 1 + .../Basic_viewer/long_description.txt | 3 + .../package_info/Basic_viewer/maintainer | 1 + .../examples/Surface_mesh/CMakeLists.txt | 2 - 10 files changed, 211 insertions(+), 194 deletions(-) create mode 100644 Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp delete mode 100644 Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp create mode 100644 Basic_viewer/package_info/Basic_viewer/dependencies create mode 100644 Basic_viewer/package_info/Basic_viewer/description.txt create mode 100644 Basic_viewer/package_info/Basic_viewer/license.txt create mode 100644 Basic_viewer/package_info/Basic_viewer/long_description.txt create mode 100644 Basic_viewer/package_info/Basic_viewer/maintainer diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index e5a6aa07ad8b..03d5b03a22f6 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -7,15 +7,24 @@ # Careful when modifying cmake_minimum_required(VERSION 3.1...3.23) -project(CGAL_basic_viewers_Examples) +project(Basic_viewer_Examples) #CGAL_Qt5 is needed for the drawing. find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(Eigen3 3.1.0) +include(CGAL_Eigen3_support) create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") +create_single_source_cgal_program("draw_mesh_and_points.cpp") + if(CGAL_Qt5_FOUND) #link it with the required CGAL libraries target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) +endif() + +if(TARGET CGAL::Eigen3_support) + target_link_libraries(draw_mesh_and_points PUBLIC CGAL::Eigen3_support) endif() #end of the file diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp new file mode 100644 index 000000000000..10a1afd9fe95 --- /dev/null +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// Types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point; +typedef Kernel::Vector_3 Vector; +typedef std::pair Pwn; +typedef CGAL::Polyhedron_3 Polyhedron; +using PS3=CGAL::Point_set_3; + +struct Drawing_functor_green_points: + public CGAL::Drawing_functor +{ + bool colored_vertex(const PS3&, typename PS3::const_iterator) const + { return true; } + CGAL::IO::Color vertex_color(const PS3&, typename PS3::const_iterator) const + { return CGAL::IO::Color(0,220,0); } +}; + +int main(void) +{ + std::vector points; + + if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points), + CGAL::parameters::point_map(CGAL::First_of_pair_property_map()) + .normal_map(CGAL::Second_of_pair_property_map()))) + { + std::cerr << "Error: cannot read input file!" << std::endl; + return EXIT_FAILURE; + } + + Polyhedron output_mesh; + + double average_spacing = CGAL::compute_average_spacing + (points, 6, CGAL::parameters::point_map(CGAL::First_of_pair_property_map())); + + if (CGAL::poisson_surface_reconstruction_delaunay + (points.begin(), points.end(), + CGAL::First_of_pair_property_map(), + CGAL::Second_of_pair_property_map(), + output_mesh, average_spacing)) + { + PS3 point_set; + for(Pwn& it: points) + { point_set.insert(it.first); } + + CGAL::Graphic_buffer graphic_buffer; + CGAL::add_in_graphic_buffer(point_set, graphic_buffer, Drawing_functor_green_points()); + CGAL::add_in_graphic_buffer(output_mesh, graphic_buffer); + CGAL::draw_buffer(graphic_buffer); + } + else + { return EXIT_FAILURE; } + + return EXIT_SUCCESS; +} diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 0037cfb34997..a8cd5ad72901 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -1,47 +1,81 @@ -#include -#include -#include -#include +#include #include -#include -#include "CGAL/draw_surface_mesh_small_faces.h" - +#include +#include #include +#include +#include +#include -typedef CGAL::Simple_cartesian Kernel; -typedef Kernel::Point_3 Point; -typedef CGAL::Surface_mesh Mesh; -typedef Kernel::FT FT; +typedef CGAL::Simple_cartesian K; +typedef CGAL::Surface_mesh Mesh; +typedef Mesh::Vertex_index vertex_descriptor; +typedef Mesh::Face_index face_descriptor; +typedef K::FT FT; -struct Drawing_functor_small_face: public CGAL::Drawing_functor - +template +struct Drawing_functor_small_faces: + public CGAL::Drawing_functor::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor> { - Drawing_functor_small_face() { + using Self=Drawing_functor_small_faces; + using Base=CGAL::Drawing_functor::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor>; + + Drawing_functor_small_faces(const SM& sm): Base(), m_sm(sm) + { + typename SM::template Property_map faces_size; + boost::tie(faces_size, m_with_size)=sm.template property_map("f:size"); + if(!m_with_size) + { return; } + + m_min_size=faces_size[*(sm.faces().begin())]; + m_max_size=m_min_size; + FT cur_size; + for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) + { + cur_size=faces_size[*f]; + if (cur_sizem_max_size) m_max_size=cur_size; + } - // TODO: change threshold in realtime. - m_threshold = 2000; + this->face_color=[=](const SM& sm, + typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color + { return this->get_face_color(sm, fh); }; - // Return false if face value less than threshold. - is_small = [=] (typename boost::graph_traits::face_descriptor fg) -> bool { - return fg <= m_threshold; - }; + this->colored_face = [](const SM&, + typename boost::graph_traits::face_descriptor) -> bool + { return true; }; + } - colored_face = [=](const Mesh&, - typename boost::graph_traits::face_descriptor fg) -> bool - { return is_small(fg); }; + CGAL::IO::Color get_face_color(const SM& sm, + typename boost::graph_traits::face_descriptor fh) + { + // Default color of faces + CGAL::IO::Color c(75,160,255); + if(!m_with_size) { return c; } + + // Compare the size of the face with the % m_threshold + bool exist; + typename SM::template Property_map faces_size; + boost::tie(faces_size, exist)=sm.template property_map("f:size"); + assert(exist); - face_color = [] (const Mesh&, - typename boost::graph_traits::face_descriptor) -> CGAL::IO::Color - { return CGAL::IO::Color(200, 60, 60); }; // Red + // If the face is small, color it in red. + if (get(faces_size, fh)::face_descriptor)> is_small; - - unsigned int m_threshold; + + const SM& m_sm; + bool m_with_size; FT m_min_size, m_max_size; - bool m_draw_small_faces; - bool m_draw_big_faces; + unsigned int m_threshold=85; // 85% }; int main(int argc, char* argv[]) @@ -55,12 +89,66 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - Drawing_functor_small_face drawing_functor; - CGAL::draw(sm, drawing_functor); + CGAL::Polygon_mesh_processing::triangulate_faces(sm); + + Mesh::Property_map faces_size; + bool created; + boost::tie(faces_size, created)=sm.add_property_map("f:size",0.); + assert(created); - // setKeyDescription(Qt::Key_I, "Increment threshold for small faces"); - // setKeyDescription(Qt::Key_D, "Decrement threshold for small faces"); - // setKeyDescription(Qt::Key_S, "Draw small faces only , big faces only, both"); + for(face_descriptor fd : sm.faces()) + { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } + + Drawing_functor_small_faces df(sm); + CGAL::Graphic_buffer buffer; + + add_in_graphic_buffer(sm, buffer, df); + CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); + if(app) + { + app.basic_viewer().on_key_pressed= + [&sm, &df, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + { + const ::Qt::KeyboardModifiers modifiers = e->modifiers(); + if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) + { + df.m_threshold+=5; + if(df.m_threshold>100) { df.m_threshold=100; } + basic_viewer->displayMessage + (QString("Small faces threshold=%1.").arg(df.m_threshold)); + + basic_viewer->clear(); + add_in_graphic_buffer(sm, buffer, df); + basic_viewer->redraw(); + } + else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) + { + if(df.m_threshold<5) { df.m_threshold=0; } + else { df.m_threshold-=5; } + basic_viewer->displayMessage + (QString("Small faces threshold=%1.").arg(df.m_threshold)); + + basic_viewer->clear(); + add_in_graphic_buffer(sm, buffer, df); + basic_viewer->redraw(); + } + else + { + // Return false will call the base method to process others/classicals key + return false; + } + return true; + }; + + // Here we add shortcut descriptions + app.basic_viewer().setKeyDescription(::Qt::Key_I, "Increase threshold for small faces"); + app.basic_viewer().setKeyDescription(::Qt::Key_D, "Decrease threshold for small faces"); + + // Then we run the app + app.run(); + } + + sm.remove_property_map(faces_size); return EXIT_SUCCESS; } diff --git a/Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp deleted file mode 100644 index a8cd5ad72901..000000000000 --- a/Basic_viewer/examples/Basic_viewer/sm_draw_small_faces.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -typedef CGAL::Simple_cartesian K; -typedef CGAL::Surface_mesh Mesh; -typedef Mesh::Vertex_index vertex_descriptor; -typedef Mesh::Face_index face_descriptor; -typedef K::FT FT; - -template -struct Drawing_functor_small_faces: - public CGAL::Drawing_functor::vertex_descriptor, - typename boost::graph_traits::edge_descriptor, - typename boost::graph_traits::face_descriptor> -{ - using Self=Drawing_functor_small_faces; - using Base=CGAL::Drawing_functor::vertex_descriptor, - typename boost::graph_traits::edge_descriptor, - typename boost::graph_traits::face_descriptor>; - - Drawing_functor_small_faces(const SM& sm): Base(), m_sm(sm) - { - typename SM::template Property_map faces_size; - boost::tie(faces_size, m_with_size)=sm.template property_map("f:size"); - if(!m_with_size) - { return; } - - m_min_size=faces_size[*(sm.faces().begin())]; - m_max_size=m_min_size; - FT cur_size; - for (typename SM::Face_range::iterator f=sm.faces().begin(); f!=sm.faces().end(); ++f) - { - cur_size=faces_size[*f]; - if (cur_sizem_max_size) m_max_size=cur_size; - } - - this->face_color=[=](const SM& sm, - typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color - { return this->get_face_color(sm, fh); }; - - this->colored_face = [](const SM&, - typename boost::graph_traits::face_descriptor) -> bool - { return true; }; - } - - CGAL::IO::Color get_face_color(const SM& sm, - typename boost::graph_traits::face_descriptor fh) - { - // Default color of faces - CGAL::IO::Color c(75,160,255); - if(!m_with_size) { return c; } - - // Compare the size of the face with the % m_threshold - bool exist; - typename SM::template Property_map faces_size; - boost::tie(faces_size, exist)=sm.template property_map("f:size"); - assert(exist); - - // If the face is small, color it in red. - if (get(faces_size, fh)1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); - - Mesh sm; - if(!CGAL::IO::read_polygon_mesh(filename, sm)) - { - std::cerr << "Invalid input file." << std::endl; - return EXIT_FAILURE; - } - - CGAL::Polygon_mesh_processing::triangulate_faces(sm); - - Mesh::Property_map faces_size; - bool created; - boost::tie(faces_size, created)=sm.add_property_map("f:size",0.); - assert(created); - - for(face_descriptor fd : sm.faces()) - { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } - - Drawing_functor_small_faces df(sm); - CGAL::Graphic_buffer buffer; - - add_in_graphic_buffer(sm, buffer, df); - CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); - if(app) - { - app.basic_viewer().on_key_pressed= - [&sm, &df, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool - { - const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) - { - df.m_threshold+=5; - if(df.m_threshold>100) { df.m_threshold=100; } - basic_viewer->displayMessage - (QString("Small faces threshold=%1.").arg(df.m_threshold)); - - basic_viewer->clear(); - add_in_graphic_buffer(sm, buffer, df); - basic_viewer->redraw(); - } - else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) - { - if(df.m_threshold<5) { df.m_threshold=0; } - else { df.m_threshold-=5; } - basic_viewer->displayMessage - (QString("Small faces threshold=%1.").arg(df.m_threshold)); - - basic_viewer->clear(); - add_in_graphic_buffer(sm, buffer, df); - basic_viewer->redraw(); - } - else - { - // Return false will call the base method to process others/classicals key - return false; - } - return true; - }; - - // Here we add shortcut descriptions - app.basic_viewer().setKeyDescription(::Qt::Key_I, "Increase threshold for small faces"); - app.basic_viewer().setKeyDescription(::Qt::Key_D, "Decrease threshold for small faces"); - - // Then we run the app - app.run(); - } - - sm.remove_property_map(faces_size); - - return EXIT_SUCCESS; -} diff --git a/Basic_viewer/package_info/Basic_viewer/dependencies b/Basic_viewer/package_info/Basic_viewer/dependencies new file mode 100644 index 000000000000..d2dd8a53bd84 --- /dev/null +++ b/Basic_viewer/package_info/Basic_viewer/dependencies @@ -0,0 +1,3 @@ +Poisson_surface_reconstruction_3 +Polyhedron +Surface_mesh diff --git a/Basic_viewer/package_info/Basic_viewer/description.txt b/Basic_viewer/package_info/Basic_viewer/description.txt new file mode 100644 index 000000000000..bf6b6a0aef80 --- /dev/null +++ b/Basic_viewer/package_info/Basic_viewer/description.txt @@ -0,0 +1 @@ +Basic viewer diff --git a/Basic_viewer/package_info/Basic_viewer/license.txt b/Basic_viewer/package_info/Basic_viewer/license.txt new file mode 100644 index 000000000000..5c1c5d8436f8 --- /dev/null +++ b/Basic_viewer/package_info/Basic_viewer/license.txt @@ -0,0 +1 @@ +LGPL (v3 or later) diff --git a/Basic_viewer/package_info/Basic_viewer/long_description.txt b/Basic_viewer/package_info/Basic_viewer/long_description.txt new file mode 100644 index 000000000000..12cc9c460fc7 --- /dev/null +++ b/Basic_viewer/package_info/Basic_viewer/long_description.txt @@ -0,0 +1,3 @@ +Implementation of basic viewers. + +A basic viewer allows to visualize a data structure of CGAL. diff --git a/Basic_viewer/package_info/Basic_viewer/maintainer b/Basic_viewer/package_info/Basic_viewer/maintainer new file mode 100644 index 000000000000..942352b9dc41 --- /dev/null +++ b/Basic_viewer/package_info/Basic_viewer/maintainer @@ -0,0 +1 @@ +Guillaume Damiand diff --git a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt index 9c693ffaa08d..80d9389a4ee4 100644 --- a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt @@ -22,7 +22,6 @@ create_single_source_cgal_program("sm_iterators.cpp") create_single_source_cgal_program("sm_kruskal.cpp") create_single_source_cgal_program("sm_memory.cpp") create_single_source_cgal_program("sm_properties.cpp") -create_single_source_cgal_program("sm_draw_small_faces.cpp") create_single_source_cgal_program("check_orientation.cpp") #create the executable of the application @@ -32,7 +31,6 @@ if(CGAL_Qt5_FOUND) #link it with the required CGAL libraries target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(sm_draw_small_faces PUBLIC CGAL::CGAL_Basic_viewer) endif() #end of the file From fe92449d008086d3e8fb384cbe7a140f851d5d6f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 27 Apr 2023 15:04:02 +0200 Subject: [PATCH 132/341] doc --- .../CGAL_basic_viewers.txt => Basic_viewer/Basic_viewer.txt} | 4 ++-- Basic_viewer/doc/Basic_viewer/Doxyfile.in | 3 +++ .../PackageDescription.txt | 0 .../doc/{CGAL_basic_viewers => Basic_viewer}/dependencies | 0 Basic_viewer/doc/Basic_viewer/examples.txt | 4 ++++ Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in | 3 --- Basic_viewer/doc/CGAL_basic_viewers/examples.txt | 0 7 files changed, 9 insertions(+), 5 deletions(-) rename Basic_viewer/doc/{CGAL_basic_viewers/CGAL_basic_viewers.txt => Basic_viewer/Basic_viewer.txt} (66%) create mode 100644 Basic_viewer/doc/Basic_viewer/Doxyfile.in rename Basic_viewer/doc/{CGAL_basic_viewers => Basic_viewer}/PackageDescription.txt (100%) rename Basic_viewer/doc/{CGAL_basic_viewers => Basic_viewer}/dependencies (100%) create mode 100644 Basic_viewer/doc/Basic_viewer/examples.txt delete mode 100644 Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in delete mode 100644 Basic_viewer/doc/CGAL_basic_viewers/examples.txt diff --git a/Basic_viewer/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt similarity index 66% rename from Basic_viewer/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt rename to Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index db97fdc64402..f46fd36c5f4a 100644 --- a/Basic_viewer/doc/CGAL_basic_viewers/CGAL_basic_viewers.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -2,7 +2,7 @@ namespace CGAL { /*! \mainpage User Manual -\anchor Chapter_CGAL_Basic_viewers +\anchor Chapter_Basic_viewer \anchor \cgalAutoToc \author Guillaume Damiand, Mostafa Ashraf @@ -11,4 +11,4 @@ namespace CGAL { */ -} /* namespace CGAL */ \ No newline at end of file +} /* namespace CGAL */ diff --git a/Basic_viewer/doc/Basic_viewer/Doxyfile.in b/Basic_viewer/doc/Basic_viewer/Doxyfile.in new file mode 100644 index 000000000000..2082ff842dc1 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/Doxyfile.in @@ -0,0 +1,3 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - CGAL Basic Viewer" diff --git a/Basic_viewer/doc/CGAL_basic_viewers/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt similarity index 100% rename from Basic_viewer/doc/CGAL_basic_viewers/PackageDescription.txt rename to Basic_viewer/doc/Basic_viewer/PackageDescription.txt diff --git a/Basic_viewer/doc/CGAL_basic_viewers/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies similarity index 100% rename from Basic_viewer/doc/CGAL_basic_viewers/dependencies rename to Basic_viewer/doc/Basic_viewer/dependencies diff --git a/Basic_viewer/doc/Basic_viewer/examples.txt b/Basic_viewer/doc/Basic_viewer/examples.txt new file mode 100644 index 000000000000..9a6d5e6a3be7 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/examples.txt @@ -0,0 +1,4 @@ +/*! +\example Basic_viewer/draw_mesh_and_points.cpp +\example Basic_viewer/draw_surface_mesh_small_faces.cpp +*/ diff --git a/Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in b/Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in deleted file mode 100644 index 78014f4c59e4..000000000000 --- a/Basic_viewer/doc/CGAL_basic_viewers/Doxyfile.in +++ /dev/null @@ -1,3 +0,0 @@ -@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} - -PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - CGAL and Basic Viewers" diff --git a/Basic_viewer/doc/CGAL_basic_viewers/examples.txt b/Basic_viewer/doc/CGAL_basic_viewers/examples.txt deleted file mode 100644 index e69de29bb2d1..000000000000 From 8f29e4d3232ebf9808aeadd934f7624ba2e546cc Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 27 Apr 2023 15:48:42 +0200 Subject: [PATCH 133/341] Rename class graphic buffer --- BGL/include/CGAL/draw_face_graph.h | 8 +++---- .../Basic_viewer/draw_mesh_and_points.cpp | 2 +- .../draw_surface_mesh_small_faces.cpp | 2 +- .../include/Basic_viewer}/Buffer_for_vao.h | 0 .../include/Basic_viewer}/Drawing_functor.h | 0 .../include/Basic_viewer}/Graphic_buffer.h | 4 ++-- .../include/CGAL/Qt/Basic_viewer_qt.h | 16 ++++++------- .../demo/Linear_cell_complex/Viewer.h | 2 +- .../include/CGAL/draw_linear_cell_complex.h | 18 +++++++------- Nef_3/include/CGAL/draw_nef_3.h | 16 ++++++------- .../CGAL/draw_periodic_2_triangulation_2.h | 20 ++++++++-------- Point_set_3/include/CGAL/draw_point_set_3.h | 12 +++++----- Polygon/include/CGAL/draw_polygon_2.h | 12 +++++----- .../include/CGAL/draw_polygon_with_holes_2.h | 14 +++++------ Polyhedron/include/CGAL/draw_polyhedron.h | 10 ++++---- .../include/CGAL/draw_straight_skeleton_2.h | 20 ++++++++-------- Surface_mesh/include/CGAL/draw_surface_mesh.h | 10 ++++---- .../include/CGAL/draw_face_graph_with_paths.h | 24 +++++++++---------- .../polygon_triangulation_drawing_functor.h | 4 ++-- .../include/CGAL/draw_triangulation_2.h | 20 ++++++++-------- .../include/CGAL/draw_triangulation_3.h | 18 +++++++------- .../include/CGAL/draw_voronoi_diagram_2.h | 22 ++++++++--------- 22 files changed, 127 insertions(+), 127 deletions(-) rename {GraphicsView/include/CGAL => Basic_viewer/include/Basic_viewer}/Buffer_for_vao.h (100%) rename {GraphicsView/include/CGAL => Basic_viewer/include/Basic_viewer}/Drawing_functor.h (100%) rename {GraphicsView/include/CGAL => Basic_viewer/include/Basic_viewer}/Graphic_buffer.h (99%) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index a691e0c2fcf7..04238fd633c7 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -14,7 +14,7 @@ #ifndef CGAL_DRAW_FACE_GRAPH_H #define CGAL_DRAW_FACE_GRAPH_H -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace draw_function_for_FG { template void compute_elements(const FG &fg, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &m_drawing_functor) { using Point=typename boost::property_map_value::type; @@ -120,7 +120,7 @@ void compute_elements(const FG &fg, template void add_in_graphic_buffer_for_fg(const FG &fg, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_FG::compute_elements(fg, graphic_buffer, drawing_functor); @@ -128,7 +128,7 @@ void add_in_graphic_buffer_for_fg(const FG &fg, template void add_in_graphic_buffer_for_fg(const FG &fg, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_storage &graphic_buffer) { Drawing_functor::vertex_descriptor, diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 10a1afd9fe95..744f98299888 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -55,7 +55,7 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphic_buffer graphic_buffer; + CGAL::Graphic_storage graphic_buffer; CGAL::add_in_graphic_buffer(point_set, graphic_buffer, Drawing_functor_green_points()); CGAL::add_in_graphic_buffer(output_mesh, graphic_buffer); CGAL::draw_buffer(graphic_buffer); diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index a8cd5ad72901..56b15be2022e 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -100,7 +100,7 @@ int main(int argc, char* argv[]) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } Drawing_functor_small_faces df(sm); - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(sm, buffer, df); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/Basic_viewer/Buffer_for_vao.h similarity index 100% rename from GraphicsView/include/CGAL/Buffer_for_vao.h rename to Basic_viewer/include/Basic_viewer/Buffer_for_vao.h diff --git a/GraphicsView/include/CGAL/Drawing_functor.h b/Basic_viewer/include/Basic_viewer/Drawing_functor.h similarity index 100% rename from GraphicsView/include/CGAL/Drawing_functor.h rename to Basic_viewer/include/Basic_viewer/Drawing_functor.h diff --git a/GraphicsView/include/CGAL/Graphic_buffer.h b/Basic_viewer/include/Basic_viewer/Graphic_buffer.h similarity index 99% rename from GraphicsView/include/CGAL/Graphic_buffer.h rename to Basic_viewer/include/Basic_viewer/Graphic_buffer.h index 425597cfcdb4..c6cab7251fe2 100644 --- a/GraphicsView/include/CGAL/Graphic_buffer.h +++ b/Basic_viewer/include/Basic_viewer/Graphic_buffer.h @@ -56,14 +56,14 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) // This class is responsible for dealing with available CGAL data structures and // handling buffers. template -class Graphic_buffer +class Graphic_storage { public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - Graphic_buffer() + Graphic_storage() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, &m_bounding_box, nullptr, nullptr, nullptr), m_buffer_for_colored_points(&arrays[POS_COLORED_POINTS], nullptr, diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 50388985edb4..4fa0c1ea583e 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -49,7 +49,7 @@ #include #include -#include +#include #include #include #include @@ -69,11 +69,11 @@ class Basic_viewer_qt : public CGAL::QGLViewer typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - using GB=Graphic_buffer; + using GB=Graphic_storage; // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - Graphic_buffer& buf, + Graphic_storage& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -365,7 +365,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer void face_end() { gBuffer.face_end(); } - Graphic_buffer& get_graphic_buffer() + Graphic_storage& get_graphic_buffer() { return gBuffer; } virtual void redraw() @@ -1593,7 +1593,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer std::function *)> on_key_pressed; protected: - Graphic_buffer& gBuffer; + Graphic_storage& gBuffer; bool m_draw_vertices; bool m_draw_edges; @@ -1667,7 +1667,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_buffer(Graphic_buffer& graphic_buffer, +void draw_buffer(Graphic_storage& graphic_buffer, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1692,7 +1692,7 @@ void draw_buffer(Graphic_buffer& graphic_buffer, } // template -// void draw_buffer(Graphic_buffer &graphic_buffer, +// void draw_buffer(Graphic_storage &graphic_buffer, // const std::function *)>& onPress, // const char *title="CGAL Basic Viewer") // { @@ -1722,7 +1722,7 @@ template class QApplication_and_basic_viewer { public: - QApplication_and_basic_viewer(CGAL::Graphic_buffer& buffer, + QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, const char* title="CGAL Basic Viewer"): m_application(nullptr), m_basic_viewer(nullptr), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index c72feee6f32b..4165c0fea9e9 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -39,7 +39,7 @@ public Q_SLOTS: Dart_const_descriptor, Dart_const_descriptor, Dart_const_descriptor> m_drawing_functor; - CGAL::Graphic_buffer m_graphic_buffer; + CGAL::Graphic_storage m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; }; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index d047aed5f3d7..8dc57de4cc04 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_LCC_H #include -#include +#include #include #include #include @@ -61,7 +61,7 @@ template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctorLCC& drawing_functor) { if (!drawing_functor.are_faces_enabled() || @@ -105,7 +105,7 @@ void compute_face(const LCC& lcc, template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_edges_enabled() || @@ -129,7 +129,7 @@ void compute_edge(const LCC& lcc, template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctorLCC& drawing_functor) { if (!drawing_functor.are_vertices_enabled() || @@ -147,7 +147,7 @@ void compute_vertex(const LCC& lcc, template void compute_elements(const LCC& lcc, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { typename LCC::size_type markvolumes = lcc.get_new_mark(); @@ -240,7 +240,7 @@ template void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_lcc::compute_elements(static_cast(alcc), @@ -254,7 +254,7 @@ template class Map, class Refs, class Storage_, typename BufferType=float> void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor_with_volume buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(alcc, buffer, drawing_functor); draw_buffer(buffer, title); } @@ -300,7 +300,7 @@ template void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(alcc, buffer); draw_buffer(buffer, title); } diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 96c1093ec4de..fd0ff0897775 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -95,7 +95,7 @@ class Nef_Visitor { public: Nef_Visitor(const Nef_Polyhedron&_nef, - CGAL::Graphic_buffer& _graphic_buffer, + CGAL::Graphic_storage& _graphic_buffer, const DrawingFunctor&_drawing_functor) : n_faces(0), n_edges(0), nef(_nef), @@ -204,14 +204,14 @@ class Nef_Visitor { protected: std::unordered_map facets_done; std::unordered_map edges_done; - CGAL::Graphic_buffer& graphic_buffer; + CGAL::Graphic_storage& graphic_buffer; const DrawingFunctor& drawing_functor; const Nef_Polyhedron& nef; }; template void compute_elements(const Nef_Polyhedron &nef, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { @@ -240,7 +240,7 @@ void compute_elements(const Nef_Polyhedron &nef, template void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_nef_polyhedron::compute_elements(anef, @@ -251,7 +251,7 @@ void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, template void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_storage &graphic_buffer) { // Default functor; user can add his own functor. Drawing_functor buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(anef, buffer, drawing_functor); draw_buffer(buffer, title); } @@ -296,7 +296,7 @@ template buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(anef, buffer); draw_buffer(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 5ca4e9c4bb3f..7ed6f5058759 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -69,7 +69,7 @@ namespace draw_function_for_P2T2 template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { // Construct the point in 9-sheeted covering space and add to viewer @@ -86,7 +86,7 @@ void compute_vertex(const P2T2 &p2t2, template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_edge(p2t2, si)) @@ -104,7 +104,7 @@ void compute_edge(const P2T2 &p2t2, template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_face(p2t2, ti)) @@ -126,7 +126,7 @@ void compute_face(const P2T2 &p2t2, template void compute_domain(const P2T2& p2t2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -155,7 +155,7 @@ void compute_domain(const P2T2& p2t2, template void compute_elements(const P2T2& p2t2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { // Get the display type, iterate through periodic elements according @@ -198,7 +198,7 @@ void compute_elements(const P2T2& p2t2, template void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, drawing_functor); @@ -206,7 +206,7 @@ void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, template void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor_periodic_2_triangulation_2 buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2t2, buffer, drawing_functor); draw_buffer(buffer); } @@ -234,7 +234,7 @@ template void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; CGAL::Drawing_functor_periodic_2_triangulation_2 #include -#include +#include #include #include @@ -44,7 +44,7 @@ namespace draw_function_for_PointSet { template void compute_elements(const PointSet& pointset, - Graphic_buffer& graphic_buffer, + Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_vertices_enabled()) @@ -70,7 +70,7 @@ void compute_elements(const PointSet& pointset, template void add_in_graphic_buffer(const Point_set_3& apointset, - Graphic_buffer& graphic_buffer, + Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_PointSet::compute_elements(apointset, @@ -80,7 +80,7 @@ void add_in_graphic_buffer(const Point_set_3& apointset, template void add_in_graphic_buffer(const Point_set_3& apointset, - Graphic_buffer& graphic_buffer) + Graphic_storage& graphic_buffer) { CGAL::Drawing_functor, typename Point_set_3::const_iterator, @@ -96,7 +96,7 @@ void draw(const Point_set_3& apointset, const DrawingFunctor& drawing_functor, const char *title="Point_set_3 Basic Viewer") { - Graphic_buffer buffer; + Graphic_storage buffer; add_in_graphic_buffer(apointset, buffer, drawing_functor); draw_buffer(buffer, title); } @@ -105,7 +105,7 @@ template void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { - Graphic_buffer buffer; + Graphic_storage buffer; add_in_graphic_buffer(apointset, buffer); draw_buffer(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index e97a29bcd597..6ae50e0fe773 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -19,7 +19,7 @@ #define CGAL_DRAW_POLYGON_2_H #include -#include +#include #include #include @@ -48,7 +48,7 @@ namespace draw_function_for_p2 { template void compute_elements(const P2& p2, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor& drawing_functor) { if (p2.is_empty()) @@ -103,13 +103,13 @@ void compute_elements(const P2& p2, template void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawingfunctor) { draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); } template void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_storage &graphic_buffer) { CGAL::Drawing_functor void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer); draw_buffer(buffer, title); } @@ -136,7 +136,7 @@ void draw(const CGAL_P2_TYPE &ap2, const DrawingFunctor& drawingfunctor, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer, drawingfunctor); draw_buffer(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index b90e2ba2d481..c94f39d7cb9d 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -19,7 +19,7 @@ #define CGAL_DRAW_POLYGON_WITH_HOLES_2_H #include -#include +#include #include #include @@ -49,7 +49,7 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, - Graphic_buffer &graphic_buffer, + Graphic_storage &graphic_buffer, bool hole, const DrawingFunctor& drawing_functor) { @@ -92,7 +92,7 @@ void compute_one_loop_elements(const P2& ap2, } template -void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, +void compute_elements(const P2& p2, Graphic_storage &graphic_buffer, const DrawingFunctor& drawing_functor) { if (p2.outer_boundary().is_empty()) return; @@ -128,7 +128,7 @@ void compute_elements(const P2& p2, Graphic_buffer &graphic_buffer, template void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor &drawing_functor) { draw_function_for_ph2_with_holes::compute_elements(p2, graphic_buffer, @@ -137,7 +137,7 @@ void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, template void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { Drawing_functor void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_functor, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer, drawing_functor); draw_buffer(buffer, title); } @@ -163,7 +163,7 @@ template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer); draw_buffer(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 81bbdb4370f2..05ed00e25a5a 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_POLYHEDRON_H #include -#include +#include #include #include #include @@ -35,7 +35,7 @@ template void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { add_in_graphic_buffer_for_fg(apoly, graphic_buffer, drawing_functor); } @@ -46,7 +46,7 @@ template void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_storage &graphic_buffer) { add_in_graphic_buffer_for_fg(apoly, graphic_buffer); } // Specialization of draw function: require Qt and the CGAL basic viewer. @@ -61,7 +61,7 @@ template buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(apoly, buffer); draw_buffer(buffer, title); } @@ -77,7 +77,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const DrawingFunctor &drawing_functor, const char* title="Polyhedron Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(apoly, buffer, drawing_functor); draw_buffer(buffer, title); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 3557378d6206..80689e79dc58 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace draw_function_for_ss2 { template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_edge(ss2, eh)) @@ -48,7 +48,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { // TODO? a functor different from draw_edge to allow to show only some labels ?? @@ -67,7 +67,7 @@ void print_halfedge_labels(const SS2& ss2, template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_vertex(ss2, vh)) @@ -84,7 +84,7 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { // TODO? a functor different from draw_vertex to allow to show only some labels ?? @@ -98,7 +98,7 @@ void print_vertex_label(const SS2& ss2, template void compute_elements(const SS2& ss2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_edges_enabled()) @@ -131,7 +131,7 @@ void compute_elements(const SS2& ss2, template void add_in_graphic_buffer(const CGAL_SS_TYPE &ass2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_ss2::compute_elements(ass2, graphic_buffer, @@ -140,7 +140,7 @@ void add_in_graphic_buffer(const CGAL_SS_TYPE &ass2, template void add_in_graphic_buffer(const CGAL_SS_TYPE& ass2, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { Drawing_functor void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ass2, buffer, drawingfunctor); draw_buffer(buffer, title); } @@ -195,7 +195,7 @@ template void draw(const CGAL_SS_TYPE &ass2, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ass2, buffer); draw_buffer(buffer, title); } diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index cad60c4e87d4..f630b8133374 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -30,7 +30,7 @@ void draw(const SM& asm); #else // DOXYGEN_RUNNING #include -#include +#include #include #include #include @@ -41,13 +41,13 @@ namespace CGAL template void add_in_graphic_buffer(const Surface_mesh& amesh, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { add_in_graphic_buffer_for_fg(amesh, graphic_buffer, drawing_functor); } template void add_in_graphic_buffer(const Surface_mesh& amesh, - CGAL::Graphic_buffer &graphic_buffer) + CGAL::Graphic_storage &graphic_buffer) { add_in_graphic_buffer_for_fg(amesh, graphic_buffer); } #ifdef CGAL_USE_BASIC_VIEWER @@ -57,7 +57,7 @@ template void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(amesh, buffer); draw_buffer(buffer, title); } @@ -67,7 +67,7 @@ void draw(const Surface_mesh& amesh, const DrawingFunctor &drawing_functor, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(amesh, buffer, drawing_functor); draw_buffer(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index e117e5b54a52..35d7495c8262 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include @@ -145,7 +145,7 @@ template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_face(lcc, dh)) @@ -193,7 +193,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, DrawingFunctor& drawing_functor, bool draw_marked_darts=true) { @@ -224,7 +224,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; @@ -241,7 +241,7 @@ void compute_edge(const Mesh &mesh, template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, DrawingFunctor& drawing_functor) { typedef typename CGAL::Get_traits::Kernel Kernel; @@ -253,7 +253,7 @@ void compute_vertex(const Mesh &mesh, template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const std::vector>* m_paths, std::size_t i, typename Get_map::type::size_type amark) @@ -282,7 +282,7 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &m_drawing_functor, const std::vector>* m_paths, typename Get_map::type::size_type amark) @@ -371,7 +371,7 @@ void compute_elements(const Mesh &mesh, template void add_in_graphic_buffer(const Mesh& mesh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const std::vector>* paths, const DrawingFunctor& drawing_functor, typename Get_map::type::size_type amark= @@ -385,7 +385,7 @@ void add_in_graphic_buffer(const Mesh& mesh, template void add_in_graphic_buffer(const Mesh& mesh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const std::vector>* paths, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) @@ -409,7 +409,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, &paths, amark); draw_buffer(buffer, title); } @@ -422,7 +422,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, drawing_functor, &paths, amark); draw_buffer(buffer, title); } @@ -435,7 +435,7 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { std::vector> paths=l; - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, &paths, amark); draw_buffer(buffer, title); } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h index 983ae936a8dc..9c63c3bf8afd 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -61,7 +61,7 @@ struct Polygon_triangulation_drawing_functor : template void add_in_graphic_buffer(const CGAL_CT2_TYPE& ct2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_t2::compute_elements(ct2, graphic_buffer, drawing_functor); @@ -74,7 +74,7 @@ template void draw(const CGAL_CT2_TYPE &ct2, const DrawingFunctor &drawingfunctor, const char *title="Constrained Triangulation_2 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(ct2, buffer, drawingfunctor); draw_buffer(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 2ae142e3d3f6..e57a6e0a37fa 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ namespace draw_function_for_t2 { template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_face(t2, fh)) @@ -47,7 +47,7 @@ void compute_face(const T2& t2, template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_edge(t2, eh)) @@ -70,7 +70,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_vertex(t2, vh)) @@ -88,7 +88,7 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, template void compute_elements(const T2& t2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (drawing_functor.are_faces_enabled()) @@ -119,7 +119,7 @@ void compute_elements(const T2& t2, template void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_t2::compute_elements(at2, graphic_buffer, drawing_functor); @@ -127,9 +127,9 @@ void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, template void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; Drawing_functor void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(at2, buffer, drawingfunctor); draw_buffer(buffer, title); } @@ -166,7 +166,7 @@ template void draw(const CGAL_T2_TYPE& at2, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(at2, buffer); draw_buffer(buffer, title); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 51a082dd43c7..788763d4e328 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -28,7 +28,7 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, const DrawingFunctor& drawing_functor, - CGAL::Graphic_buffer& graphic_buffer, const T3 *t3) + CGAL::Graphic_storage& graphic_buffer, const T3 *t3) { if(!drawing_functor.draw_face(*t3, fh)) { return; } @@ -50,7 +50,7 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_edge(*t3, eh)) @@ -70,7 +70,7 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_vertex(*t3, vh)) @@ -86,7 +86,7 @@ void compute_vertex(typename T3::Vertex_handle vh, template void compute_elements(const T3* t3, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if (drawing_functor.are_faces_enabled()) @@ -118,7 +118,7 @@ void compute_elements(const T3* t3, template void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { draw_function_for_t3::compute_elements(&at3, graphic_buffer, drawing_functor); @@ -127,7 +127,7 @@ void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, template void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, const char *title="T3 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(at3, buffer, drawingfunctor); draw_buffer(buffer, title); } @@ -169,7 +169,7 @@ void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, template void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(at3, buffer); draw_buffer(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index b1e4ad3de924..74a5687ed11e 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -72,7 +72,7 @@ typedef Local_kernel::Vector_3 Local_vector; template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_vertex(v2, vh)) @@ -87,14 +87,14 @@ void compute_vertex(const V2& v2, template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphic_buffer &graphic_buffer, + CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor& drawing_functor) { graphic_buffer.add_point(vi->point(), drawing_functor.dual_vertex_color); } template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -224,7 +224,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -254,7 +254,7 @@ void compute_rays_and_bisectors(const V2&, template void compute_face(const V2& v2, typename V2::Face_iterator fh, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& m_drawing_functor) { if(fh->is_unbounded() || !m_drawing_functor.draw_face(v2, fh)) @@ -288,7 +288,7 @@ void compute_face(const V2& v2, template void compute_elements(const V2& v2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { if(drawing_functor.are_vertices_enabled()) @@ -338,7 +338,7 @@ void compute_elements(const V2& v2, template void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphic_buffer& graphic_buffer, + CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& m_drawing_functor) { draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor); @@ -346,7 +346,7 @@ void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, template void add_in_graphic_buffer(const CGAL_VORONOI_TYPE& v2, - CGAL::Graphic_buffer& graphic_buffer) + CGAL::Graphic_storage& graphic_buffer) { // Default functor; user can add his own functor. CGAL::Drawing_functor_voronoi buffer; + CGAL::Graphic_storage buffer; add_in_graphic_buffer(av2, buffer, drawing_functor); draw_buffer(buffer, title); } @@ -376,7 +376,7 @@ template void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { - CGAL::Graphic_buffer buffer; + CGAL::Graphic_storage buffer; CGAL::Drawing_functor_voronoi Date: Thu, 27 Apr 2023 17:31:33 +0200 Subject: [PATCH 134/341] move basic viewer files --- Basic_viewer/include/{Basic_viewer => CGAL}/Buffer_for_vao.h | 0 Basic_viewer/include/{Basic_viewer => CGAL}/Drawing_functor.h | 0 .../{Basic_viewer/Graphic_buffer.h => CGAL/Graphic_storage.h} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Basic_viewer/include/{Basic_viewer => CGAL}/Buffer_for_vao.h (100%) rename Basic_viewer/include/{Basic_viewer => CGAL}/Drawing_functor.h (100%) rename Basic_viewer/include/{Basic_viewer/Graphic_buffer.h => CGAL/Graphic_storage.h} (100%) diff --git a/Basic_viewer/include/Basic_viewer/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h similarity index 100% rename from Basic_viewer/include/Basic_viewer/Buffer_for_vao.h rename to Basic_viewer/include/CGAL/Buffer_for_vao.h diff --git a/Basic_viewer/include/Basic_viewer/Drawing_functor.h b/Basic_viewer/include/CGAL/Drawing_functor.h similarity index 100% rename from Basic_viewer/include/Basic_viewer/Drawing_functor.h rename to Basic_viewer/include/CGAL/Drawing_functor.h diff --git a/Basic_viewer/include/Basic_viewer/Graphic_buffer.h b/Basic_viewer/include/CGAL/Graphic_storage.h similarity index 100% rename from Basic_viewer/include/Basic_viewer/Graphic_buffer.h rename to Basic_viewer/include/CGAL/Graphic_storage.h From 5ef4638a70233bcaed8c861ac1409b7c6dff6fe8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 27 Apr 2023 18:10:42 +0200 Subject: [PATCH 135/341] =?UTF-8?q?start=20doc=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 114 ++++++++++++++++++ .../doc/Basic_viewer/CGAL/Graphic_storage.h | 67 ++++++++++ 2 files changed, 181 insertions(+) create mode 100644 Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h create mode 100644 Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h new file mode 100644 index 000000000000..dacba4b84a40 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -0,0 +1,114 @@ + +namespace CGAL { + +/*! +\ingroup PkgBasicViewerClasses + +The class `Drawing_functor` is used to tune the way that a given data-structure of CGAL is drawn. +The different std::function can be modified to change the behavior of the drawing. + +\tparam DS a data structure of CGAL. +\tparam Vertex_descriptor a descriptor of vertices of DS. +\tparam Edge_descriptor a descriptor of edges of DS. +\tparam Face_descriptor a descriptor of faces of DS. + +*/ +template +struct Drawing_functor +{ + /// std::function that returns true if the given vertex must be drawn, false otherwise. + std::function draw_vertex; + + /// std::function that returns true if the given edge must be drawn, false otherwise. + std::function draw_edge; + + /// std::function that returns true if the given face must be drawn, false otherwise. + std::function draw_face; + + /// std::function that returns true if the given vertex is colored, false otherwise. + std::function colored_vertex; + + /// std::function that returns true if the given edge is colored, false otherwise. + std::function colored_edge; + + /// std::function that returns true if the given face is colored, false otherwise. + std::function colored_face; + + /// std::function that returns true if the given face is drawn in wireframe, false otherwise. + std::function face_wireframe; + + /// std::function that returns the color of the given vertex. + std::function vertex_color; + + /// std::function that returns the color of the given edge. + std::function edge_color; + + /// std::function that returns the color of the given face. + std::function face_color; + + /// Disable the drawing of vertices. + void disable_vertices(); + + /// Enable the drawing of vertices. + void enable_vertices(); + + /// Disable the drawing of edges. + void disable_edges(); + + /// Enable the drawing of edges. + void enable_edges(); + + /// Disable the drawing of faces. + void disable_faces(); + + /// Enable the drawing of faces. + void enable_faces(); +}; + +/*! +\ingroup PkgBasicViewerClasses + +The class `Drawing_functor_with_volume` is used to tune the way that a given data-structure of CGAL is drawn, for a data-structure that contains volumes. +The different std::function can be modified to change the behavior of the drawing. + +\tparam DS a data structure of CGAL. +\tparam Vertex_descriptor a descriptor of vertices of DS. +\tparam Edge_descriptor a descriptor of edges of DS. +\tparam Face_descriptor a descriptor of faces of DS. +\tparam Volume_descriptor a descriptor of volumes of DS. + +*/ + +// Drawing functor for a 3D data structure +// (with vertices, edges, faces and volumes) +template +struct Drawing_functor_with_volume : + public Drawing_functor +{ + /// std::function that returns true if the given volume must be drawn, false otherwise. + std::function draw_volume; + + /// std::function that returns the color of the given volume. + std::function colored_volume; + + /// std::function that returns true if the given volume is drawn in wireframe, false otherwise. + std::function volume_wireframe; + + /// std::function that returns the color of the given volume. + std::function volume_color; + + /// Disable the drawing of volumes. + void disable_volumes(); + + /// Enable the drawing of volumes. + void enable_volumes(); +}; + +} // End namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h new file mode 100644 index 000000000000..de77b753e061 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -0,0 +1,67 @@ + +namespace CGAL { + +/*! + \ingroup PkgBasicViewerClasses + +The class `Graphic_storage` store points, segments and triangles. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and triangulated internally. + +\tparam BufferType the type used for point coordinates: float by default. + +*/ +template +class Graphic_storage +{ + template void add_point(const KPoint &p); + + template + void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + + template + void add_segment(const KPoint &p1, const KPoint &p2); + + template + void add_segment(const KPoint &p1, const KPoint &p2, + const CGAL::IO::Color &acolor); + + template + void add_ray(const KPoint &p, const KVector &v); + + template + void add_ray(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + template + void add_line(const KPoint &p, const KVector &v); + + template + void add_line(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + template bool add_point_in_face(const KPoint &kp); + + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal); + + bool is_a_face_started() const; + + void face_begin(); + + void face_begin(const CGAL::IO::Color &acolor); + + void face_end(); + + bool is_empty() const; + + void clear(); + + template + void add_text(const KPoint &kp, const char *txt); + + template + void add_text(const KPoint &kp, const std::string &txt); + + void m_texts_clear(); +}; + +} // namespace CGAL From 48cfa7ad61f1336550b6fd65e2f3cd05d104849c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 27 Apr 2023 18:30:41 +0200 Subject: [PATCH 136/341] add default value in the doc --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index dacba4b84a40..31c31e69561b 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -20,33 +20,43 @@ template draw_vertex; /// std::function that returns true if the given edge must be drawn, false otherwise. + /// Returns true by default. std::function draw_edge; /// std::function that returns true if the given face must be drawn, false otherwise. + /// Returns true by default. std::function draw_face; /// std::function that returns true if the given vertex is colored, false otherwise. + /// Returns false by default. std::function colored_vertex; /// std::function that returns true if the given edge is colored, false otherwise. + /// Returns false by default. std::function colored_edge; /// std::function that returns true if the given face is colored, false otherwise. + /// Returns false by default. std::function colored_face; /// std::function that returns true if the given face is drawn in wireframe, false otherwise. + /// Returns false by default. std::function face_wireframe; /// std::function that returns the color of the given vertex. + /// nullptr by default. std::function vertex_color; /// std::function that returns the color of the given edge. + /// nullptr by default. std::function edge_color; /// std::function that returns the color of the given face. + /// nullptr by default. std::function face_color; /// Disable the drawing of vertices. @@ -93,16 +103,20 @@ struct Drawing_functor_with_volume : public Drawing_functor { /// std::function that returns true if the given volume must be drawn, false otherwise. - std::function draw_volume; + /// Returns true by default. + std::function draw_volume; /// std::function that returns the color of the given volume. - std::function colored_volume; + /// Returns false by default. + std::function colored_volume; /// std::function that returns true if the given volume is drawn in wireframe, false otherwise. - std::function volume_wireframe; + /// Returns false by default. + std::function volume_wireframe; /// std::function that returns the color of the given volume. - std::function volume_color; + /// nullptr by default. + std::function volume_color; /// Disable the drawing of volumes. void disable_volumes(); From 4df2edd9c1248a72e92be81dd3a82e9a9557d5d5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 12:26:31 +0200 Subject: [PATCH 137/341] Replace draw_buffer by draw_graphic_storage --- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 34 +++++++++++++++---- .../Basic_viewer/draw_mesh_and_points.cpp | 2 +- .../include/CGAL/Qt/Basic_viewer_qt.h | 4 +-- .../include/CGAL/draw_linear_cell_complex.h | 4 +-- Nef_3/include/CGAL/draw_nef_3.h | 4 +-- .../CGAL/draw_periodic_2_triangulation_2.h | 2 +- Point_set_3/include/CGAL/draw_point_set_3.h | 4 +-- Polygon/include/CGAL/draw_polygon_2.h | 4 +-- .../include/CGAL/draw_polygon_with_holes_2.h | 4 +-- Polyhedron/include/CGAL/draw_polyhedron.h | 4 +-- .../include/CGAL/draw_straight_skeleton_2.h | 4 +-- Surface_mesh/include/CGAL/draw_surface_mesh.h | 4 +-- .../include/CGAL/draw_face_graph_with_paths.h | 6 ++-- .../polygon_triangulation_drawing_functor.h | 2 +- .../include/CGAL/draw_triangulation_2.h | 4 +-- .../include/CGAL/draw_triangulation_3.h | 4 +-- .../include/CGAL/draw_voronoi_diagram_2.h | 2 +- 17 files changed, 56 insertions(+), 36 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index de77b753e061..2f0b5901cc67 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Graphic_storage` store points, segments and triangles. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and triangulated internally. +The class `Graphic_storage` store points, segments and triangles. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and are triangulated internally. \tparam BufferType the type used for point coordinates: float by default. @@ -12,55 +12,75 @@ The class `Graphic_storage` store points, segments and triangles. Elements can b template class Graphic_storage { - template void add_point(const KPoint &p); + /// Add the given point in this storage. + template + void add_point(const KPoint &p); + /// Add the given colored point in this storage. template void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + /// Add the given segment in this storage. template void add_segment(const KPoint &p1, const KPoint &p2); + /// Add the given colored segment in this storage. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); + /// Add the given ray in the storage: an half line starting from p and having v as direction. template void add_ray(const KPoint &p, const KVector &v); + /// Add the given colored ray in the storage: an half line starting from p and having v as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); + /// Add the given line in the storage, defined by p and v as direction. template void add_line(const KPoint &p, const KVector &v); + /// Add the given colored line in the storage, defined by p and v as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - template bool add_point_in_face(const KPoint &kp); + /// start a new face. + void face_begin(); - template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal); + /// start a new colored face. + void face_begin(const CGAL::IO::Color &acolor); + /// @return true iff a face is started. bool is_a_face_started() const; - void face_begin(); + /// add the given point in the current face. + template bool add_point_in_face(const KPoint &kp); - void face_begin(const CGAL::IO::Color &acolor); + /// add the given point in the current face, having the vertex normal. + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal); + /// end the current face. void face_end(); + /// @return true iff the storage has no element. bool is_empty() const; + /// clear the storage, i.e. remove all points, segments, triangles and text. void clear(); + /// add the given text at the given position in the storage. template void add_text(const KPoint &kp, const char *txt); + /// add the given text at the given position in the storage. template void add_text(const KPoint &kp, const std::string &txt); + /// clear all the texts. void m_texts_clear(); }; diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 744f98299888..7a2058b2d3a5 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -58,7 +58,7 @@ int main(void) CGAL::Graphic_storage graphic_buffer; CGAL::add_in_graphic_buffer(point_set, graphic_buffer, Drawing_functor_green_points()); CGAL::add_in_graphic_buffer(output_mesh, graphic_buffer); - CGAL::draw_buffer(graphic_buffer); + CGAL::draw_graphic_storage(graphic_buffer); } else { return EXIT_FAILURE; } diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 4fa0c1ea583e..254e9fb724df 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -1667,7 +1667,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_buffer(Graphic_storage& graphic_buffer, +void draw_graphic_storage(Graphic_storage& graphic_buffer, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1692,7 +1692,7 @@ void draw_buffer(Graphic_storage& graphic_buffer, } // template -// void draw_buffer(Graphic_storage &graphic_buffer, +// void draw_graphic_storage(Graphic_storage &graphic_buffer, // const std::function *)>& onPress, // const char *title="CGAL Basic Viewer") // { diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 8dc57de4cc04..25c697907077 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -290,7 +290,7 @@ void draw(const CGAL_LCC_TYPE& alcc, const DrawingFunctor& drawing_functor, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(alcc, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } // Specialization of draw function for a LCC, without a drawing functor. @@ -302,7 +302,7 @@ void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") { CGAL::Graphic_storage buffer; add_in_graphic_buffer(alcc, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index fd0ff0897775..f4242edd06ad 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -288,7 +288,7 @@ void draw(const CGAL_NEF3_TYPE &anef, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(anef, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template buffer; add_in_graphic_buffer(anef, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 7ed6f5058759..1b0c38a68f69 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -227,7 +227,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2t2, buffer, drawing_functor); - draw_buffer(buffer); + draw_graphic_storage(buffer); } template diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 447db4f7d785..4b8bd016bff4 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -98,7 +98,7 @@ void draw(const Point_set_3& apointset, { Graphic_storage buffer; add_in_graphic_buffer(apointset, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -107,7 +107,7 @@ void draw(const Point_set_3& apointset, { Graphic_storage buffer; add_in_graphic_buffer(apointset, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 6ae50e0fe773..2562d0efe35d 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -128,7 +128,7 @@ void draw(const CGAL_P2_TYPE &ap2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -138,7 +138,7 @@ void draw(const CGAL_P2_TYPE &ap2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer, drawingfunctor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index c94f39d7cb9d..33006449e794 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -156,7 +156,7 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_func { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -165,7 +165,7 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ap2, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 05ed00e25a5a..19c96d92188a 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -63,7 +63,7 @@ void draw(const CGAL_POLY_TYPE& apoly, { CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(apoly, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template buffer; add_in_graphic_buffer_for_fg(apoly, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 80689e79dc58..8736fd07080a 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -188,7 +188,7 @@ void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ass2, buffer, drawingfunctor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -197,7 +197,7 @@ void draw(const CGAL_SS_TYPE &ass2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ass2, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index f630b8133374..f68fa485697a 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -59,7 +59,7 @@ void draw(const Surface_mesh& amesh, { CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(amesh, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -69,7 +69,7 @@ void draw(const Surface_mesh& amesh, { CGAL::Graphic_storage buffer; add_in_graphic_buffer_for_fg(amesh, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 35d7495c8262..486ad6490108 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -411,7 +411,7 @@ void draw(const Mesh& mesh, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, &paths, amark); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -424,7 +424,7 @@ void draw(const Mesh& mesh, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, drawing_functor, &paths, amark); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -437,7 +437,7 @@ void draw(const Mesh& mesh, std::vector> paths=l; CGAL::Graphic_storage buffer; add_in_graphic_buffer(mesh, buffer, &paths, amark); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } } // End namespace CGAL diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h index 9c63c3bf8afd..6880a4921b3e 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -76,7 +76,7 @@ void draw(const CGAL_CT2_TYPE &ct2, const DrawingFunctor &drawingfunctor, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(ct2, buffer, drawingfunctor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index e57a6e0a37fa..0e777ffdd435 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -159,7 +159,7 @@ void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(at2, buffer, drawingfunctor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -168,7 +168,7 @@ void draw(const CGAL_T2_TYPE& at2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(at2, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 788763d4e328..0a171fc30df1 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -163,7 +163,7 @@ void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(at3, buffer, drawingfunctor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template @@ -171,7 +171,7 @@ void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { CGAL::Graphic_storage buffer; add_in_graphic_buffer(at3, buffer); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 74a5687ed11e..20bcffc914a4 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -369,7 +369,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, { CGAL::Graphic_storage buffer; add_in_graphic_buffer(av2, buffer, drawing_functor); - draw_buffer(buffer, title); + draw_graphic_storage(buffer, title); } template From b04d7a6b714d8cc0079f2fb631537ee94dde869a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 14:59:16 +0200 Subject: [PATCH 138/341] Rename --- Basic_viewer/include/CGAL/Buffer_for_vao.h | 6 +++--- Basic_viewer/include/CGAL/Graphic_storage.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Basic_viewer/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h index 6589800a9a23..04d5bd927827 100644 --- a/Basic_viewer/include/CGAL/Buffer_for_vao.h +++ b/Basic_viewer/include/CGAL/Buffer_for_vao.h @@ -10,8 +10,8 @@ // // Author(s) : Guillaume Damiand -#ifndef CGAL_VBO_BUFFER_FILLER_H -#define CGAL_VBO_BUFFER_FILLER_H +#ifndef CGAL_BUFFER_FOR_VAO_H +#define CGAL_BUFFER_FOR_VAO_H #include @@ -923,4 +923,4 @@ class Buffer_for_vao } // End namespace CGAL -#endif // CGAL_VBO_BUFFER_FILLER_H +#endif // CGAL_BUFFER_FOR_VAO_H diff --git a/Basic_viewer/include/CGAL/Graphic_storage.h b/Basic_viewer/include/CGAL/Graphic_storage.h index c6cab7251fe2..056078251ac0 100644 --- a/Basic_viewer/include/CGAL/Graphic_storage.h +++ b/Basic_viewer/include/CGAL/Graphic_storage.h @@ -10,8 +10,8 @@ // Author(s): Guillaume Damiand // Mostafa Ashraf -#ifndef CGAL_GRAPHIC_BUFFER_H -#define CGAL_GRAPHIC_BUFFER_H +#ifndef CGAL_GRAPHIC_STORAGE_H +#define CGAL_GRAPHIC_STORAGE_H #include #include @@ -417,4 +417,4 @@ class Graphic_storage } // namespace CGAL -#endif // CGAL_GRAPHIC_BUFFER_H +#endif // CGAL_GRAPHIC_STORAGE_H From 519c7cc1a55d62e35967c0dfb5cb86b781980be5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 15:25:40 +0200 Subject: [PATCH 139/341] rename add_in_graphic_buffer into add_in_graphic_storage --- BGL/include/CGAL/draw_face_graph.h | 6 ++-- .../doc/Basic_viewer/Basic_viewer.txt | 31 +++++++++++++++++++ .../Basic_viewer/draw_mesh_and_points.cpp | 4 +-- .../draw_surface_mesh_small_faces.cpp | 6 ++-- .../demo/Linear_cell_complex/Viewer.cpp | 4 +-- .../include/CGAL/draw_linear_cell_complex.h | 14 ++++----- Nef_3/include/CGAL/draw_nef_3.h | 12 +++---- .../CGAL/draw_periodic_2_triangulation_2.h | 10 +++--- Point_set_3/include/CGAL/draw_point_set_3.h | 10 +++--- Polygon/include/CGAL/draw_polygon_2.h | 10 +++--- .../include/CGAL/draw_polygon_with_holes_2.h | 10 +++--- Polyhedron/include/CGAL/draw_polyhedron.h | 14 ++++----- .../include/CGAL/draw_straight_skeleton_2.h | 10 +++--- Surface_mesh/include/CGAL/draw_surface_mesh.h | 12 +++---- .../include/CGAL/draw_face_graph_with_paths.h | 12 +++---- .../polygon_triangulation_drawing_functor.h | 4 +-- .../include/CGAL/draw_triangulation_2.h | 10 +++--- .../include/CGAL/draw_triangulation_3.h | 10 +++--- .../include/CGAL/draw_voronoi_diagram_2.h | 10 +++--- 19 files changed, 115 insertions(+), 84 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 04238fd633c7..9c28c5c4c090 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -119,7 +119,7 @@ void compute_elements(const FG &fg, } // draw_function_for_FG template -void add_in_graphic_buffer_for_fg(const FG &fg, +void add_in_graphic_storage_for_fg(const FG &fg, CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { @@ -127,7 +127,7 @@ void add_in_graphic_buffer_for_fg(const FG &fg, } template -void add_in_graphic_buffer_for_fg(const FG &fg, +void add_in_graphic_storage_for_fg(const FG &fg, CGAL::Graphic_storage &graphic_buffer) { Drawing_functor graphic_buffer; - CGAL::add_in_graphic_buffer(point_set, graphic_buffer, Drawing_functor_green_points()); - CGAL::add_in_graphic_buffer(output_mesh, graphic_buffer); + CGAL::add_in_graphic_storage(point_set, graphic_buffer, Drawing_functor_green_points()); + CGAL::add_in_graphic_storage(output_mesh, graphic_buffer); CGAL::draw_graphic_storage(graphic_buffer); } else diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 56b15be2022e..115f96c9e982 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -102,7 +102,7 @@ int main(int argc, char* argv[]) Drawing_functor_small_faces df(sm); CGAL::Graphic_storage buffer; - add_in_graphic_buffer(sm, buffer, df); + add_in_graphic_storage(sm, buffer, df); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { @@ -118,7 +118,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(df.m_threshold)); basic_viewer->clear(); - add_in_graphic_buffer(sm, buffer, df); + add_in_graphic_storage(sm, buffer, df); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -129,7 +129,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(df.m_threshold)); basic_viewer->clear(); - add_in_graphic_buffer(sm, buffer, df); + add_in_graphic_storage(sm, buffer, df); basic_viewer->redraw(); } else diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 6a7ba68de51f..8308b4c4a30c 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -53,7 +53,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphic_buffer(*scene->lcc, gBuffer, m_drawing_functor); } + { CGAL::add_in_graphic_storage(*scene->lcc, gBuffer, m_drawing_functor); } if (doredraw) { Base::redraw(); } @@ -62,7 +62,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { gBuffer.clear(); - CGAL::add_in_graphic_buffer(*scene->lcc, gBuffer, m_drawing_functor); + CGAL::add_in_graphic_storage(*scene->lcc, gBuffer, m_drawing_functor); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 25c697907077..01cfb7fd5ffd 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -232,14 +232,14 @@ void compute_elements(const LCC& lcc, CGAL::Linear_cell_complex_base -// add_in_graphic_buffer: to add a LCC in the given graphic buffer, with a +// add_in_graphic_storage: to add a LCC in the given graphic buffer, with a // drawing functor. template class Map, class Refs, class Storage_, typename BufferType=float, class DrawingFunctor> -void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, +void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -247,13 +247,13 @@ void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, graphic_buffer, drawing_functor); } -// add_in_graphic_buffer: to add a LCC in the given graphic buffer, without a +// add_in_graphic_storage: to add a LCC in the given graphic buffer, without a // drawing functor. Use default drawing values. template class Map, class Refs, class Storage_, typename BufferType=float> -void add_in_graphic_buffer(const CGAL_LCC_TYPE& alcc, +void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor_with_volume buffer; - add_in_graphic_buffer(alcc, buffer, drawing_functor); + add_in_graphic_storage(alcc, buffer, drawing_functor); draw_graphic_storage(buffer, title); } @@ -301,7 +301,7 @@ template buffer; - add_in_graphic_buffer(alcc, buffer); + add_in_graphic_storage(alcc, buffer); draw_graphic_storage(buffer, title); } diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index f4242edd06ad..45b2f8488b66 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -236,10 +236,10 @@ void compute_elements(const Nef_Polyhedron &nef, #define CGAL_NEF3_TYPE Nef_polyhedron_3 -// add_in_graphic_buffer +// add_in_graphic_storage template -void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, +void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) { @@ -250,7 +250,7 @@ void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, template -void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, +void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, CGAL::Graphic_storage &graphic_buffer) { // Default functor; user can add his own functor. @@ -274,7 +274,7 @@ void add_in_graphic_buffer(const CGAL_NEF3_TYPE &anef, return get_random_color(random); }; - add_in_graphic_buffer(anef, graphic_buffer, drawing_functor); + add_in_graphic_storage(anef, graphic_buffer, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -287,7 +287,7 @@ void draw(const CGAL_NEF3_TYPE &anef, const char *title="Nef Polyhedron Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(anef, buffer, drawing_functor); + add_in_graphic_storage(anef, buffer, drawing_functor); draw_graphic_storage(buffer, title); } @@ -297,7 +297,7 @@ void draw(const CGAL_NEF3_TYPE &anef, const char *title="Nef Polyhedron Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(anef, buffer); + add_in_graphic_storage(anef, buffer); draw_graphic_storage(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 1b0c38a68f69..f9e734553422 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -197,7 +197,7 @@ void compute_elements(const P2T2& p2t2, #define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 template -void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, +void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -205,7 +205,7 @@ void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, } template -void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, +void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor_periodic_2_triangulation_2 @@ -214,7 +214,7 @@ void add_in_graphic_buffer(const CGAL_P2T2_TYPE& p2t2, typename CGAL_P2T2_TYPE::Periodic_segment_iterator, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> drawing_functor; - add_in_graphic_buffer(p2t2, graphic_buffer, drawing_functor); + add_in_graphic_storage(p2t2, graphic_buffer, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -226,7 +226,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ap2t2, buffer, drawing_functor); + add_in_graphic_storage(ap2t2, buffer, drawing_functor); draw_graphic_storage(buffer); } @@ -241,7 +241,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, typename CGAL_P2T2_TYPE::Periodic_segment_iterator, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> drawing_functor; - add_in_graphic_buffer(ap2t2, buffer, drawing_functor); + add_in_graphic_storage(ap2t2, buffer, drawing_functor); QApplication_and_basic_viewer app(buffer, title); if(app) { diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 4b8bd016bff4..144417fb1dcf 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -69,7 +69,7 @@ void compute_elements(const PointSet& pointset, } // namespace draw_function_for_PointSet template -void add_in_graphic_buffer(const Point_set_3& apointset, +void add_in_graphic_storage(const Point_set_3& apointset, Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -79,13 +79,13 @@ void add_in_graphic_buffer(const Point_set_3& apointset, } template -void add_in_graphic_buffer(const Point_set_3& apointset, +void add_in_graphic_storage(const Point_set_3& apointset, Graphic_storage& graphic_buffer) { CGAL::Drawing_functor, typename Point_set_3::const_iterator, int, int> drawing_functor; - add_in_graphic_buffer(apointset, graphic_buffer, drawing_functor); + add_in_graphic_storage(apointset, graphic_buffer, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -97,7 +97,7 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphic_storage buffer; - add_in_graphic_buffer(apointset, buffer, drawing_functor); + add_in_graphic_storage(apointset, buffer, drawing_functor); draw_graphic_storage(buffer, title); } @@ -106,7 +106,7 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphic_storage buffer; - add_in_graphic_buffer(apointset, buffer); + add_in_graphic_storage(apointset, buffer); draw_graphic_storage(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 2562d0efe35d..20897bdb9f86 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -99,16 +99,16 @@ void compute_elements(const P2& p2, #define CGAL_P2_TYPE CGAL::Polygon_2 -// Specializations of add_in_graphic_buffer function +// Specializations of add_in_graphic_storage function template -void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, +void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawingfunctor) { draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); } template -void add_in_graphic_buffer(const CGAL_P2_TYPE& ap2, +void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, CGAL::Graphic_storage &graphic_buffer) { CGAL::Drawing_functor buffer; - add_in_graphic_buffer(ap2, buffer); + add_in_graphic_storage(ap2, buffer); draw_graphic_storage(buffer, title); } @@ -137,7 +137,7 @@ void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ap2, buffer, drawingfunctor); + add_in_graphic_storage(ap2, buffer, drawingfunctor); draw_graphic_storage(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 33006449e794..b04fd60ba0a6 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -127,7 +127,7 @@ void compute_elements(const P2& p2, Graphic_storage &graphic_buffer, #define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 template -void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, +void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor &drawing_functor) { @@ -136,7 +136,7 @@ void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, } template -void add_in_graphic_buffer(const CGAL_P2_WITH_HOLES_TYPE& p2, +void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphic_storage& graphic_buffer) { Drawing_functor drawing_functor; - add_in_graphic_buffer(p2, graphic_buffer, drawing_functor); + add_in_graphic_storage(p2, graphic_buffer, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -155,7 +155,7 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_func const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ap2, buffer, drawing_functor); + add_in_graphic_storage(ap2, buffer, drawing_functor); draw_graphic_storage(buffer, title); } @@ -164,7 +164,7 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ap2, buffer); + add_in_graphic_storage(ap2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 19c96d92188a..8e7b1788afeb 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -26,7 +26,7 @@ namespace CGAL #define CGAL_POLY_TYPE CGAL::Polyhedron_3 \ -// Specialization of add_in_graphic_buffer function. +// Specialization of add_in_graphic_storage function. template @@ -34,10 +34,10 @@ template -void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, +void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) -{ add_in_graphic_buffer_for_fg(apoly, graphic_buffer, drawing_functor); } +{ add_in_graphic_storage_for_fg(apoly, graphic_buffer, drawing_functor); } template -void add_in_graphic_buffer(const CGAL_POLY_TYPE& apoly, +void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, CGAL::Graphic_storage &graphic_buffer) -{ add_in_graphic_buffer_for_fg(apoly, graphic_buffer); } +{ add_in_graphic_storage_for_fg(apoly, graphic_buffer); } // Specialization of draw function: require Qt and the CGAL basic viewer. #ifdef CGAL_USE_BASIC_VIEWER @@ -62,7 +62,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer_for_fg(apoly, buffer); + add_in_graphic_storage_for_fg(apoly, buffer); draw_graphic_storage(buffer, title); } @@ -78,7 +78,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer_for_fg(apoly, buffer, drawing_functor); + add_in_graphic_storage_for_fg(apoly, buffer, drawing_functor); draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 8736fd07080a..9b4fcddf3926 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -130,7 +130,7 @@ void compute_elements(const SS2& ss2, #define CGAL_SS_TYPE CGAL::Straight_skeleton_2 template -void add_in_graphic_buffer(const CGAL_SS_TYPE &ass2, +void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -139,7 +139,7 @@ void add_in_graphic_buffer(const CGAL_SS_TYPE &ass2, } template -void add_in_graphic_buffer(const CGAL_SS_TYPE& ass2, +void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, CGAL::Graphic_storage& graphic_buffer) { Drawing_functor buffer; - add_in_graphic_buffer(ass2, buffer, drawingfunctor); + add_in_graphic_storage(ass2, buffer, drawingfunctor); draw_graphic_storage(buffer, title); } @@ -196,7 +196,7 @@ void draw(const CGAL_SS_TYPE &ass2, const char *title="Straight Skeleton Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ass2, buffer); + add_in_graphic_storage(ass2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index f68fa485697a..3b2f9895c93f 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -40,15 +40,15 @@ namespace CGAL { template -void add_in_graphic_buffer(const Surface_mesh& amesh, +void add_in_graphic_storage(const Surface_mesh& amesh, CGAL::Graphic_storage &graphic_buffer, const DrawingFunctor &drawing_functor) -{ add_in_graphic_buffer_for_fg(amesh, graphic_buffer, drawing_functor); } +{ add_in_graphic_storage_for_fg(amesh, graphic_buffer, drawing_functor); } template -void add_in_graphic_buffer(const Surface_mesh& amesh, +void add_in_graphic_storage(const Surface_mesh& amesh, CGAL::Graphic_storage &graphic_buffer) -{ add_in_graphic_buffer_for_fg(amesh, graphic_buffer); } +{ add_in_graphic_storage_for_fg(amesh, graphic_buffer); } #ifdef CGAL_USE_BASIC_VIEWER @@ -58,7 +58,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer_for_fg(amesh, buffer); + add_in_graphic_storage_for_fg(amesh, buffer); draw_graphic_storage(buffer, title); } @@ -68,7 +68,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer_for_fg(amesh, buffer, drawing_functor); + add_in_graphic_storage_for_fg(amesh, buffer, drawing_functor); draw_graphic_storage(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 486ad6490108..8eecc3b4f0b0 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -370,7 +370,7 @@ void compute_elements(const Mesh &mesh, } // namespace draw_function_for_face_graph_with_paths template -void add_in_graphic_buffer(const Mesh& mesh, +void add_in_graphic_storage(const Mesh& mesh, CGAL::Graphic_storage& graphic_buffer, const std::vector>* paths, const DrawingFunctor& drawing_functor, @@ -384,7 +384,7 @@ void add_in_graphic_buffer(const Mesh& mesh, } template -void add_in_graphic_buffer(const Mesh& mesh, +void add_in_graphic_storage(const Mesh& mesh, CGAL::Graphic_storage& graphic_buffer, const std::vector>* paths, typename Get_map::type::size_type amark= @@ -397,7 +397,7 @@ void add_in_graphic_buffer(const Mesh& mesh, typename Get_map::type::Dart_const_descriptor /*fh*/> drawing_functor; - add_in_graphic_buffer(mesh, graphic_buffer, drawing_functor, paths, amark); + add_in_graphic_storage(mesh, graphic_buffer, drawing_functor, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER @@ -410,7 +410,7 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(mesh, buffer, &paths, amark); + add_in_graphic_storage(mesh, buffer, &paths, amark); draw_graphic_storage(buffer, title); } @@ -423,7 +423,7 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(mesh, buffer, drawing_functor, &paths, amark); + add_in_graphic_storage(mesh, buffer, drawing_functor, &paths, amark); draw_graphic_storage(buffer, title); } @@ -436,7 +436,7 @@ void draw(const Mesh& mesh, { std::vector> paths=l; CGAL::Graphic_storage buffer; - add_in_graphic_buffer(mesh, buffer, &paths, amark); + add_in_graphic_storage(mesh, buffer, &paths, amark); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h index 6880a4921b3e..b1750169c7d7 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -60,7 +60,7 @@ struct Polygon_triangulation_drawing_functor : template -void add_in_graphic_buffer(const CGAL_CT2_TYPE& ct2, +void add_in_graphic_storage(const CGAL_CT2_TYPE& ct2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -75,7 +75,7 @@ void draw(const CGAL_CT2_TYPE &ct2, const DrawingFunctor &drawingfunctor, const char *title="Constrained Triangulation_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(ct2, buffer, drawingfunctor); + add_in_graphic_storage(ct2, buffer, drawingfunctor); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 0e777ffdd435..8d17d21accb0 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -118,7 +118,7 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 template -void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, +void add_in_graphic_storage(const CGAL_T2_TYPE& at2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -126,7 +126,7 @@ void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, } template -void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, +void add_in_graphic_storage(const CGAL_T2_TYPE& at2, CGAL::Graphic_storage& graphic_buffer) { CGAL::Graphic_storage buffer; @@ -147,7 +147,7 @@ void add_in_graphic_buffer(const CGAL_T2_TYPE& at2, return get_random_color(random); }; - add_in_graphic_buffer(at2, graphic_buffer, drawingFunctor); + add_in_graphic_storage(at2, graphic_buffer, drawingFunctor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -158,7 +158,7 @@ void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, const char *title="Triangulation_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(at2, buffer, drawingfunctor); + add_in_graphic_storage(at2, buffer, drawingfunctor); draw_graphic_storage(buffer, title); } @@ -167,7 +167,7 @@ void draw(const CGAL_T2_TYPE& at2, const char *title="Triangulation_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(at2, buffer); + add_in_graphic_storage(at2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 0a171fc30df1..de8f06acd07b 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -117,7 +117,7 @@ void compute_elements(const T3* t3, template -void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, +void add_in_graphic_storage(const CGAL_T3_TYPE& at3, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& drawing_functor) { @@ -126,7 +126,7 @@ void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, template -void add_in_graphic_buffer(const CGAL_T3_TYPE& at3, +void add_in_graphic_storage(const CGAL_T3_TYPE& at3, CGAL::Graphic_storage& graphic_buffer) { CGAL::Drawing_functor buffer; - add_in_graphic_buffer(at3, buffer, drawingfunctor); + add_in_graphic_storage(at3, buffer, drawingfunctor); draw_graphic_storage(buffer, title); } @@ -170,7 +170,7 @@ template void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(at3, buffer); + add_in_graphic_storage(at3, buffer); draw_graphic_storage(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 20bcffc914a4..33218f901124 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -337,7 +337,7 @@ void compute_elements(const V2& v2, template -void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, +void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, CGAL::Graphic_storage& graphic_buffer, const DrawingFunctor& m_drawing_functor) { @@ -345,7 +345,7 @@ void add_in_graphic_buffer(const CGAL_VORONOI_TYPE &v2, } template -void add_in_graphic_buffer(const CGAL_VORONOI_TYPE& v2, +void add_in_graphic_storage(const CGAL_VORONOI_TYPE& v2, CGAL::Graphic_storage& graphic_buffer) { // Default functor; user can add his own functor. @@ -355,7 +355,7 @@ void add_in_graphic_buffer(const CGAL_VORONOI_TYPE& v2, typename CGAL_VORONOI_TYPE::Face_iterator> drawing_functor; - add_in_graphic_buffer(v2, graphic_buffer, drawing_functor); + add_in_graphic_storage(v2, graphic_buffer, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -368,7 +368,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_buffer(av2, buffer, drawing_functor); + add_in_graphic_storage(av2, buffer, drawing_functor); draw_graphic_storage(buffer, title); } @@ -384,7 +384,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, typename CGAL_VORONOI_TYPE::Face_iterator> drawing_functor; - add_in_graphic_buffer(av2, buffer, drawing_functor); + add_in_graphic_storage(av2, buffer, drawing_functor); QApplication_and_basic_viewer app(buffer, title); if(app) From e2428902555593576e808f603b496449782d1282 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 15:53:39 +0200 Subject: [PATCH 140/341] doc --- .../doc/Basic_viewer/PackageDescription.txt | 30 +++++++++++++++++++ .../include/CGAL/Basic_shaders.h | 0 .../include/CGAL/Qt/Basic_viewer_qt.h | 0 Documentation/doc/Documentation/packages.txt | 2 +- 4 files changed, 31 insertions(+), 1 deletion(-) rename {GraphicsView => Basic_viewer}/include/CGAL/Basic_shaders.h (100%) rename {GraphicsView => Basic_viewer}/include/CGAL/Qt/Basic_viewer_qt.h (100%) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index e69de29bb2d1..019d185aa849 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -0,0 +1,30 @@ +/// \defgroup PkgBasicViewerRef Basic Viewer Reference + +/// \defgroup PkgBasicViewerClasses Classes +/// \ingroup PkgBasicViewerRef + +/*! +\addtogroup PkgBasicViewerRef +\cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} +\cgalPkgPicture{TODO.png} +\cgalPkgSummaryBegin +\cgalPkgAuthor{Guillaume Damiand} +\cgalPkgDesc{This package implements basic viewer class.} +\cgalPkgManuals{Chapter_Basic_Viewer,PkgBasicViewerRef} +\cgalPkgSummaryEnd +\cgalPkgShortInfoBegin +\cgalPkgSince{6.0} +\cgalPkgBib{cgal:XXX} +\cgalPkgLicense{\ref licensesLGPL "LGPL"} +\cgalPkgShortInfoEnd +\cgalPkgDescriptionEnd + +\cgalClassifedRefPages + +\cgalCRPSection{Classes} +- `CGAL::Drawing_functor` +- `CGAL::Drawing_functor_with_volume` +- `CGAL::Graphic_storage` + +*/ + diff --git a/GraphicsView/include/CGAL/Basic_shaders.h b/Basic_viewer/include/CGAL/Basic_shaders.h similarity index 100% rename from GraphicsView/include/CGAL/Basic_shaders.h rename to Basic_viewer/include/CGAL/Basic_shaders.h diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h similarity index 100% rename from GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h rename to Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h diff --git a/Documentation/doc/Documentation/packages.txt b/Documentation/doc/Documentation/packages.txt index efb62a8134e1..467098a1b84b 100644 --- a/Documentation/doc/Documentation/packages.txt +++ b/Documentation/doc/Documentation/packages.txt @@ -167,6 +167,6 @@ \package_listing{GraphicsView} \package_listing{CGAL_ipelets} -\package_listing{CGAL_basic_viewers} +\package_listing{Basic_viewer} */ From 43194fb5ef710b6d33406fffe93c6741b08f7153 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 17:13:49 +0200 Subject: [PATCH 141/341] Add new example of Basic viewer allowing to view several windows --- .../examples/Basic_viewer/CMakeLists.txt | 3 +++ .../Basic_viewer/draw_mesh_and_points.cpp | 1 - .../draw_surface_mesh_small_faces.cpp | 18 +++++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index 03d5b03a22f6..44e79ffd565c 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -16,15 +16,18 @@ include(CGAL_Eigen3_support) create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") create_single_source_cgal_program("draw_mesh_and_points.cpp") +create_single_source_cgal_program("draw_several_windows.cpp") if(CGAL_Qt5_FOUND) #link it with the required CGAL libraries target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_several_windows PUBLIC CGAL::CGAL_Basic_viewer) endif() if(TARGET CGAL::Eigen3_support) target_link_libraries(draw_mesh_and_points PUBLIC CGAL::Eigen3_support) + target_link_libraries(draw_several_windows PUBLIC CGAL::Eigen3_support) endif() #end of the file diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 68a59a7f4f16..d230becb9d9f 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -9,7 +9,6 @@ #include #include -// Types typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; typedef Kernel::Vector_3 Vector; diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 115f96c9e982..231290527076 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -25,14 +25,14 @@ struct Drawing_functor_small_faces: typename boost::graph_traits::vertex_descriptor, typename boost::graph_traits::edge_descriptor, typename boost::graph_traits::face_descriptor>; - + Drawing_functor_small_faces(const SM& sm): Base(), m_sm(sm) { typename SM::template Property_map faces_size; boost::tie(faces_size, m_with_size)=sm.template property_map("f:size"); - if(!m_with_size) + if(!m_with_size) { return; } - + m_min_size=faces_size[*(sm.faces().begin())]; m_max_size=m_min_size; FT cur_size; @@ -54,11 +54,11 @@ struct Drawing_functor_small_faces: CGAL::IO::Color get_face_color(const SM& sm, typename boost::graph_traits::face_descriptor fh) - { + { // Default color of faces CGAL::IO::Color c(75,160,255); if(!m_with_size) { return c; } - + // Compare the size of the face with the % m_threshold bool exist; typename SM::template Property_map faces_size; @@ -71,7 +71,7 @@ struct Drawing_functor_small_faces: return c; // Default color } - + const SM& m_sm; bool m_with_size; FT m_min_size, m_max_size; @@ -122,9 +122,9 @@ int main(int argc, char* argv[]) basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) - { + { if(df.m_threshold<5) { df.m_threshold=0; } - else { df.m_threshold-=5; } + else { df.m_threshold-=5; } basic_viewer->displayMessage (QString("Small faces threshold=%1.").arg(df.m_threshold)); @@ -147,7 +147,7 @@ int main(int argc, char* argv[]) // Then we run the app app.run(); } - + sm.remove_property_map(faces_size); return EXIT_SUCCESS; From e7acefdde3783414c901af477d2b9ee729d05dcb Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 17:14:05 +0200 Subject: [PATCH 142/341] clean --- .../include/CGAL/Qt/Basic_viewer_qt.h | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index 254e9fb724df..5c77196d8cf0 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -1691,32 +1691,6 @@ void draw_graphic_storage(Graphic_storage& graphic_buffer, } } -// template -// void draw_graphic_storage(Graphic_storage &graphic_buffer, -// const std::function *)>& onPress, -// const char *title="CGAL Basic Viewer") -// { -// #if defined(CGAL_TEST_SUITE) -// bool cgal_test_suite = true; -// #else -// bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -// #endif - -// if (!cgal_test_suite) -// { -// Qt::init_ogl_context(4, 3); - -// int argc = 1; -// const char *argv[2] = {title, nullptr}; -// QApplication app(argc, const_cast(argv)); -// Basic_viewer_qt basic_viewer(app.activeWindow(), graphic_buffer, title); -// basic_viewer._onPress = onPress; - -// basic_viewer.show(); -// app.exec(); -// } -// } - //------------------------------------------------------------------------------ template class QApplication_and_basic_viewer From bde0a527307a77f65c917e08deab9de3a2f1c04f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 17:14:43 +0200 Subject: [PATCH 143/341] Add new example of Basic viewer allowing to view several windows --- .../Basic_viewer/draw_several_windows.cpp | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp new file mode 100644 index 000000000000..0fae3870c9d2 --- /dev/null +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point; +typedef Kernel::Vector_3 Vector; +typedef std::pair Pwn; +typedef CGAL::Polyhedron_3 Polyhedron; +using PS3=CGAL::Point_set_3; + +int main(void) +{ + /// (1) Some CGAL code that create data structure and fill Graphic_storage. + std::vector points; + + if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points), + CGAL::parameters::point_map(CGAL::First_of_pair_property_map()) + .normal_map(CGAL::Second_of_pair_property_map()))) + { + std::cerr << "Error: cannot read input file!" << std::endl; + return EXIT_FAILURE; + } + + Polyhedron output_mesh; + + double average_spacing = CGAL::compute_average_spacing + (points, 6, CGAL::parameters::point_map(CGAL::First_of_pair_property_map())); + + if (!CGAL::poisson_surface_reconstruction_delaunay + (points.begin(), points.end(), + CGAL::First_of_pair_property_map(), + CGAL::Second_of_pair_property_map(), + output_mesh, average_spacing)) + { return EXIT_FAILURE; } + + PS3 point_set; + for(Pwn& it: points) + { point_set.insert(it.first); } + + CGAL::Graphic_storage graphic_buffer1, graphic_buffer2; + CGAL::add_in_graphic_storage(point_set, graphic_buffer1); + CGAL::add_in_graphic_storage(output_mesh, graphic_buffer2); + + /// (2) Qt code that create windows, add them in a layout, and create app. + +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite=true; +#else + bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (cgal_test_suite) { return EXIT_SUCCESS; } + + int argc=1; + const char* argv[2]={"Draw several windows example","\0"}; + QApplication app(argc,const_cast(argv)); + + QMainWindow* mainWindow=new QMainWindow; + QWidget *centralWidget = new QWidget(mainWindow); + QHBoxLayout* layout = new QHBoxLayout(mainWindow); + + CGAL::Basic_viewer_qt bv1(mainWindow, graphic_buffer1); + CGAL::Basic_viewer_qt bv2(mainWindow, graphic_buffer2); + bv1.set_draw_vertices(true); + + layout->addWidget(&bv1); + layout->addWidget(&bv2); + + centralWidget->setLayout(layout); + mainWindow->setCentralWidget(centralWidget); + + mainWindow->show(); + app.exec(); + + return EXIT_SUCCESS; +} From d3acc0941e4c0af14e9f2d401a79cbf068feae7c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 18:19:09 +0200 Subject: [PATCH 144/341] add one example with custom color --- .../examples/Basic_viewer/CMakeLists.txt | 6 +- .../Basic_viewer/draw_surface_mesh_height.cpp | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index 44e79ffd565c..2ba9f5b9dae8 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -14,15 +14,17 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) find_package(Eigen3 3.1.0) include(CGAL_Eigen3_support) -create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") create_single_source_cgal_program("draw_mesh_and_points.cpp") create_single_source_cgal_program("draw_several_windows.cpp") +create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") +create_single_source_cgal_program("draw_surface_mesh_height.cpp") if(CGAL_Qt5_FOUND) #link it with the required CGAL libraries - target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_several_windows PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_height PUBLIC CGAL::CGAL_Basic_viewer) endif() if(TARGET CGAL::Eigen3_support) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp new file mode 100644 index 000000000000..9c72bf2feaf0 --- /dev/null +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point; +typedef CGAL::Surface_mesh Mesh; + +struct Colored_faces_given_height: public CGAL::Drawing_functor +{ + Colored_faces_given_height(const Mesh& sm) + { + double m_min_z, m_max_z; + if(!sm.is_empty()) + { + bool first=true; + for(typename Mesh::Vertex_index vi: sm.vertices()) + { + if(first) + { m_min_z=sm.point(vi).z(); m_max_z=m_min_z; first=false; } + else + { + m_min_z=std::min(m_min_z, sm.point(vi).z()); + m_max_z=std::max(m_max_z, sm.point(vi).z()); + } + } + } + + this->colored_face=[](const Mesh &, typename Mesh::Face_index)->bool { return true; }; + + this->face_color=[m_min_z, m_max_z] + (const Mesh& sm, typename Mesh::Face_index fi)->CGAL::IO::Color + { + double res; + std::size_t n=0; + for(typename Mesh::Vertex_index vi: vertices_around_face(sm.halfedge(fi), sm)) + { + res+=sm.point(vi).z(); + ++n; + } + // Random color depending on the "height" of the facet + CGAL::Random random(30*((res/n)-m_min_z)/(m_max_z-m_min_z)); + return CGAL::get_random_color(random); + }; + } +}; + +int main(int argc, char* argv[]) +{ + const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); + + Mesh sm; + if(!CGAL::IO::read_polygon_mesh(filename, sm)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + + CGAL::draw(sm, Colored_faces_given_height(sm)); + + return EXIT_SUCCESS; +} From f39254f738fb7c043540ae56866d944cfcb1ca78 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 28 Apr 2023 19:09:57 +0200 Subject: [PATCH 145/341] doc --- .../doc/Basic_viewer/Basic_viewer.txt | 48 ++++++++++++------- .../doc/Basic_viewer/PackageDescription.txt | 6 +++ Basic_viewer/doc/Basic_viewer/examples.txt | 3 ++ .../CGAL/draw_linear_cell_complex.h | 12 ++++- .../PackageDescription.txt | 1 + 5 files changed, 50 insertions(+), 20 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 92729ab1ab63..87f101bafea0 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -3,41 +3,53 @@ namespace CGAL { \mainpage User Manual \anchor Chapter_Basic_viewer -\anchor -\cgalAutoToc +\anchor ChapterBasicViewer + \author Guillaume Damiand, Mostafa Ashraf +\cgalAutoToc -Two main use: +\section Basic_viewerDoc + +\subsection Basic_viewerDoc_1 Direct Draw -1) draw draw(XXX) -2) through graphic storage +\subsection Basic_viewerDoc_2 Customize the drawing + +Drawing_functor + +\subsection Basic_viewerDoc_3 Graphic storage + +\subsection Basic_viewerDoc_4 Basic viewer Qt + +\subsection Basic_viewerDoc_5 Application and basic viewer + + +\section Basic_viewerExamples Examples + +\subsection Basic_viewerExamples_simple_draw Basic draw + +\cgalExample{Linear_cell_complex/draw_linear_cell_complex.cpp} -Graohic_storage gs; -add_in_graphic_storage(XXX, gs); -draw_graphic_storage(gs); -3) basic interactions +\subsection Basic_viewerExamples_custom_color Change Face Colors -introduce qapplication and basic viewer class +\cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} -4) advanced interactions -introduce basic viewer class +\subsection Basic_viewerExamples_two_ds Draw two different CGAL data-structures in a same viewer -5) examples +\cgalExample{Basic_viewer/draw_mesh_and_points.cpp} -5.1) simple draw -5.2) draw with drawing functor +\subsection Basic_viewerExamples_interact Interaction with the viewer -5.3) draw 2 different DS in a same viewer +\cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -5.4) interaction with qapplication and basic viewer -5.5) mix different basic viewer in a same window (code laurent ?) +\subsection Basic_viewerExamples_several_window Draw several basic viewers +\cgalExample{Basic_viewer/draw_several_windows.cpp} */ diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 019d185aa849..1ad624dc5250 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -26,5 +26,11 @@ - `CGAL::Drawing_functor_with_volume` - `CGAL::Graphic_storage` +\cgalCRPSubsection{Draw functions} +- \link PkgDrawLinearCellComplex CGAL::draw() \endlink + +\cgalCRPSubsection{Fill graphic storage functions} +- \link PkgDrawLinearCellComplex CGAL::CGAL::add_in_graphic_storage() \endlink + */ diff --git a/Basic_viewer/doc/Basic_viewer/examples.txt b/Basic_viewer/doc/Basic_viewer/examples.txt index 9a6d5e6a3be7..1deef74b4f8f 100644 --- a/Basic_viewer/doc/Basic_viewer/examples.txt +++ b/Basic_viewer/doc/Basic_viewer/examples.txt @@ -1,4 +1,7 @@ /*! +\example Linear_cell_complex/draw_linear_cell_complex.cpp \example Basic_viewer/draw_mesh_and_points.cpp +\example Basic_viewer/draw_several_windows.cpp +\example Basic_viewer/draw_surface_mesh_height.cpp \example Basic_viewer/draw_surface_mesh_small_faces.cpp */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 0e0d2f392b58..400697b9e9d9 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -9,8 +9,16 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 \param alcc the linear cell complex to draw. */ -template -void draw(const LCC& alcc); + template + void draw(const LCC& alcc, const DrawingFunctor& afunctor); + +/*! +\ingroup PkgDrawLinearCellComplex + +*/ + template + void add_in_graphic_storage(const LCC& alcc, CGAL::Graphic_storage& graphic_buffer, + const DrawingFunctor& afunctor); } /* namespace CGAL */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt index 42da9fd92769..02d4553862e8 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt @@ -76,6 +76,7 @@ \cgalCRPSubsection{Draw a Linear Cell Complex} - \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- \link PkgDrawLinearCellComplex CGAL::add_in_graphic_storage() \endlink */ From 45e2d49fa5390032042fff116ad561f466244172 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 12:11:06 +0200 Subject: [PATCH 146/341] doc --- Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index 2f0b5901cc67..0d87d6639240 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -10,8 +10,8 @@ The class `Graphic_storage` store points, segments and triangles. Elements can b */ template -class Graphic_storage -{ +class Graphic_storage { +public: /// Add the given point in this storage. template void add_point(const KPoint &p); From 03d7c1079badbeb56d150c09cf398df2c3b9e3a0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 12:29:35 +0200 Subject: [PATCH 147/341] doc --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 40 ++++++++++--------- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 4 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 31c31e69561b..a3241cba361e 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -19,32 +19,33 @@ template struct Drawing_functor { - /// std::function that returns true if the given vertex must be drawn, false otherwise. - /// Returns true by default. +public: + /// std::function that returns `true` if the given vertex must be drawn, `false` otherwise. + /// Returns `true` by default. std::function draw_vertex; - /// std::function that returns true if the given edge must be drawn, false otherwise. - /// Returns true by default. + /// std::function that returns `true` if the given edge must be drawn, `false` otherwise. + /// Returns `true` by default. std::function draw_edge; - /// std::function that returns true if the given face must be drawn, false otherwise. - /// Returns true by default. + /// std::function that returns `true` if the given face must be drawn, `false` otherwise. + /// Returns `true` by default. std::function draw_face; - /// std::function that returns true if the given vertex is colored, false otherwise. - /// Returns false by default. + /// std::function that returns `true` if the given vertex is colored, `false` otherwise. + /// Returns `false` by default. std::function colored_vertex; - /// std::function that returns true if the given edge is colored, false otherwise. - /// Returns false by default. + /// std::function that returns `true` if the given edge is colored, `false` otherwise. + /// Returns `false` by default. std::function colored_edge; - /// std::function that returns true if the given face is colored, false otherwise. - /// Returns false by default. + /// std::function that returns `true` if the given face is colored, `false` otherwise. + /// Returns `false` by default. std::function colored_face; - /// std::function that returns true if the given face is drawn in wireframe, false otherwise. - /// Returns false by default. + /// std::function that returns `true` if the given face is drawn in wireframe, `false` otherwise. + /// Returns `false` by default. std::function face_wireframe; /// std::function that returns the color of the given vertex. @@ -102,16 +103,17 @@ template { - /// std::function that returns true if the given volume must be drawn, false otherwise. - /// Returns true by default. +public: + /// std::function that returns `true` if the given volume must be drawn, `false` otherwise. + /// Returns `true` by default. std::function draw_volume; /// std::function that returns the color of the given volume. - /// Returns false by default. + /// Returns `false` by default. std::function colored_volume; - /// std::function that returns true if the given volume is drawn in wireframe, false otherwise. - /// Returns false by default. + /// std::function that returns `true` if the given volume is drawn in wireframe, `false` otherwise. + /// Returns `false` by default. std::function volume_wireframe; /// std::function that returns the color of the given volume. diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index 0d87d6639240..6b59045bda1a 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -53,7 +53,7 @@ class Graphic_storage { /// start a new colored face. void face_begin(const CGAL::IO::Color &acolor); - /// @return true iff a face is started. + /// @return `true` iff a face is started. bool is_a_face_started() const; /// add the given point in the current face. @@ -66,7 +66,7 @@ class Graphic_storage { /// end the current face. void face_end(); - /// @return true iff the storage has no element. + /// @return `true` iff the storage has no element. bool is_empty() const; /// clear the storage, i.e. remove all points, segments, triangles and text. From 7da9812bda90a55c55f833462bd86cd32c7755b2 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 15:18:34 +0200 Subject: [PATCH 148/341] Rename graphic_buffer into graphic_storage. --- BGL/include/CGAL/draw_face_graph.h | 24 +-- .../include/CGAL/Qt/Basic_viewer_qt.h | 140 +++++++++--------- .../include/CGAL/draw_linear_cell_complex.h | 40 ++--- Nef_3/include/CGAL/draw_nef_3.h | 42 +++--- .../CGAL/draw_periodic_2_triangulation_2.h | 56 +++---- Point_set_3/include/CGAL/draw_point_set_3.h | 14 +- Polygon/include/CGAL/draw_polygon_2.h | 26 ++-- .../include/CGAL/draw_polygon_with_holes_2.h | 38 ++--- Polyhedron/include/CGAL/draw_polyhedron.h | 8 +- .../include/CGAL/draw_straight_skeleton_2.h | 38 ++--- Surface_mesh/include/CGAL/draw_surface_mesh.h | 8 +- .../include/CGAL/draw_face_graph_with_paths.h | 58 ++++---- .../include/CGAL/draw_triangulation_2.h | 42 +++--- .../include/CGAL/draw_triangulation_3.h | 42 +++--- .../include/CGAL/draw_voronoi_diagram_2.h | 74 ++++----- 15 files changed, 326 insertions(+), 324 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 9c28c5c4c090..fd370e25c47b 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -26,7 +26,7 @@ namespace draw_function_for_FG { template void compute_elements(const FG &fg, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &m_drawing_functor) { using Point=typename boost::property_map_value::type; @@ -66,17 +66,17 @@ void compute_elements(const FG &fg, !m_drawing_functor.face_wireframe(fg, fh) && // face is not wireframe m_drawing_functor.colored_face(fg, fh)) // and face is colored { - graphic_buffer.face_begin(m_drawing_functor.face_color(fg, fh)); + graphic_storage.face_begin(m_drawing_functor.face_color(fg, fh)); auto hd = halfedge(fh, fg); const auto first_hd = hd; do { auto v = source(hd, fg); - graphic_buffer.add_point_in_face(get(point_pmap, v), get(vnormals, v)); + graphic_storage.add_point_in_face(get(point_pmap, v), get(vnormals, v)); hd = next(hd, fg); } while (hd != first_hd); - graphic_buffer.face_end(); + graphic_storage.face_end(); } } } @@ -87,13 +87,13 @@ void compute_elements(const FG &fg, { if(m_drawing_functor.colored_edge(fg, e)) // edge is colored { - graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + graphic_storage.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), m_drawing_functor.edge_color(fg, e)); } else { - graphic_buffer.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + graphic_storage.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg))); } } @@ -105,12 +105,12 @@ void compute_elements(const FG &fg, { if(m_drawing_functor.colored_vertex(fg, v)) // vertex is colored { - graphic_buffer.add_point(get(point_pmap, v), + graphic_storage.add_point(get(point_pmap, v), m_drawing_functor.vertex_color(fg, v)); } else { - graphic_buffer.add_point(get(point_pmap, v)); + graphic_storage.add_point(get(point_pmap, v)); } } } @@ -120,15 +120,15 @@ void compute_elements(const FG &fg, template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &drawing_functor) { - draw_function_for_FG::compute_elements(fg, graphic_buffer, drawing_functor); + draw_function_for_FG::compute_elements(fg, graphic_storage, drawing_functor); } template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_buffer) + CGAL::Graphic_storage &graphic_storage) { Drawing_functor::vertex_descriptor, @@ -151,7 +151,7 @@ void add_in_graphic_storage_for_fg(const FG &fg, return get_random_color(CGAL::get_default_random()); }; - add_in_graphic_storage_for_fg(fg, graphic_buffer, drawing_functor); + add_in_graphic_storage_for_fg(fg, graphic_storage, drawing_functor); } } // End namespace CGAL diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index 5c77196d8cf0..7ad04ad25e8f 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -58,8 +58,7 @@ #define CGAL_BASIC_VIEWER_INIT_SIZE_X 500 #define CGAL_BASIC_VIEWER_INIT_SIZE_Y 450 -namespace CGAL -{ +namespace CGAL { //------------------------------------------------------------------------------ template @@ -69,7 +68,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - using GB=Graphic_storage; + using GS=Graphic_storage; // Constructor/Destructor Basic_viewer_qt(QWidget* parent, @@ -240,9 +239,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer void clear() { - for (unsigned int i=0; i& get_graphic_buffer() + Graphic_storage& get_graphic_storage() + { return gBuffer; } + const Graphic_storage& get_graphic_storage() const { return gBuffer; } virtual void redraw() @@ -394,6 +395,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer gBuffer.negate_all_normals(); } + // Returns true if the data structure lies on a plane + bool is_two_dimensional() const + { + return (!is_empty() && !m_no_2D_mode && + (has_zero_x() || has_zero_y() || has_zero_z())); + } + protected: void compile_shaders() { @@ -525,8 +533,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer unsigned int bufn = 0; CGAL_assertion(bufn(gBuffer.number_of_elements(GB::POS_MONO_POINTS))); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_POINTS))); vao[VAO_MONO_POINTS].release(); vao[VAO_COLORED_POINTS].bind(); @@ -975,7 +977,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("clipPlane", clipPlane); rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_POINTS))); + glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_POINTS))); vao[VAO_COLORED_POINTS].release(); }; @@ -1014,7 +1016,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_SEGMENTS))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_SEGMENTS))); vao[VAO_MONO_SEGMENTS].release(); vao[VAO_COLORED_SEGMENTS].bind(); @@ -1034,7 +1036,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.setUniformValue("pointPlane", plane_point); rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_SEGMENTS))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_SEGMENTS))); vao[VAO_COLORED_SEGMENTS].release(); }; @@ -1066,7 +1068,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_rays_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_RAYS))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_RAYS))); vao[VAO_MONO_RAYS].release(); vao[VAO_COLORED_RAYS].bind(); @@ -1083,7 +1085,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_RAYS))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_RAYS))); vao[VAO_COLORED_RAYS].release(); rendering_program_p_l.release(); @@ -1099,7 +1101,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (double)m_lines_mono_color.blue()/(double)255); rendering_program_p_l.setAttributeValue("color",color); glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_LINES))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_LINES))); vao[VAO_MONO_LINES].release(); rendering_program_p_l.release(); @@ -1118,7 +1120,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_p_l.enableAttributeArray("color"); } glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_LINES))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_LINES))); vao[VAO_COLORED_LINES].release(); rendering_program_p_l.release(); @@ -1152,7 +1154,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GB::POS_MONO_FACES))); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_FACES))); vao[VAO_MONO_FACES].release(); vao[VAO_COLORED_FACES].bind(); @@ -1172,7 +1174,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); rendering_program_face.setUniformValue("clipPlane", clipPlane); rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GB::POS_COLORED_FACES))); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_FACES))); vao[VAO_COLORED_FACES].release(); }; @@ -1183,7 +1185,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.bind(); vao[VAO_CLIPPING_PLANE].bind(); glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GB::POS_CLIPPING_PLANE))); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_CLIPPING_PLANE))); glLineWidth(1.0f); vao[VAO_CLIPPING_PLANE].release(); rendering_program_clipping_plane.release(); @@ -1311,7 +1313,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer (bounding_box().zmax() - bounding_box().zmin())); const unsigned int nbSubdivisions=30; - auto& array = gBuffer.get_array_of_index(GB::POS_CLIPPING_PLANE); + auto& array = gBuffer.get_array_of_index(GS::POS_CLIPPING_PLANE); array.clear(); for (unsigned int i=0; i<=nbSubdivisions; ++i) { @@ -1590,7 +1592,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer return text; } public: - std::function *)> on_key_pressed; + std::function *)> on_key_pressed; protected: Graphic_storage& gBuffer; @@ -1634,8 +1636,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer // CGAL::qglviewer::LocalConstraint constraint; CGAL::qglviewer::WorldConstraint constraint; - static const unsigned int NB_VBO_BUFFERS=(GB::END_POS-GB::BEGIN_POS)+ - (GB::END_COLOR-GB::BEGIN_COLOR)+2; // +2 for 2 vectors of normals + static const unsigned int NB_VBO_BUFFERS=(GS::END_POS-GS::BEGIN_POS)+ + (GS::END_COLOR-GS::BEGIN_COLOR)+2; // +2 for 2 vectors of normals QGLBuffer buffers[NB_VBO_BUFFERS]; @@ -1667,7 +1669,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_graphic_storage(Graphic_storage& graphic_buffer, +void draw_graphic_storage(Graphic_storage& graphic_storage, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1684,7 +1686,7 @@ void draw_graphic_storage(Graphic_storage& graphic_buffer, const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); Basic_viewer_qt basic_viewer(app.activeWindow(), - graphic_buffer, title); + graphic_storage, title); basic_viewer.show(); app.exec(); diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 01cfb7fd5ffd..1334cf8e7537 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -61,7 +61,7 @@ template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctorLCC& drawing_functor) { if (!drawing_functor.are_faces_enabled() || @@ -80,32 +80,32 @@ void compute_face(const LCC& lcc, if (drawing_functor.colored_volume(lcc, voldh)) { - graphic_buffer.face_begin(drawing_functor.volume_color(lcc, voldh)); + graphic_storage.face_begin(drawing_functor.volume_color(lcc, voldh)); } else if (drawing_functor.colored_face(lcc, dh)) { - graphic_buffer.face_begin(drawing_functor.face_color(lcc, dh)); + graphic_storage.face_begin(drawing_functor.face_color(lcc, dh)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } cur=dh; do { - graphic_buffer.add_point_in_face + graphic_storage.add_point_in_face (lcc.point(cur), LCC_geom_utils::get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } while (cur!=dh); - graphic_buffer.face_end(); + graphic_storage.face_end(); } template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_edges_enabled() || @@ -118,18 +118,18 @@ void compute_edge(const LCC& lcc, { if (drawing_functor.colored_edge(lcc, dh)) { - graphic_buffer.add_segment(p1, lcc.point(d2), + graphic_storage.add_segment(p1, lcc.point(d2), drawing_functor.edge_color(lcc, dh)); } else - { graphic_buffer.add_segment(p1, lcc.point(d2)); } + { graphic_storage.add_segment(p1, lcc.point(d2)); } } } template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctorLCC& drawing_functor) { if (!drawing_functor.are_vertices_enabled() || @@ -138,16 +138,16 @@ void compute_vertex(const LCC& lcc, if (drawing_functor.colored_vertex(lcc, dh)) { - graphic_buffer.add_point(lcc.point(dh), + graphic_storage.add_point(lcc.point(dh), drawing_functor.vertex_color(lcc, dh)); } else - { graphic_buffer.add_point(lcc.point(dh)); } + { graphic_storage.add_point(lcc.point(dh)); } } template void compute_elements(const LCC& lcc, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { typename LCC::size_type markvolumes = lcc.get_new_mark(); @@ -178,7 +178,7 @@ void compute_elements(const LCC& lcc, (!lcc.template is_free<3>(itv) && !drawing_functor.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && !drawing_functor.face_wireframe(lcc, itv)) - { compute_face(lcc, itv, it, graphic_buffer, drawing_functor); } + { compute_face(lcc, itv, it, graphic_storage, drawing_functor); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator itf=lcc.template darts_of_cell_basic<2>(itv, markfaces).begin(), itfend=lcc.template darts_of_cell_basic<2>(itv, markfaces).end(); @@ -188,7 +188,7 @@ void compute_elements(const LCC& lcc, if (!lcc.is_marked(itf, markedges) && drawing_functor.draw_edge(lcc, itf)) { - compute_edge(lcc, itf, graphic_buffer, drawing_functor); + compute_edge(lcc, itf, graphic_storage, drawing_functor); for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator ite=lcc.template darts_of_cell_basic<1>(itf, markedges).begin(), iteend=lcc.template darts_of_cell_basic<1>(itf, markedges).end(); @@ -198,7 +198,7 @@ void compute_elements(const LCC& lcc, if (!lcc.is_marked(ite, markvertices) && drawing_functor.draw_vertex(lcc, ite)) { - compute_vertex(lcc, ite, graphic_buffer, drawing_functor); + compute_vertex(lcc, ite, graphic_storage, drawing_functor); CGAL::mark_cell(lcc, ite, markvertices); } } @@ -240,11 +240,11 @@ template void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { draw_function_for_lcc::compute_elements(static_cast(alcc), - graphic_buffer, drawing_functor); + graphic_storage, drawing_functor); } // add_in_graphic_storage: to add a LCC in the given graphic buffer, without a @@ -254,7 +254,7 @@ template class Map, class Refs, class Storage_, typename BufferType=float> void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { CGAL::Drawing_functor_with_volume& _graphic_buffer, + CGAL::Graphic_storage& _graphic_storage, const DrawingFunctor&_drawing_functor) : n_faces(0), n_edges(0), nef(_nef), - graphic_buffer(_graphic_buffer), + graphic_storage(_graphic_storage), drawing_functor(_drawing_functor) {} @@ -110,10 +110,10 @@ class Nef_Visitor { { return; } if(drawing_functor.colored_vertex(nef, vh)) - { graphic_buffer.add_point(vh->point(), + { graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(nef, vh)); } else - { graphic_buffer.add_point(vh->point()); } + { graphic_storage.add_point(vh->point()); } } void visit(Halffacet_const_handle opposite_facet) @@ -135,9 +135,9 @@ class Nef_Visitor { { return; } //return if not-shalfedge if(drawing_functor.colored_face(nef, f)) - { graphic_buffer.face_begin(drawing_functor.face_color(nef, f)); } + { graphic_storage.face_begin(drawing_functor.face_color(nef, f)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } SHalfedge_around_facet_const_circulator hc_start(se); SHalfedge_around_facet_const_circulator hc_end(hc_start); @@ -146,7 +146,7 @@ class Nef_Visitor { { Vertex_const_handle vh=hc_start->source()->center_vertex(); lastvh=vh; - graphic_buffer.add_point_in_face(vh->point(), + graphic_storage.add_point_in_face(vh->point(), get_vertex_normal(vh)); } @@ -160,18 +160,18 @@ class Nef_Visitor { CGAL_For_all(hc_start, hc_end) { Vertex_const_handle vh=hc_start->source()->center_vertex(); - graphic_buffer.add_point_in_face(vh->point(), + graphic_storage.add_point_in_face(vh->point(), get_vertex_normal(vh)); } - graphic_buffer.add_point_in_face(hc_start->source()->center_vertex()->point(), + graphic_storage.add_point_in_face(hc_start->source()->center_vertex()->point(), get_vertex_normal (hc_start->source()->center_vertex())); - graphic_buffer.add_point_in_face(lastvh->point(), + graphic_storage.add_point_in_face(lastvh->point(), get_vertex_normal(lastvh)); ++fc; } - graphic_buffer.face_end(); + graphic_storage.face_end(); facets_done[f]=true; ++n_faces; } @@ -188,10 +188,10 @@ class Nef_Visitor { { return; } // Edge already added if(drawing_functor.colored_edge(nef, he)) - { graphic_buffer.add_segment(he->source()->point(), he->target()->point(), + { graphic_storage.add_segment(he->source()->point(), he->target()->point(), drawing_functor.edge_color(nef, he)); } else - { graphic_buffer.add_segment(he->source()->point(), he->target()->point()); } + { graphic_storage.add_segment(he->source()->point(), he->target()->point()); } edges_done[he]=true; ++n_edges; } @@ -204,14 +204,14 @@ class Nef_Visitor { protected: std::unordered_map facets_done; std::unordered_map edges_done; - CGAL::Graphic_storage& graphic_buffer; + CGAL::Graphic_storage& graphic_storage; const DrawingFunctor& drawing_functor; const Nef_Polyhedron& nef; }; template void compute_elements(const Nef_Polyhedron &nef, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &drawing_functor) { @@ -221,7 +221,7 @@ void compute_elements(const Nef_Polyhedron &nef, Volume_const_iterator c; Nef_Visitor - V(nef, graphic_buffer, drawing_functor); + V(nef, graphic_storage, drawing_functor); CGAL_forall_volumes(c, nef) { Shell_entry_const_iterator it; @@ -229,7 +229,7 @@ void compute_elements(const Nef_Polyhedron &nef, { nef.visit_shell_objects(SFace_const_handle(it), V); } } - graphic_buffer.negate_all_normals(); + graphic_storage.negate_all_normals(); } } // namespace draw_function_for_nef_polyhedron @@ -240,18 +240,18 @@ void compute_elements(const Nef_Polyhedron &nef, template void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &drawing_functor) { draw_function_for_nef_polyhedron::compute_elements(anef, - graphic_buffer, + graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_storage &graphic_buffer) + CGAL::Graphic_storage &graphic_storage) { // Default functor; user can add his own functor. Drawing_functor void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { // Construct the point in 9-sheeted covering space and add to viewer @@ -77,16 +77,16 @@ void compute_vertex(const P2T2 &p2t2, { return; } if(drawing_functor.colored_vertex(p2t2, pi)) - { graphic_buffer.add_point(p2t2.point(*pi), + { graphic_storage.add_point(p2t2.point(*pi), drawing_functor.vertex_color(p2t2, pi)); } else - { graphic_buffer.add_point(p2t2.point(*pi)); } + { graphic_storage.add_point(p2t2.point(*pi)); } } template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_edge(p2t2, si)) @@ -95,16 +95,16 @@ void compute_edge(const P2T2 &p2t2, // Construct the segment in 9-sheeted covering space and add to viewer typename P2T2::Segment s(p2t2.segment(*si)); if(drawing_functor.colored_edge(p2t2, si)) - { graphic_buffer.add_segment(s[0], s[1], + { graphic_storage.add_segment(s[0], s[1], drawing_functor.edge_color(p2t2, si)); } else - { graphic_buffer.add_segment(s[0], s[1]); } + { graphic_storage.add_segment(s[0], s[1]); } } template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_face(p2t2, ti)) @@ -114,19 +114,19 @@ void compute_face(const P2T2 &p2t2, typename P2T2::Triangle t(p2t2.triangle(*ti)); if(drawing_functor.colored_face(p2t2, ti)) - { graphic_buffer.face_begin(drawing_functor.face_color(p2t2, ti)); } + { graphic_storage.face_begin(drawing_functor.face_color(p2t2, ti)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } - graphic_buffer.add_point_in_face(t[0]); - graphic_buffer.add_point_in_face(t[1]); - graphic_buffer.add_point_in_face(t[2]); - graphic_buffer.face_end(); + graphic_storage.add_point_in_face(t[0]); + graphic_storage.add_point_in_face(t[1]); + graphic_storage.add_point_in_face(t[2]); + graphic_storage.face_end(); } template void compute_domain(const P2T2& p2t2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -145,17 +145,17 @@ void compute_domain(const P2T2& p2t2, Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); Kernel::Point_2 p4((orig_domain.max)()); - graphic_buffer.add_segment(p1 + shift, p2 + shift, drawing_functor.domain_color); - graphic_buffer.add_segment(p1 + shift, p3 + shift, drawing_functor.domain_color); - graphic_buffer.add_segment(p2 + shift, p4 + shift, drawing_functor.domain_color); - graphic_buffer.add_segment(p3 + shift, p4 + shift, drawing_functor.domain_color); + graphic_storage.add_segment(p1 + shift, p2 + shift, drawing_functor.domain_color); + graphic_storage.add_segment(p1 + shift, p3 + shift, drawing_functor.domain_color); + graphic_storage.add_segment(p2 + shift, p4 + shift, drawing_functor.domain_color); + graphic_storage.add_segment(p3 + shift, p4 + shift, drawing_functor.domain_color); } } } template void compute_elements(const P2T2& p2t2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { // Get the display type, iterate through periodic elements according @@ -168,27 +168,27 @@ void compute_elements(const P2T2& p2t2, { for (typename P2T2::Periodic_point_iterator it=p2t2.periodic_points_begin(it_type); it!=p2t2.periodic_points_end(it_type); ++it) - { compute_vertex(p2t2, it, graphic_buffer, drawing_functor); } + { compute_vertex(p2t2, it, graphic_storage, drawing_functor); } } if(drawing_functor.are_edges_enabled()) { for (typename P2T2::Periodic_segment_iterator it=p2t2.periodic_segments_begin(it_type); it!=p2t2.periodic_segments_end(it_type); ++it) - { compute_edge(p2t2, it, graphic_buffer, drawing_functor); } + { compute_edge(p2t2, it, graphic_storage, drawing_functor); } } if (drawing_functor.are_faces_enabled()) { for (typename P2T2::Periodic_triangle_iterator it=p2t2.periodic_triangles_begin(it_type); it!=p2t2.periodic_triangles_end(it_type); ++it) - { compute_face(p2t2, it, graphic_buffer, drawing_functor); } + { compute_face(p2t2, it, graphic_storage, drawing_functor); } } if(drawing_functor.get_draw_domain()) { // Compute the (9-sheet covering space) domain of the periodic triangulation - compute_domain(p2t2, graphic_buffer, drawing_functor); + compute_domain(p2t2, graphic_storage, drawing_functor); } } @@ -198,15 +198,15 @@ void compute_elements(const P2T2& p2t2, template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { - draw_function_for_P2T2::compute_elements(p2t2, graphic_buffer, drawing_functor); + draw_function_for_P2T2::compute_elements(p2t2, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { CGAL::Drawing_functor_periodic_2_triangulation_2 drawing_functor; - add_in_graphic_storage(p2t2, graphic_buffer, drawing_functor); + add_in_graphic_storage(p2t2, graphic_storage, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -260,7 +260,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, "Unique cover")))); basic_viewer->clear(); draw_function_for_P2T2::compute_elements(ap2t2, - basic_viewer->get_graphic_buffer(), + basic_viewer->get_graphic_storage(), drawing_functor); basic_viewer->redraw(); } diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 144417fb1dcf..32685b4b1acb 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -44,7 +44,7 @@ namespace draw_function_for_PointSet { template void compute_elements(const PointSet& pointset, - Graphic_storage& graphic_buffer, + Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_vertices_enabled()) @@ -57,11 +57,11 @@ void compute_elements(const PointSet& pointset, { if (drawing_functor.colored_vertex(pointset, it)) { - graphic_buffer.add_point(pointset.point(*it), + graphic_storage.add_point(pointset.point(*it), drawing_functor.vertex_color(pointset, it)); } else - { graphic_buffer.add_point(pointset.point(*it)); } + { graphic_storage.add_point(pointset.point(*it)); } } } } @@ -70,22 +70,22 @@ void compute_elements(const PointSet& pointset, template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_buffer, + Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { draw_function_for_PointSet::compute_elements(apointset, - graphic_buffer, + graphic_storage, drawing_functor); } template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_buffer) + Graphic_storage& graphic_storage) { CGAL::Drawing_functor, typename Point_set_3::const_iterator, int, int> drawing_functor; - add_in_graphic_storage(apointset, graphic_buffer, drawing_functor); + add_in_graphic_storage(apointset, graphic_storage, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 20897bdb9f86..cad954ab5df4 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -48,7 +48,7 @@ namespace draw_function_for_p2 { template void compute_elements(const P2& p2, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor& drawing_functor) { if (p2.is_empty()) @@ -59,9 +59,9 @@ void compute_elements(const P2& p2, if (drawing_functor.are_faces_enabled()) { if(drawing_functor.colored_face(p2, nullptr)) - { graphic_buffer.face_begin(drawing_functor.face_color(p2, nullptr)); } + { graphic_storage.face_begin(drawing_functor.face_color(p2, nullptr)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } } for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); @@ -71,28 +71,28 @@ void compute_elements(const P2& p2, drawing_functor.draw_vertex(p2, i)) { // Add vertex if(drawing_functor.colored_vertex(p2, i)) - { graphic_buffer.add_point(*i, drawing_functor.vertex_color(p2, i)); } + { graphic_storage.add_point(*i, drawing_functor.vertex_color(p2, i)); } else - { graphic_buffer.add_point(*i); } + { graphic_storage.add_point(*i); } } if(drawing_functor.are_edges_enabled() && drawing_functor.draw_edge(p2, i)) { // Add edge with previous point if(drawing_functor.colored_vertex(p2, i)) - { graphic_buffer.add_segment(prev, *i, drawing_functor.edge_color(p2, i)); } + { graphic_storage.add_segment(prev, *i, drawing_functor.edge_color(p2, i)); } else - { graphic_buffer.add_segment(prev, *i); } + { graphic_storage.add_segment(prev, *i); } } if(drawing_functor.are_faces_enabled()) - { graphic_buffer.add_point_in_face(*i); } // Add point in face + { graphic_storage.add_point_in_face(*i); } // Add point in face prev = *i; } if (drawing_functor.are_faces_enabled()) - { graphic_buffer.face_end(); } + { graphic_storage.face_end(); } } } // namespace draw_function_for_p2 @@ -103,19 +103,19 @@ void compute_elements(const P2& p2, template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawingfunctor) -{ draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); } +{ draw_function_for_p2::compute_elements(ap2, graphic_storage, drawingfunctor); } template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_storage &graphic_buffer) + CGAL::Graphic_storage &graphic_storage) { CGAL::Drawing_functor drawingfunctor; - draw_function_for_p2::compute_elements(ap2, graphic_buffer, drawingfunctor); + draw_function_for_p2::compute_elements(ap2, graphic_storage, drawingfunctor); } // Specialization of draw function. diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index b04fd60ba0a6..5f47eb710cc4 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -49,12 +49,12 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, - Graphic_storage &graphic_buffer, + Graphic_storage &graphic_storage, bool hole, const DrawingFunctor& drawing_functor) { if (hole && drawing_functor.are_faces_enabled()) - { graphic_buffer.add_point_in_face(aloop.vertex(aloop.size()-1)); } + { graphic_storage.add_point_in_face(aloop.vertex(aloop.size()-1)); } typename P2::General_polygon_2::Vertex_const_iterator prev; for(typename P2::General_polygon_2::Vertex_const_iterator i=aloop.vertices_begin(); @@ -64,9 +64,9 @@ void compute_one_loop_elements(const P2& ap2, drawing_functor.draw_vertex(ap2, i)) { // Add vertex if(drawing_functor.colored_vertex(ap2, i)) - { graphic_buffer.add_point(*i, drawing_functor.vertex_color(ap2, i)); } + { graphic_storage.add_point(*i, drawing_functor.vertex_color(ap2, i)); } else - { graphic_buffer.add_point(*i); } + { graphic_storage.add_point(*i); } } if(i!=aloop.vertices_begin() && @@ -74,13 +74,13 @@ void compute_one_loop_elements(const P2& ap2, drawing_functor.draw_edge(ap2, i)) { // Add segment with previous point if(drawing_functor.colored_vertex(ap2, i)) - { graphic_buffer.add_segment(*prev, *i, drawing_functor.edge_color(ap2, i)); } + { graphic_storage.add_segment(*prev, *i, drawing_functor.edge_color(ap2, i)); } else - { graphic_buffer.add_segment(*prev, *i); } + { graphic_storage.add_segment(*prev, *i); } } if(drawing_functor.are_faces_enabled()) - { graphic_buffer.add_point_in_face(*i); } // Add point in face + { graphic_storage.add_point_in_face(*i); } // Add point in face prev=i; } @@ -88,11 +88,11 @@ void compute_one_loop_elements(const P2& ap2, // Add the last segment between the last point and the first one if(drawing_functor.are_edges_enabled() && drawing_functor.draw_edge(ap2, aloop.vertices_begin())) - { graphic_buffer.add_segment(*prev, *(aloop.vertices_begin())); } + { graphic_storage.add_segment(*prev, *(aloop.vertices_begin())); } } template -void compute_elements(const P2& p2, Graphic_storage &graphic_buffer, +void compute_elements(const P2& p2, Graphic_storage &graphic_storage, const DrawingFunctor& drawing_functor) { if (p2.outer_boundary().is_empty()) return; @@ -100,26 +100,26 @@ void compute_elements(const P2& p2, Graphic_storage &graphic_buffer, if (drawing_functor.are_faces_enabled()) { if(drawing_functor.colored_face(p2, nullptr)) - { graphic_buffer.face_begin(drawing_functor.face_color(p2, nullptr)); } + { graphic_storage.face_begin(drawing_functor.face_color(p2, nullptr)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } } - compute_one_loop_elements(p2, p2.outer_boundary(), graphic_buffer, + compute_one_loop_elements(p2, p2.outer_boundary(), graphic_storage, false, drawing_functor); for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { - compute_one_loop_elements(p2, *it, graphic_buffer, + compute_one_loop_elements(p2, *it, graphic_storage, true, drawing_functor); if (drawing_functor.are_faces_enabled()) - { graphic_buffer.add_point_in_face(p2.outer_boundary().vertex + { graphic_storage.add_point_in_face(p2.outer_boundary().vertex (p2.outer_boundary().size()-1)); } } if (drawing_functor.are_faces_enabled()) - { graphic_buffer.face_end(); } + { graphic_storage.face_end(); } } } // draw_function_for_ph2 @@ -128,23 +128,23 @@ void compute_elements(const P2& p2, Graphic_storage &graphic_buffer, template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor &drawing_functor) { - draw_function_for_ph2_with_holes::compute_elements(p2, graphic_buffer, + draw_function_for_ph2_with_holes::compute_elements(p2, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { Drawing_functor drawing_functor; - add_in_graphic_storage(p2, graphic_buffer, drawing_functor); + add_in_graphic_storage(p2, graphic_storage, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 8e7b1788afeb..5157e5d0fa6b 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -35,9 +35,9 @@ template void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &drawing_functor) -{ add_in_graphic_storage_for_fg(apoly, graphic_buffer, drawing_functor); } +{ add_in_graphic_storage_for_fg(apoly, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_storage &graphic_buffer) -{ add_in_graphic_storage_for_fg(apoly, graphic_buffer); } + CGAL::Graphic_storage &graphic_storage) +{ add_in_graphic_storage_for_fg(apoly, graphic_storage); } // Specialization of draw function: require Qt and the CGAL basic viewer. #ifdef CGAL_USE_BASIC_VIEWER diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 9b4fcddf3926..a68fb77c38c4 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -26,7 +26,7 @@ namespace draw_function_for_ss2 { template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_edge(ss2, eh)) @@ -34,13 +34,13 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, if (drawing_functor.colored_edge(ss2, eh)) { - graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + graphic_storage.add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point(), drawing_functor.edge_color(ss2, eh)); } else { - graphic_buffer.add_segment(eh->opposite()->vertex()->point(), + graphic_storage.add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point()); } } @@ -48,7 +48,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { // TODO? a functor different from draw_edge to allow to show only some labels ?? @@ -60,14 +60,14 @@ void print_halfedge_labels(const SS2& ss2, label << "H" << h->opposite()->id() << " (V" << h->opposite()->vertex()->id() << ") "; - graphic_buffer.add_text( + graphic_storage.add_text( CGAL::midpoint(h->opposite()->vertex()->point(), h->vertex()->point()), label.str()); } template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_vertex(ss2, vh)) @@ -75,16 +75,16 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, if (drawing_functor.colored_vertex(ss2, vh)) { - graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(ss2, vh)); + graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(ss2, vh)); } else - { graphic_buffer.add_point(vh->point()); } + { graphic_storage.add_point(vh->point()); } } template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { // TODO? a functor different from draw_vertex to allow to show only some labels ?? @@ -93,12 +93,12 @@ void print_vertex_label(const SS2& ss2, std::stringstream label; label << "V" << vh->id() << std::ends; - graphic_buffer.add_text(vh->point(), label.str()); + graphic_storage.add_text(vh->point(), label.str()); } template void compute_elements(const SS2& ss2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.are_edges_enabled()) @@ -108,8 +108,8 @@ void compute_elements(const SS2& ss2, { if (it->id()opposite()->id()) { - compute_edge(ss2, it, graphic_buffer, drawing_functor); - print_halfedge_labels(ss2, it, graphic_buffer, drawing_functor); + compute_edge(ss2, it, graphic_storage, drawing_functor); + print_halfedge_labels(ss2, it, graphic_storage, drawing_functor); } } } @@ -119,8 +119,8 @@ void compute_elements(const SS2& ss2, for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); it!=ss2.vertices_end(); ++it) { - compute_vertex(ss2, it, graphic_buffer, drawing_functor); - print_vertex_label(ss2, it, graphic_buffer, drawing_functor); + compute_vertex(ss2, it, graphic_storage, drawing_functor); + print_vertex_label(ss2, it, graphic_storage, drawing_functor); } } } @@ -131,16 +131,16 @@ void compute_elements(const SS2& ss2, template void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { - draw_function_for_ss2::compute_elements(ass2, graphic_buffer, + draw_function_for_ss2::compute_elements(ass2, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { Drawing_functor void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &drawing_functor) -{ add_in_graphic_storage_for_fg(amesh, graphic_buffer, drawing_functor); } +{ add_in_graphic_storage_for_fg(amesh, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphic_storage &graphic_buffer) -{ add_in_graphic_storage_for_fg(amesh, graphic_buffer); } + CGAL::Graphic_storage &graphic_storage) +{ add_in_graphic_storage_for_fg(amesh, graphic_storage); } #ifdef CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 8eecc3b4f0b0..9c557b81f6a0 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -145,7 +145,7 @@ template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_face(lcc, dh)) @@ -171,21 +171,21 @@ void compute_face(const Mesh& mesh, while(cur!=dh); if(drawing_functor.colored_face(lcc, dh)) - { graphic_buffer.face_begin(drawing_functor.face_color(lcc, dh)); } + { graphic_storage.face_begin(drawing_functor.face_color(lcc, dh)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } cur=dh; do { - graphic_buffer.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(mesh, cur), + graphic_storage.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(mesh, cur), draw_function_for_lcc::LCC_geom_utils:: get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } while(cur!=dh); - graphic_buffer.face_end(); + graphic_storage.face_end(); } template @@ -193,7 +193,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, DrawingFunctor& drawing_functor, bool draw_marked_darts=true) { @@ -213,9 +213,9 @@ void compute_edge(const Mesh &mesh, { if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) - { graphic_buffer.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } + { graphic_storage.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } else - { graphic_buffer.add_segment(p1, get_point(mesh, d2)); } + { graphic_storage.add_segment(p1, get_point(mesh, d2)); } } } @@ -224,7 +224,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; @@ -235,25 +235,25 @@ void compute_edge(const Mesh &mesh, Point p1=get_point(mesh, dh); Dart_const_descriptor d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) - { graphic_buffer.add_segment(p1, get_point(mesh, d2), color); } + { graphic_storage.add_segment(p1, get_point(mesh, d2), color); } } template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, DrawingFunctor& drawing_functor) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - graphic_buffer.add_point(get_point(mesh, dh)); + graphic_storage.add_point(get_point(mesh, dh)); } template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const std::vector>* m_paths, std::size_t i, typename Get_map::type::size_type amark) @@ -269,12 +269,12 @@ void compute_path(const Mesh &mesh, CGAL::Random random(static_cast(i)); CGAL::IO::Color color = get_random_color(random); - graphic_buffer.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); + graphic_storage.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) { if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) { - compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphic_buffer, lcc); + compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphic_storage, lcc); lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); } } @@ -282,7 +282,7 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor &m_drawing_functor, const std::vector>* m_paths, typename Get_map::type::size_type amark) @@ -311,19 +311,19 @@ void compute_elements(const Mesh &mesh, if (m_current_dart!=lcc.darts().end()) { // We want to draw only one dart Dart_const_descriptor selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); - compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphic_buffer, lcc); + compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphic_storage, lcc); lcc.template mark_cell<1>(selected_dart, markedges); - compute_vertex(selected_dart, mesh, graphic_buffer); + compute_vertex(selected_dart, mesh, graphic_storage); if ( !m_nofaces ) - { compute_face(selected_dart, mesh, graphic_buffer, lcc); } + { compute_face(selected_dart, mesh, graphic_storage, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) { if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphic_buffer, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphic_storage, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } } @@ -333,10 +333,10 @@ void compute_elements(const Mesh &mesh, if (m_current_path==m_paths->size()) { for (std::size_t i=0; isize(); ++i) - { compute_path(i, markedges, mesh, graphic_buffer, m_paths, lcc); } + { compute_path(i, markedges, mesh, graphic_storage, m_paths, lcc); } } else if (m_current_path!=m_paths->size()+1) - { compute_path(m_current_path, markedges, mesh, graphic_buffer, m_paths, lcc); } + { compute_path(m_current_path, markedges, mesh, graphic_storage, m_paths, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) @@ -344,19 +344,19 @@ void compute_elements(const Mesh &mesh, if (!m_nofaces && !lcc.is_marked(it, markfaces) && !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) { - compute_face(it, mesh, graphic_buffer, lcc); + compute_face(it, mesh, graphic_storage, lcc); lcc.template mark_cell<2>(it, markfaces); } if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphic_buffer, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphic_storage, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } if ( !lcc.is_marked(it, markvertices) ) { - compute_vertex(it, mesh, graphic_buffer); + compute_vertex(it, mesh, graphic_storage); lcc.template mark_cell<0>(it, markvertices); } } @@ -371,21 +371,21 @@ void compute_elements(const Mesh &mesh, template void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const std::vector>* paths, const DrawingFunctor& drawing_functor, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) { draw_function_for_face_graph_with_paths::compute_elements(mesh, - graphic_buffer, + graphic_storage, drawing_functor, paths, amark); } template void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const std::vector>* paths, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) @@ -397,7 +397,7 @@ void add_in_graphic_storage(const Mesh& mesh, typename Get_map::type::Dart_const_descriptor /*fh*/> drawing_functor; - add_in_graphic_storage(mesh, graphic_buffer, drawing_functor, paths, amark); + add_in_graphic_storage(mesh, graphic_storage, drawing_functor, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 8d17d21accb0..9a4166eebc67 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -27,27 +27,27 @@ namespace draw_function_for_t2 { template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_face(t2, fh)) { return; } if (drawing_functor.colored_face(t2, fh)) - { graphic_buffer.face_begin(drawing_functor.face_color(t2, fh)); } + { graphic_storage.face_begin(drawing_functor.face_color(t2, fh)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } - graphic_buffer.add_point_in_face(fh->vertex(0)->point()); - graphic_buffer.add_point_in_face(fh->vertex(1)->point()); - graphic_buffer.add_point_in_face(fh->vertex(2)->point()); + graphic_storage.add_point_in_face(fh->vertex(0)->point()); + graphic_storage.add_point_in_face(fh->vertex(1)->point()); + graphic_storage.add_point_in_face(fh->vertex(2)->point()); - graphic_buffer.face_end(); + graphic_storage.face_end(); } template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_edge(t2, eh)) @@ -55,14 +55,14 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, if (drawing_functor.colored_edge(t2, eh)) { - graphic_buffer.add_segment + graphic_storage.add_segment (eh->first->vertex(eh->first->cw(eh->second))->point(), eh->first->vertex(eh->first->ccw(eh->second))->point(), drawing_functor.edge_color(t2, eh)); } else { - graphic_buffer.add_segment + graphic_storage.add_segment (eh->first->vertex(eh->first->cw(eh->second))->point(), eh->first->vertex(eh->first->ccw(eh->second))->point()); } @@ -70,7 +70,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (!drawing_functor.draw_vertex(t2, vh)) @@ -78,38 +78,38 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, if (drawing_functor.colored_vertex(t2, vh)) { - graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(t2, vh)); + graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(t2, vh)); } else { - graphic_buffer.add_point(vh->point()); + graphic_storage.add_point(vh->point()); } } template void compute_elements(const T2& t2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (drawing_functor.are_faces_enabled()) { for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); it!=t2.finite_faces_end(); ++it) - { compute_face(t2, it, graphic_buffer, drawing_functor); } + { compute_face(t2, it, graphic_storage, drawing_functor); } } if (drawing_functor.are_edges_enabled()) { for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); it!=t2.finite_edges_end(); ++it) - { compute_edge(t2, it, graphic_buffer, drawing_functor); } + { compute_edge(t2, it, graphic_storage, drawing_functor); } } if (drawing_functor.are_vertices_enabled()) { for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); it!=t2.finite_vertices_end(); ++it) - { compute_vertex(t2, it, graphic_buffer, drawing_functor); } + { compute_vertex(t2, it, graphic_storage, drawing_functor); } } } @@ -119,15 +119,15 @@ void compute_elements(const T2& t2, template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { - draw_function_for_t2::compute_elements(at2, graphic_buffer, drawing_functor); + draw_function_for_t2::compute_elements(at2, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { CGAL::Graphic_storage buffer; Drawing_functor void compute_face(typename T3::Finite_facets_iterator fh, const DrawingFunctor& drawing_functor, - CGAL::Graphic_storage& graphic_buffer, const T3 *t3) + CGAL::Graphic_storage& graphic_storage, const T3 *t3) { if(!drawing_functor.draw_face(*t3, fh)) { return; } if(drawing_functor.colored_face(*t3, fh)) - { graphic_buffer.face_begin(drawing_functor.face_color(*t3, fh)); } + { graphic_storage.face_begin(drawing_functor.face_color(*t3, fh)); } else - { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(); } - graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 1) % 4)-> + graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 1) % 4)-> point()); - graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 2) % 4)-> + graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 2) % 4)-> point()); - graphic_buffer.add_point_in_face(fh->first->vertex((fh->second + 3) % 4)-> + graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 3) % 4)-> point()); - graphic_buffer.face_end(); + graphic_storage.face_end(); } template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_edge(*t3, eh)) @@ -58,19 +58,19 @@ void compute_edge(typename T3::Finite_edges_iterator eh, if(drawing_functor.colored_edge(*t3, eh)) { - graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), + graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point(), drawing_functor.edge_color(*t3, eh)); } else { - graphic_buffer.add_segment(eh->first->vertex(eh->second)->point(), + graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point()); } } template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor, const T3* t3) { if(!drawing_functor.draw_vertex(*t3, vh)) @@ -78,36 +78,36 @@ void compute_vertex(typename T3::Vertex_handle vh, if(drawing_functor.colored_vertex(*t3, vh)) { - graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(*t3, vh)); + graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(*t3, vh)); } else - { graphic_buffer.add_point(vh->point()); } + { graphic_storage.add_point(vh->point()); } } template void compute_elements(const T3* t3, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if (drawing_functor.are_faces_enabled()) { for (typename T3::Finite_facets_iterator it=t3->finite_facets_begin(); it!=t3->finite_facets_end(); ++it) - { compute_face(it, drawing_functor, graphic_buffer, t3); } + { compute_face(it, drawing_functor, graphic_storage, t3); } } if (drawing_functor.are_edges_enabled()) { for (typename T3::Finite_edges_iterator it=t3->finite_edges_begin(); it!=t3->finite_edges_end(); ++it) - { compute_edge(it, graphic_buffer,drawing_functor, t3); } + { compute_edge(it, graphic_storage,drawing_functor, t3); } } if (drawing_functor.are_vertices_enabled()) { for (typename T3::Finite_vertices_iterator it=t3->finite_vertices_begin(); it!=t3->finite_vertices_end(); ++it) - { compute_vertex(it, graphic_buffer, drawing_functor, t3); } + { compute_vertex(it, graphic_storage, drawing_functor, t3); } } } @@ -118,16 +118,16 @@ void compute_elements(const T3* t3, template void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { - draw_function_for_t3::compute_elements(&at3, graphic_buffer, drawing_functor); + draw_function_for_t3::compute_elements(&at3, graphic_storage, drawing_functor); } template void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { CGAL::Drawing_functor void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if(!drawing_functor.draw_vertex(v2, vh)) { return; } if(drawing_functor.colored_vertex(v2, vh)) - { graphic_buffer.add_point(vh->point(), drawing_functor.vertex_color(v2, vh)); } + { graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(v2, vh)); } else - { graphic_buffer.add_point(vh->point()); } + { graphic_storage.add_point(vh->point()); } } template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphic_storage &graphic_buffer, + CGAL::Graphic_storage &graphic_storage, const DrawingFunctor& drawing_functor) -{ graphic_buffer.add_point(vi->point(), drawing_functor.dual_vertex_color); } +{ graphic_storage.add_point(vi->point(), drawing_functor.dual_vertex_color); } template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -104,12 +104,12 @@ void add_segments_and_update_bounding_box(const V2& v2, { if(drawing_functor.colored_edge(v2, he)) { - graphic_buffer.add_segment(he->source()->point(), he->target()->point(), + graphic_storage.add_segment(he->source()->point(), he->target()->point(), drawing_functor.edge_color(v2, he)); } else { - graphic_buffer.add_segment(he->source()->point(), he->target()->point()); + graphic_storage.add_segment(he->source()->point(), he->target()->point()); } } else @@ -127,10 +127,10 @@ void add_segments_and_update_bounding_box(const V2& v2, end_point = he->source()->point(); // update_bounding_box_for_ray(end_point, direction); - Local_point lp = graphic_buffer.get_local_point(end_point); - Local_vector lv = graphic_buffer.get_local_vector(direction); + Local_point lp = graphic_storage.get_local_point(end_point); + Local_vector lv = graphic_storage.get_local_vector(direction); CGAL::Bbox_3 b = (lp + lv).bbox(); - graphic_buffer.update_bounding_box(b); + graphic_storage.update_bounding_box(b); } } else if (he->is_bisector()) @@ -143,12 +143,12 @@ void add_segments_and_update_bounding_box(const V2& v2, // update_bounding_box_for_line(pointOnLine, direction, // perpendicularDirection); - Local_point lp = graphic_buffer.get_local_point(pointOnLine); - Local_vector lv = graphic_buffer.get_local_vector(direction); - Local_vector lpv = graphic_buffer.get_local_vector(perpendicularDirection); + Local_point lp = graphic_storage.get_local_point(pointOnLine); + Local_vector lv = graphic_storage.get_local_vector(direction); + Local_vector lpv = graphic_storage.get_local_vector(perpendicularDirection); CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - graphic_buffer.update_bounding_box(b); + graphic_storage.update_bounding_box(b); } } } @@ -224,7 +224,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -239,39 +239,39 @@ void compute_rays_and_bisectors(const V2&, { if (he->has_source()) { - // add_ray_segment(he->source()->point(), get_second_point(he, graphic_buffer.get_bounding_box())); - graphic_buffer.add_ray(he->source()->point(), direction, drawing_functor.ray_color); + // add_ray_segment(he->source()->point(), get_second_point(he, graphic_storage.get_bounding_box())); + graphic_storage.add_ray(he->source()->point(), direction, drawing_functor.ray_color); } } else if (he->is_bisector()) { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); - graphic_buffer.add_line(pointOnLine, direction, drawing_functor.bisector_color); + graphic_storage.add_line(pointOnLine, direction, drawing_functor.bisector_color); } } template void compute_face(const V2& v2, typename V2::Face_iterator fh, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& m_drawing_functor) { if(fh->is_unbounded() || !m_drawing_functor.draw_face(v2, fh)) { return; } if(m_drawing_functor.colored_face(v2, fh)) - { graphic_buffer.face_begin(m_drawing_functor.face_color(v2, fh)); } - else { graphic_buffer.face_begin(); } + { graphic_storage.face_begin(m_drawing_functor.face_color(v2, fh)); } + else { graphic_storage.face_begin(); } typename V2::Ccb_halfedge_circulator ec_start=fh->ccb(); typename V2::Ccb_halfedge_circulator ec=ec_start; do { - graphic_buffer.add_point_in_face(ec->source()->point()); + graphic_storage.add_point_in_face(ec->source()->point()); } while (++ec!=ec_start); - graphic_buffer.face_end(); + graphic_storage.face_end(); // Test: for unbounded faces (??) // else { @@ -280,7 +280,7 @@ void compute_face(const V2& v2, // add_point_in_face(ec->source()->point()); // } // else{ - // add_point_in_face(get_second_point(ec->twin(), graphic_buffer.get_bounding_box())); + // add_point_in_face(get_second_point(ec->twin(), graphic_storage.get_bounding_box())); // } // } while(++ec != ec_start); // } @@ -288,7 +288,7 @@ void compute_face(const V2& v2, template void compute_elements(const V2& v2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& drawing_functor) { if(drawing_functor.are_vertices_enabled()) @@ -298,7 +298,7 @@ void compute_elements(const V2& v2, { for (typename V2::Vertex_iterator it=v2.vertices_begin(); it!=v2.vertices_end(); ++it) - { compute_vertex(v2, it, graphic_buffer, drawing_functor); } + { compute_vertex(v2, it, graphic_storage, drawing_functor); } } // Draw the dual vertices @@ -307,7 +307,7 @@ void compute_elements(const V2& v2, for (typename V2::Delaunay_graph::Finite_vertices_iterator it=v2.dual().finite_vertices_begin(); it!=v2.dual().finite_vertices_end(); ++it) - { compute_dual_vertex(v2, it, graphic_buffer, drawing_functor); } + { compute_dual_vertex(v2, it, graphic_storage, drawing_functor); } } } @@ -317,17 +317,17 @@ void compute_elements(const V2& v2, for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) { add_segments_and_update_bounding_box(v2, it, - graphic_buffer, drawing_functor); } + graphic_storage, drawing_functor); } } for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) - { compute_rays_and_bisectors(v2, it, graphic_buffer, drawing_functor); } + { compute_rays_and_bisectors(v2, it, graphic_storage, drawing_functor); } if (drawing_functor.are_faces_enabled()) { for (typename V2::Face_iterator it=v2.faces_begin(); it!=v2.faces_end(); ++it) - { compute_face(v2, it, graphic_buffer, drawing_functor); } + { compute_face(v2, it, graphic_storage, drawing_functor); } } } @@ -338,15 +338,15 @@ void compute_elements(const V2& v2, template void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& m_drawing_functor) { - draw_function_for_v2::compute_elements(v2, graphic_buffer, m_drawing_functor); + draw_function_for_v2::compute_elements(v2, graphic_storage, m_drawing_functor); } template void add_in_graphic_storage(const CGAL_VORONOI_TYPE& v2, - CGAL::Graphic_storage& graphic_buffer) + CGAL::Graphic_storage& graphic_storage) { // Default functor; user can add his own functor. CGAL::Drawing_functor_voronoi drawing_functor; - add_in_graphic_storage(v2, graphic_buffer, drawing_functor); + add_in_graphic_storage(v2, graphic_storage, drawing_functor); } #ifdef CGAL_USE_BASIC_VIEWER @@ -414,7 +414,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphic_buffer(), + basic_viewer->get_graphic_storage(), drawing_functor); basic_viewer->redraw(); } @@ -429,7 +429,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphic_buffer(), + basic_viewer->get_graphic_storage(), drawing_functor); basic_viewer->redraw(); } From 7e99eac60d3f0b1316559c1c4c4453a0a0b23a08 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 15:20:06 +0200 Subject: [PATCH 149/341] Rename graphic_buffer into graphic_storage --- .../doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 400697b9e9d9..aee6357e36ef 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -17,7 +17,7 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 */ template - void add_in_graphic_storage(const LCC& alcc, CGAL::Graphic_storage& graphic_buffer, + void add_in_graphic_storage(const LCC& alcc, CGAL::Graphic_storage& graphic_storage, const DrawingFunctor& afunctor); } /* namespace CGAL */ From 10a87486cf0e38832be8c4237b208112d742ff3c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 16:08:35 +0200 Subject: [PATCH 150/341] Basic viewer doc (cont) --- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 33 ++- .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 252 ++++++++++++++++++ .../doc/Basic_viewer/PackageDescription.txt | 3 + 3 files changed, 270 insertions(+), 18 deletions(-) create mode 100644 Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index 6b59045bda1a..bba0e545a23c 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -4,45 +4,45 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Graphic_storage` store points, segments and triangles. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and are triangulated internally. +The class `Graphic_storage` store points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and are triangulated internally. \tparam BufferType the type used for point coordinates: float by default. -*/ +*/ template class Graphic_storage { public: - /// Add the given point in this storage. + /// add the given point in the storage. template void add_point(const KPoint &p); - /// Add the given colored point in this storage. + /// add the given colored point in the storage. template void add_point(const KPoint &p, const CGAL::IO::Color &acolor); - /// Add the given segment in this storage. + /// add the given segment in the storage. template void add_segment(const KPoint &p1, const KPoint &p2); - /// Add the given colored segment in this storage. + /// add the given colored segment in the storage. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// Add the given ray in the storage: an half line starting from p and having v as direction. + /// add the given ray in the storage: an half line starting from p and having v as direction. template void add_ray(const KPoint &p, const KVector &v); - /// Add the given colored ray in the storage: an half line starting from p and having v as direction. + /// add the given colored ray in the storage: an half line starting from p and having v as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// Add the given line in the storage, defined by p and v as direction. + /// add the given line in the storage, defined by p and v as direction. template void add_line(const KPoint &p, const KVector &v); - /// Add the given colored line in the storage, defined by p and v as direction. + /// add the given colored line in the storage, defined by p and v as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); @@ -66,12 +66,6 @@ class Graphic_storage { /// end the current face. void face_end(); - /// @return `true` iff the storage has no element. - bool is_empty() const; - - /// clear the storage, i.e. remove all points, segments, triangles and text. - void clear(); - /// add the given text at the given position in the storage. template void add_text(const KPoint &kp, const char *txt); @@ -80,8 +74,11 @@ class Graphic_storage { template void add_text(const KPoint &kp, const std::string &txt); - /// clear all the texts. - void m_texts_clear(); + /// @return `true` iff the storage has no element. + bool is_empty() const; + + /// clear the storage, i.e. remove all points, segments, triangles and text. + void clear(); }; } // namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h new file mode 100644 index 000000000000..c97f041b54bd --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -0,0 +1,252 @@ +namespace CGAL { + +//------------------------------------------------------------------------------ +/*! + \ingroup PkgBasicViewerClasses + +The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphic_storage`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + +\tparam BufferType the type used for point coordinates: float by default. + +*/ +template +class Basic_viewer_qt : public CGAL::QGLViewer +{ +public: + /// constructor given a pointer on a QWidget (can be a nullptr) and a Graphic_storage. + /// title will be the title of the window. + Basic_viewer_qt(QWidget* parent, + Graphic_storage& buf, + const char* title=""); + + /// enable or disable the drawing of vertices. + void set_draw_vertices(bool b); + + /// enable or disable the drawing of edges. + void set_draw_edges(bool b); + + /// enable or disable the drawing of rays. + void set_draw_rays(bool b); + + /// enable or disable the drawing of lines. + void set_draw_lines(bool b); + + /// enable or disable the drawing of faces. + void set_draw_faces(bool b); + + /// enable or disable the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). + void set_use_mono_color(bool b); + + /// enable or disable the drawing of texts. + void set_draw_text(bool b); + + /// set the color used for vertices in mono_color mode. + void set_vertices_mono_color(const CGAL::IO::Color& c); + + /// set the color used for edges in mono_color mode. + void set_edges_mono_color(const CGAL::IO::Color& c); + + /// set the color used for rays in mono_color mode. + void set_rays_mono_color(const CGAL::IO::Color& c); + + /// set the color used for lines in mono_color mode. + void set_lines_mono_color(const CGAL::IO::Color& c); + + /// set the color used for faces in mono_color mode. + void set_faces_mono_color(const CGAL::IO::Color& c); + + /// negate the drawing of vertices (becomes `true` if it was `false` and reciprocally). + void negate_draw_vertices(); + + /// negate the drawing of edges (becomes `true` if it was `false` and reciprocally). + void negate_draw_edges(); + + /// negate the drawing of rays (becomes `true` if it was `false` and reciprocally). + void negate_draw_rays(); + + /// negate the drawing of lines (becomes `true` if it was `false` and reciprocally). + void negate_draw_lines(); + + /// negate the drawing of faces (becomes `true` if it was `false` and reciprocally). + void negate_draw_faces(); + + /// negate the use of mono color mode (becomes `true` if it was `false` and reciprocally). + void negate_use_mono_color(); + + /// negate the drawing of text (becomes `true` if it was `false` and reciprocally). + void negate_draw_text(); + + /// @return `true` if vertices are drawn. + bool get_draw_vertices() const; + + /// @return `true` if edges are drawn. + bool get_draw_edges() const; + + /// @return `true` if rays are drawn. + bool get_draw_rays() const; + + /// @return `true` if lines are drawn. + bool get_draw_lines() const; + + /// @return `true` if faces are drawn. + bool get_draw_faces() const; + + /// @return `true` if mono color mode is used. + bool get_use_mono_color() const; + + /// @return `true` if normal are reversed. + bool get_inverse_normal() const; + + /// @return `true` if text are drawn. + bool get_draw_text() const; + + /// @return the mono color used for vertices. + const CGAL::IO::Color& get_vertices_mono_color() const; + + /// @return the mono color used for edges. + const CGAL::IO::Color& get_edges_mono_color() const; + + /// @return the mono color used for rays. + const CGAL::IO::Color& get_rays_mono_color() const; + + /// @return the mono color used for lines. + const CGAL::IO::Color& get_lines_mono_color() const; + + /// @return the mono color used for faces. + const CGAL::IO::Color& get_faces_mono_color() const; + + /// clear the basic viewer, i.e. remove all its elements. + void clear(); + + /// @return `true` if the viewer is empty. + bool is_empty() const; + + /// @return the bounding box of all the elements in the viewer. + const CGAL::Bbox_3& bounding_box() const; + + /// @return `true` if the clipping plane is enabled. + bool is_clipping_plane_enabled() const; + + /// @return the clipping plane when it is enabled. + Local_kernel::Plane_3 clipping_plane() const; + + /// add the given point in the viewer. + template + void add_point(const KPoint &p); + + /// add the given colored point in the viewer. + template + void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + + /// add the given segment in the viewer. + template + void add_segment(const KPoint &p1, const KPoint &p2); + + /// add the given colored segment in the viewer. + template + void add_segment(const KPoint &p1, const KPoint &p2, + const CGAL::IO::Color &acolor); + + /// add the given ray in the viewer: an half line starting from p and having v as direction. + template + void add_ray(const KPoint &p, const KVector &v); + + /// add the given colored ray in the viewer: an half line starting from p and having v as direction. + template + void add_ray(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + /// add the given line in the viewer, defined by p and v as direction. + template + void add_line(const KPoint &p, const KVector &v); + + /// add the given colored line in the viewer, defined by p and v as direction. + template + void add_line(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + /// start a new face. + void face_begin(); + + /// start a new colored face. + void face_begin(const CGAL::IO::Color &acolor); + + /// @return `true` iff a face is started. + bool is_a_face_started() const; + + /// add the given point in the current face. + template bool add_point_in_face(const KPoint &kp); + + /// add the given point in the current face, having the vertex normal. + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal); + + /// end the current face. + void face_end(); + + /// add the given text at the given position in the viewer. + template + void add_text(const KPoint &kp, const char *txt); + + /// add the given text at the given position in the viewer. + template + void add_text(const KPoint &kp, const std::string &txt); + + /// @return the graphic storage of the viewer. + Graphic_storage& get_graphic_storage(); + + /// @return the graphic storage of the viewer, const version. + const Graphic_storage& get_graphic_storage() const; + + /// negate all normal of vertices and faces. + void negate_all_normals(); + + // \return true if the data structure in in 2D, i.e. lies on a plane. + bool is_two_dimensional() const; + + /// draw the viewer without recomputing all internal buffers. + virtual void draw(); + + /// redraw the viewer, i.e. recompute all internal buffers and update the window. + virtual void redraw(); + + /// function called when a key is pressed. Users can define their own function in order + /// to add specific behavior. + std::function *)> on_key_pressed; +}; + + +//------------------------------------------------------------------------------ +/*! + \ingroup PkgBasicViewerClasses + +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The QApplication is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + +\tparam BufferType the type used for point coordinates: float by default. + +*/ +template +class QApplication_and_basic_viewer +{ +public: + /// Constructor given a Graphic_storage and possibly a title. + QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, + const char* title="CGAL Basic Viewer"); + + /// run the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. + void run(); + + /// @return a reference to the Basic_viewer_qt associated with this. + Basic_viewer_qt& basic_viewer(); +}; + +//------------------------------------------------------------------------------ +/*! + opens a new window and draws the given `Graphic_storage` (which must be have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +*/ +template +void draw_graphic_storage(Graphic_storage& graphic_buffer, + const char *title="CGAL Basic Viewer"); + +} // End namespace CGAL + diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 1ad624dc5250..ffa349ec68de 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -25,9 +25,12 @@ - `CGAL::Drawing_functor` - `CGAL::Drawing_functor_with_volume` - `CGAL::Graphic_storage` +- `CGAL::Basic_viewer_qt` +- `CGAL::QApplication_and_basic_viewer` \cgalCRPSubsection{Draw functions} - \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- CGAL::draw_graphic_storage() \cgalCRPSubsection{Fill graphic storage functions} - \link PkgDrawLinearCellComplex CGAL::CGAL::add_in_graphic_storage() \endlink From 1acb0e67665e6c0195c638c7b0646f02158be85b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 16:20:20 +0200 Subject: [PATCH 151/341] typo --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index c97f041b54bd..51e3f4ecfc84 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -242,7 +242,7 @@ class QApplication_and_basic_viewer //------------------------------------------------------------------------------ /*! - opens a new window and draws the given `Graphic_storage` (which must be have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + opens a new window and draws the given `Graphic_storage` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. */ template void draw_graphic_storage(Graphic_storage& graphic_buffer, From 2f3d0c1029649f3f2aa4dcf4e722d8d352349ed9 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 16:55:35 +0200 Subject: [PATCH 152/341] add lcc in dependencies --- Basic_viewer/doc/Basic_viewer/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index e69de29bb2d1..f0abb4c7ced1 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -0,0 +1 @@ +Linear_cell_complex From 5e420b1e3fa994e20cb7f65f1f8cddda777334a3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 17:08:39 +0200 Subject: [PATCH 153/341] doc --- Basic_viewer/doc/Basic_viewer/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index f0abb4c7ced1..f4dccf527f1e 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -1 +1,2 @@ Linear_cell_complex +Manual From 0fe120ba2046938639464b9650c10df71b56fe94 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 18:57:28 +0200 Subject: [PATCH 154/341] add links to draw functions --- .../doc/Basic_viewer/PackageDescription.txt | 24 ++++++++++++++++--- Basic_viewer/doc/Basic_viewer/dependencies | 14 ++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index ffa349ec68de..c250d939dd20 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -28,9 +28,27 @@ - `CGAL::Basic_viewer_qt` - `CGAL::QApplication_and_basic_viewer` -\cgalCRPSubsection{Draw functions} -- \link PkgDrawLinearCellComplex CGAL::draw() \endlink -- CGAL::draw_graphic_storage() +\cgalCRPSubsection{Draw functions of a graphic storage} + +- `CGAL::draw_graphic_storage()` + + +\cgalCRPSubsection{Draw functions for different packages} + +- \link PkgDrawTriangulation2 Constrained_triangulation_2 CGAL::draw() \endlink +- \link PkgDrawLinearCellComplex Linear_cell_complex CGAL::draw() \endlink +- \link PkgDrawNef3 Nef_polyhedron_3 CGAL::draw() \endlink +- \link PkgDrawPeriodic2Triangulation2 Periodic_2_Triangulation_2 CGAL::draw() \endlink +- \link PkgDrawPointSet3D Point_set_3 CGAL::draw() \endlink +- \link PkgDrawPolygon2 Polygon_2 CGAL::draw() \endlink +- \link PkgDrawPolygonSet2 Polygon_set_2 CGAL::draw() \endlink +- \link PkgDrawPolygonWithHoles2 Polygon_with_holes_2 CGAL::draw() \endlink +- \link PkgDrawPolyhedron Polyhedron_3 CGAL::draw() \endlink +- \link PkgDrawSurfaceMesh Surface_mesh CGAL::draw() \endlink +- \link PkgDrawFaceGraphWithPaths Surface_mesh_topology CGAL::draw() \endlink +- \link PkgDrawTriangulation2 Triangulation_2 CGAL::draw() \endlink +- \link PkgDrawTriangulation3 Triangulation_3 CGAL::draw() \endlink +- \link PkgDrawVoronoiDiagram2 Voronoi_diagram_2 CGAL::draw() \endlink \cgalCRPSubsection{Fill graphic storage functions} - \link PkgDrawLinearCellComplex CGAL::CGAL::add_in_graphic_storage() \endlink diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index f4dccf527f1e..5e5f8885e7bc 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -1,2 +1,14 @@ -Linear_cell_complex Manual +Boolean_set_operations_2 +Constrained_triangulation_2 +Linear_cell_complex +Nef_polyhedron_3 +Periodic_2_Triangulation_2 +Point_set_3 +Polygon_2 +Polyhedron_3 +Surface_mesh +Surface_mesh_topology +Triangulation_2 +Triangulation_3 +Voronoi_diagram_2 From b9a4f86dbc132ee6b387321d83164f17d43eb24e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Jun 2023 13:24:38 +0200 Subject: [PATCH 155/341] doc --- .../doc/Basic_viewer/Basic_viewer.txt | 2 +- .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 3 ++- Basic_viewer/doc/Basic_viewer/Doxyfile.in | 2 ++ .../doc/Basic_viewer/PackageDescription.txt | 24 +++++++++++++++---- Basic_viewer/doc/Basic_viewer/dependencies | 9 ++++--- Basic_viewer/doc/Basic_viewer/examples.txt | 2 +- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 87f101bafea0..ff81f476c0b7 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -29,7 +29,7 @@ Drawing_functor \subsection Basic_viewerExamples_simple_draw Basic draw -\cgalExample{Linear_cell_complex/draw_linear_cell_complex.cpp} +\cgalExample{Surface_mesh/draw_surface_mesh.cpp} \subsection Basic_viewerExamples_custom_color Change Face Colors diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 51e3f4ecfc84..3bfad55352d1 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -246,7 +246,8 @@ class QApplication_and_basic_viewer */ template void draw_graphic_storage(Graphic_storage& graphic_buffer, - const char *title="CGAL Basic Viewer"); + const char *title="CGAL Basic Viewer") +{} } // End namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/Doxyfile.in b/Basic_viewer/doc/Basic_viewer/Doxyfile.in index 2082ff842dc1..8b325940a193 100644 --- a/Basic_viewer/doc/Basic_viewer/Doxyfile.in +++ b/Basic_viewer/doc/Basic_viewer/Doxyfile.in @@ -1,3 +1,5 @@ @INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - CGAL Basic Viewer" + +EXAMPLE_PATH += ${CGAL_Surface_mesh_EXAMPLE_DIR} \ No newline at end of file diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index c250d939dd20..2c77cc1aac4b 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -10,7 +10,7 @@ \cgalPkgSummaryBegin \cgalPkgAuthor{Guillaume Damiand} \cgalPkgDesc{This package implements basic viewer class.} -\cgalPkgManuals{Chapter_Basic_Viewer,PkgBasicViewerRef} +\cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin \cgalPkgSince{6.0} @@ -28,12 +28,12 @@ - `CGAL::Basic_viewer_qt` - `CGAL::QApplication_and_basic_viewer` -\cgalCRPSubsection{Draw functions of a graphic storage} +\cgalCRPSubsection{Draw a Graphic Storage} - `CGAL::draw_graphic_storage()` -\cgalCRPSubsection{Draw functions for different packages} +\cgalCRPSubsection{Draw for Different Packages} - \link PkgDrawTriangulation2 Constrained_triangulation_2 CGAL::draw() \endlink - \link PkgDrawLinearCellComplex Linear_cell_complex CGAL::draw() \endlink @@ -50,8 +50,22 @@ - \link PkgDrawTriangulation3 Triangulation_3 CGAL::draw() \endlink - \link PkgDrawVoronoiDiagram2 Voronoi_diagram_2 CGAL::draw() \endlink -\cgalCRPSubsection{Fill graphic storage functions} -- \link PkgDrawLinearCellComplex CGAL::CGAL::add_in_graphic_storage() \endlink +\cgalCRPSubsection{Fill Graphic Storage for Different Packages} + +- \link PkgDrawTriangulation2 Constrained_triangulation_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawLinearCellComplex Linear_cell_complex CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawNef3 Nef_polyhedron_3 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPeriodic2Triangulation2 Periodic_2_Triangulation_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPointSet3D Point_set_3 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPolygon2 Polygon_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPolygonSet2 Polygon_set_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPolygonWithHoles2 Polygon_with_holes_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawPolyhedron Polyhedron_3 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawSurfaceMesh Surface_mesh CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawFaceGraphWithPaths Surface_mesh_topology CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawTriangulation2 Triangulation_2 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawTriangulation3 Triangulation_3 CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawVoronoiDiagram2 Voronoi_diagram_2 CGAL::add_in_graphic_storage() \endlink */ diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index 5e5f8885e7bc..67a91f218f5e 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -1,12 +1,11 @@ Manual Boolean_set_operations_2 -Constrained_triangulation_2 Linear_cell_complex -Nef_polyhedron_3 -Periodic_2_Triangulation_2 +Nef_3 +Periodic_2_triangulation_2 Point_set_3 -Polygon_2 -Polyhedron_3 +Polygon +Polyhedron Surface_mesh Surface_mesh_topology Triangulation_2 diff --git a/Basic_viewer/doc/Basic_viewer/examples.txt b/Basic_viewer/doc/Basic_viewer/examples.txt index 1deef74b4f8f..0a13e1c0f6fd 100644 --- a/Basic_viewer/doc/Basic_viewer/examples.txt +++ b/Basic_viewer/doc/Basic_viewer/examples.txt @@ -1,5 +1,5 @@ /*! -\example Linear_cell_complex/draw_linear_cell_complex.cpp +\example Surface_mesh/draw_surface_mesh.cpp \example Basic_viewer/draw_mesh_and_points.cpp \example Basic_viewer/draw_several_windows.cpp \example Basic_viewer/draw_surface_mesh_height.cpp From 980241e7cdf45abf140a1cbc18b7b8c7d2b1290b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Jun 2023 15:05:43 +0200 Subject: [PATCH 156/341] author --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 2c77cc1aac4b..0cd5d9e62b3c 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -8,7 +8,7 @@ \cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} \cgalPkgPicture{TODO.png} \cgalPkgSummaryBegin -\cgalPkgAuthor{Guillaume Damiand} +\cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} \cgalPkgDesc{This package implements basic viewer class.} \cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd From 157558a0888b6a43e47ab29321f89a76f040d9fe Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 26 Jun 2023 11:12:39 +0200 Subject: [PATCH 157/341] update doc --- .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 253 ------------------ .../doc/Basic_viewer/PackageDescription.txt | 56 ++-- 2 files changed, 28 insertions(+), 281 deletions(-) delete mode 100644 Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h deleted file mode 100644 index 3bfad55352d1..000000000000 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ /dev/null @@ -1,253 +0,0 @@ -namespace CGAL { - -//------------------------------------------------------------------------------ -/*! - \ingroup PkgBasicViewerClasses - -The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphic_storage`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. - -\tparam BufferType the type used for point coordinates: float by default. - -*/ -template -class Basic_viewer_qt : public CGAL::QGLViewer -{ -public: - /// constructor given a pointer on a QWidget (can be a nullptr) and a Graphic_storage. - /// title will be the title of the window. - Basic_viewer_qt(QWidget* parent, - Graphic_storage& buf, - const char* title=""); - - /// enable or disable the drawing of vertices. - void set_draw_vertices(bool b); - - /// enable or disable the drawing of edges. - void set_draw_edges(bool b); - - /// enable or disable the drawing of rays. - void set_draw_rays(bool b); - - /// enable or disable the drawing of lines. - void set_draw_lines(bool b); - - /// enable or disable the drawing of faces. - void set_draw_faces(bool b); - - /// enable or disable the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). - void set_use_mono_color(bool b); - - /// enable or disable the drawing of texts. - void set_draw_text(bool b); - - /// set the color used for vertices in mono_color mode. - void set_vertices_mono_color(const CGAL::IO::Color& c); - - /// set the color used for edges in mono_color mode. - void set_edges_mono_color(const CGAL::IO::Color& c); - - /// set the color used for rays in mono_color mode. - void set_rays_mono_color(const CGAL::IO::Color& c); - - /// set the color used for lines in mono_color mode. - void set_lines_mono_color(const CGAL::IO::Color& c); - - /// set the color used for faces in mono_color mode. - void set_faces_mono_color(const CGAL::IO::Color& c); - - /// negate the drawing of vertices (becomes `true` if it was `false` and reciprocally). - void negate_draw_vertices(); - - /// negate the drawing of edges (becomes `true` if it was `false` and reciprocally). - void negate_draw_edges(); - - /// negate the drawing of rays (becomes `true` if it was `false` and reciprocally). - void negate_draw_rays(); - - /// negate the drawing of lines (becomes `true` if it was `false` and reciprocally). - void negate_draw_lines(); - - /// negate the drawing of faces (becomes `true` if it was `false` and reciprocally). - void negate_draw_faces(); - - /// negate the use of mono color mode (becomes `true` if it was `false` and reciprocally). - void negate_use_mono_color(); - - /// negate the drawing of text (becomes `true` if it was `false` and reciprocally). - void negate_draw_text(); - - /// @return `true` if vertices are drawn. - bool get_draw_vertices() const; - - /// @return `true` if edges are drawn. - bool get_draw_edges() const; - - /// @return `true` if rays are drawn. - bool get_draw_rays() const; - - /// @return `true` if lines are drawn. - bool get_draw_lines() const; - - /// @return `true` if faces are drawn. - bool get_draw_faces() const; - - /// @return `true` if mono color mode is used. - bool get_use_mono_color() const; - - /// @return `true` if normal are reversed. - bool get_inverse_normal() const; - - /// @return `true` if text are drawn. - bool get_draw_text() const; - - /// @return the mono color used for vertices. - const CGAL::IO::Color& get_vertices_mono_color() const; - - /// @return the mono color used for edges. - const CGAL::IO::Color& get_edges_mono_color() const; - - /// @return the mono color used for rays. - const CGAL::IO::Color& get_rays_mono_color() const; - - /// @return the mono color used for lines. - const CGAL::IO::Color& get_lines_mono_color() const; - - /// @return the mono color used for faces. - const CGAL::IO::Color& get_faces_mono_color() const; - - /// clear the basic viewer, i.e. remove all its elements. - void clear(); - - /// @return `true` if the viewer is empty. - bool is_empty() const; - - /// @return the bounding box of all the elements in the viewer. - const CGAL::Bbox_3& bounding_box() const; - - /// @return `true` if the clipping plane is enabled. - bool is_clipping_plane_enabled() const; - - /// @return the clipping plane when it is enabled. - Local_kernel::Plane_3 clipping_plane() const; - - /// add the given point in the viewer. - template - void add_point(const KPoint &p); - - /// add the given colored point in the viewer. - template - void add_point(const KPoint &p, const CGAL::IO::Color &acolor); - - /// add the given segment in the viewer. - template - void add_segment(const KPoint &p1, const KPoint &p2); - - /// add the given colored segment in the viewer. - template - void add_segment(const KPoint &p1, const KPoint &p2, - const CGAL::IO::Color &acolor); - - /// add the given ray in the viewer: an half line starting from p and having v as direction. - template - void add_ray(const KPoint &p, const KVector &v); - - /// add the given colored ray in the viewer: an half line starting from p and having v as direction. - template - void add_ray(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); - - /// add the given line in the viewer, defined by p and v as direction. - template - void add_line(const KPoint &p, const KVector &v); - - /// add the given colored line in the viewer, defined by p and v as direction. - template - void add_line(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); - - /// start a new face. - void face_begin(); - - /// start a new colored face. - void face_begin(const CGAL::IO::Color &acolor); - - /// @return `true` iff a face is started. - bool is_a_face_started() const; - - /// add the given point in the current face. - template bool add_point_in_face(const KPoint &kp); - - /// add the given point in the current face, having the vertex normal. - template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal); - - /// end the current face. - void face_end(); - - /// add the given text at the given position in the viewer. - template - void add_text(const KPoint &kp, const char *txt); - - /// add the given text at the given position in the viewer. - template - void add_text(const KPoint &kp, const std::string &txt); - - /// @return the graphic storage of the viewer. - Graphic_storage& get_graphic_storage(); - - /// @return the graphic storage of the viewer, const version. - const Graphic_storage& get_graphic_storage() const; - - /// negate all normal of vertices and faces. - void negate_all_normals(); - - // \return true if the data structure in in 2D, i.e. lies on a plane. - bool is_two_dimensional() const; - - /// draw the viewer without recomputing all internal buffers. - virtual void draw(); - - /// redraw the viewer, i.e. recompute all internal buffers and update the window. - virtual void redraw(); - - /// function called when a key is pressed. Users can define their own function in order - /// to add specific behavior. - std::function *)> on_key_pressed; -}; - - -//------------------------------------------------------------------------------ -/*! - \ingroup PkgBasicViewerClasses - -The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The QApplication is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. - -\tparam BufferType the type used for point coordinates: float by default. - -*/ -template -class QApplication_and_basic_viewer -{ -public: - /// Constructor given a Graphic_storage and possibly a title. - QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, - const char* title="CGAL Basic Viewer"); - - /// run the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. - void run(); - - /// @return a reference to the Basic_viewer_qt associated with this. - Basic_viewer_qt& basic_viewer(); -}; - -//------------------------------------------------------------------------------ -/*! - opens a new window and draws the given `Graphic_storage` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. -*/ -template -void draw_graphic_storage(Graphic_storage& graphic_buffer, - const char *title="CGAL Basic Viewer") -{} - -} // End namespace CGAL - diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 0cd5d9e62b3c..d5a338e9ebbb 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -35,37 +35,37 @@ \cgalCRPSubsection{Draw for Different Packages} -- \link PkgDrawTriangulation2 Constrained_triangulation_2 CGAL::draw() \endlink -- \link PkgDrawLinearCellComplex Linear_cell_complex CGAL::draw() \endlink -- \link PkgDrawNef3 Nef_polyhedron_3 CGAL::draw() \endlink -- \link PkgDrawPeriodic2Triangulation2 Periodic_2_Triangulation_2 CGAL::draw() \endlink -- \link PkgDrawPointSet3D Point_set_3 CGAL::draw() \endlink -- \link PkgDrawPolygon2 Polygon_2 CGAL::draw() \endlink -- \link PkgDrawPolygonSet2 Polygon_set_2 CGAL::draw() \endlink -- \link PkgDrawPolygonWithHoles2 Polygon_with_holes_2 CGAL::draw() \endlink -- \link PkgDrawPolyhedron Polyhedron_3 CGAL::draw() \endlink -- \link PkgDrawSurfaceMesh Surface_mesh CGAL::draw() \endlink -- \link PkgDrawFaceGraphWithPaths Surface_mesh_topology CGAL::draw() \endlink -- \link PkgDrawTriangulation2 Triangulation_2 CGAL::draw() \endlink -- \link PkgDrawTriangulation3 Triangulation_3 CGAL::draw() \endlink -- \link PkgDrawVoronoiDiagram2 Voronoi_diagram_2 CGAL::draw() \endlink +- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::draw() \endlink +- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::draw() \endlink +- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- Point_set_3 \link PkgDrawPointSet3D CGAL::draw() \endlink +- Polygon_2 \link PkgDrawPolygon2 CGAL::draw() \endlink +- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::draw() \endlink +- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::draw() \endlink +- Polyhedron_3 \link PkgDrawPolyhedron CGAL::draw() \endlink +- Surface_mesh \link PkgDrawSurfaceMesh CGAL::draw() \endlink +- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink +- Triangulation_2 \link PkgDrawTriangulation2 CGAL::draw() \endlink +- Triangulation_3 \link PkgDrawTriangulation3 CGAL::draw() \endlink +- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink \cgalCRPSubsection{Fill Graphic Storage for Different Packages} -- \link PkgDrawTriangulation2 Constrained_triangulation_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawLinearCellComplex Linear_cell_complex CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawNef3 Nef_polyhedron_3 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPeriodic2Triangulation2 Periodic_2_Triangulation_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPointSet3D Point_set_3 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPolygon2 Polygon_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPolygonSet2 Polygon_set_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPolygonWithHoles2 Polygon_with_holes_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawPolyhedron Polyhedron_3 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawSurfaceMesh Surface_mesh CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawFaceGraphWithPaths Surface_mesh_topology CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawTriangulation2 Triangulation_2 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawTriangulation3 Triangulation_3 CGAL::add_in_graphic_storage() \endlink -- \link PkgDrawVoronoiDiagram2 Voronoi_diagram_2 CGAL::add_in_graphic_storage() \endlink +- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphic_storage() \endlink +- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_in_graphic_storage() \endlink +- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_in_graphic_storage() \endlink +- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_in_graphic_storage() \endlink +- Point_set_3 \link PkgDrawPointSet3D CGAL::add_in_graphic_storage() \endlink +- Polygon_2 \link PkgDrawPolygon2 CGAL::add_in_graphic_storage() \endlink +- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_in_graphic_storage() \endlink +- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_in_graphic_storage() \endlink +- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_in_graphic_storage() \endlink +- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_in_graphic_storage() \endlink +- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_in_graphic_storage() \endlink +- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphic_storage() \endlink +- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_in_graphic_storage() \endlink +- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_in_graphic_storage() \endlink */ From 11c7e4415e22eac42194bf2973e5666ebc556e2e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 26 Jun 2023 11:12:53 +0200 Subject: [PATCH 158/341] move file --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h new file mode 100644 index 000000000000..3bfad55352d1 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -0,0 +1,253 @@ +namespace CGAL { + +//------------------------------------------------------------------------------ +/*! + \ingroup PkgBasicViewerClasses + +The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphic_storage`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + +\tparam BufferType the type used for point coordinates: float by default. + +*/ +template +class Basic_viewer_qt : public CGAL::QGLViewer +{ +public: + /// constructor given a pointer on a QWidget (can be a nullptr) and a Graphic_storage. + /// title will be the title of the window. + Basic_viewer_qt(QWidget* parent, + Graphic_storage& buf, + const char* title=""); + + /// enable or disable the drawing of vertices. + void set_draw_vertices(bool b); + + /// enable or disable the drawing of edges. + void set_draw_edges(bool b); + + /// enable or disable the drawing of rays. + void set_draw_rays(bool b); + + /// enable or disable the drawing of lines. + void set_draw_lines(bool b); + + /// enable or disable the drawing of faces. + void set_draw_faces(bool b); + + /// enable or disable the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). + void set_use_mono_color(bool b); + + /// enable or disable the drawing of texts. + void set_draw_text(bool b); + + /// set the color used for vertices in mono_color mode. + void set_vertices_mono_color(const CGAL::IO::Color& c); + + /// set the color used for edges in mono_color mode. + void set_edges_mono_color(const CGAL::IO::Color& c); + + /// set the color used for rays in mono_color mode. + void set_rays_mono_color(const CGAL::IO::Color& c); + + /// set the color used for lines in mono_color mode. + void set_lines_mono_color(const CGAL::IO::Color& c); + + /// set the color used for faces in mono_color mode. + void set_faces_mono_color(const CGAL::IO::Color& c); + + /// negate the drawing of vertices (becomes `true` if it was `false` and reciprocally). + void negate_draw_vertices(); + + /// negate the drawing of edges (becomes `true` if it was `false` and reciprocally). + void negate_draw_edges(); + + /// negate the drawing of rays (becomes `true` if it was `false` and reciprocally). + void negate_draw_rays(); + + /// negate the drawing of lines (becomes `true` if it was `false` and reciprocally). + void negate_draw_lines(); + + /// negate the drawing of faces (becomes `true` if it was `false` and reciprocally). + void negate_draw_faces(); + + /// negate the use of mono color mode (becomes `true` if it was `false` and reciprocally). + void negate_use_mono_color(); + + /// negate the drawing of text (becomes `true` if it was `false` and reciprocally). + void negate_draw_text(); + + /// @return `true` if vertices are drawn. + bool get_draw_vertices() const; + + /// @return `true` if edges are drawn. + bool get_draw_edges() const; + + /// @return `true` if rays are drawn. + bool get_draw_rays() const; + + /// @return `true` if lines are drawn. + bool get_draw_lines() const; + + /// @return `true` if faces are drawn. + bool get_draw_faces() const; + + /// @return `true` if mono color mode is used. + bool get_use_mono_color() const; + + /// @return `true` if normal are reversed. + bool get_inverse_normal() const; + + /// @return `true` if text are drawn. + bool get_draw_text() const; + + /// @return the mono color used for vertices. + const CGAL::IO::Color& get_vertices_mono_color() const; + + /// @return the mono color used for edges. + const CGAL::IO::Color& get_edges_mono_color() const; + + /// @return the mono color used for rays. + const CGAL::IO::Color& get_rays_mono_color() const; + + /// @return the mono color used for lines. + const CGAL::IO::Color& get_lines_mono_color() const; + + /// @return the mono color used for faces. + const CGAL::IO::Color& get_faces_mono_color() const; + + /// clear the basic viewer, i.e. remove all its elements. + void clear(); + + /// @return `true` if the viewer is empty. + bool is_empty() const; + + /// @return the bounding box of all the elements in the viewer. + const CGAL::Bbox_3& bounding_box() const; + + /// @return `true` if the clipping plane is enabled. + bool is_clipping_plane_enabled() const; + + /// @return the clipping plane when it is enabled. + Local_kernel::Plane_3 clipping_plane() const; + + /// add the given point in the viewer. + template + void add_point(const KPoint &p); + + /// add the given colored point in the viewer. + template + void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + + /// add the given segment in the viewer. + template + void add_segment(const KPoint &p1, const KPoint &p2); + + /// add the given colored segment in the viewer. + template + void add_segment(const KPoint &p1, const KPoint &p2, + const CGAL::IO::Color &acolor); + + /// add the given ray in the viewer: an half line starting from p and having v as direction. + template + void add_ray(const KPoint &p, const KVector &v); + + /// add the given colored ray in the viewer: an half line starting from p and having v as direction. + template + void add_ray(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + /// add the given line in the viewer, defined by p and v as direction. + template + void add_line(const KPoint &p, const KVector &v); + + /// add the given colored line in the viewer, defined by p and v as direction. + template + void add_line(const KPoint &p, const KVector &v, + const CGAL::IO::Color &acolor); + + /// start a new face. + void face_begin(); + + /// start a new colored face. + void face_begin(const CGAL::IO::Color &acolor); + + /// @return `true` iff a face is started. + bool is_a_face_started() const; + + /// add the given point in the current face. + template bool add_point_in_face(const KPoint &kp); + + /// add the given point in the current face, having the vertex normal. + template + bool add_point_in_face(const KPoint &kp, const KVector &p_normal); + + /// end the current face. + void face_end(); + + /// add the given text at the given position in the viewer. + template + void add_text(const KPoint &kp, const char *txt); + + /// add the given text at the given position in the viewer. + template + void add_text(const KPoint &kp, const std::string &txt); + + /// @return the graphic storage of the viewer. + Graphic_storage& get_graphic_storage(); + + /// @return the graphic storage of the viewer, const version. + const Graphic_storage& get_graphic_storage() const; + + /// negate all normal of vertices and faces. + void negate_all_normals(); + + // \return true if the data structure in in 2D, i.e. lies on a plane. + bool is_two_dimensional() const; + + /// draw the viewer without recomputing all internal buffers. + virtual void draw(); + + /// redraw the viewer, i.e. recompute all internal buffers and update the window. + virtual void redraw(); + + /// function called when a key is pressed. Users can define their own function in order + /// to add specific behavior. + std::function *)> on_key_pressed; +}; + + +//------------------------------------------------------------------------------ +/*! + \ingroup PkgBasicViewerClasses + +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The QApplication is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + +\tparam BufferType the type used for point coordinates: float by default. + +*/ +template +class QApplication_and_basic_viewer +{ +public: + /// Constructor given a Graphic_storage and possibly a title. + QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, + const char* title="CGAL Basic Viewer"); + + /// run the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. + void run(); + + /// @return a reference to the Basic_viewer_qt associated with this. + Basic_viewer_qt& basic_viewer(); +}; + +//------------------------------------------------------------------------------ +/*! + opens a new window and draws the given `Graphic_storage` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +*/ +template +void draw_graphic_storage(Graphic_storage& graphic_buffer, + const char *title="CGAL Basic Viewer") +{} + +} // End namespace CGAL + From ef602d7aa0dd96a46a8c8f121b92da105764b070 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 26 Jun 2023 16:13:49 +0200 Subject: [PATCH 159/341] draw constrained triangulation can reuse draw triangulation --- .../CGAL/draw_constrained_triangulation_2.h | 72 ++++++++++++------- .../include/CGAL/draw_triangulation_2.h | 1 - 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index 2f8edf0f0c2c..36f413b20a74 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -13,60 +13,80 @@ #define CGAL_DRAW_CT2_H #include -#include #include #include #ifdef CGAL_USE_BASIC_VIEWER -#include +#include namespace CGAL { +// Specialization of draw function. +#define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 + +template +void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, + CGAL::Graphic_storage& graphic_storage) +{ + using BASET2=CGAL::Triangulation_2; - template - CGAL::IO::Color color_of_face(Facet_const_handle fh, InDomainPmap ipm) - { return get(ipm, fh)? CGAL::IO::yellow() : CGAL::IO::white(); } + Drawing_functor + drawingFunctor; - CGAL::IO::Color color_of_edge(Edge_const_handle eh) - { return t2.is_constrained(*eh)? CGAL::IO::green() : CGAL::IO::black(); } + drawingFunctor.colored_edge = + [](const BASET2& t2, typename CGAL_T2_TYPE::Finite_edges_iterator eh) -> bool + { return static_cast(t2).is_constrained(*eh); }; + drawingFunctor.edge_color = + [](const BASET2& t2, typename CGAL_T2_TYPE::Finite_edges_iterator eh) -> CGAL::IO::Color + { return static_cast(t2).is_constrained(*eh)? CGAL::IO::green() : CGAL::IO::black(); }; -// Specialization of draw function. -#define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 + drawingFunctor.colored_face = + [](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator) -> bool + { return true; }; + + drawingFunctor.face_color = + [&ipm](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> CGAL::IO::Color + { return get(ipm, fh)? CGAL::IO::yellow() : CGAL::IO::white(); }; + + add_in_graphic_storage(at2, graphic_storage, drawingFunctor); +} + +template +void add_in_graphic_storage(const CGAL_T2_TYPE& at2, + CGAL::Graphic_storage& graphic_storage) +{ + internal::In_domain in_domain; + add_in_graphic_storage(at2, in_domain, graphic_storage); +} template -void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm) +void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, + const char *title="Constrained Triangulation_2 Basic Viewer") { + CGAL::Graphic_storage buffer; + add_in_graphic_storage(at2, ipm, buffer); + draw_graphic_storage(buffer, title); } template -void draw(const CGAL_T2_TYPE& at2) +void draw(const CGAL_T2_TYPE& at2, + const char *title="Constrained Triangulation_2 Basic Viewer") { internal::In_domain in_domain; - draw(at2, in_domain); + draw(at2, in_domain, title); } #undef CGAL_T2_TYPE } // End namespace CGAL -#else - -namespace CGAL { -// Specialization of draw function. -#define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 - -template -void draw(const CGAL_T2_TYPE& , - InDomainPmap ) -{} -#undef CGAL_T2_TYPE - -} // End namespace CGAL - #endif // CGAL_USE_BASIC_VIEWER #endif // CGAL_DRAW_CT2_H diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 8b4cc946c6bc..aa04b819889e 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -129,7 +129,6 @@ template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, CGAL::Graphic_storage& graphic_storage) { - CGAL::Graphic_storage buffer; Drawing_functor Date: Mon, 26 Jun 2023 16:14:07 +0200 Subject: [PATCH 160/341] draw constrained triangulation instead of triangulation --- Mesh_2/examples/Mesh_2/mesh_marked_domain.cpp | 2 +- Mesh_2/examples/Mesh_2/mesh_with_seeds.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mesh_2/examples/Mesh_2/mesh_marked_domain.cpp b/Mesh_2/examples/Mesh_2/mesh_marked_domain.cpp index 5313871f5271..9649f2076e50 100644 --- a/Mesh_2/examples/Mesh_2/mesh_marked_domain.cpp +++ b/Mesh_2/examples/Mesh_2/mesh_marked_domain.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include diff --git a/Mesh_2/examples/Mesh_2/mesh_with_seeds.cpp b/Mesh_2/examples/Mesh_2/mesh_with_seeds.cpp index 2b30e7920149..79a52e9034c8 100644 --- a/Mesh_2/examples/Mesh_2/mesh_with_seeds.cpp +++ b/Mesh_2/examples/Mesh_2/mesh_with_seeds.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include From 6664339b3f45f7741c045e3b9894714a3b7a9340 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 27 Jun 2023 09:56:06 +0200 Subject: [PATCH 161/341] Update drawing functor for surface mesh --- .../Surface_mesh/draw_surface_mesh.cpp | 10 +-- Surface_mesh/include/CGAL/draw_surface_mesh.h | 80 ++++++++++--------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp index cc83ca90fc0e..21f7bf4e51ce 100644 --- a/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp +++ b/Surface_mesh/examples/Surface_mesh/draw_surface_mesh.cpp @@ -14,7 +14,7 @@ int main(int argc, char* argv[]) Mesh sm; if(!CGAL::IO::read_polygon_mesh(filename, sm)) { - std::cerr << "Invalid input file." << std::endl; + std::cerr << "Invalid input file: " << filename << std::endl; return EXIT_FAILURE; } @@ -26,15 +26,15 @@ int main(int argc, char* argv[]) for(auto v : vertices(sm)) { if(v.idx()%2) - put(vcm, v, CGAL::IO::black()); + { put(vcm, v, CGAL::IO::black()); } else - put(vcm, v, CGAL::IO::blue()); + { put(vcm, v, CGAL::IO::blue()); } } for(auto e : edges(sm)) - put(ecm, e, CGAL::IO::gray()); + { put(ecm, e, CGAL::IO::gray()); } - CGAL_USE(fcm); + put(fcm, *(sm.faces().begin()), CGAL::IO::red()); // Draw! CGAL::draw(sm); diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index f9c69aba440c..72b83eff6ea9 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -38,9 +38,9 @@ void draw(const SM& asm); namespace CGAL { -// Check if there are any color maps that could be used, random otherwise +// Check if there are any color maps that could be used template -struct Surface_mesh_basic_viewer_color_map +struct Drawing_functor_surface_mesh : public Drawing_functor, typename boost::graph_traits<::CGAL::Surface_mesh>::vertex_descriptor, typename boost::graph_traits<::CGAL::Surface_mesh>::edge_descriptor, @@ -51,43 +51,47 @@ struct Surface_mesh_basic_viewer_color_map using edge_descriptor = typename boost::graph_traits::edge_descriptor; using face_descriptor = typename boost::graph_traits::face_descriptor; - using Base=Drawing_functor; - - using vertex_colors = typename SM::template Property_map; - using edge_colors = typename SM::template Property_map; - using face_colors = typename SM::template Property_map; - - Surface_mesh_basic_viewer_color_map(const SM& amesh) - { - bool found = false; - std::tie(vcolors, found) = amesh.template property_map("v:color"); - std::tie(ecolors, found) = amesh.template property_map("e:color"); - std::tie(fcolors, found) = amesh.template property_map("f:color"); - CGAL_USE(found); - } - - CGAL::IO::Color operator()(const Surface_mesh& amesh, - const vertex_descriptor v) const - { - return vcolors ? get(vcolors, v) : Base::operator()(amesh, v); - } - - CGAL::IO::Color operator()(const Surface_mesh& amesh, - const edge_descriptor e) const - { - return ecolors ? get(ecolors, e) : Base::operator()(amesh, e); - } - - CGAL::IO::Color operator()(const Surface_mesh& amesh, - const face_descriptor f) const + Drawing_functor_surface_mesh(const SM& amesh) { - return fcolors ? get(fcolors, f) : Base::operator()(amesh, f); + bool found=false; + std::tie(vcolors, found)= + amesh.template property_map("v:color"); + if(found) + { + this->colored_vertex=[](const SM &, vertex_descriptor)->bool { return true; }; + this->vertex_color=[this](const SM &, vertex_descriptor v)->CGAL::IO::Color + { return get(vcolors, v); }; + } + else + { this->colored_vertex=[](const SM &, vertex_descriptor)->bool { return false; }; } + + std::tie(ecolors, found)= + amesh.template property_map("e:color"); + if(found) + { + this->colored_edge=[](const SM &, edge_descriptor)->bool { return true; }; + this->edge_color=[this](const SM &, edge_descriptor e)->CGAL::IO::Color + { return get(ecolors, e); }; + } + else + { this->colored_edge=[](const SM &, edge_descriptor)->bool { return false; }; } + + std::tie(fcolors, found)= + amesh.template property_map("f:color"); + if(found) + { + this->colored_face=[](const SM &, face_descriptor)->bool { return true; }; + this->face_color=[this](const SM &, face_descriptor f)->CGAL::IO::Color + { return get(fcolors, f); }; + } + else + { this->colored_face=[](const SM &, face_descriptor)->bool { return false; }; } } private: - vertex_colors vcolors; - edge_colors ecolors; - face_colors fcolors; + typename SM::template Property_map vcolors; + typename SM::template Property_map ecolors; + typename SM::template Property_map fcolors; }; template @@ -100,7 +104,7 @@ template void add_in_graphic_storage(const Surface_mesh& amesh, CGAL::Graphic_storage &graphic_storage) { add_in_graphic_storage_for_fg(amesh, graphic_storage, - Surface_mesh_basic_viewer_color_map(amesh)); } + Drawing_functor_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER @@ -110,7 +114,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage_for_fg(amesh, buffer); + add_in_graphic_storage(amesh, buffer); draw_graphic_storage(buffer, title); } @@ -120,7 +124,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage_for_fg(amesh, buffer, drawing_functor); + add_in_graphic_storage(amesh, buffer, drawing_functor); draw_graphic_storage(buffer, title); } From 367b2d3815ea2d8f74f2387e701f7720bd0de662 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 27 Jun 2023 16:04:18 +0200 Subject: [PATCH 162/341] Update doc --- .../CGAL/draw_triangulation_2.h | 41 +++++++++---------- .../Triangulation_2/PackageDescription.txt | 8 ++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 4b63d19a344d..2eee9d5810d8 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -3,41 +3,40 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation2 -opens a new window and draws a triangulation. If the triangulation -has constraints they are drawn. If the face type has a member -function `bool is_in_domain()` the faces inside and outside of the -domain are drawn in different colors. +opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional drawing functor parameter. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam T2 a triangulation class derived from `Triangulation_2` or `Constrained_triangulation_2` +\tparam T2 a triangulation class derived from `Triangulation_2` \param at2 the triangulation to draw. +\param df the drawing functor. */ template -void draw(const T2& at2); +void draw(const T2& at2, const CGAL::Drawing_functor& df=default); - /*! +/*! \ingroup PkgDrawTriangulation2 -opens a new window and draws a constrained triangulation. If the triangulation -has constraints they are drawn. The faces inside and outside of the -domain, based on the property map, are drawn in different colors. - -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. - -\tparam CT2 a triangulation class derived from `Constrained_triangulation_2` -\tparam InDomainPMap a class model of `ReadWritePropertyMap` with -`CT::Face_handle` as key type and `bool` as value type. +adds the vertices, edges and faces of at2 into the given graphic storage gs. Parameters of the cells are taken from the optional drawing functor parameter. Note that gs is not clear before to be filled (to enable to draw several data structures in a same basic viewer). -\param act2 the constrained triangulation to draw. -\param ipm the property map defining the faces which are in the domain. +\tparam T2 a triangulation class derived from `Triangulation_2` +\param at2 the triangulation to draw. +\param gs the graphic storage to fill. +\param df the drawing functor. */ - template - void draw(const CT2& act2, InDomainPMap ipm); +template +void add_in_graphic_storage(const T2& at2, + CGAL::Graphic_storage& gs, + const CGAL::Drawing_functor& df=default); } /* namespace CGAL */ diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index 65b8c9137e4b..61ecd53769e4 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -21,6 +21,14 @@ /// \defgroup PkgDrawTriangulation2 Draw a Triangulation 2 /// \ingroup PkgTriangulation2Ref +/*! + \code + #include + \endcode +*/ +/// \defgroup PkgDrawConstrainedTriangulation2 Draw a Constrained Triangulation 2 +/// \ingroup PkgTriangulation2Ref + /*! \addtogroup PkgTriangulation2Ref \todo check generated documentation From 8b556137b58d9cff39a764b8908927237b4effb8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 27 Jun 2023 16:26:13 +0200 Subject: [PATCH 163/341] split draw triangulation in two for the doc (without and with constrained), similarly to the code --- .../CGAL/draw_constrained_triangulation_2.h | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h new file mode 100644 index 000000000000..87c085b92135 --- /dev/null +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -0,0 +1,43 @@ +namespace CGAL { + +/*! +\ingroup PkgDrawConstrainedTriangulation2 + +opens a new window and draws a triangulation. If the triangulation +has constraints they are drawn. If the face type has a member +function `bool is_in_domain()` the faces inside and outside of the +domain are drawn in different colors. + +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with +`CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. + +\tparam T2 a triangulation class derived from `Triangulation_2` or `Constrained_triangulation_2` +\param at2 the triangulation to draw. + +*/ +template +void draw(const T2& at2); + + /*! +\ingroup PkgDrawConstrainedTriangulation2 + +opens a new window and draws a constrained triangulation. If the triangulation +has constraints they are drawn. The faces inside and outside of the +domain, based on the property map, are drawn in different colors. + +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. + +\tparam CT2 a triangulation class derived from `Constrained_triangulation_2` +\tparam InDomainPMap a class model of `ReadWritePropertyMap` with +`CT::Face_handle` as key type and `bool` as value type. + +\param act2 the constrained triangulation to draw. +\param ipm the property map defining the faces which are in the domain. + +*/ + template + void draw(const CT2& act2, InDomainPMap ipm); + +} /* namespace CGAL */ From 44fd0bcb0b526b7bd8e648523e86412b6f7e2334 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 27 Jun 2023 19:14:09 +0200 Subject: [PATCH 164/341] camel case --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index a3241cba361e..221dc76f398c 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -8,57 +8,57 @@ The class `Drawing_functor` is used to tune the way that a given data-structure The different std::function can be modified to change the behavior of the drawing. \tparam DS a data structure of CGAL. -\tparam Vertex_descriptor a descriptor of vertices of DS. -\tparam Edge_descriptor a descriptor of edges of DS. -\tparam Face_descriptor a descriptor of faces of DS. +\tparam VertexDescriptor a descriptor of vertices of DS. +\tparam EdgeDescriptor a descriptor of edges of DS. +\tparam FaceDescriptor a descriptor of faces of DS. */ template + typename VertexDescriptor, + typename EdgeDescriptor, + typename FaceDescriptor> struct Drawing_functor { public: /// std::function that returns `true` if the given vertex must be drawn, `false` otherwise. /// Returns `true` by default. - std::function draw_vertex; + std::function draw_vertex; /// std::function that returns `true` if the given edge must be drawn, `false` otherwise. /// Returns `true` by default. - std::function draw_edge; + std::function draw_edge; /// std::function that returns `true` if the given face must be drawn, `false` otherwise. /// Returns `true` by default. - std::function draw_face; + std::function draw_face; /// std::function that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_vertex; + std::function colored_vertex; /// std::function that returns `true` if the given edge is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_edge; + std::function colored_edge; /// std::function that returns `true` if the given face is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_face; + std::function colored_face; /// std::function that returns `true` if the given face is drawn in wireframe, `false` otherwise. /// Returns `false` by default. - std::function face_wireframe; + std::function face_wireframe; /// std::function that returns the color of the given vertex. /// nullptr by default. - std::function vertex_color; + std::function vertex_color; /// std::function that returns the color of the given edge. /// nullptr by default. - std::function edge_color; + std::function edge_color; /// std::function that returns the color of the given face. /// nullptr by default. - std::function face_color; + std::function face_color; /// Disable the drawing of vertices. void disable_vertices(); @@ -86,39 +86,39 @@ The class `Drawing_functor_with_volume` is used to tune the way that a given dat The different std::function can be modified to change the behavior of the drawing. \tparam DS a data structure of CGAL. -\tparam Vertex_descriptor a descriptor of vertices of DS. -\tparam Edge_descriptor a descriptor of edges of DS. -\tparam Face_descriptor a descriptor of faces of DS. -\tparam Volume_descriptor a descriptor of volumes of DS. +\tparam VertexDescriptor a descriptor of vertices of DS. +\tparam EdgeDescriptor a descriptor of edges of DS. +\tparam FaceDescriptor a descriptor of faces of DS. +\tparam VolumeDescriptor a descriptor of volumes of DS. */ // Drawing functor for a 3D data structure // (with vertices, edges, faces and volumes) template + typename VertexDescriptor, + typename EdgeDescriptor, + typename FaceDescriptor, + typename VolumeDescriptor> struct Drawing_functor_with_volume : - public Drawing_functor + public Drawing_functor { public: /// std::function that returns `true` if the given volume must be drawn, `false` otherwise. /// Returns `true` by default. - std::function draw_volume; + std::function draw_volume; /// std::function that returns the color of the given volume. /// Returns `false` by default. - std::function colored_volume; + std::function colored_volume; /// std::function that returns `true` if the given volume is drawn in wireframe, `false` otherwise. /// Returns `false` by default. - std::function volume_wireframe; + std::function volume_wireframe; /// std::function that returns the color of the given volume. /// nullptr by default. - std::function volume_color; + std::function volume_color; /// Disable the drawing of volumes. void disable_volumes(); From df33c70be5300e9015cf8c7252ff5d028d6dc383 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 3 Jul 2023 09:40:01 +0200 Subject: [PATCH 165/341] Update doc --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 73 ++++++++----------- .../CGAL/draw_triangulation_2.h | 18 ++--- 2 files changed, 39 insertions(+), 52 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 221dc76f398c..215d8aebd2c7 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -4,8 +4,8 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Drawing_functor` is used to tune the way that a given data-structure of CGAL is drawn. -The different std::function can be modified to change the behavior of the drawing. +The class `Cell_parameters` is used to tune the way that the cells of a given data-structure of CGAL are considered. +The different std::function can be modified to change for example the behavior of the drawing. \tparam DS a data structure of CGAL. \tparam VertexDescriptor a descriptor of vertices of DS. @@ -17,20 +17,20 @@ template -struct Drawing_functor +struct Cell_parameters { public: - /// std::function that returns `true` if the given vertex must be drawn, `false` otherwise. - /// Returns `true` by default. - std::function draw_vertex; + /// std::function that returns `true` if the given vertex must be ignored, `false` otherwise. + /// Returns `false` by default. + std::function ignore_vertex; - /// std::function that returns `true` if the given edge must be drawn, `false` otherwise. + /// std::function that returns `true` if the given edge must be ignored, `false` otherwise. /// Returns `true` by default. - std::function draw_edge; + std::function ignore_edge; - /// std::function that returns `true` if the given face must be drawn, `false` otherwise. + /// std::function that returns `true` if the given face must be ignored, `false` otherwise. /// Returns `true` by default. - std::function draw_face; + std::function ignore_face; /// std::function that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. @@ -44,7 +44,7 @@ struct Drawing_functor /// Returns `false` by default. std::function colored_face; - /// std::function that returns `true` if the given face is drawn in wireframe, `false` otherwise. + /// std::function that returns `true` if the given face is in wireframe, `false` otherwise. /// Returns `false` by default. std::function face_wireframe; @@ -60,30 +60,21 @@ struct Drawing_functor /// nullptr by default. std::function face_color; - /// Disable the drawing of vertices. - void disable_vertices(); - - /// Enable the drawing of vertices. - void enable_vertices(); - - /// Disable the drawing of edges. - void disable_edges(); - - /// Enable the drawing of edges. - void enable_edges(); + /// Ignore all vertices when `b` is `true`; otherwise ignore only vertices for which `ignore_vertex` returns `true`. + void ignore_all_vertices(bool b); - /// Disable the drawing of faces. - void disable_faces(); - - /// Enable the drawing of faces. - void enable_faces(); + /// Ignore all edges when `b` is `true`; otherwise ignore only edges for which `ignore_edge` returns `true`. + void ignore_all_vertices(bool b); + + /// Ignore all faces when `b` is `true`; otherwise ignore only faces for which `ignore_face` returns `true`. + void ignore_all_vertices(bool b); }; /*! \ingroup PkgBasicViewerClasses -The class `Drawing_functor_with_volume` is used to tune the way that a given data-structure of CGAL is drawn, for a data-structure that contains volumes. -The different std::function can be modified to change the behavior of the drawing. +The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data-structure of CGAL are considered, for a data-structure that contains volumes. +The different std::function can be modified to change for example the behavior of the drawing. \tparam DS a data structure of CGAL. \tparam VertexDescriptor a descriptor of vertices of DS. @@ -93,26 +84,25 @@ The different std::function can be modified to change the behavior of the drawin */ -// Drawing functor for a 3D data structure -// (with vertices, edges, faces and volumes) +// Cell parameters for a 3D data structure (with vertices, edges, faces and volumes) template -struct Drawing_functor_with_volume : - public Drawing_functor +struct Cell_parameters_with_volume : + public Cell_parameters { public: - /// std::function that returns `true` if the given volume must be drawn, `false` otherwise. - /// Returns `true` by default. - std::function draw_volume; + /// std::function that returns `true` if the given volume must be ignored, `false` otherwise. + /// Returns `false` by default. + std::function ignore_volume; - /// std::function that returns the color of the given volume. + /// std::function that returns `true` if the given volume is colored, `false` otherwise. /// Returns `false` by default. std::function colored_volume; - /// std::function that returns `true` if the given volume is drawn in wireframe, `false` otherwise. + /// std::function that returns `true` if the given volume is in wireframe, `false` otherwise. /// Returns `false` by default. std::function volume_wireframe; @@ -120,11 +110,8 @@ struct Drawing_functor_with_volume : /// nullptr by default. std::function volume_color; - /// Disable the drawing of volumes. - void disable_volumes(); - - /// Enable the drawing of volumes. - void enable_volumes(); + /// Ignore all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume` returns `true`. + void ignore_all_volumes(bool b); }; } // End namespace CGAL diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 2eee9d5810d8..5d3b5faf1ec7 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -3,40 +3,40 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation2 -opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional drawing functor parameter. +opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional cell parameter. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam T2 a triangulation class derived from `Triangulation_2` \param at2 the triangulation to draw. -\param df the drawing functor. +\param cp the cell parameters. */ template -void draw(const T2& at2, const CGAL::Drawing_functor& df=default); + typename T2::Finite_faces_iterator>& cp=default); /*! \ingroup PkgDrawTriangulation2 -adds the vertices, edges and faces of at2 into the given graphic storage gs. Parameters of the cells are taken from the optional drawing functor parameter. Note that gs is not clear before to be filled (to enable to draw several data structures in a same basic viewer). +adds the vertices, edges and faces of `at2` into the given graphic storage `gs`. Parameters of the cells are taken from the optional cell parameters `cp` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam T2 a triangulation class derived from `Triangulation_2` \param at2 the triangulation to draw. \param gs the graphic storage to fill. -\param df the drawing functor. +\param cp the cell parameters. */ template void add_in_graphic_storage(const T2& at2, CGAL::Graphic_storage& gs, - const CGAL::Drawing_functor& df=default); + typename T2::Finite_faces_iterator>& cp=default); } /* namespace CGAL */ From 3e71ba95a425aea0a2bc2658bdeb997ccead8126 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 24 Aug 2023 16:58:34 +0200 Subject: [PATCH 166/341] update doc --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 23 ++++---- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 56 +++++++++---------- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 13 +++-- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index 3bfad55352d1..f5ed49c43526 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -6,15 +6,15 @@ namespace CGAL { The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphic_storage`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. -\tparam BufferType the type used for point coordinates: float by default. +\tparam BufferType the type used for point coordinates: `float` by default. */ template class Basic_viewer_qt : public CGAL::QGLViewer { public: - /// constructor given a pointer on a QWidget (can be a nullptr) and a Graphic_storage. - /// title will be the title of the window. + /// constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphic_storage`. + /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, Graphic_storage& buf, const char* title=""); @@ -147,20 +147,20 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// add the given ray in the viewer: an half line starting from p and having v as direction. + /// add the given ray in the viewer: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); - /// add the given colored ray in the viewer: an half line starting from p and having v as direction. + /// add the given colored ray in the viewer: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// add the given line in the viewer, defined by p and v as direction. + /// add the given line in the viewer, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v); - /// add the given colored line in the viewer, defined by p and v as direction. + /// add the given colored line in the viewer, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); @@ -175,13 +175,16 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_a_face_started() const; /// add the given point in the current face. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp); /// add the given point in the current face, having the vertex normal. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); /// end the current face. + /// @pre `is_a_face_started()` void face_end(); /// add the given text at the given position in the viewer. @@ -220,9 +223,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer /*! \ingroup PkgBasicViewerClasses -The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The QApplication is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. -\tparam BufferType the type used for point coordinates: float by default. +\tparam BufferType the type used for point coordinates: `float` by default. */ template @@ -236,7 +239,7 @@ class QApplication_and_basic_viewer /// run the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); - /// @return a reference to the Basic_viewer_qt associated with this. + /// @return a reference to the `Basic_viewer_qt` associated with this. Basic_viewer_qt& basic_viewer(); }; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 215d8aebd2c7..1a7435f152b6 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -4,13 +4,13 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters` is used to tune the way that the cells of a given data-structure of CGAL are considered. -The different std::function can be modified to change for example the behavior of the drawing. +The class `Cell_parameters` is used to tune the way that the cells of a given data-structure of \cgal are considered. +The different `std::function` can be modified to change for example the behavior of the drawing. -\tparam DS a data structure of CGAL. -\tparam VertexDescriptor a descriptor of vertices of DS. -\tparam EdgeDescriptor a descriptor of edges of DS. -\tparam FaceDescriptor a descriptor of faces of DS. +\tparam DS a data structure of \cgal. +\tparam VertexDescriptor a descriptor of vertices of `DS`. +\tparam EdgeDescriptor a descriptor of edges of `DS`. +\tparam FaceDescriptor a descriptor of faces of `DS`. */ template ignore_vertex; - /// std::function that returns `true` if the given edge must be ignored, `false` otherwise. + /// `std::function` that returns `true` if the given edge must be ignored, `false` otherwise. /// Returns `true` by default. std::function ignore_edge; - /// std::function that returns `true` if the given face must be ignored, `false` otherwise. + /// `std::function` that returns `true` if the given face must be ignored, `false` otherwise. /// Returns `true` by default. std::function ignore_face; - /// std::function that returns `true` if the given vertex is colored, `false` otherwise. + /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. std::function colored_vertex; - /// std::function that returns `true` if the given edge is colored, `false` otherwise. + /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. /// Returns `false` by default. std::function colored_edge; - /// std::function that returns `true` if the given face is colored, `false` otherwise. + /// `std::function` that returns `true` if the given face is colored, `false` otherwise. /// Returns `false` by default. std::function colored_face; - /// std::function that returns `true` if the given face is in wireframe, `false` otherwise. + /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. /// Returns `false` by default. std::function face_wireframe; - /// std::function that returns the color of the given vertex. + /// `std::function` that returns the color of the given vertex. /// nullptr by default. std::function vertex_color; - /// std::function that returns the color of the given edge. + /// `std::function` that returns the color of the given edge. /// nullptr by default. std::function edge_color; - /// std::function that returns the color of the given face. + /// `std::function` that returns the color of the given face. /// nullptr by default. std::function face_color; @@ -65,7 +65,7 @@ struct Cell_parameters /// Ignore all edges when `b` is `true`; otherwise ignore only edges for which `ignore_edge` returns `true`. void ignore_all_vertices(bool b); - + /// Ignore all faces when `b` is `true`; otherwise ignore only faces for which `ignore_face` returns `true`. void ignore_all_vertices(bool b); }; @@ -73,14 +73,14 @@ struct Cell_parameters /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data-structure of CGAL are considered, for a data-structure that contains volumes. -The different std::function can be modified to change for example the behavior of the drawing. +The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data-structure of \cgal are considered, for a data-structure that contains volumes. +The different `std::function` can be modified to change for example the behavior of the drawing. -\tparam DS a data structure of CGAL. -\tparam VertexDescriptor a descriptor of vertices of DS. -\tparam EdgeDescriptor a descriptor of edges of DS. -\tparam FaceDescriptor a descriptor of faces of DS. -\tparam VolumeDescriptor a descriptor of volumes of DS. +\tparam DS a data structure of \cgal. +\tparam VertexDescriptor a descriptor of vertices of `DS`. +\tparam EdgeDescriptor a descriptor of edges of `DS`. +\tparam FaceDescriptor a descriptor of faces of `DS`. +\tparam VolumeDescriptor a descriptor of volumes of `DS`. */ @@ -94,19 +94,19 @@ struct Cell_parameters_with_volume : public Cell_parameters { public: - /// std::function that returns `true` if the given volume must be ignored, `false` otherwise. + /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. /// Returns `false` by default. std::function ignore_volume; - /// std::function that returns `true` if the given volume is colored, `false` otherwise. + /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. /// Returns `false` by default. std::function colored_volume; - /// std::function that returns `true` if the given volume is in wireframe, `false` otherwise. + /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. /// Returns `false` by default. std::function volume_wireframe; - /// std::function that returns the color of the given volume. + /// `std::function` that returns the color of the given volume. /// nullptr by default. std::function volume_color; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index bba0e545a23c..4043357754ac 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Graphic_storage` store points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and are triangulated internally. -\tparam BufferType the type used for point coordinates: float by default. +\tparam BufferType the type used for point coordinates: `float` by default. */ template @@ -29,20 +29,20 @@ class Graphic_storage { void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// add the given ray in the storage: an half line starting from p and having v as direction. + /// add the given ray in the storage: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); - /// add the given colored ray in the storage: an half line starting from p and having v as direction. + /// add the given colored ray in the storage: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// add the given line in the storage, defined by p and v as direction. + /// add the given line in the storage, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v); - /// add the given colored line in the storage, defined by p and v as direction. + /// add the given colored line in the storage, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); @@ -57,13 +57,16 @@ class Graphic_storage { bool is_a_face_started() const; /// add the given point in the current face. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp); /// add the given point in the current face, having the vertex normal. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); /// end the current face. + /// @pre `is_a_face_started()` void face_end(); /// add the given text at the given position in the storage. From cc03d2ccb3ec2b84e1344cb6de2921a323e7d1fb Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 24 Aug 2023 17:07:30 +0200 Subject: [PATCH 167/341] verbs with s --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 46 +++++++++---------- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 8 ++-- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 36 +++++++-------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index f5ed49c43526..9e4784823523 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -76,58 +76,58 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// negate the drawing of text (becomes `true` if it was `false` and reciprocally). void negate_draw_text(); - /// @return `true` if vertices are drawn. + /// return `true` if vertices are drawn. bool get_draw_vertices() const; - /// @return `true` if edges are drawn. + /// return `true` if edges are drawn. bool get_draw_edges() const; - /// @return `true` if rays are drawn. + /// return `true` if rays are drawn. bool get_draw_rays() const; - /// @return `true` if lines are drawn. + /// return `true` if lines are drawn. bool get_draw_lines() const; - /// @return `true` if faces are drawn. + /// return `true` if faces are drawn. bool get_draw_faces() const; - /// @return `true` if mono color mode is used. + /// return `true` if mono color mode is used. bool get_use_mono_color() const; - /// @return `true` if normal are reversed. + /// return `true` if normal are reversed. bool get_inverse_normal() const; - /// @return `true` if text are drawn. + /// return `true` if text are drawn. bool get_draw_text() const; - /// @return the mono color used for vertices. + /// return the mono color used for vertices. const CGAL::IO::Color& get_vertices_mono_color() const; - /// @return the mono color used for edges. + /// return the mono color used for edges. const CGAL::IO::Color& get_edges_mono_color() const; - /// @return the mono color used for rays. + /// return the mono color used for rays. const CGAL::IO::Color& get_rays_mono_color() const; - /// @return the mono color used for lines. + /// return the mono color used for lines. const CGAL::IO::Color& get_lines_mono_color() const; - /// @return the mono color used for faces. + /// return the mono color used for faces. const CGAL::IO::Color& get_faces_mono_color() const; /// clear the basic viewer, i.e. remove all its elements. void clear(); - /// @return `true` if the viewer is empty. + /// return `true` if the viewer is empty. bool is_empty() const; - /// @return the bounding box of all the elements in the viewer. + /// return the bounding box of all the elements in the viewer. const CGAL::Bbox_3& bounding_box() const; - /// @return `true` if the clipping plane is enabled. + /// return `true` if the clipping plane is enabled. bool is_clipping_plane_enabled() const; - /// @return the clipping plane when it is enabled. + /// return the clipping plane when it is enabled. Local_kernel::Plane_3 clipping_plane() const; /// add the given point in the viewer. @@ -171,7 +171,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// start a new colored face. void face_begin(const CGAL::IO::Color &acolor); - /// @return `true` iff a face is started. + /// return `true` iff a face is started. bool is_a_face_started() const; /// add the given point in the current face. @@ -195,10 +195,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_text(const KPoint &kp, const std::string &txt); - /// @return the graphic storage of the viewer. + /// return the graphic storage of the viewer. Graphic_storage& get_graphic_storage(); - /// @return the graphic storage of the viewer, const version. + /// return the graphic storage of the viewer, const version. const Graphic_storage& get_graphic_storage() const; /// negate all normal of vertices and faces. @@ -232,14 +232,14 @@ template class QApplication_and_basic_viewer { public: - /// Constructor given a Graphic_storage and possibly a title. + /// constructs given a Graphic_storage and possibly a title. QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, const char* title="CGAL Basic Viewer"); - /// run the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. + /// runs the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); - /// @return a reference to the `Basic_viewer_qt` associated with this. + /// returns a reference to the `Basic_viewer_qt` associated with this. Basic_viewer_qt& basic_viewer(); }; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 1a7435f152b6..8e456f3cc947 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -60,13 +60,13 @@ struct Cell_parameters /// nullptr by default. std::function face_color; - /// Ignore all vertices when `b` is `true`; otherwise ignore only vertices for which `ignore_vertex` returns `true`. + /// ignores all vertices when `b` is `true`; otherwise ignore only vertices for which `ignore_vertex` returns `true`. void ignore_all_vertices(bool b); - /// Ignore all edges when `b` is `true`; otherwise ignore only edges for which `ignore_edge` returns `true`. + /// ignores all edges when `b` is `true`; otherwise ignore only edges for which `ignore_edge` returns `true`. void ignore_all_vertices(bool b); - /// Ignore all faces when `b` is `true`; otherwise ignore only faces for which `ignore_face` returns `true`. + /// ignores all faces when `b` is `true`; otherwise ignore only faces for which `ignore_face` returns `true`. void ignore_all_vertices(bool b); }; @@ -110,7 +110,7 @@ struct Cell_parameters_with_volume : /// nullptr by default. std::function volume_color; - /// Ignore all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume` returns `true`. + /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume` returns `true`. void ignore_all_volumes(bool b); }; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index 4043357754ac..8eb01c754cb8 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Graphic_storage` store points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added, and are triangulated internally. +The class `Graphic_storage` stores points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. \tparam BufferType the type used for point coordinates: `float` by default. @@ -12,55 +12,55 @@ The class `Graphic_storage` store points, segments, triangles, rays and lines. E template class Graphic_storage { public: - /// add the given point in the storage. + /// adds the given point in the storage. template void add_point(const KPoint &p); - /// add the given colored point in the storage. + /// adds the given colored point in the storage. template void add_point(const KPoint &p, const CGAL::IO::Color &acolor); - /// add the given segment in the storage. + /// adds the given segment in the storage. template void add_segment(const KPoint &p1, const KPoint &p2); - /// add the given colored segment in the storage. + /// adds the given colored segment in the storage. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// add the given ray in the storage: an half line starting from `p` and having `v` as direction. + /// adds the given ray in the storage: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); - /// add the given colored ray in the storage: an half line starting from `p` and having `v` as direction. + /// adds the given colored ray in the storage: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// add the given line in the storage, defined by `p` and `v` as direction. + /// adds the given line in the storage, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v); - /// add the given colored line in the storage, defined by `p` and `v` as direction. + /// adds the given colored line in the storage, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// start a new face. + /// starts a new face. void face_begin(); - /// start a new colored face. + /// starts a new colored face. void face_begin(const CGAL::IO::Color &acolor); - /// @return `true` iff a face is started. + /// return `true` iff a face is started. bool is_a_face_started() const; - /// add the given point in the current face. + /// adds the given point in the current face. /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp); - /// add the given point in the current face, having the vertex normal. + /// adds the given point in the current face, having the vertex normal. /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); @@ -69,18 +69,18 @@ class Graphic_storage { /// @pre `is_a_face_started()` void face_end(); - /// add the given text at the given position in the storage. + /// adds the given text at the given position in the storage. template void add_text(const KPoint &kp, const char *txt); - /// add the given text at the given position in the storage. + /// adds the given text at the given position in the storage. template void add_text(const KPoint &kp, const std::string &txt); - /// @return `true` iff the storage has no element. + /// returns `true` iff the storage has no element. bool is_empty() const; - /// clear the storage, i.e. remove all points, segments, triangles and text. + /// clears the storage, i.e. remove all points, segments, triangles and text. void clear(); }; From f3e3fcd84a3e16762283db5e6b91116fc66e945f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 24 Aug 2023 17:08:58 +0200 Subject: [PATCH 168/341] data structure --- Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 8e456f3cc947..a66210b8dfae 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters` is used to tune the way that the cells of a given data-structure of \cgal are considered. +The class `Cell_parameters` is used to tune the way that the cells of a given data structure of \cgal are considered. The different `std::function` can be modified to change for example the behavior of the drawing. \tparam DS a data structure of \cgal. @@ -73,7 +73,7 @@ struct Cell_parameters /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data-structure of \cgal are considered, for a data-structure that contains volumes. +The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data structure of \cgal are considered, for a data structure that contains volumes. The different `std::function` can be modified to change for example the behavior of the drawing. \tparam DS a data structure of \cgal. From b0691143fd12bbe25e988905d558d8d03040ce67 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 24 Aug 2023 17:24:15 +0200 Subject: [PATCH 169/341] more s --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index 9e4784823523..aa9fc1d13310 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -13,207 +13,207 @@ template class Basic_viewer_qt : public CGAL::QGLViewer { public: - /// constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphic_storage`. + /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphic_storage`. /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, Graphic_storage& buf, const char* title=""); - /// enable or disable the drawing of vertices. + /// enables or disables the drawing of vertices. void set_draw_vertices(bool b); - /// enable or disable the drawing of edges. + /// enables or disables the drawing of edges. void set_draw_edges(bool b); - /// enable or disable the drawing of rays. + /// enables or disables the drawing of rays. void set_draw_rays(bool b); - /// enable or disable the drawing of lines. + /// enables or disables the drawing of lines. void set_draw_lines(bool b); - /// enable or disable the drawing of faces. + /// enables or disables the drawing of faces. void set_draw_faces(bool b); - /// enable or disable the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). + /// enables or disables the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). void set_use_mono_color(bool b); - /// enable or disable the drawing of texts. + /// enables or disables the drawing of texts. void set_draw_text(bool b); - /// set the color used for vertices in mono_color mode. + /// sets the color used for vertices in mono_color mode. void set_vertices_mono_color(const CGAL::IO::Color& c); - /// set the color used for edges in mono_color mode. + /// sets the color used for edges in mono_color mode. void set_edges_mono_color(const CGAL::IO::Color& c); - /// set the color used for rays in mono_color mode. + /// sets the color used for rays in mono_color mode. void set_rays_mono_color(const CGAL::IO::Color& c); - /// set the color used for lines in mono_color mode. + /// sets the color used for lines in mono_color mode. void set_lines_mono_color(const CGAL::IO::Color& c); - /// set the color used for faces in mono_color mode. + /// sets the color used for faces in mono_color mode. void set_faces_mono_color(const CGAL::IO::Color& c); - /// negate the drawing of vertices (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of vertices (becomes `true` if it was `false` and reciprocally). void negate_draw_vertices(); - /// negate the drawing of edges (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of edges (becomes `true` if it was `false` and reciprocally). void negate_draw_edges(); - /// negate the drawing of rays (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of rays (becomes `true` if it was `false` and reciprocally). void negate_draw_rays(); - /// negate the drawing of lines (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of lines (becomes `true` if it was `false` and reciprocally). void negate_draw_lines(); - /// negate the drawing of faces (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of faces (becomes `true` if it was `false` and reciprocally). void negate_draw_faces(); - /// negate the use of mono color mode (becomes `true` if it was `false` and reciprocally). + /// negates the use of mono color mode (becomes `true` if it was `false` and reciprocally). void negate_use_mono_color(); - /// negate the drawing of text (becomes `true` if it was `false` and reciprocally). + /// negates the drawing of text (becomes `true` if it was `false` and reciprocally). void negate_draw_text(); - /// return `true` if vertices are drawn. + /// returns `true` if vertices are drawn. bool get_draw_vertices() const; - /// return `true` if edges are drawn. + /// returns `true` if edges are drawn. bool get_draw_edges() const; - /// return `true` if rays are drawn. + /// returns `true` if rays are drawn. bool get_draw_rays() const; - /// return `true` if lines are drawn. + /// returns `true` if lines are drawn. bool get_draw_lines() const; - /// return `true` if faces are drawn. + /// returns `true` if faces are drawn. bool get_draw_faces() const; - /// return `true` if mono color mode is used. + /// returns `true` if mono color mode is used. bool get_use_mono_color() const; - /// return `true` if normal are reversed. + /// returns `true` if normal are reversed. bool get_inverse_normal() const; - /// return `true` if text are drawn. + /// returns `true` if text are drawn. bool get_draw_text() const; - /// return the mono color used for vertices. + /// returns the mono color used for vertices. const CGAL::IO::Color& get_vertices_mono_color() const; - /// return the mono color used for edges. + /// returns the mono color used for edges. const CGAL::IO::Color& get_edges_mono_color() const; - /// return the mono color used for rays. + /// returns the mono color used for rays. const CGAL::IO::Color& get_rays_mono_color() const; - /// return the mono color used for lines. + /// returns the mono color used for lines. const CGAL::IO::Color& get_lines_mono_color() const; - /// return the mono color used for faces. + /// returns the mono color used for faces. const CGAL::IO::Color& get_faces_mono_color() const; - /// clear the basic viewer, i.e. remove all its elements. + /// clears the basic viewer, i.e. remove all its elements. void clear(); - /// return `true` if the viewer is empty. + /// returns `true` if the viewer is empty. bool is_empty() const; - /// return the bounding box of all the elements in the viewer. + /// returns the bounding box of all the elements in the viewer. const CGAL::Bbox_3& bounding_box() const; - /// return `true` if the clipping plane is enabled. + /// returns `true` if the clipping plane is enabled. bool is_clipping_plane_enabled() const; - /// return the clipping plane when it is enabled. + /// returns the clipping plane when it is enabled. Local_kernel::Plane_3 clipping_plane() const; - /// add the given point in the viewer. + /// adds the given point in the viewer. template void add_point(const KPoint &p); - /// add the given colored point in the viewer. + /// adds the given colored point in the viewer. template void add_point(const KPoint &p, const CGAL::IO::Color &acolor); - /// add the given segment in the viewer. + /// adds the given segment in the viewer. template void add_segment(const KPoint &p1, const KPoint &p2); - /// add the given colored segment in the viewer. + /// adds the given colored segment in the viewer. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// add the given ray in the viewer: an half line starting from `p` and having `v` as direction. + /// adds the given ray in the viewer: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); - /// add the given colored ray in the viewer: an half line starting from `p` and having `v` as direction. + /// adds the given colored ray in the viewer: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// add the given line in the viewer, defined by `p` and `v` as direction. + /// adds the given line in the viewer, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v); - /// add the given colored line in the viewer, defined by `p` and `v` as direction. + /// adds the given colored line in the viewer, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// start a new face. + /// starts a new face. void face_begin(); - /// start a new colored face. + /// starts a new colored face. void face_begin(const CGAL::IO::Color &acolor); - /// return `true` iff a face is started. + /// returns `true` iff a face is started. bool is_a_face_started() const; - /// add the given point in the current face. - /// @pre `is_a_face_started()` + /// adds the given point in the current face. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp); - /// add the given point in the current face, having the vertex normal. - /// @pre `is_a_face_started()` + /// adds the given point in the current face, having the vertex normal. + /// @pre `is_a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); - /// end the current face. - /// @pre `is_a_face_started()` + /// ends the current face. + /// @pre `is_a_face_started()` void face_end(); - /// add the given text at the given position in the viewer. + /// adds the given text at the given position in the viewer. template void add_text(const KPoint &kp, const char *txt); - /// add the given text at the given position in the viewer. + /// adds the given text at the given position in the viewer. template void add_text(const KPoint &kp, const std::string &txt); - /// return the graphic storage of the viewer. + /// returns the graphic storage of the viewer. Graphic_storage& get_graphic_storage(); - /// return the graphic storage of the viewer, const version. + /// returns the graphic storage of the viewer, const version. const Graphic_storage& get_graphic_storage() const; - /// negate all normal of vertices and faces. + /// negates all normal of vertices and faces. void negate_all_normals(); - // \return true if the data structure in in 2D, i.e. lies on a plane. + /// returns true if the data structure in in 2D, i.e. lies on a plane. bool is_two_dimensional() const; - /// draw the viewer without recomputing all internal buffers. + /// draws the viewer without recomputing all internal buffers. virtual void draw(); - /// redraw the viewer, i.e. recompute all internal buffers and update the window. + /// redraws the viewer, i.e. recompute all internal buffers and update the window. virtual void redraw(); - /// function called when a key is pressed. Users can define their own function in order + /// Function called when a key is pressed. Users can define their own function in order /// to add specific behavior. std::function *)> on_key_pressed; }; @@ -232,11 +232,11 @@ template class QApplication_and_basic_viewer { public: - /// constructs given a Graphic_storage and possibly a title. + /// Constructor given a `Graphic_storage` and possibly a title. QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, const char* title="CGAL Basic Viewer"); - /// runs the QApplication, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. + /// runs the `QApplication`, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); /// returns a reference to the `Basic_viewer_qt` associated with this. From 1b651f14885537fa0e86214351938884d9bcc0b5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 11 Sep 2023 16:30:44 +0200 Subject: [PATCH 170/341] Doc following Sebastien remarks --- .../doc/Basic_viewer/CGAL/Drawing_functor.h | 2 +- .../doc/Basic_viewer/CGAL/Graphic_storage.h | 2 +- .../doc/Basic_viewer/PackageDescription.txt | 28 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index a66210b8dfae..631cf2c14657 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -84,7 +84,7 @@ The different `std::function` can be modified to change for example the behavior */ -// Cell parameters for a 3D data structure (with vertices, edges, faces and volumes) +// Cell parameters for a volumic data structure (with vertices, edges, faces and volumes) template diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index d5a338e9ebbb..d002f4186e6e 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -35,20 +35,20 @@ \cgalCRPSubsection{Draw for Different Packages} -- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::draw() \endlink -- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::draw() \endlink -- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::draw() \endlink -- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink -- Point_set_3 \link PkgDrawPointSet3D CGAL::draw() \endlink -- Polygon_2 \link PkgDrawPolygon2 CGAL::draw() \endlink -- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::draw() \endlink -- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::draw() \endlink -- Polyhedron_3 \link PkgDrawPolyhedron CGAL::draw() \endlink -- Surface_mesh \link PkgDrawSurfaceMesh CGAL::draw() \endlink -- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink -- Triangulation_2 \link PkgDrawTriangulation2 CGAL::draw() \endlink -- Triangulation_3 \link PkgDrawTriangulation3 CGAL::draw() \endlink -- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink +- `Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink +- `Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- `Nef_polyhedron_3` \link PkgDrawNef3 CGAL::draw() \endlink +- `Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- `Point_set_3` \link PkgDrawPointSet3D CGAL::draw() \endlink +- `Polygon_2` \link PkgDrawPolygon2 CGAL::draw() \endlink +- `Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::draw() \endlink +- `Polygon_with_holes_2` \link PkgDrawPolygonWithHoles2 CGAL::draw() \endlink +- `Polyhedron_3` \link PkgDrawPolyhedron CGAL::draw() \endlink +- `Surface_mesh` \link PkgDrawSurfaceMesh CGAL::draw() \endlink +- `Surface_mesh_topology` \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink +- `Triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink +- `Triangulation_3` \link PkgDrawTriangulation3 CGAL::draw() \endlink +- `Voronoi_diagram_2` \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink \cgalCRPSubsection{Fill Graphic Storage for Different Packages} From 0ee25cd11c347054764cb828fc63bbb8b7504395 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 25 Sep 2023 08:51:49 +0200 Subject: [PATCH 171/341] After Andreas review --- Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h | 6 +++--- Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h index 631cf2c14657..79fa49f64c9f 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h @@ -60,13 +60,13 @@ struct Cell_parameters /// nullptr by default. std::function face_color; - /// ignores all vertices when `b` is `true`; otherwise ignore only vertices for which `ignore_vertex` returns `true`. + /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex` returns `true`. void ignore_all_vertices(bool b); - /// ignores all edges when `b` is `true`; otherwise ignore only edges for which `ignore_edge` returns `true`. + /// ignores all edges when `b` is `true`; otherwise ignores only edges for which `ignore_edge` returns `true`. void ignore_all_vertices(bool b); - /// ignores all faces when `b` is `true`; otherwise ignore only faces for which `ignore_face` returns `true`. + /// ignores all faces when `b` is `true`; otherwise ignores only faces for which `ignore_face` returns `true`. void ignore_all_vertices(bool b); }; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h index d15eefe94248..7c1a7e5bdfa2 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h @@ -80,7 +80,7 @@ class Graphic_storage { /// returns `true` iff the storage has no element. bool is_empty() const; - /// clears the storage, i.e. remove all points, segments, triangles and text. + /// clears the storage, i.e. removes all points, segments, triangles and text. void clear(); }; From ebd13c85515cd594a08398418ed729ce5a40288e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 09:13:44 +0200 Subject: [PATCH 172/341] Rename Drawing_functor in Graphics_scene_options (following Andreas and Sebastien review) --- BGL/include/CGAL/draw_face_graph.h | 55 +++++++++---------- .../Basic_viewer/draw_mesh_and_points.cpp | 8 +-- .../Basic_viewer/draw_several_windows.cpp | 2 +- .../Basic_viewer/draw_surface_mesh_height.cpp | 17 +++--- .../draw_surface_mesh_small_faces.cpp | 37 ++++++------- ...ing_functor.h => Graphics_scene_options.h} | 21 ++++--- Point_set_3/include/CGAL/draw_point_set_3.h | 38 ++++++------- Polyhedron/include/CGAL/draw_polyhedron.h | 14 ++--- Surface_mesh/include/CGAL/draw_surface_mesh.h | 24 ++++---- 9 files changed, 111 insertions(+), 105 deletions(-) rename Basic_viewer/include/CGAL/{Drawing_functor.h => Graphics_scene_options.h} (86%) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index fd370e25c47b..f7b9efb4abb9 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -15,7 +15,7 @@ #define CGAL_DRAW_FACE_GRAPH_H #include -#include +#include #include #include #include @@ -24,10 +24,10 @@ namespace CGAL { namespace draw_function_for_FG { -template +template void compute_elements(const FG &fg, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &m_drawing_functor) + const GSOptions &m_gs_options) { using Point=typename boost::property_map_value::type; using Kernel = typename CGAL::Kernel_traits::Kernel; @@ -48,7 +48,7 @@ void compute_elements(const FG &fg, get(point_pmap, target(h, fg))), Vector(get(point_pmap, target(h, fg)), get(point_pmap, target(next(h, fg), fg)))); - if (ni != NULL_VECTOR) + if (ni!=NULL_VECTOR) { n += ni; ++i; @@ -58,15 +58,15 @@ void compute_elements(const FG &fg, put(vnormals, v, n / i); } - if (m_drawing_functor.are_faces_enabled()) + if (m_gs_options.are_faces_enabled()) { for (auto fh : faces(fg)) { if (fh != boost::graph_traits::null_face() && // face exists - !m_drawing_functor.face_wireframe(fg, fh) && // face is not wireframe - m_drawing_functor.colored_face(fg, fh)) // and face is colored + !m_gs_options.face_wireframe(fg, fh) && // face is not wireframe + m_gs_options.colored_face(fg, fh)) // and face is colored { - graphic_storage.face_begin(m_drawing_functor.face_color(fg, fh)); + graphic_storage.face_begin(m_gs_options.face_color(fg, fh)); auto hd = halfedge(fh, fg); const auto first_hd = hd; do @@ -81,15 +81,15 @@ void compute_elements(const FG &fg, } } - if(m_drawing_functor.are_edges_enabled()) + if(m_gs_options.are_edges_enabled()) { for (auto e : edges(fg)) { - if(m_drawing_functor.colored_edge(fg, e)) // edge is colored + if(m_gs_options.colored_edge(fg, e)) // edge is colored { graphic_storage.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), - m_drawing_functor.edge_color(fg, e)); + m_gs_options.edge_color(fg, e)); } else { @@ -99,14 +99,14 @@ void compute_elements(const FG &fg, } } - if(m_drawing_functor.are_vertices_enabled()) + if(m_gs_options.are_vertices_enabled()) { for (auto v : vertices(fg)) { - if(m_drawing_functor.colored_vertex(fg, v)) // vertex is colored + if(m_gs_options.colored_vertex(fg, v)) // vertex is colored { graphic_storage.add_point(get(point_pmap, v), - m_drawing_functor.vertex_color(fg, v)); + m_gs_options.vertex_color(fg, v)); } else { @@ -118,30 +118,29 @@ void compute_elements(const FG &fg, } // draw_function_for_FG -template +template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &drawing_functor) + CGAL::Graphic_storage &graphic_storage, + const GSOptions &gs_options) { - draw_function_for_FG::compute_elements(fg, graphic_storage, drawing_functor); + draw_function_for_FG::compute_elements(fg, graphic_storage, gs_options); } template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphic_storage &graphic_storage) { - Drawing_functor::vertex_descriptor, - typename boost::graph_traits::edge_descriptor, - typename boost::graph_traits::face_descriptor> - drawing_functor; + Graphics_scene_options::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor> + gs_options; - drawing_functor.colored_face = [](const FG&, + gs_options.colored_face = [](const FG&, typename boost::graph_traits::face_descriptor) -> bool { return true; }; - - drawing_functor.face_color = [] (const FG&, + gs_options.face_color = [] (const FG&, typename boost::graph_traits::face_descriptor fh) -> CGAL::IO::Color { if (fh==boost::graph_traits::null_face()) @@ -151,7 +150,7 @@ void add_in_graphic_storage_for_fg(const FG &fg, return get_random_color(CGAL::get_default_random()); }; - add_in_graphic_storage_for_fg(fg, graphic_storage, drawing_functor); + add_in_graphic_storage_for_fg(fg, graphic_storage, gs_options); } } // End namespace CGAL diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index d230becb9d9f..200f4b0928b7 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -17,9 +17,9 @@ typedef CGAL::Polyhedron_3 Polyhedron; using PS3=CGAL::Point_set_3; struct Drawing_functor_green_points: - public CGAL::Drawing_functor + public CGAL::Graphics_scene_options { bool colored_vertex(const PS3&, typename PS3::const_iterator) const { return true; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 0fae3870c9d2..7a6a3497996e 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index 9c72bf2feaf0..851518b2e861 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -1,17 +1,18 @@ #include #include #include -#include +#include #include -typedef CGAL::Simple_cartesian Kernel; -typedef Kernel::Point_3 Point; -typedef CGAL::Surface_mesh Mesh; +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point; +typedef CGAL::Surface_mesh Mesh; -struct Colored_faces_given_height: public CGAL::Drawing_functor +struct Colored_faces_given_height: + public CGAL::Graphics_scene_options { Colored_faces_given_height(const Mesh& sm) { diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 231290527076..d22cd1287062 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -14,19 +14,18 @@ typedef Mesh::Face_index face_descriptor; typedef K::FT FT; template -struct Drawing_functor_small_faces: - public CGAL::Drawing_functor::vertex_descriptor, typename boost::graph_traits::edge_descriptor, typename boost::graph_traits::face_descriptor> { - using Self=Drawing_functor_small_faces; - using Base=CGAL::Drawing_functor::vertex_descriptor, - typename boost::graph_traits::edge_descriptor, - typename boost::graph_traits::face_descriptor>; + using Base=CGAL::Graphics_scene_options::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor>; - Drawing_functor_small_faces(const SM& sm): Base(), m_sm(sm) + Graphics_scene_options_small_faces(const SM& sm): Base(), m_sm(sm) { typename SM::template Property_map faces_size; boost::tie(faces_size, m_with_size)=sm.template property_map("f:size"); @@ -99,37 +98,37 @@ int main(int argc, char* argv[]) for(face_descriptor fd : sm.faces()) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } - Drawing_functor_small_faces df(sm); + Graphics_scene_options_small_faces gsosm(sm); CGAL::Graphic_storage buffer; - add_in_graphic_storage(sm, buffer, df); + add_in_graphic_storage(sm, buffer, gsosm); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { app.basic_viewer().on_key_pressed= - [&sm, &df, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) { - df.m_threshold+=5; - if(df.m_threshold>100) { df.m_threshold=100; } + gsosm.m_threshold+=5; + if(gsosm.m_threshold>100) { gsosm.m_threshold=100; } basic_viewer->displayMessage - (QString("Small faces threshold=%1.").arg(df.m_threshold)); + (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); basic_viewer->clear(); - add_in_graphic_storage(sm, buffer, df); + add_in_graphic_storage(sm, buffer, gsosm); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - if(df.m_threshold<5) { df.m_threshold=0; } - else { df.m_threshold-=5; } + if(gsosm.m_threshold<5) { gsosm.m_threshold=0; } + else { gsosm.m_threshold-=5; } basic_viewer->displayMessage - (QString("Small faces threshold=%1.").arg(df.m_threshold)); + (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); basic_viewer->clear(); - add_in_graphic_storage(sm, buffer, df); + add_in_graphic_storage(sm, buffer, gsosm); basic_viewer->redraw(); } else diff --git a/Basic_viewer/include/CGAL/Drawing_functor.h b/Basic_viewer/include/CGAL/Graphics_scene_options.h similarity index 86% rename from Basic_viewer/include/CGAL/Drawing_functor.h rename to Basic_viewer/include/CGAL/Graphics_scene_options.h index ce69a05a45fc..37f9d39c6560 100644 --- a/Basic_viewer/include/CGAL/Drawing_functor.h +++ b/Basic_viewer/include/CGAL/Graphics_scene_options.h @@ -19,17 +19,24 @@ namespace CGAL { +template +struct Graphics_scene_options; + // Drawing functor for a 2D combinatorial data structure // (with vertices, edges and faces) template -struct Drawing_functor +struct Graphics_scene_options { - Drawing_functor(): m_enabled_vertices(true), - m_enabled_edges(true), - m_enabled_faces(true) + Graphics_scene_options(): m_enabled_vertices(true), + m_enabled_edges(true), + m_enabled_faces(true) { draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; draw_edge=[](const DS &, edge_handle)->bool { return true; }; @@ -82,10 +89,10 @@ template -struct Drawing_functor_with_volume : - public Drawing_functor +struct Graphics_scene_options: + public Graphics_scene_options { - Drawing_functor_with_volume() : m_enabled_volumes(true) + Graphics_scene_options() : m_enabled_volumes(true) { draw_volume=[](const DS &, volume_handle)->bool { return true; }; colored_volume=[](const DS &, volume_handle)->bool { return false; }; diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 32685b4b1acb..05ab50b83a73 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #ifdef DOXYGEN_RUNNING @@ -42,23 +42,23 @@ namespace CGAL { namespace draw_function_for_PointSet { -template +template void compute_elements(const PointSet& pointset, Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.are_vertices_enabled()) + if (!gs_options.are_vertices_enabled()) { return; } for (typename PointSet::const_iterator it=pointset.begin(); it!=pointset.end(); ++it) { - if(drawing_functor.draw_vertex(pointset, it)) + if(gs_options.draw_vertex(pointset, it)) { - if (drawing_functor.colored_vertex(pointset, it)) + if (gs_options.colored_vertex(pointset, it)) { graphic_storage.add_point(pointset.point(*it), - drawing_functor.vertex_color(pointset, it)); + gs_options.vertex_color(pointset, it)); } else { graphic_storage.add_point(pointset.point(*it)); } @@ -68,36 +68,36 @@ void compute_elements(const PointSet& pointset, } // namespace draw_function_for_PointSet -template +template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + Graphic_storage& graphic_storage, + const GSOptions& gs_options) { draw_function_for_PointSet::compute_elements(apointset, graphic_storage, - drawing_functor); + gs_options); } template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_storage) + Graphic_storage& graphic_storage) { - CGAL::Drawing_functor, - typename Point_set_3::const_iterator, - int, int> drawing_functor; - add_in_graphic_storage(apointset, graphic_storage, drawing_functor); + CGAL::Graphics_scene_options, + typename Point_set_3::const_iterator, + int, int> gs_options; + add_in_graphic_storage(apointset, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. - template + template void draw(const Point_set_3& apointset, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, const char *title="Point_set_3 Basic Viewer") { Graphic_storage buffer; - add_in_graphic_storage(apointset, buffer, drawing_functor); + add_in_graphic_storage(apointset, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 5157e5d0fa6b..59f087f6179f 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -33,11 +33,11 @@ template + class GSOptions> void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &drawing_functor) -{ add_in_graphic_storage_for_fg(apoly, graphic_storage, drawing_functor); } + const GSOptions &gs_options) +{ add_in_graphic_storage_for_fg(apoly, graphic_storage, gs_options); } template + class GSOptions> void draw(const CGAL_POLY_TYPE& apoly, - const DrawingFunctor &drawing_functor, + const GSOptions &gs_options, const char* title="Polyhedron Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage_for_fg(apoly, buffer, drawing_functor); + add_in_graphic_storage_for_fg(apoly, buffer, gs_options); draw_graphic_storage(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 72b83eff6ea9..dbcd8f86c732 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -31,7 +31,7 @@ void draw(const SM& asm); #include #include -#include +#include #include #include #include @@ -40,8 +40,8 @@ namespace CGAL { // Check if there are any color maps that could be used template -struct Drawing_functor_surface_mesh - : public Drawing_functor, +struct Graphics_scene_options_surface_mesh + : public Graphics_scene_options, typename boost::graph_traits<::CGAL::Surface_mesh>::vertex_descriptor, typename boost::graph_traits<::CGAL::Surface_mesh>::edge_descriptor, typename boost::graph_traits<::CGAL::Surface_mesh>::face_descriptor> @@ -51,7 +51,7 @@ struct Drawing_functor_surface_mesh using edge_descriptor = typename boost::graph_traits::edge_descriptor; using face_descriptor = typename boost::graph_traits::face_descriptor; - Drawing_functor_surface_mesh(const SM& amesh) + Graphics_scene_options_surface_mesh(const SM& amesh) { bool found=false; std::tie(vcolors, found)= @@ -94,17 +94,17 @@ struct Drawing_functor_surface_mesh typename SM::template Property_map fcolors; }; -template +template void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &drawing_functor) -{ add_in_graphic_storage_for_fg(amesh, graphic_storage, drawing_functor); } + CGAL::Graphic_storage &graphic_storage, + const GSOptions &gs_options) +{ add_in_graphic_storage_for_fg(amesh, graphic_storage, gs_options); } template void add_in_graphic_storage(const Surface_mesh& amesh, CGAL::Graphic_storage &graphic_storage) { add_in_graphic_storage_for_fg(amesh, graphic_storage, - Drawing_functor_surface_mesh(amesh)); } + Graphics_scene_options_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER @@ -118,13 +118,13 @@ void draw(const Surface_mesh& amesh, draw_graphic_storage(buffer, title); } -template +template void draw(const Surface_mesh& amesh, - const DrawingFunctor &drawing_functor, + const GSOptions &gs_options, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(amesh, buffer, drawing_functor); + add_in_graphic_storage(amesh, buffer, gs_options); draw_graphic_storage(buffer, title); } From 5cf89dadd9bc539849205fe29ac23ee3b20c9c45 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 09:51:12 +0200 Subject: [PATCH 173/341] Rename Drawing_functor in Graphics_scene_options (following Andreas and Sebastien review) --- .../Basic_viewer/draw_mesh_and_points.cpp | 4 +- .../CGAL/draw_linear_cell_complex.h | 8 +- .../include/CGAL/draw_linear_cell_complex.h | 110 +++++++-------- Nef_3/include/CGAL/draw_nef_3.h | 66 ++++----- .../CGAL/draw_periodic_2_triangulation_2.h | 110 +++++++-------- Polygon/include/CGAL/draw_polygon_2.h | 50 +++---- .../include/CGAL/draw_polygon_with_holes_2.h | 66 ++++----- .../include/CGAL/draw_straight_skeleton_2.h | 68 +++++----- .../Surface_mesh_topology/draw_facewidth.h | 8 +- .../include/CGAL/draw_face_graph_with_paths.h | 58 ++++---- .../polygon_triangulation_drawing_functor.h | 20 +-- .../CGAL/draw_constrained_triangulation_2.h | 2 +- .../include/CGAL/draw_triangulation_2.h | 62 ++++----- .../include/CGAL/draw_triangulation_3.h | 70 +++++----- .../include/CGAL/draw_voronoi_diagram_2.h | 126 +++++++++--------- 15 files changed, 414 insertions(+), 414 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 200f4b0928b7..efb13259a371 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -16,7 +16,7 @@ typedef std::pair Pwn; typedef CGAL::Polyhedron_3 Polyhedron; using PS3=CGAL::Point_set_3; -struct Drawing_functor_green_points: +struct Graphics_scene_options_green_points: public CGAL::Graphics_scene_options @@ -55,7 +55,7 @@ int main(void) { point_set.insert(it.first); } CGAL::Graphic_storage graphic_buffer; - CGAL::add_in_graphic_storage(point_set, graphic_buffer, Drawing_functor_green_points()); + CGAL::add_in_graphic_storage(point_set, graphic_buffer, Graphics_scene_options_green_points()); CGAL::add_in_graphic_storage(output_mesh, graphic_buffer); CGAL::draw_graphic_storage(graphic_buffer); } diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index aee6357e36ef..7d5ccbad9cc6 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -9,16 +9,16 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 \param alcc the linear cell complex to draw. */ - template - void draw(const LCC& alcc, const DrawingFunctor& afunctor); + template + void draw(const LCC& alcc, const GSOptions& gs_options); /*! \ingroup PkgDrawLinearCellComplex */ - template + template void add_in_graphic_storage(const LCC& alcc, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& afunctor); + const GSOptions& gs_options); } /* namespace CGAL */ diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 1334cf8e7537..4942bef58143 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -57,15 +57,15 @@ struct LCC_geom_utils } }; -template +template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctorLCC& drawing_functor) + const GSOptionsLCC& gs_options) { - if (!drawing_functor.are_faces_enabled() || - !drawing_functor.draw_face(lcc, dh)) + if (!gs_options.are_faces_enabled() || + !gs_options.draw_face(lcc, dh)) { return; } // We fill only closed faces. @@ -78,13 +78,13 @@ void compute_face(const LCC& lcc, } while (cur!=dh); - if (drawing_functor.colored_volume(lcc, voldh)) + if (gs_options.colored_volume(lcc, voldh)) { - graphic_storage.face_begin(drawing_functor.volume_color(lcc, voldh)); + graphic_storage.face_begin(gs_options.volume_color(lcc, voldh)); } - else if (drawing_functor.colored_face(lcc, dh)) + else if (gs_options.colored_face(lcc, dh)) { - graphic_storage.face_begin(drawing_functor.face_color(lcc, dh)); + graphic_storage.face_begin(gs_options.face_color(lcc, dh)); } else { graphic_storage.face_begin(); } @@ -102,53 +102,53 @@ void compute_face(const LCC& lcc, graphic_storage.face_end(); } -template +template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.are_edges_enabled() || - !drawing_functor.draw_edge(lcc, dh)) + if (!gs_options.are_edges_enabled() || + !gs_options.draw_edge(lcc, dh)) { return; } const typename LCC::Point& p1=lcc.point(dh); typename LCC::Dart_const_handle d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (drawing_functor.colored_edge(lcc, dh)) + if (gs_options.colored_edge(lcc, dh)) { graphic_storage.add_segment(p1, lcc.point(d2), - drawing_functor.edge_color(lcc, dh)); + gs_options.edge_color(lcc, dh)); } else { graphic_storage.add_segment(p1, lcc.point(d2)); } } } -template +template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctorLCC& drawing_functor) + const GSOptionsLCC& gs_options) { - if (!drawing_functor.are_vertices_enabled() || - !drawing_functor.draw_vertex(lcc, dh)) + if (!gs_options.are_vertices_enabled() || + !gs_options.draw_vertex(lcc, dh)) { return; } - if (drawing_functor.colored_vertex(lcc, dh)) + if (gs_options.colored_vertex(lcc, dh)) { graphic_storage.add_point(lcc.point(dh), - drawing_functor.vertex_color(lcc, dh)); + gs_options.vertex_color(lcc, dh)); } else { graphic_storage.add_point(lcc.point(dh)); } } -template +template void compute_elements(const LCC& lcc, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { typename LCC::size_type markvolumes = lcc.get_new_mark(); typename LCC::size_type markfaces = lcc.get_new_mark(); @@ -162,7 +162,7 @@ void compute_elements(const LCC& lcc, itend=lcc.darts().end(); it!=itend; ++it) { if (!lcc.is_marked(it, markvolumes) && - drawing_functor.draw_volume(lcc, it)) + gs_options.draw_volume(lcc, it)) { for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator itv=lcc.template darts_of_cell_basic<3>(it, markvolumes).begin(), @@ -172,13 +172,13 @@ void compute_elements(const LCC& lcc, lcc.mark(itv, markvolumes); if (!lcc.is_marked(itv, markfaces) && lcc.is_marked(itv, oriented_mark) && - drawing_functor.draw_face(lcc, itv)) + gs_options.draw_face(lcc, itv)) { - if ((!drawing_functor.volume_wireframe(lcc, itv) || + if ((!gs_options.volume_wireframe(lcc, itv) || (!lcc.template is_free<3>(itv) && - !drawing_functor.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && - !drawing_functor.face_wireframe(lcc, itv)) - { compute_face(lcc, itv, it, graphic_storage, drawing_functor); } + !gs_options.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && + !gs_options.face_wireframe(lcc, itv)) + { compute_face(lcc, itv, it, graphic_storage, gs_options); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator itf=lcc.template darts_of_cell_basic<2>(itv, markfaces).begin(), itfend=lcc.template darts_of_cell_basic<2>(itv, markfaces).end(); @@ -186,9 +186,9 @@ void compute_elements(const LCC& lcc, { lcc.mark(itf, markfaces); if (!lcc.is_marked(itf, markedges) && - drawing_functor.draw_edge(lcc, itf)) + gs_options.draw_edge(lcc, itf)) { - compute_edge(lcc, itf, graphic_storage, drawing_functor); + compute_edge(lcc, itf, graphic_storage, gs_options); for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator ite=lcc.template darts_of_cell_basic<1>(itf, markedges).begin(), iteend=lcc.template darts_of_cell_basic<1>(itf, markedges).end(); @@ -196,9 +196,9 @@ void compute_elements(const LCC& lcc, { lcc.mark(ite, markedges); if (!lcc.is_marked(ite, markvertices) && - drawing_functor.draw_vertex(lcc, ite)) + gs_options.draw_vertex(lcc, ite)) { - compute_vertex(lcc, ite, graphic_storage, drawing_functor); + compute_vertex(lcc, ite, graphic_storage, gs_options); CGAL::mark_cell(lcc, ite, markvertices); } } @@ -233,22 +233,22 @@ void compute_elements(const LCC& lcc, Map, Refs, Storage_> // add_in_graphic_storage: to add a LCC in the given graphic buffer, with a -// drawing functor. +// graphics scene options. template class Map, class Refs, class Storage_, - typename BufferType=float, class DrawingFunctor> + typename BufferType=float, class GSOptions> void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { draw_function_for_lcc::compute_elements(static_cast(alcc), - graphic_storage, drawing_functor); + graphic_storage, gs_options); } // add_in_graphic_storage: to add a LCC in the given graphic buffer, without a -// drawing functor. Use default drawing values. +// graphics scene options. Use default drawing values. template class Map, @@ -256,44 +256,44 @@ template& graphic_storage) { - CGAL::Drawing_functor_with_volume - drawing_functor_with_volume; - - drawing_functor_with_volume.colored_volume = [](const CGAL_LCC_TYPE&, - typename CGAL_LCC_TYPE::Dart_const_handle) -> bool + CGAL::Graphics_scene_options + gs_options; + + gs_options.colored_volume = [](const CGAL_LCC_TYPE&, + typename CGAL_LCC_TYPE::Dart_const_handle) -> bool { return true; }; - drawing_functor_with_volume.volume_color = [] (const CGAL_LCC_TYPE& alcc, - typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color + gs_options.volume_color = [] (const CGAL_LCC_TYPE& alcc, + typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color { CGAL::Random random((unsigned int)(alcc.darts().index(dh))); return get_random_color(random); }; - add_in_graphic_storage(alcc, graphic_storage, drawing_functor_with_volume); + add_in_graphic_storage(alcc, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER -// Specialization of draw function for a LCC, with a drawing functor. +// Specialization of draw function for a LCC, with a drawing graphics scene options. template class Map, class Refs, class Storage_, - class DrawingFunctor> -void draw(const CGAL_LCC_TYPE& alcc, const DrawingFunctor& drawing_functor, + class GSOptions> +void draw(const CGAL_LCC_TYPE& alcc, const GSOptions& gs_options, const char *title="LCC Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(alcc, buffer, drawing_functor); + add_in_graphic_storage(alcc, buffer, gs_options); draw_graphic_storage(buffer, title); } -// Specialization of draw function for a LCC, without a drawing functor. +// Specialization of draw function for a LCC, without a graphics scene options. template class Map, diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 945f485ae0e1..29a142ede127 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -81,7 +81,7 @@ Local_vector get_vertex_normal(typename Nef_Polyhedron::Vertex_const_handle vh) } // Visitor class to iterate through shell objects -template +template class Nef_Visitor { typedef typename Nef_Polyhedron::Halfedge_const_handle Halfedge_const_handle; @@ -96,30 +96,30 @@ class Nef_Visitor { public: Nef_Visitor(const Nef_Polyhedron&_nef, CGAL::Graphic_storage& _graphic_storage, - const DrawingFunctor&_drawing_functor) : + const GSOptions&_gs_options) : n_faces(0), n_edges(0), nef(_nef), graphic_storage(_graphic_storage), - drawing_functor(_drawing_functor) + gs_options(_gs_options) {} void visit(Vertex_const_handle vh) { - if (!drawing_functor.are_vertices_enabled() || - !drawing_functor.draw_vertex(nef, vh)) + if (!gs_options.are_vertices_enabled() || + !gs_options.draw_vertex(nef, vh)) { return; } - if(drawing_functor.colored_vertex(nef, vh)) + if(gs_options.colored_vertex(nef, vh)) { graphic_storage.add_point(vh->point(), - drawing_functor.vertex_color(nef, vh)); } + gs_options.vertex_color(nef, vh)); } else { graphic_storage.add_point(vh->point()); } } void visit(Halffacet_const_handle opposite_facet) { - if (!drawing_functor.are_faces_enabled() || - !drawing_functor.draw_face(nef, opposite_facet)) + if (!gs_options.are_faces_enabled() || + !gs_options.draw_face(nef, opposite_facet)) { return; } Halffacet_const_handle f=opposite_facet->twin(); @@ -134,8 +134,8 @@ class Nef_Visitor { if(se==0) { return; } //return if not-shalfedge - if(drawing_functor.colored_face(nef, f)) - { graphic_storage.face_begin(drawing_functor.face_color(nef, f)); } + if(gs_options.colored_face(nef, f)) + { graphic_storage.face_begin(gs_options.face_color(nef, f)); } else { graphic_storage.face_begin(); } @@ -181,8 +181,8 @@ class Nef_Visitor { void visit(Halfedge_const_handle he) { - if (!drawing_functor.are_edges_enabled() || - !drawing_functor.draw_edge(nef, he)) + if (!gs_options.are_edges_enabled() || + !gs_options.draw_edge(nef, he)) { return; } Halfedge_const_handle twin=he->twin(); @@ -190,9 +190,9 @@ class Nef_Visitor { edges_done.find(twin)!=edges_done.end()) { return; } // Edge already added - if(drawing_functor.colored_edge(nef, he)) + if(gs_options.colored_edge(nef, he)) { graphic_storage.add_segment(he->source()->point(), he->target()->point(), - drawing_functor.edge_color(nef, he)); } + gs_options.edge_color(nef, he)); } else { graphic_storage.add_segment(he->source()->point(), he->target()->point()); } edges_done[he]=true; @@ -208,14 +208,14 @@ class Nef_Visitor { std::unordered_map facets_done; std::unordered_map edges_done; CGAL::Graphic_storage& graphic_storage; - const DrawingFunctor& drawing_functor; + const GSOptions& gs_options; const Nef_Polyhedron& nef; }; -template +template void compute_elements(const Nef_Polyhedron &nef, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &drawing_functor) + const GSOptions &gs_options) { typedef typename Nef_Polyhedron::Volume_const_iterator Volume_const_iterator; @@ -223,8 +223,8 @@ void compute_elements(const Nef_Polyhedron &nef, typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; Volume_const_iterator c; - Nef_Visitor - V(nef, graphic_storage, drawing_functor); + Nef_Visitor + V(nef, graphic_storage, gs_options); CGAL_forall_volumes(c, nef) { Shell_entry_const_iterator it; @@ -241,14 +241,14 @@ void compute_elements(const Nef_Polyhedron &nef, // add_in_graphic_storage template + typename BufferType=float, class GSOptions> void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &drawing_functor) + const GSOptions &gs_options) { draw_function_for_nef_polyhedron::compute_elements(anef, graphic_storage, - drawing_functor); + gs_options); } template &graphic_storage) { - // Default functor; user can add his own functor. - Drawing_functor - drawing_functor; + gs_options; - drawing_functor.colored_face = [] (const CGAL_NEF3_TYPE&, + gs_options.colored_face = [] (const CGAL_NEF3_TYPE&, typename CGAL_NEF3_TYPE::Halffacet_const_handle) -> bool { return true; }; - drawing_functor.face_color = [] (const CGAL_NEF3_TYPE&, + gs_options.face_color = [] (const CGAL_NEF3_TYPE&, typename CGAL_NEF3_TYPE::Halffacet_const_handle fh) -> CGAL::IO::Color { if (fh==nullptr) // use to get the mono color @@ -277,20 +277,20 @@ void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, return get_random_color(random); }; - add_in_graphic_storage(anef, graphic_storage, drawing_functor); + add_in_graphic_storage(anef, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function template + typename BufferType=float, class GSOptions> void draw(const CGAL_NEF3_TYPE &anef, - const DrawingFunctor &drawing_functor, + const GSOptions &gs_options, const char *title="Nef Polyhedron Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(anef, buffer, drawing_functor); + add_in_graphic_storage(anef, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 2e8b5410fad8..ca9d7ec52c3a 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -16,22 +16,22 @@ #include #include #include -#include +#include #include #include namespace CGAL { -// We need a specific functor for periodic_2_triangulation_2 for the parameter +// We need a specific graphics view options for periodic_2_triangulation_2 for the parameters // of the domain. template -struct Drawing_functor_periodic_2_triangulation_2 : - public CGAL::Drawing_functor +struct Graphics_scene_options_periodic_2_triangulation_2 : + public CGAL::Graphics_scene_options { - Drawing_functor_periodic_2_triangulation_2(): + Graphics_scene_options_periodic_2_triangulation_2(): domain_color(CGAL::IO::Color(96, 104, 252)), m_draw_domain(true), m_current_display_type(DS::STORED) @@ -66,55 +66,55 @@ struct Drawing_functor_periodic_2_triangulation_2 : namespace draw_function_for_P2T2 { -template +template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { // Construct the point in 9-sheeted covering space and add to viewer - if(!drawing_functor.draw_vertex(p2t2, pi)) + if(!gs_options.draw_vertex(p2t2, pi)) { return; } - if(drawing_functor.colored_vertex(p2t2, pi)) + if(gs_options.colored_vertex(p2t2, pi)) { graphic_storage.add_point(p2t2.point(*pi), - drawing_functor.vertex_color(p2t2, pi)); } + gs_options.vertex_color(p2t2, pi)); } else { graphic_storage.add_point(p2t2.point(*pi)); } } -template +template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if(!drawing_functor.draw_edge(p2t2, si)) + if(!gs_options.draw_edge(p2t2, si)) { return; } // Construct the segment in 9-sheeted covering space and add to viewer typename P2T2::Segment s(p2t2.segment(*si)); - if(drawing_functor.colored_edge(p2t2, si)) + if(gs_options.colored_edge(p2t2, si)) { graphic_storage.add_segment(s[0], s[1], - drawing_functor.edge_color(p2t2, si)); } + gs_options.edge_color(p2t2, si)); } else { graphic_storage.add_segment(s[0], s[1]); } } -template +template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if(!drawing_functor.draw_face(p2t2, ti)) + if(!gs_options.draw_face(p2t2, ti)) { return; } // Construct the triangle in 9-sheeted covering space and add to viewer typename P2T2::Triangle t(p2t2.triangle(*ti)); - if(drawing_functor.colored_face(p2t2, ti)) - { graphic_storage.face_begin(drawing_functor.face_color(p2t2, ti)); } + if(gs_options.colored_face(p2t2, ti)) + { graphic_storage.face_begin(gs_options.face_color(p2t2, ti)); } else { graphic_storage.face_begin(); } @@ -124,10 +124,10 @@ void compute_face(const P2T2 &p2t2, graphic_storage.face_end(); } -template +template void compute_domain(const P2T2& p2t2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -145,50 +145,50 @@ void compute_domain(const P2T2& p2t2, Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); Kernel::Point_2 p4((orig_domain.max)()); - graphic_storage.add_segment(p1 + shift, p2 + shift, drawing_functor.domain_color); - graphic_storage.add_segment(p1 + shift, p3 + shift, drawing_functor.domain_color); - graphic_storage.add_segment(p2 + shift, p4 + shift, drawing_functor.domain_color); - graphic_storage.add_segment(p3 + shift, p4 + shift, drawing_functor.domain_color); + graphic_storage.add_segment(p1 + shift, p2 + shift, gs_options.domain_color); + graphic_storage.add_segment(p1 + shift, p3 + shift, gs_options.domain_color); + graphic_storage.add_segment(p2 + shift, p4 + shift, gs_options.domain_color); + graphic_storage.add_segment(p3 + shift, p4 + shift, gs_options.domain_color); } } } -template +template void compute_elements(const P2T2& p2t2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { // Get the display type, iterate through periodic elements according // to the display type typedef typename P2T2::Iterator_type Iterator_type; - Iterator_type it_type = (Iterator_type)drawing_functor.current_display_type(); + Iterator_type it_type = (Iterator_type)gs_options.current_display_type(); // Iterate through vertices, edges and faces, add elements to buffer - if(drawing_functor.are_vertices_enabled()) + if(gs_options.are_vertices_enabled()) { for (typename P2T2::Periodic_point_iterator it=p2t2.periodic_points_begin(it_type); it!=p2t2.periodic_points_end(it_type); ++it) - { compute_vertex(p2t2, it, graphic_storage, drawing_functor); } + { compute_vertex(p2t2, it, graphic_storage, gs_options); } } - if(drawing_functor.are_edges_enabled()) + if(gs_options.are_edges_enabled()) { for (typename P2T2::Periodic_segment_iterator it=p2t2.periodic_segments_begin(it_type); it!=p2t2.periodic_segments_end(it_type); ++it) - { compute_edge(p2t2, it, graphic_storage, drawing_functor); } + { compute_edge(p2t2, it, graphic_storage, gs_options); } } - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { for (typename P2T2::Periodic_triangle_iterator it=p2t2.periodic_triangles_begin(it_type); it!=p2t2.periodic_triangles_end(it_type); ++it) - { compute_face(p2t2, it, graphic_storage, drawing_functor); } + { compute_face(p2t2, it, graphic_storage, gs_options); } } - if(drawing_functor.get_draw_domain()) + if(gs_options.get_draw_domain()) { // Compute the (9-sheet covering space) domain of the periodic triangulation - compute_domain(p2t2, graphic_storage, drawing_functor); + compute_domain(p2t2, graphic_storage, gs_options); } } @@ -196,37 +196,37 @@ void compute_elements(const P2T2& p2t2, #define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 -template +template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - draw_function_for_P2T2::compute_elements(p2t2, graphic_storage, drawing_functor); + draw_function_for_P2T2::compute_elements(p2t2, graphic_storage, gs_options); } template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphic_storage& graphic_storage) { - CGAL::Drawing_functor_periodic_2_triangulation_2 + CGAL::Graphics_scene_options_periodic_2_triangulation_2 drawing_functor; + typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; - add_in_graphic_storage(p2t2, graphic_storage, drawing_functor); + add_in_graphic_storage(p2t2, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function -template +template void draw(const CGAL_P2T2_TYPE& ap2t2, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(ap2t2, buffer, drawing_functor); + add_in_graphic_storage(ap2t2, buffer, gs_options); draw_graphic_storage(buffer); } @@ -235,33 +235,33 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphic_storage buffer; - CGAL::Drawing_functor_periodic_2_triangulation_2 + CGAL::Graphics_scene_options_periodic_2_triangulation_2 drawing_functor; + typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; - add_in_graphic_storage(ap2t2, buffer, drawing_functor); + add_in_graphic_storage(ap2t2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&ap2t2, &drawing_functor] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - drawing_functor.increase_current_display_type(); + gs_options.increase_current_display_type(); basic_viewer->displayMessage - (QString("Display type=%1.").arg(drawing_functor.current_display_type()==0?"Stored": - (drawing_functor.current_display_type()==1?"Unique": - (drawing_functor.current_display_type()==2?"Stored cover": + (QString("Display type=%1.").arg(gs_options.current_display_type()==0?"Stored": + (gs_options.current_display_type()==1?"Unique": + (gs_options.current_display_type()==2?"Stored cover": "Unique cover")))); basic_viewer->clear(); draw_function_for_P2T2::compute_elements(ap2t2, basic_viewer->get_graphic_storage(), - drawing_functor); + gs_options); basic_viewer->redraw(); } else diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index cad954ab5df4..9a9c7d2f9139 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #ifdef DOXYGEN_RUNNING @@ -46,20 +46,20 @@ namespace CGAL { namespace draw_function_for_p2 { -template +template void compute_elements(const P2& p2, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { if (p2.is_empty()) return; typename P2::Point_2 prev=p2.vertex(p2.size()-1); - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { - if(drawing_functor.colored_face(p2, nullptr)) - { graphic_storage.face_begin(drawing_functor.face_color(p2, nullptr)); } + if(gs_options.colored_face(p2, nullptr)) + { graphic_storage.face_begin(gs_options.face_color(p2, nullptr)); } else { graphic_storage.face_begin(); } } @@ -67,31 +67,31 @@ void compute_elements(const P2& p2, for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); i!=p2.vertices_end(); ++i) { - if(drawing_functor.are_vertices_enabled() && - drawing_functor.draw_vertex(p2, i)) + if(gs_options.are_vertices_enabled() && + gs_options.draw_vertex(p2, i)) { // Add vertex - if(drawing_functor.colored_vertex(p2, i)) - { graphic_storage.add_point(*i, drawing_functor.vertex_color(p2, i)); } + if(gs_options.colored_vertex(p2, i)) + { graphic_storage.add_point(*i, gs_options.vertex_color(p2, i)); } else { graphic_storage.add_point(*i); } } - if(drawing_functor.are_edges_enabled() && - drawing_functor.draw_edge(p2, i)) + if(gs_options.are_edges_enabled() && + gs_options.draw_edge(p2, i)) { // Add edge with previous point - if(drawing_functor.colored_vertex(p2, i)) - { graphic_storage.add_segment(prev, *i, drawing_functor.edge_color(p2, i)); } + if(gs_options.colored_vertex(p2, i)) + { graphic_storage.add_segment(prev, *i, gs_options.edge_color(p2, i)); } else { graphic_storage.add_segment(prev, *i); } } - if(drawing_functor.are_faces_enabled()) + if(gs_options.are_faces_enabled()) { graphic_storage.add_point_in_face(*i); } // Add point in face prev = *i; } - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { graphic_storage.face_end(); } } @@ -101,21 +101,21 @@ void compute_elements(const P2& p2, // Specializations of add_in_graphic_storage function -template +template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawingfunctor) -{ draw_function_for_p2::compute_elements(ap2, graphic_storage, drawingfunctor); } + const GSOptions& gs_options) +{ draw_function_for_p2::compute_elements(ap2, graphic_storage, gs_options); } template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, CGAL::Graphic_storage &graphic_storage) { - CGAL::Drawing_functor drawingfunctor; - draw_function_for_p2::compute_elements(ap2, graphic_storage, drawingfunctor); + void*> gs_options; + draw_function_for_p2::compute_elements(ap2, graphic_storage, gs_options); } // Specialization of draw function. @@ -131,13 +131,13 @@ void draw(const CGAL_P2_TYPE &ap2, draw_graphic_storage(buffer, title); } -template +template void draw(const CGAL_P2_TYPE &ap2, - const DrawingFunctor& drawingfunctor, + const GSOptions& gs_options, const char *title="Polygon_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(ap2, buffer, drawingfunctor); + add_in_graphic_storage(ap2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 5196b09081e9..1c0683080e5e 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #ifdef DOXYGEN_RUNNING @@ -52,79 +52,79 @@ namespace CGAL namespace draw_function_for_ph2_with_holes { -template +template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, Graphic_storage &graphic_storage, bool hole, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (hole && drawing_functor.are_faces_enabled()) + if (hole && gs_options.are_faces_enabled()) { graphic_storage.add_point_in_face(aloop.vertex(aloop.size()-1)); } typename P2::General_polygon_2::Vertex_const_iterator prev; for(typename P2::General_polygon_2::Vertex_const_iterator i=aloop.vertices_begin(); i!=aloop.vertices_end(); ++i) { - if(drawing_functor.are_vertices_enabled() && - drawing_functor.draw_vertex(ap2, i)) + if(gs_options.are_vertices_enabled() && + gs_options.draw_vertex(ap2, i)) { // Add vertex - if(drawing_functor.colored_vertex(ap2, i)) - { graphic_storage.add_point(*i, drawing_functor.vertex_color(ap2, i)); } + if(gs_options.colored_vertex(ap2, i)) + { graphic_storage.add_point(*i, gs_options.vertex_color(ap2, i)); } else { graphic_storage.add_point(*i); } } if(i!=aloop.vertices_begin() && - drawing_functor.are_edges_enabled() && - drawing_functor.draw_edge(ap2, i)) + gs_options.are_edges_enabled() && + gs_options.draw_edge(ap2, i)) { // Add segment with previous point - if(drawing_functor.colored_vertex(ap2, i)) - { graphic_storage.add_segment(*prev, *i, drawing_functor.edge_color(ap2, i)); } + if(gs_options.colored_vertex(ap2, i)) + { graphic_storage.add_segment(*prev, *i, gs_options.edge_color(ap2, i)); } else { graphic_storage.add_segment(*prev, *i); } } - if(drawing_functor.are_faces_enabled()) + if(gs_options.are_faces_enabled()) { graphic_storage.add_point_in_face(*i); } // Add point in face prev=i; } // Add the last segment between the last point and the first one - if(drawing_functor.are_edges_enabled() && - drawing_functor.draw_edge(ap2, aloop.vertices_begin())) + if(gs_options.are_edges_enabled() && + gs_options.draw_edge(ap2, aloop.vertices_begin())) { graphic_storage.add_segment(*prev, *(aloop.vertices_begin())); } } -template +template void compute_elements(const P2& p2, Graphic_storage &graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { if (p2.outer_boundary().is_empty()) return; - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { - if(drawing_functor.colored_face(p2, nullptr)) - { graphic_storage.face_begin(drawing_functor.face_color(p2, nullptr)); } + if(gs_options.colored_face(p2, nullptr)) + { graphic_storage.face_begin(gs_options.face_color(p2, nullptr)); } else { graphic_storage.face_begin(); } } compute_one_loop_elements(p2, p2.outer_boundary(), graphic_storage, - false, drawing_functor); + false, gs_options); for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { compute_one_loop_elements(p2, *it, graphic_storage, - true, drawing_functor); - if (drawing_functor.are_faces_enabled()) + true, gs_options); + if (gs_options.are_faces_enabled()) { graphic_storage.add_point_in_face(p2.outer_boundary().vertex (p2.outer_boundary().size()-1)); } } - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { graphic_storage.face_end(); } } @@ -132,36 +132,36 @@ void compute_elements(const P2& p2, Graphic_storage &graphic_storage #define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 -template +template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor &drawing_functor) + const GSOptions &gs_options) { draw_function_for_ph2_with_holes::compute_elements(p2, graphic_storage, - drawing_functor); + gs_options); } template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphic_storage& graphic_storage) { - Drawing_functor drawing_functor; + void*> gs_options; - add_in_graphic_storage(p2, graphic_storage, drawing_functor); + add_in_graphic_storage(p2, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template -void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const DrawingFunctor &drawing_functor, +template +void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const GSOptions &gs_options, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(ap2, buffer, drawing_functor); + add_in_graphic_storage(ap2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index a68fb77c38c4..e47cd8a778c3 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -24,19 +24,19 @@ namespace CGAL { namespace draw_function_for_ss2 { -template +template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.draw_edge(ss2, eh)) + if (!gs_options.draw_edge(ss2, eh)) { return; } - if (drawing_functor.colored_edge(ss2, eh)) + if (gs_options.colored_edge(ss2, eh)) { graphic_storage.add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point(), - drawing_functor.edge_color(ss2, eh)); + gs_options.edge_color(ss2, eh)); } else { @@ -45,14 +45,14 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, } } -template +template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - // TODO? a functor different from draw_edge to allow to show only some labels ?? - if(!drawing_functor.draw_edge(ss2, h)) + // TODO? an option different from draw_edge to allow to show only some labels ?? + if(!gs_options.draw_edge(ss2, h)) { return; } std::stringstream label; @@ -65,30 +65,30 @@ void print_halfedge_labels(const SS2& ss2, label.str()); } -template +template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.draw_vertex(ss2, vh)) + if (!gs_options.draw_vertex(ss2, vh)) { return; } - if (drawing_functor.colored_vertex(ss2, vh)) + if (gs_options.colored_vertex(ss2, vh)) { - graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(ss2, vh)); + graphic_storage.add_point(vh->point(), gs_options.vertex_color(ss2, vh)); } else { graphic_storage.add_point(vh->point()); } } -template +template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - // TODO? a functor different from draw_vertex to allow to show only some labels ?? - if (!drawing_functor.draw_vertex(ss2, vh)) + // TODO? an option different from draw_vertex to allow to show only some labels ?? + if (!gs_options.draw_vertex(ss2, vh)) { return; } std::stringstream label; @@ -96,31 +96,31 @@ void print_vertex_label(const SS2& ss2, graphic_storage.add_text(vh->point(), label.str()); } -template +template void compute_elements(const SS2& ss2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.are_edges_enabled()) + if (!gs_options.are_edges_enabled()) { for (typename SS2::Halfedge_const_iterator it=ss2.halfedges_begin(); it != ss2.halfedges_end(); ++it) { if (it->id()opposite()->id()) { - compute_edge(ss2, it, graphic_storage, drawing_functor); - print_halfedge_labels(ss2, it, graphic_storage, drawing_functor); + compute_edge(ss2, it, graphic_storage, gs_options); + print_halfedge_labels(ss2, it, graphic_storage, gs_options); } } } - if (!drawing_functor.are_vertices_enabled()) + if (!gs_options.are_vertices_enabled()) { for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); it!=ss2.vertices_end(); ++it) { - compute_vertex(ss2, it, graphic_storage, drawing_functor); - print_vertex_label(ss2, it, graphic_storage, drawing_functor); + compute_vertex(ss2, it, graphic_storage, gs_options); + print_vertex_label(ss2, it, graphic_storage, gs_options); } } } @@ -129,20 +129,20 @@ void compute_elements(const SS2& ss2, #define CGAL_SS_TYPE CGAL::Straight_skeleton_2 -template +template void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { draw_function_for_ss2::compute_elements(ass2, graphic_storage, - drawing_functor); + gs_options); } template void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, CGAL::Graphic_storage& graphic_storage) { - Drawing_functor @@ -182,12 +182,12 @@ void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, // Specialization of draw function. #ifdef CGAL_USE_BASIC_VIEWER -template -void draw(const CGAL_SS_TYPE &ass2, const DrawingFunctor &drawingfunctor, +template +void draw(const CGAL_SS_TYPE &ass2, const GSOptions &gs_options, const char *title="Straight Skeleton Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(ass2, buffer, drawingfunctor); + add_in_graphic_storage(ass2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index 00f35a792bba..e49b3a93f026 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -6,12 +6,12 @@ #ifdef CGAL_USE_BASIC_VIEWER #include -#include +#include template -struct Facewidth_draw_functor +struct Facewidth_graphics_scene_options { - Facewidth_draw_functor(typename ALCC::size_type amark1, typename ALCC::size_type amark2) : + Facewidth_graphics_scene_options(typename ALCC::size_type amark1, typename ALCC::size_type amark2) : m_vertex_mark(amark1), m_face_mark(amark2) {} @@ -107,7 +107,7 @@ void draw_facewidth(const LCC& lcc, { lcc.template mark_cell<2>(cycle[i], face_mark); } } - Facewidth_draw_functor df(vertex_mark, face_mark); + Facewidth_graphics_scene_options df(vertex_mark, face_mark); CGAL::draw(lcc, df, "Face width"); lcc.free_mark(vertex_mark); diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 9c557b81f6a0..454316d4c3ab 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include @@ -30,15 +30,15 @@ namespace CGAL { -// Specific drawing functor +// Specific graphics scene options template -struct Drawing_functor_face_graph_with_paths : - public CGAL::Drawing_functor +struct Graphics_scene_options_face_graph_with_paths : + public CGAL::Graphics_scene_options { - Drawing_functor_face_graph_with_paths(std::size_t nbpaths): m_nbpaths(nbpaths) + Graphics_scene_options_face_graph_with_paths(std::size_t nbpaths): m_nbpaths(nbpaths) { color_of_path=[](std::size_t i)->CGAL::IO::Color { @@ -141,14 +141,14 @@ const typename CGAL::Get_traits::Point& get_point return CGAL::Get_traits::get_point(mesh, dh); } -template +template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphic_storage& graphic_storage, - DrawingFunctor& drawing_functor) + GSOptions& gs_options) { - if(!drawing_functor.draw_face(lcc, dh)) + if(!gs_options.draw_face(lcc, dh)) { return; } typedef typename Get_map::type LCC; @@ -170,8 +170,8 @@ void compute_face(const Mesh& mesh, } while(cur!=dh); - if(drawing_functor.colored_face(lcc, dh)) - { graphic_storage.face_begin(drawing_functor.face_color(lcc, dh)); } + if(gs_options.colored_face(lcc, dh)) + { graphic_storage.face_begin(gs_options.face_color(lcc, dh)); } else { graphic_storage.face_begin(); } @@ -188,16 +188,16 @@ void compute_face(const Mesh& mesh, graphic_storage.face_end(); } -template +template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, CGAL::Graphic_storage& graphic_storage, - DrawingFunctor& drawing_functor, + GSOptions& gs_options, bool draw_marked_darts=true) { - if(!drawing_functor.draw_edge(lcc, dh)) + if(!gs_options.draw_edge(lcc, dh)) { return; } typedef typename Get_map::type LCC; @@ -242,7 +242,7 @@ template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphic_storage& graphic_storage, - DrawingFunctor& drawing_functor) + GSOptions& gs_options) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; @@ -263,7 +263,7 @@ void compute_path(const Mesh &mesh, typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - if ((*m_paths)[i].is_empty() || !drawing_functor.draw_path(i)) + if ((*m_paths)[i].is_empty() || !gs_options.draw_path(i)) { return; } CGAL::Random random(static_cast(i)); @@ -280,10 +280,10 @@ void compute_path(const Mesh &mesh, } } -template +template void compute_elements(const Mesh &mesh, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor &m_drawing_functor, + const GSOptions &m_gs_options, const std::vector>* m_paths, typename Get_map::type::size_type amark) { @@ -369,17 +369,17 @@ void compute_elements(const Mesh &mesh, } // namespace draw_function_for_face_graph_with_paths -template +template void add_in_graphic_storage(const Mesh& mesh, CGAL::Graphic_storage& graphic_storage, const std::vector>* paths, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) { draw_function_for_face_graph_with_paths::compute_elements(mesh, graphic_storage, - drawing_functor, + gs_options, paths, amark); } @@ -390,14 +390,14 @@ void add_in_graphic_storage(const Mesh& mesh, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) { - // Default functor; user can add his own functor. - Drawing_functor::type::Dart_const_descriptor /*vh*/, typename Get_map::type::Dart_const_descriptor /*eh*/, typename Get_map::type::Dart_const_descriptor /*fh*/> - drawing_functor; + gs_options; - add_in_graphic_storage(mesh, graphic_storage, drawing_functor, paths, amark); + add_in_graphic_storage(mesh, graphic_storage, gs_options, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER @@ -414,16 +414,16 @@ void draw(const Mesh& mesh, draw_graphic_storage(buffer, title); } -template +template void draw(const Mesh& mesh, const std::vector >& paths, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(mesh, buffer, drawing_functor, &paths, amark); + add_in_graphic_storage(mesh, buffer, gs_options, &paths, amark); draw_graphic_storage(buffer, title); } @@ -457,10 +457,10 @@ namespace CGAL std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + template void draw(const Mesh&, const std::vector >&, - const DrawingFunctor&, + const GSOptions&, typename Get_map::type::size_type= (std::numeric_limits::type::size_type>::max)(), const char* ="") diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h index b1750169c7d7..85a70dc23f82 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -13,7 +13,7 @@ #define CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H #include -#include +#include #include #include #include @@ -22,14 +22,14 @@ namespace CGAL { template -struct Polygon_triangulation_drawing_functor : - public CGAL::Drawing_functor { template - Polygon_triangulation_drawing_functor(IPM ipm) + Polygon_triangulation_gs_options(IPM ipm) { this->colored_face = [](const PT&, const typename PT::Finite_faces_iterator) -> bool @@ -59,23 +59,23 @@ struct Polygon_triangulation_drawing_functor : #define CGAL_CT2_TYPE CGAL::Constrained_Delaunay_triangulation_2 template + typename BufferType=float, class GSOptions> void add_in_graphic_storage(const CGAL_CT2_TYPE& ct2, CGAL::Graphic_storage& graphic_buffer, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - draw_function_for_t2::compute_elements(ct2, graphic_buffer, drawing_functor); + draw_function_for_t2::compute_elements(ct2, graphic_buffer, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template -void draw(const CGAL_CT2_TYPE &ct2, const DrawingFunctor &drawingfunctor, +template +void draw(const CGAL_CT2_TYPE &ct2, const GSOptions &gs_options, const char *title="Constrained Triangulation_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(ct2, buffer, drawingfunctor); + add_in_graphic_storage(ct2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index 36f413b20a74..fb1a912addbc 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -32,7 +32,7 @@ void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, { using BASET2=CGAL::Triangulation_2; - Drawing_functor diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index aa04b819889e..84134c0cde0b 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -24,17 +24,17 @@ namespace CGAL { namespace draw_function_for_t2 { -template +template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.draw_face(t2, fh)) + if (!gs_options.draw_face(t2, fh)) { return; } - if (drawing_functor.colored_face(t2, fh)) - { graphic_storage.face_begin(drawing_functor.face_color(t2, fh)); } + if (gs_options.colored_face(t2, fh)) + { graphic_storage.face_begin(gs_options.face_color(t2, fh)); } else { graphic_storage.face_begin(); } @@ -45,20 +45,20 @@ void compute_face(const T2& t2, graphic_storage.face_end(); } -template +template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.draw_edge(t2, eh)) + if (!gs_options.draw_edge(t2, eh)) { return; } - if (drawing_functor.colored_edge(t2, eh)) + if (gs_options.colored_edge(t2, eh)) { graphic_storage.add_segment (eh->first->vertex(eh->first->cw(eh->second))->point(), eh->first->vertex(eh->first->ccw(eh->second))->point(), - drawing_functor.edge_color(t2, eh)); + gs_options.edge_color(t2, eh)); } else { @@ -68,17 +68,17 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, } } -template +template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (!drawing_functor.draw_vertex(t2, vh)) + if (!gs_options.draw_vertex(t2, vh)) { return; } - if (drawing_functor.colored_vertex(t2, vh)) + if (gs_options.colored_vertex(t2, vh)) { - graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(t2, vh)); + graphic_storage.add_point(vh->point(), gs_options.vertex_color(t2, vh)); } else { @@ -86,30 +86,30 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, } } -template +template void compute_elements(const T2& t2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); it!=t2.finite_faces_end(); ++it) - { compute_face(t2, it, graphic_storage, drawing_functor); } + { compute_face(t2, it, graphic_storage, gs_options); } } - if (drawing_functor.are_edges_enabled()) + if (gs_options.are_edges_enabled()) { for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); it!=t2.finite_edges_end(); ++it) - { compute_edge(t2, it, graphic_storage, drawing_functor); } + { compute_edge(t2, it, graphic_storage, gs_options); } } - if (drawing_functor.are_vertices_enabled()) + if (gs_options.are_vertices_enabled()) { for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); it!=t2.finite_vertices_end(); ++it) - { compute_vertex(t2, it, graphic_storage, drawing_functor); } + { compute_vertex(t2, it, graphic_storage, gs_options); } } } @@ -117,19 +117,19 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 -template +template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - draw_function_for_t2::compute_elements(at2, graphic_storage, drawing_functor); + draw_function_for_t2::compute_elements(at2, graphic_storage, gs_options); } template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, CGAL::Graphic_storage& graphic_storage) { - Drawing_functor @@ -152,12 +152,12 @@ void add_in_graphic_storage(const CGAL_T2_TYPE& at2, #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template -void draw(const CGAL_T2_TYPE &at2, const DrawingFunctor &drawingfunctor, +template +void draw(const CGAL_T2_TYPE &at2, const GSOptions &gs_options, const char *title="Triangulation_2 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(at2, buffer, drawingfunctor); + add_in_graphic_storage(at2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 7c2d080d9541..32a4e93eb9ff 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -25,16 +25,16 @@ namespace CGAL { namespace draw_function_for_t3 { -template +template void compute_face(typename T3::Finite_facets_iterator fh, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, CGAL::Graphic_storage& graphic_storage, const T3 *t3) { - if(!drawing_functor.draw_face(*t3, fh)) + if(!gs_options.draw_face(*t3, fh)) { return; } - if(drawing_functor.colored_face(*t3, fh)) - { graphic_storage.face_begin(drawing_functor.face_color(*t3, fh)); } + if(gs_options.colored_face(*t3, fh)) + { graphic_storage.face_begin(gs_options.face_color(*t3, fh)); } else { graphic_storage.face_begin(); } @@ -48,19 +48,19 @@ void compute_face(typename T3::Finite_facets_iterator fh, graphic_storage.face_end(); } -template +template void compute_edge(typename T3::Finite_edges_iterator eh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor, const T3* t3) + const GSOptions& gs_options, const T3* t3) { - if(!drawing_functor.draw_edge(*t3, eh)) + if(!gs_options.draw_edge(*t3, eh)) { return; } - if(drawing_functor.colored_edge(*t3, eh)) + if(gs_options.colored_edge(*t3, eh)) { graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point(), - drawing_functor.edge_color(*t3, eh)); + gs_options.edge_color(*t3, eh)); } else { graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), @@ -68,46 +68,46 @@ void compute_edge(typename T3::Finite_edges_iterator eh, } } -template +template void compute_vertex(typename T3::Vertex_handle vh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor, const T3* t3) + const GSOptions& gs_options, const T3* t3) { - if(!drawing_functor.draw_vertex(*t3, vh)) + if(!gs_options.draw_vertex(*t3, vh)) { return; } - if(drawing_functor.colored_vertex(*t3, vh)) + if(gs_options.colored_vertex(*t3, vh)) { - graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(*t3, vh)); + graphic_storage.add_point(vh->point(), gs_options.vertex_color(*t3, vh)); } else { graphic_storage.add_point(vh->point()); } } -template +template void compute_elements(const T3* t3, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { for (typename T3::Finite_facets_iterator it=t3->finite_facets_begin(); it!=t3->finite_facets_end(); ++it) - { compute_face(it, drawing_functor, graphic_storage, t3); } + { compute_face(it, gs_options, graphic_storage, t3); } } - if (drawing_functor.are_edges_enabled()) + if (gs_options.are_edges_enabled()) { for (typename T3::Finite_edges_iterator it=t3->finite_edges_begin(); it!=t3->finite_edges_end(); ++it) - { compute_edge(it, graphic_storage,drawing_functor, t3); } + { compute_edge(it, graphic_storage,gs_options, t3); } } - if (drawing_functor.are_vertices_enabled()) + if (gs_options.are_vertices_enabled()) { for (typename T3::Finite_vertices_iterator it=t3->finite_vertices_begin(); it!=t3->finite_vertices_end(); ++it) - { compute_vertex(it, graphic_storage, drawing_functor, t3); } + { compute_vertex(it, graphic_storage, gs_options, t3); } } } @@ -116,12 +116,12 @@ void compute_elements(const T3* t3, #define CGAL_T3_TYPE CGAL::Triangulation_3 template + typename BufferType=float, class GSOptions> void add_in_graphic_storage(const CGAL_T3_TYPE& at3, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - draw_function_for_t3::compute_elements(&at3, graphic_storage, drawing_functor); + draw_function_for_t3::compute_elements(&at3, graphic_storage, gs_options); } template & graphic_storage) { - CGAL::Drawing_functor - drawing_functor; + gs_options; - drawing_functor.colored_face = + gs_options.colored_face = [](const CGAL_T3_TYPE &, const typename CGAL_T3_TYPE::Finite_facets_iterator) -> bool { return true; }; - drawing_functor.face_color = + gs_options.face_color = [](const CGAL_T3_TYPE &at3, const typename CGAL_T3_TYPE::Finite_facets_iterator fh) -> CGAL::IO::Color { if (fh==at3.finite_facets_end()) // use to get the mono color @@ -151,18 +151,18 @@ void add_in_graphic_storage(const CGAL_T3_TYPE& at3, return get_random_color(random); }; - add_in_graphic_storage(at3, graphic_storage, drawing_functor); + add_in_graphic_storage(at3, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template -void draw(const CGAL_T3_TYPE &at3, const DrawingFunctor &drawingfunctor, +template +void draw(const CGAL_T3_TYPE &at3, const GSOptions &gs_options, const char *title="T3 Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(at3, buffer, drawingfunctor); + add_in_graphic_storage(at3, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 60ff01d36b35..6d6ed974f8b9 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include @@ -27,16 +27,16 @@ namespace CGAL { -// We need a specific functor for voronoi2 in order to allow to differentiate -// voronoi and dual vertices, and to manage rays. +// We need a specific graphics scene option for voronoi2 in order to allow +// to differentiate voronoi and dual vertices, and to manage rays. template -struct Drawing_functor_voronoi : - public CGAL::Drawing_functor +struct Graphics_scene_options_voronoi : + public CGAL::Graphics_scene_options { - Drawing_functor_voronoi() : m_draw_voronoi_vertices(true), + Graphics_scene_options_voronoi() : m_draw_voronoi_vertices(true), m_draw_dual_vertices(true), dual_vertex_color(CGAL::IO::Color(50, 100, 180)), ray_color(CGAL::IO::Color(100, 0, 0)), @@ -69,43 +69,43 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; -template +template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if(!drawing_functor.draw_vertex(v2, vh)) + if(!gs_options.draw_vertex(v2, vh)) { return; } - if(drawing_functor.colored_vertex(v2, vh)) - { graphic_storage.add_point(vh->point(), drawing_functor.vertex_color(v2, vh)); } + if(gs_options.colored_vertex(v2, vh)) + { graphic_storage.add_point(vh->point(), gs_options.vertex_color(v2, vh)); } else { graphic_storage.add_point(vh->point()); } } -template +template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, CGAL::Graphic_storage &graphic_storage, - const DrawingFunctor& drawing_functor) -{ graphic_storage.add_point(vi->point(), drawing_functor.dual_vertex_color); } + const GSOptions& gs_options) +{ graphic_storage.add_point(vi->point(), gs_options.dual_vertex_color); } -template +template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, CGAL::Graphic_storage& graphic_storage, - DrawingFunctor& drawing_functor) + GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; if (he->is_segment()) { - if(drawing_functor.colored_edge(v2, he)) + if(gs_options.colored_edge(v2, he)) { graphic_storage.add_segment(he->source()->point(), he->target()->point(), - drawing_functor.edge_color(v2, he)); + gs_options.edge_color(v2, he)); } else { @@ -221,11 +221,11 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, } // Halfedge_const_handle -template +template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef typename V2::Delaunay_vertex_handle Delaunay_vertex_const_handle; @@ -240,28 +240,28 @@ void compute_rays_and_bisectors(const V2&, if (he->has_source()) { // add_ray_segment(he->source()->point(), get_second_point(he, graphic_storage.get_bounding_box())); - graphic_storage.add_ray(he->source()->point(), direction, drawing_functor.ray_color); + graphic_storage.add_ray(he->source()->point(), direction, gs_options.ray_color); } } else if (he->is_bisector()) { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); - graphic_storage.add_line(pointOnLine, direction, drawing_functor.bisector_color); + graphic_storage.add_line(pointOnLine, direction, gs_options.bisector_color); } } -template +template void compute_face(const V2& v2, typename V2::Face_iterator fh, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& m_drawing_functor) + const GSOptions& m_gs_options) { - if(fh->is_unbounded() || !m_drawing_functor.draw_face(v2, fh)) + if(fh->is_unbounded() || !m_gs_options.draw_face(v2, fh)) { return; } - if(m_drawing_functor.colored_face(v2, fh)) - { graphic_storage.face_begin(m_drawing_functor.face_color(v2, fh)); } + if(m_gs_options.colored_face(v2, fh)) + { graphic_storage.face_begin(m_gs_options.face_color(v2, fh)); } else { graphic_storage.face_begin(); } typename V2::Ccb_halfedge_circulator ec_start=fh->ccb(); @@ -286,48 +286,48 @@ void compute_face(const V2& v2, // } } -template +template void compute_elements(const V2& v2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& drawing_functor) + const GSOptions& gs_options) { - if(drawing_functor.are_vertices_enabled()) + if(gs_options.are_vertices_enabled()) { // Draw the voronoi vertices - if (drawing_functor.are_voronoi_vertices_enabled()) + if (gs_options.are_voronoi_vertices_enabled()) { for (typename V2::Vertex_iterator it=v2.vertices_begin(); it!=v2.vertices_end(); ++it) - { compute_vertex(v2, it, graphic_storage, drawing_functor); } + { compute_vertex(v2, it, graphic_storage, gs_options); } } // Draw the dual vertices - if (drawing_functor.are_dual_vertices_enabled()) + if (gs_options.are_dual_vertices_enabled()) { for (typename V2::Delaunay_graph::Finite_vertices_iterator it=v2.dual().finite_vertices_begin(); it!=v2.dual().finite_vertices_end(); ++it) - { compute_dual_vertex(v2, it, graphic_storage, drawing_functor); } + { compute_dual_vertex(v2, it, graphic_storage, gs_options); } } } - if(drawing_functor.are_edges_enabled()) + if(gs_options.are_edges_enabled()) { // Add segments and update bounding box for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) { add_segments_and_update_bounding_box(v2, it, - graphic_storage, drawing_functor); } + graphic_storage, gs_options); } } for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) - { compute_rays_and_bisectors(v2, it, graphic_storage, drawing_functor); } + { compute_rays_and_bisectors(v2, it, graphic_storage, gs_options); } - if (drawing_functor.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { for (typename V2::Face_iterator it=v2.faces_begin(); it!=v2.faces_end(); ++it) - { compute_face(v2, it, graphic_storage, drawing_functor); } + { compute_face(v2, it, graphic_storage, gs_options); } } } @@ -336,39 +336,39 @@ void compute_elements(const V2& v2, #define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 template + typename BufferType=float, class GSOptions> void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, CGAL::Graphic_storage& graphic_storage, - const DrawingFunctor& m_drawing_functor) + const GSOptions& m_gs_options) { - draw_function_for_v2::compute_elements(v2, graphic_storage, m_drawing_functor); + draw_function_for_v2::compute_elements(v2, graphic_storage, m_gs_options); } template void add_in_graphic_storage(const CGAL_VORONOI_TYPE& v2, CGAL::Graphic_storage& graphic_storage) { - // Default functor; user can add his own functor. - CGAL::Drawing_functor_voronoi - drawing_functor; + gs_options; - add_in_graphic_storage(v2, graphic_storage, drawing_functor); + add_in_graphic_storage(v2, graphic_storage, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. template + typename BufferType=float, class GSOptions> void draw(const CGAL_VORONOI_TYPE& av2, - const DrawingFunctor& drawing_functor, + const GSOptions& gs_options, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphic_storage buffer; - add_in_graphic_storage(av2, buffer, drawing_functor); + add_in_graphic_storage(av2, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -378,20 +378,20 @@ void draw(const CGAL_VORONOI_TYPE& av2, { CGAL::Graphic_storage buffer; - CGAL::Drawing_functor_voronoi - drawing_functor; + gs_options; - add_in_graphic_storage(av2, buffer, drawing_functor); + add_in_graphic_storage(av2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&av2, &drawing_functor] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&av2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) @@ -404,33 +404,33 @@ void draw(const CGAL_VORONOI_TYPE& av2, } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::ShiftModifier)) { - if(drawing_functor.are_voronoi_vertices_enabled()) - { drawing_functor.disable_voronoi_vertices(); } - else { drawing_functor.enable_voronoi_vertices(); } + if(gs_options.are_voronoi_vertices_enabled()) + { gs_options.disable_voronoi_vertices(); } + else { gs_options.enable_voronoi_vertices(); } basic_viewer->displayMessage (QString("Voronoi vertices=%1."). - arg(drawing_functor.are_voronoi_vertices_enabled()?"true":"false")); + arg(gs_options.are_voronoi_vertices_enabled()?"true":"false")); basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, basic_viewer->get_graphic_storage(), - drawing_functor); + gs_options); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - if(drawing_functor.are_dual_vertices_enabled()) - { drawing_functor.disable_dual_vertices(); } - else { drawing_functor.enable_dual_vertices(); } + if(gs_options.are_dual_vertices_enabled()) + { gs_options.disable_dual_vertices(); } + else { gs_options.enable_dual_vertices(); } basic_viewer->displayMessage(QString("Dual vertices=%1."). - arg(drawing_functor.are_dual_vertices_enabled()?"true":"false")); + arg(gs_options.are_dual_vertices_enabled()?"true":"false")); basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, basic_viewer->get_graphic_storage(), - drawing_functor); + gs_options); basic_viewer->redraw(); } else From e5a8a0d006f05ae412600a445d0c3e124458b9ae Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 09:55:20 +0200 Subject: [PATCH 174/341] Pmap readable --- .../doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h index 87c085b92135..e67670bcbc9c 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -30,7 +30,7 @@ A call to this function is blocking, that is the program continues as soon as th Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam CT2 a triangulation class derived from `Constrained_triangulation_2` -\tparam InDomainPMap a class model of `ReadWritePropertyMap` with +\tparam InDomainPMap a class model of `ReadablePropertyMap` with `CT::Face_handle` as key type and `bool` as value type. \param act2 the constrained triangulation to draw. From fd115bd32129f216a391fa5754a0ec815ca84717 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 11:06:53 +0200 Subject: [PATCH 175/341] Rename Graphic_storare into Graphics_scene (Andreas and Sebastien review) --- .../include/CGAL/draw_arrangement_2.h | 2 +- BGL/include/CGAL/draw_face_graph.h | 8 +++---- .../doc/Basic_viewer/Basic_viewer.txt | 2 +- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 18 +++++++------- .../{Graphic_storage.h => Graphics_scene.h} | 4 ++-- ...ing_functor.h => Graphics_scene_options.h} | 10 ++++---- .../doc/Basic_viewer/PackageDescription.txt | 6 ++--- .../Basic_viewer/draw_mesh_and_points.cpp | 2 +- .../Basic_viewer/draw_several_windows.cpp | 4 ++-- .../draw_surface_mesh_small_faces.cpp | 2 +- .../{Graphic_storage.h => Graphics_scene.h} | 10 ++++---- .../include/CGAL/Graphics_scene_options.h | 6 ++--- .../include/CGAL/Qt/Basic_viewer_qt.h | 16 ++++++------- .../include/CGAL/draw_polygon_set_2.h | 2 +- .../demo/Linear_cell_complex/Viewer.h | 4 ++-- .../CGAL/draw_linear_cell_complex.h | 2 +- .../include/CGAL/draw_linear_cell_complex.h | 18 +++++++------- Nef_3/include/CGAL/draw_nef_3.h | 16 ++++++------- .../CGAL/draw_periodic_2_triangulation_2.h | 20 ++++++++-------- Point_set_3/include/CGAL/draw_point_set_3.h | 12 +++++----- Polygon/include/CGAL/draw_polygon_2.h | 12 +++++----- .../include/CGAL/draw_polygon_with_holes_2.h | 14 +++++------ Polyhedron/include/CGAL/draw_polyhedron.h | 10 ++++---- .../include/CGAL/draw_straight_skeleton_2.h | 20 ++++++++-------- Surface_mesh/include/CGAL/draw_surface_mesh.h | 10 ++++---- .../include/CGAL/draw_face_graph_with_paths.h | 24 +++++++++---------- .../CGAL/draw_triangulation_2.h | 6 ++--- .../polygon_triangulation_drawing_functor.h | 4 ++-- .../CGAL/draw_constrained_triangulation_2.h | 6 ++--- .../include/CGAL/draw_triangulation_2.h | 18 +++++++------- .../include/CGAL/draw_triangulation_3.h | 18 +++++++------- .../include/CGAL/draw_voronoi_diagram_2.h | 22 ++++++++--------- 32 files changed, 164 insertions(+), 164 deletions(-) rename Basic_viewer/doc/Basic_viewer/CGAL/{Graphic_storage.h => Graphics_scene.h} (92%) rename Basic_viewer/doc/Basic_viewer/CGAL/{Drawing_functor.h => Graphics_scene_options.h} (90%) rename Basic_viewer/include/CGAL/{Graphic_storage.h => Graphics_scene.h} (99%) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index ad19e55bff0a..f03f133c3588 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -511,7 +511,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { Color_generator m_color_generator; std::unordered_map m_visited; - CGAL::Graphic_storage m_graphic_storage; + CGAL::Graphics_scene m_graphic_storage; }; //! Basic viewer of a 2D arrangement. diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index f7b9efb4abb9..4c30d6b2a5f4 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -14,7 +14,7 @@ #ifndef CGAL_DRAW_FACE_GRAPH_H #define CGAL_DRAW_FACE_GRAPH_H -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace draw_function_for_FG { template void compute_elements(const FG &fg, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &m_gs_options) { using Point=typename boost::property_map_value::type; @@ -120,7 +120,7 @@ void compute_elements(const FG &fg, template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &gs_options) { draw_function_for_FG::compute_elements(fg, graphic_storage, gs_options); @@ -128,7 +128,7 @@ void add_in_graphic_storage_for_fg(const FG &fg, template void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphics_scene &graphic_storage) { Graphics_scene_options::vertex_descriptor, diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index ff81f476c0b7..766ccf8c7798 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -16,7 +16,7 @@ draw(XXX) \subsection Basic_viewerDoc_2 Customize the drawing -Drawing_functor +Graphics_scene_options \subsection Basic_viewerDoc_3 Graphic storage diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index aa9fc1d13310..d771cdcd5947 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphic_storage`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. \tparam BufferType the type used for point coordinates: `float` by default. @@ -13,10 +13,10 @@ template class Basic_viewer_qt : public CGAL::QGLViewer { public: - /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphic_storage`. + /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphics_scene`. /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, - Graphic_storage& buf, + Graphics_scene& buf, const char* title=""); /// enables or disables the drawing of vertices. @@ -196,10 +196,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_text(const KPoint &kp, const std::string &txt); /// returns the graphic storage of the viewer. - Graphic_storage& get_graphic_storage(); + Graphics_scene& get_graphic_storage(); /// returns the graphic storage of the viewer, const version. - const Graphic_storage& get_graphic_storage() const; + const Graphics_scene& get_graphic_storage() const; /// negates all normal of vertices and faces. void negate_all_normals(); @@ -232,8 +232,8 @@ template class QApplication_and_basic_viewer { public: - /// Constructor given a `Graphic_storage` and possibly a title. - QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, + /// Constructor given a `Graphics_scene` and possibly a title. + QApplication_and_basic_viewer(CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"); /// runs the `QApplication`, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. @@ -245,10 +245,10 @@ class QApplication_and_basic_viewer //------------------------------------------------------------------------------ /*! - opens a new window and draws the given `Graphic_storage` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. */ template -void draw_graphic_storage(Graphic_storage& graphic_buffer, +void draw_graphic_storage(Graphics_scene& graphic_buffer, const char *title="CGAL Basic Viewer") {} diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h similarity index 92% rename from Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h rename to Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 7c1a7e5bdfa2..e9cef86e6d94 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphic_storage.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -4,13 +4,13 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Graphic_storage` stores points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. +The class `Graphics_scene` stores points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. \tparam BufferType the number type used for point coordinates: `float` by default. */ template -class Graphic_storage { +class Graphics_scene { public: /// adds the given point in the storage. template diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h similarity index 90% rename from Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h rename to Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 79fa49f64c9f..3b0408f3f841 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Drawing_functor.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters` is used to tune the way that the cells of a given data structure of \cgal are considered. +The class `Graphics_scene_options` is used to tune the way that the cells of a given data structure of \cgal are considered. The different `std::function` can be modified to change for example the behavior of the drawing. \tparam DS a data structure of \cgal. @@ -17,7 +17,7 @@ template -struct Cell_parameters +struct Graphics_scene_options { public: /// `std::function` that returns `true` if the given vertex must be ignored, `false` otherwise. @@ -73,7 +73,7 @@ struct Cell_parameters /*! \ingroup PkgBasicViewerClasses -The class `Cell_parameters_with_volume` is used to tune the way that the cells of a given data structure of \cgal are considered, for a data structure that contains volumes. +The class `Graphics_scene_options` is used to tune the way that the cells of a given data structure of \cgal are considered, for a data structure that contains volumes. The different `std::function` can be modified to change for example the behavior of the drawing. \tparam DS a data structure of \cgal. @@ -90,8 +90,8 @@ template -struct Cell_parameters_with_volume : - public Cell_parameters +struct Graphics_scene_options : + public Graphics_scene_options { public: /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index d002f4186e6e..569246d4dfb1 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -22,9 +22,9 @@ \cgalClassifedRefPages \cgalCRPSection{Classes} -- `CGAL::Drawing_functor` -- `CGAL::Drawing_functor_with_volume` -- `CGAL::Graphic_storage` +- `CGAL::Graphics_scene_options` +- `CGAL::Graphics_scene_options` +- `CGAL::Graphics_scene` - `CGAL::Basic_viewer_qt` - `CGAL::QApplication_and_basic_viewer` diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index efb13259a371..bd843f8c1ad2 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -54,7 +54,7 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphic_storage graphic_buffer; + CGAL::Graphics_scene graphic_buffer; CGAL::add_in_graphic_storage(point_set, graphic_buffer, Graphics_scene_options_green_points()); CGAL::add_in_graphic_storage(output_mesh, graphic_buffer); CGAL::draw_graphic_storage(graphic_buffer); diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 7a6a3497996e..4fb8bd75892c 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -20,7 +20,7 @@ using PS3=CGAL::Point_set_3; int main(void) { - /// (1) Some CGAL code that create data structure and fill Graphic_storage. + /// (1) Some CGAL code that create data structure and fill Graphics_scene. std::vector points; if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points), @@ -47,7 +47,7 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphic_storage graphic_buffer1, graphic_buffer2; + CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; CGAL::add_in_graphic_storage(point_set, graphic_buffer1); CGAL::add_in_graphic_storage(output_mesh, graphic_buffer2); diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index d22cd1287062..a2f617d34487 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -99,7 +99,7 @@ int main(int argc, char* argv[]) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } Graphics_scene_options_small_faces gsosm(sm); - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(sm, buffer, gsosm); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); diff --git a/Basic_viewer/include/CGAL/Graphic_storage.h b/Basic_viewer/include/CGAL/Graphics_scene.h similarity index 99% rename from Basic_viewer/include/CGAL/Graphic_storage.h rename to Basic_viewer/include/CGAL/Graphics_scene.h index 056078251ac0..fd5fcc4cde18 100644 --- a/Basic_viewer/include/CGAL/Graphic_storage.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -10,8 +10,8 @@ // Author(s): Guillaume Damiand // Mostafa Ashraf -#ifndef CGAL_GRAPHIC_STORAGE_H -#define CGAL_GRAPHIC_STORAGE_H +#ifndef CGAL_GRAPHICS_SCENE_H +#define CGAL_GRAPHICS_SCENE_H #include #include @@ -56,14 +56,14 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) // This class is responsible for dealing with available CGAL data structures and // handling buffers. template -class Graphic_storage +class Graphics_scene { public: typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - Graphic_storage() + Graphics_scene() : m_buffer_for_mono_points(&arrays[POS_MONO_POINTS], nullptr, &m_bounding_box, nullptr, nullptr, nullptr), m_buffer_for_colored_points(&arrays[POS_COLORED_POINTS], nullptr, @@ -417,4 +417,4 @@ class Graphic_storage } // namespace CGAL -#endif // CGAL_GRAPHIC_STORAGE_H +#endif // CGAL_GRAPHICS_SCENE_H diff --git a/Basic_viewer/include/CGAL/Graphics_scene_options.h b/Basic_viewer/include/CGAL/Graphics_scene_options.h index 37f9d39c6560..5728dfbb2913 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/include/CGAL/Graphics_scene_options.h @@ -10,8 +10,8 @@ // Author(s): Guillaume Damiand // Mostafa Ashraf -#ifndef CGAL_DRAWING_FUNCTORS_H -#define CGAL_DRAWING_FUNCTORS_H +#ifndef CGAL_GRAPHICS_SCENE_OPTIONS_H +#define CGAL_GRAPHICS_SCENE_OPTIONS_H #include #include @@ -114,4 +114,4 @@ struct Graphics_scene_options: } // End namespace CGAL -#endif // CGAL_DRAWING_FUNCTORS_H +#endif // CGAL_GRAPHICS_SCENE_OPTIONS_H diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index 0410edfb0d0f..5d8ecbcf83e9 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -49,7 +49,7 @@ #include #include -#include +#include #include #include #include @@ -68,11 +68,11 @@ class Basic_viewer_qt : public CGAL::QGLViewer typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - using GS=Graphic_storage; + using GS=Graphics_scene; // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - Graphic_storage& buf, + Graphics_scene& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -364,9 +364,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer void face_end() { gBuffer.face_end(); } - Graphic_storage& get_graphic_storage() + Graphics_scene& get_graphic_storage() { return gBuffer; } - const Graphic_storage& get_graphic_storage() const + const Graphics_scene& get_graphic_storage() const { return gBuffer; } virtual void redraw() @@ -1595,7 +1595,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer std::function *)> on_key_pressed; protected: - Graphic_storage& gBuffer; + Graphics_scene& gBuffer; bool m_draw_vertices; bool m_draw_edges; @@ -1669,7 +1669,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_graphic_storage(Graphic_storage& graphic_storage, +void draw_graphic_storage(Graphics_scene& graphic_storage, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1698,7 +1698,7 @@ template class QApplication_and_basic_viewer { public: - QApplication_and_basic_viewer(CGAL::Graphic_storage& buffer, + QApplication_and_basic_viewer(CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"): m_application(nullptr), m_basic_viewer(nullptr), diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 5da2ad7cee27..cc4452f99c63 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -186,7 +186,7 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { //! Indicates whether to draw unbounded polygons with holes. bool m_draw_unbounded = false; - Graphic_storage gs; + Graphics_scene gs; }; // Specialization of draw function. diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 4165c0fea9e9..85b8d6591ac6 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -34,12 +34,12 @@ public Q_SLOTS: void sceneChanged(); private: - CGAL::Drawing_functor_with_volume m_drawing_functor; - CGAL::Graphic_storage m_graphic_buffer; + CGAL::Graphics_scene m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; }; diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 7d5ccbad9cc6..59b25e2371f3 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -17,7 +17,7 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 */ template - void add_in_graphic_storage(const LCC& alcc, CGAL::Graphic_storage& graphic_storage, + void add_in_graphic_storage(const LCC& alcc, CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options); } /* namespace CGAL */ diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 4942bef58143..6ef9c4ada70e 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_LCC_H #include -#include +#include #include #include #include @@ -61,7 +61,7 @@ template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptionsLCC& gs_options) { if (!gs_options.are_faces_enabled() || @@ -105,7 +105,7 @@ void compute_face(const LCC& lcc, template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled() || @@ -129,7 +129,7 @@ void compute_edge(const LCC& lcc, template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptionsLCC& gs_options) { if (!gs_options.are_vertices_enabled() || @@ -147,7 +147,7 @@ void compute_vertex(const LCC& lcc, template void compute_elements(const LCC& lcc, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { typename LCC::size_type markvolumes = lcc.get_new_mark(); @@ -240,7 +240,7 @@ template void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_lcc::compute_elements(static_cast(alcc), @@ -254,7 +254,7 @@ template class Map, class Refs, class Storage_, typename BufferType=float> void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { CGAL::Graphics_scene_options buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(alcc, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -300,7 +300,7 @@ template void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(alcc, buffer); draw_graphic_storage(buffer, title); } diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 29a142ede127..49a56e023d13 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -95,7 +95,7 @@ class Nef_Visitor { public: Nef_Visitor(const Nef_Polyhedron&_nef, - CGAL::Graphic_storage& _graphic_storage, + CGAL::Graphics_scene& _graphic_storage, const GSOptions&_gs_options) : n_faces(0), n_edges(0), nef(_nef), @@ -207,14 +207,14 @@ class Nef_Visitor { protected: std::unordered_map facets_done; std::unordered_map edges_done; - CGAL::Graphic_storage& graphic_storage; + CGAL::Graphics_scene& graphic_storage; const GSOptions& gs_options; const Nef_Polyhedron& nef; }; template void compute_elements(const Nef_Polyhedron &nef, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &gs_options) { @@ -243,7 +243,7 @@ void compute_elements(const Nef_Polyhedron &nef, template void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &gs_options) { draw_function_for_nef_polyhedron::compute_elements(anef, @@ -254,7 +254,7 @@ void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, template void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphics_scene &graphic_storage) { // Default graphics view options. Graphics_scene_options buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(anef, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -299,7 +299,7 @@ template buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(anef, buffer); draw_graphic_storage(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index ca9d7ec52c3a..3fcf78387c53 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -69,7 +69,7 @@ namespace draw_function_for_P2T2 template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { // Construct the point in 9-sheeted covering space and add to viewer @@ -86,7 +86,7 @@ void compute_vertex(const P2T2 &p2t2, template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if(!gs_options.draw_edge(p2t2, si)) @@ -104,7 +104,7 @@ void compute_edge(const P2T2 &p2t2, template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if(!gs_options.draw_face(p2t2, ti)) @@ -126,7 +126,7 @@ void compute_face(const P2T2 &p2t2, template void compute_domain(const P2T2& p2t2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -155,7 +155,7 @@ void compute_domain(const P2T2& p2t2, template void compute_elements(const P2T2& p2t2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { // Get the display type, iterate through periodic elements according @@ -198,7 +198,7 @@ void compute_elements(const P2T2& p2t2, template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_P2T2::compute_elements(p2t2, graphic_storage, gs_options); @@ -206,7 +206,7 @@ void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, template void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { CGAL::Graphics_scene_options_periodic_2_triangulation_2 buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ap2t2, buffer, gs_options); draw_graphic_storage(buffer); } @@ -234,7 +234,7 @@ template void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; CGAL::Graphics_scene_options_periodic_2_triangulation_2 #include -#include +#include #include #include @@ -44,7 +44,7 @@ namespace draw_function_for_PointSet { template void compute_elements(const PointSet& pointset, - Graphic_storage& graphic_storage, + Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.are_vertices_enabled()) @@ -70,7 +70,7 @@ void compute_elements(const PointSet& pointset, template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_storage, + Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_PointSet::compute_elements(apointset, @@ -80,7 +80,7 @@ void add_in_graphic_storage(const Point_set_3& apointset, template void add_in_graphic_storage(const Point_set_3& apointset, - Graphic_storage& graphic_storage) + Graphics_scene& graphic_storage) { CGAL::Graphics_scene_options, typename Point_set_3::const_iterator, @@ -96,7 +96,7 @@ void draw(const Point_set_3& apointset, const GSOptions& gs_options, const char *title="Point_set_3 Basic Viewer") { - Graphic_storage buffer; + Graphics_scene buffer; add_in_graphic_storage(apointset, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -105,7 +105,7 @@ template void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { - Graphic_storage buffer; + Graphics_scene buffer; add_in_graphic_storage(apointset, buffer); draw_graphic_storage(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 9a9c7d2f9139..89ae5f70c689 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -19,7 +19,7 @@ #define CGAL_DRAW_POLYGON_2_H #include -#include +#include #include #include @@ -48,7 +48,7 @@ namespace draw_function_for_p2 { template void compute_elements(const P2& p2, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions& gs_options) { if (p2.is_empty()) @@ -103,13 +103,13 @@ void compute_elements(const P2& p2, template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_p2::compute_elements(ap2, graphic_storage, gs_options); } template void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphics_scene &graphic_storage) { CGAL::Graphics_scene_options void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ap2, buffer); draw_graphic_storage(buffer, title); } @@ -136,7 +136,7 @@ void draw(const CGAL_P2_TYPE &ap2, const GSOptions& gs_options, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ap2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 1c0683080e5e..03a428f40091 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -19,7 +19,7 @@ #define CGAL_DRAW_POLYGON_WITH_HOLES_2_H #include -#include +#include #include #include @@ -55,7 +55,7 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, - Graphic_storage &graphic_storage, + Graphics_scene &graphic_storage, bool hole, const GSOptions& gs_options) { @@ -98,7 +98,7 @@ void compute_one_loop_elements(const P2& ap2, } template -void compute_elements(const P2& p2, Graphic_storage &graphic_storage, +void compute_elements(const P2& p2, Graphics_scene &graphic_storage, const GSOptions& gs_options) { if (p2.outer_boundary().is_empty()) return; @@ -134,7 +134,7 @@ void compute_elements(const P2& p2, Graphic_storage &graphic_storage template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions &gs_options) { draw_function_for_ph2_with_holes::compute_elements(p2, graphic_storage, @@ -143,7 +143,7 @@ void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, template void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { Graphics_scene_options void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const GSOptions &gs_options, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ap2, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -169,7 +169,7 @@ template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ap2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 59f087f6179f..c9f7cb47f099 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_POLYHEDRON_H #include -#include +#include #include #include #include @@ -35,7 +35,7 @@ template void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &gs_options) { add_in_graphic_storage_for_fg(apoly, graphic_storage, gs_options); } @@ -46,7 +46,7 @@ template void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphics_scene &graphic_storage) { add_in_graphic_storage_for_fg(apoly, graphic_storage); } // Specialization of draw function: require Qt and the CGAL basic viewer. @@ -61,7 +61,7 @@ template buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage_for_fg(apoly, buffer); draw_graphic_storage(buffer, title); } @@ -77,7 +77,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const GSOptions &gs_options, const char* title="Polyhedron Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage_for_fg(apoly, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index e47cd8a778c3..7552a10469f3 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace draw_function_for_ss2 { template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.draw_edge(ss2, eh)) @@ -48,7 +48,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { // TODO? an option different from draw_edge to allow to show only some labels ?? @@ -67,7 +67,7 @@ void print_halfedge_labels(const SS2& ss2, template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.draw_vertex(ss2, vh)) @@ -84,7 +84,7 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { // TODO? an option different from draw_vertex to allow to show only some labels ?? @@ -98,7 +98,7 @@ void print_vertex_label(const SS2& ss2, template void compute_elements(const SS2& ss2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled()) @@ -131,7 +131,7 @@ void compute_elements(const SS2& ss2, template void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_ss2::compute_elements(ass2, graphic_storage, @@ -140,7 +140,7 @@ void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, template void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { Graphics_scene_options void draw(const CGAL_SS_TYPE &ass2, const GSOptions &gs_options, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ass2, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -195,7 +195,7 @@ template void draw(const CGAL_SS_TYPE &ass2, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ass2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index dbcd8f86c732..e41050d297cb 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -30,7 +30,7 @@ void draw(const SM& asm); #else // DOXYGEN_RUNNING #include -#include +#include #include #include #include @@ -96,13 +96,13 @@ struct Graphics_scene_options_surface_mesh template void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &gs_options) { add_in_graphic_storage_for_fg(amesh, graphic_storage, gs_options); } template void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphic_storage &graphic_storage) + CGAL::Graphics_scene &graphic_storage) { add_in_graphic_storage_for_fg(amesh, graphic_storage, Graphics_scene_options_surface_mesh(amesh)); } @@ -113,7 +113,7 @@ template void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(amesh, buffer); draw_graphic_storage(buffer, title); } @@ -123,7 +123,7 @@ void draw(const Surface_mesh& amesh, const GSOptions &gs_options, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(amesh, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 454316d4c3ab..698eab17e1e4 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include @@ -145,7 +145,7 @@ template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, GSOptions& gs_options) { if(!gs_options.draw_face(lcc, dh)) @@ -193,7 +193,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, GSOptions& gs_options, bool draw_marked_darts=true) { @@ -224,7 +224,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; @@ -241,7 +241,7 @@ void compute_edge(const Mesh &mesh, template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, GSOptions& gs_options) { typedef typename CGAL::Get_traits::Kernel Kernel; @@ -253,7 +253,7 @@ void compute_vertex(const Mesh &mesh, template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const std::vector>* m_paths, std::size_t i, typename Get_map::type::size_type amark) @@ -282,7 +282,7 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions &m_gs_options, const std::vector>* m_paths, typename Get_map::type::size_type amark) @@ -371,7 +371,7 @@ void compute_elements(const Mesh &mesh, template void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const std::vector>* paths, const GSOptions& gs_options, typename Get_map::type::size_type amark= @@ -385,7 +385,7 @@ void add_in_graphic_storage(const Mesh& mesh, template void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const std::vector>* paths, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) @@ -409,7 +409,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(mesh, buffer, &paths, amark); draw_graphic_storage(buffer, title); } @@ -422,7 +422,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(mesh, buffer, gs_options, &paths, amark); draw_graphic_storage(buffer, title); } @@ -435,7 +435,7 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { std::vector> paths=l; - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(mesh, buffer, &paths, amark); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 5d3b5faf1ec7..857d8db8b2a5 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -15,7 +15,7 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with */ template -void draw(const T2& at2, const CGAL::Cell_parameters& cp=default); @@ -33,8 +33,8 @@ adds the vertices, edges and faces of `at2` into the given graphic storage `gs`. */ template void add_in_graphic_storage(const T2& at2, - CGAL::Graphic_storage& gs, - const CGAL::Cell_parameters& gs, + const CGAL::Graphics_scene_options& cp=default); diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h index 85a70dc23f82..7cca28a1948f 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h @@ -61,7 +61,7 @@ struct Polygon_triangulation_gs_options : template void add_in_graphic_storage(const CGAL_CT2_TYPE& ct2, - CGAL::Graphic_storage& graphic_buffer, + CGAL::Graphics_scene& graphic_buffer, const GSOptions& gs_options) { draw_function_for_t2::compute_elements(ct2, graphic_buffer, gs_options); @@ -74,7 +74,7 @@ template void draw(const CGAL_CT2_TYPE &ct2, const GSOptions &gs_options, const char *title="Constrained Triangulation_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(ct2, buffer, gs_options); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index fb1a912addbc..c56938f8eecf 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -28,7 +28,7 @@ namespace CGAL template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { using BASET2=CGAL::Triangulation_2; @@ -59,7 +59,7 @@ void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { internal::In_domain in_domain; add_in_graphic_storage(at2, in_domain, graphic_storage); @@ -69,7 +69,7 @@ template void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, const char *title="Constrained Triangulation_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(at2, ipm, buffer); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 84134c0cde0b..56b0c8b9b337 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ namespace draw_function_for_t2 { template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.draw_face(t2, fh)) @@ -47,7 +47,7 @@ void compute_face(const T2& t2, template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.draw_edge(t2, eh)) @@ -70,7 +70,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (!gs_options.draw_vertex(t2, vh)) @@ -88,7 +88,7 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, template void compute_elements(const T2& t2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) @@ -119,7 +119,7 @@ void compute_elements(const T2& t2, template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_t2::compute_elements(at2, graphic_storage, gs_options); @@ -127,7 +127,7 @@ void add_in_graphic_storage(const CGAL_T2_TYPE& at2, template void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { Graphics_scene_options void draw(const CGAL_T2_TYPE &at2, const GSOptions &gs_options, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(at2, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -165,7 +165,7 @@ template void draw(const CGAL_T2_TYPE& at2, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(at2, buffer); draw_graphic_storage(buffer, title); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 32a4e93eb9ff..e9fca016eda0 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -28,7 +28,7 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, const GSOptions& gs_options, - CGAL::Graphic_storage& graphic_storage, const T3 *t3) + CGAL::Graphics_scene& graphic_storage, const T3 *t3) { if(!gs_options.draw_face(*t3, fh)) { return; } @@ -50,7 +50,7 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_edge(*t3, eh)) @@ -70,7 +70,7 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_vertex(*t3, vh)) @@ -86,7 +86,7 @@ void compute_vertex(typename T3::Vertex_handle vh, template void compute_elements(const T3* t3, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) @@ -118,7 +118,7 @@ void compute_elements(const T3* t3, template void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { draw_function_for_t3::compute_elements(&at3, graphic_storage, gs_options); @@ -127,7 +127,7 @@ void add_in_graphic_storage(const CGAL_T3_TYPE& at3, template void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { CGAL::Graphics_scene_options void draw(const CGAL_T3_TYPE &at3, const GSOptions &gs_options, const char *title="T3 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(at3, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -169,7 +169,7 @@ void draw(const CGAL_T3_TYPE &at3, const GSOptions &gs_options, template void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(at3, buffer); draw_graphic_storage(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 6d6ed974f8b9..48e5065ee8ef 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -72,7 +72,7 @@ typedef Local_kernel::Vector_3 Local_vector; template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if(!gs_options.draw_vertex(v2, vh)) @@ -87,14 +87,14 @@ void compute_vertex(const V2& v2, template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphic_storage &graphic_storage, + CGAL::Graphics_scene &graphic_storage, const GSOptions& gs_options) { graphic_storage.add_point(vi->point(), gs_options.dual_vertex_color); } template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -224,7 +224,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -254,7 +254,7 @@ void compute_rays_and_bisectors(const V2&, template void compute_face(const V2& v2, typename V2::Face_iterator fh, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& m_gs_options) { if(fh->is_unbounded() || !m_gs_options.draw_face(v2, fh)) @@ -288,7 +288,7 @@ void compute_face(const V2& v2, template void compute_elements(const V2& v2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& gs_options) { if(gs_options.are_vertices_enabled()) @@ -338,7 +338,7 @@ void compute_elements(const V2& v2, template void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphic_storage& graphic_storage, + CGAL::Graphics_scene& graphic_storage, const GSOptions& m_gs_options) { draw_function_for_v2::compute_elements(v2, graphic_storage, m_gs_options); @@ -346,7 +346,7 @@ void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, template void add_in_graphic_storage(const CGAL_VORONOI_TYPE& v2, - CGAL::Graphic_storage& graphic_storage) + CGAL::Graphics_scene& graphic_storage) { // Default graphics view options. CGAL::Graphics_scene_options_voronoi buffer; + CGAL::Graphics_scene buffer; add_in_graphic_storage(av2, buffer, gs_options); draw_graphic_storage(buffer, title); } @@ -376,7 +376,7 @@ template void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { - CGAL::Graphic_storage buffer; + CGAL::Graphics_scene buffer; CGAL::Graphics_scene_options_voronoi Date: Thu, 28 Sep 2023 11:10:24 +0200 Subject: [PATCH 176/341] Camel case (Andreas review) --- .../include/CGAL/Graphics_scene_options.h | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/Basic_viewer/include/CGAL/Graphics_scene_options.h b/Basic_viewer/include/CGAL/Graphics_scene_options.h index 5728dfbb2913..6a085c2397f3 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/include/CGAL/Graphics_scene_options.h @@ -20,51 +20,51 @@ namespace CGAL { template + typename VertexHandle, + typename EdgeHandle, + typename FaceHandle, + typename VolumeHandle=void> struct Graphics_scene_options; // Drawing functor for a 2D combinatorial data structure // (with vertices, edges and faces) template -struct Graphics_scene_options + typename VertexHandle, + typename EdgeHandle, + typename FaceHandle> +struct Graphics_scene_options { Graphics_scene_options(): m_enabled_vertices(true), m_enabled_edges(true), m_enabled_faces(true) { - draw_vertex=[](const DS &, vertex_handle)->bool { return true; }; - draw_edge=[](const DS &, edge_handle)->bool { return true; }; - draw_face=[](const DS &, face_handle)->bool { return true; }; + draw_vertex=[](const DS &, VertexHandle)->bool { return true; }; + draw_edge=[](const DS &, EdgeHandle)->bool { return true; }; + draw_face=[](const DS &, FaceHandle)->bool { return true; }; - colored_vertex=[](const DS &, vertex_handle)->bool { return false; }; - colored_edge=[](const DS &, edge_handle)->bool { return false; }; - colored_face=[](const DS &, face_handle)->bool { return false; }; + colored_vertex=[](const DS &, VertexHandle)->bool { return false; }; + colored_edge=[](const DS &, EdgeHandle)->bool { return false; }; + colored_face=[](const DS &, FaceHandle)->bool { return false; }; - face_wireframe=[](const DS &, face_handle)->bool { return false; }; + face_wireframe=[](const DS &, FaceHandle)->bool { return false; }; } // The seven following functions should not be null - std::function draw_vertex; - std::function draw_edge; - std::function draw_face; + std::function draw_vertex; + std::function draw_edge; + std::function draw_face; - std::function colored_vertex; - std::function colored_edge; - std::function colored_face; + std::function colored_vertex; + std::function colored_edge; + std::function colored_face; - std::function face_wireframe; + std::function face_wireframe; // These functions must be non null if the corresponding colored_XXX function // returns true. - std::function vertex_color; - std::function edge_color; - std::function face_color; + std::function vertex_color; + std::function edge_color; + std::function face_color; void disable_vertices() { m_enabled_vertices=false; } void enable_vertices() { m_enabled_vertices=true; } @@ -85,24 +85,24 @@ struct Graphics_scene_options // Drawing functor for a 3D combinatorial data structure // (with vertices, edges, faces and volumes) template + typename VertexHandle, + typename EdgeHandle, + typename FaceHandle, + typename VolumeHandle> struct Graphics_scene_options: - public Graphics_scene_options + public Graphics_scene_options { Graphics_scene_options() : m_enabled_volumes(true) { - draw_volume=[](const DS &, volume_handle)->bool { return true; }; - colored_volume=[](const DS &, volume_handle)->bool { return false; }; - volume_wireframe=[](const DS &, volume_handle)->bool { return false; }; + draw_volume=[](const DS &, VolumeHandle)->bool { return true; }; + colored_volume=[](const DS &, VolumeHandle)->bool { return false; }; + volume_wireframe=[](const DS &, VolumeHandle)->bool { return false; }; } - std::function draw_volume; - std::function colored_volume; - std::function volume_wireframe; - std::function volume_color; + std::function draw_volume; + std::function colored_volume; + std::function volume_wireframe; + std::function volume_color; void disable_volumes() { m_enabled_volumes=false; } void enable_volumes() { m_enabled_volumes=true; } From 9f22d67ed082c215d6708e58a9685ab2eb01f197 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 12:49:00 +0200 Subject: [PATCH 177/341] Rename Graphic_storage in Graphics_scene (Andreas and Sebastien review) --- .../include/CGAL/draw_arrangement_2.h | 4 +- BGL/include/CGAL/draw_face_graph.h | 28 +++---- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 6 +- .../doc/Basic_viewer/PackageDescription.txt | 30 +++---- .../Basic_viewer/draw_mesh_and_points.cpp | 6 +- .../Basic_viewer/draw_several_windows.cpp | 4 +- .../draw_surface_mesh_small_faces.cpp | 6 +- .../include/CGAL/Qt/Basic_viewer_qt.h | 8 +- .../demo/Linear_cell_complex/Viewer.cpp | 12 +-- .../demo/Linear_cell_complex/Viewer.h | 2 +- .../CGAL/draw_linear_cell_complex.h | 2 +- .../PackageDescription.txt | 2 +- .../include/CGAL/draw_linear_cell_complex.h | 56 ++++++------- Nef_3/include/CGAL/draw_nef_3.h | 56 ++++++------- .../CGAL/draw_periodic_2_triangulation_2.h | 66 +++++++-------- Point_set_3/include/CGAL/draw_point_set_3.h | 26 +++--- Polygon/include/CGAL/draw_polygon_2.h | 40 ++++----- .../include/CGAL/draw_polygon_with_holes_2.h | 50 +++++------ Polyhedron/include/CGAL/draw_polyhedron.h | 22 ++--- .../include/CGAL/draw_straight_skeleton_2.h | 50 +++++------ Surface_mesh/include/CGAL/draw_surface_mesh.h | 20 ++--- .../include/CGAL/draw_face_graph_with_paths.h | 74 ++++++++-------- .../CGAL/draw_triangulation_2.h | 2 +- .../Triangulation_2/polygon_triangulation.cpp | 4 +- ...on_triangulation_graphics_scene_options.h} | 12 +-- .../CGAL/draw_constrained_triangulation_2.h | 16 ++-- .../include/CGAL/draw_triangulation_2.h | 54 ++++++------ .../include/CGAL/draw_triangulation_3.h | 54 ++++++------ .../include/CGAL/draw_voronoi_diagram_2.h | 84 +++++++++---------- 29 files changed, 398 insertions(+), 398 deletions(-) rename Triangulation_2/examples/Triangulation_2/{polygon_triangulation_drawing_functor.h => polygon_triangulation_graphics_scene_options.h} (88%) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index f03f133c3588..62b7ece09c46 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -70,7 +70,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { const char* title = "2D Arrangement Basic Viewer", bool draw_vertices = false) : // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, m_graphic_storage, title, draw_vertices, true, true, false, false), + Base(parent, m_graphics_scene, title, draw_vertices, true, true, false, false), m_arr(arr), m_color_generator(color_generator) { @@ -511,7 +511,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { Color_generator m_color_generator; std::unordered_map m_visited; - CGAL::Graphics_scene m_graphic_storage; + CGAL::Graphics_scene m_graphics_scene; }; //! Basic viewer of a 2D arrangement. diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 4c30d6b2a5f4..4172b25fcb71 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -26,7 +26,7 @@ namespace draw_function_for_FG { template void compute_elements(const FG &fg, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const GSOptions &m_gs_options) { using Point=typename boost::property_map_value::type; @@ -66,17 +66,17 @@ void compute_elements(const FG &fg, !m_gs_options.face_wireframe(fg, fh) && // face is not wireframe m_gs_options.colored_face(fg, fh)) // and face is colored { - graphic_storage.face_begin(m_gs_options.face_color(fg, fh)); + graphics_scene.face_begin(m_gs_options.face_color(fg, fh)); auto hd = halfedge(fh, fg); const auto first_hd = hd; do { auto v = source(hd, fg); - graphic_storage.add_point_in_face(get(point_pmap, v), get(vnormals, v)); + graphics_scene.add_point_in_face(get(point_pmap, v), get(vnormals, v)); hd = next(hd, fg); } while (hd != first_hd); - graphic_storage.face_end(); + graphics_scene.face_end(); } } } @@ -87,13 +87,13 @@ void compute_elements(const FG &fg, { if(m_gs_options.colored_edge(fg, e)) // edge is colored { - graphic_storage.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + graphics_scene.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), m_gs_options.edge_color(fg, e)); } else { - graphic_storage.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), + graphics_scene.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg))); } } @@ -105,12 +105,12 @@ void compute_elements(const FG &fg, { if(m_gs_options.colored_vertex(fg, v)) // vertex is colored { - graphic_storage.add_point(get(point_pmap, v), + graphics_scene.add_point(get(point_pmap, v), m_gs_options.vertex_color(fg, v)); } else { - graphic_storage.add_point(get(point_pmap, v)); + graphics_scene.add_point(get(point_pmap, v)); } } } @@ -119,16 +119,16 @@ void compute_elements(const FG &fg, } // draw_function_for_FG template -void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphics_scene &graphic_storage, +void add_in_graphics_scene_for_fg(const FG &fg, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { - draw_function_for_FG::compute_elements(fg, graphic_storage, gs_options); + draw_function_for_FG::compute_elements(fg, graphics_scene, gs_options); } template -void add_in_graphic_storage_for_fg(const FG &fg, - CGAL::Graphics_scene &graphic_storage) +void add_in_graphics_scene_for_fg(const FG &fg, + CGAL::Graphics_scene &graphics_scene) { Graphics_scene_options::vertex_descriptor, @@ -150,7 +150,7 @@ void add_in_graphic_storage_for_fg(const FG &fg, return get_random_color(CGAL::get_default_random()); }; - add_in_graphic_storage_for_fg(fg, graphic_storage, gs_options); + add_in_graphics_scene_for_fg(fg, graphics_scene, gs_options); } } // End namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index d771cdcd5947..9c6388c6698b 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -196,10 +196,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_text(const KPoint &kp, const std::string &txt); /// returns the graphic storage of the viewer. - Graphics_scene& get_graphic_storage(); + Graphics_scene& get_graphics_scene(); /// returns the graphic storage of the viewer, const version. - const Graphics_scene& get_graphic_storage() const; + const Graphics_scene& get_graphics_scene() const; /// negates all normal of vertices and faces. void negate_all_normals(); @@ -248,7 +248,7 @@ class QApplication_and_basic_viewer opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. */ template -void draw_graphic_storage(Graphics_scene& graphic_buffer, +void draw_graphics_scene(Graphics_scene& graphic_buffer, const char *title="CGAL Basic Viewer") {} diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 569246d4dfb1..a9e27a2cd74b 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -30,7 +30,7 @@ \cgalCRPSubsection{Draw a Graphic Storage} -- `CGAL::draw_graphic_storage()` +- `CGAL::draw_graphics_scene()` \cgalCRPSubsection{Draw for Different Packages} @@ -52,20 +52,20 @@ \cgalCRPSubsection{Fill Graphic Storage for Different Packages} -- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphic_storage() \endlink -- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_in_graphic_storage() \endlink -- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_in_graphic_storage() \endlink -- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_in_graphic_storage() \endlink -- Point_set_3 \link PkgDrawPointSet3D CGAL::add_in_graphic_storage() \endlink -- Polygon_2 \link PkgDrawPolygon2 CGAL::add_in_graphic_storage() \endlink -- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_in_graphic_storage() \endlink -- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_in_graphic_storage() \endlink -- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_in_graphic_storage() \endlink -- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_in_graphic_storage() \endlink -- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_in_graphic_storage() \endlink -- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphic_storage() \endlink -- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_in_graphic_storage() \endlink -- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_in_graphic_storage() \endlink +- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphics_scene() \endlink +- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_in_graphics_scene() \endlink +- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_in_graphics_scene() \endlink +- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_in_graphics_scene() \endlink +- Point_set_3 \link PkgDrawPointSet3D CGAL::add_in_graphics_scene() \endlink +- Polygon_2 \link PkgDrawPolygon2 CGAL::add_in_graphics_scene() \endlink +- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_in_graphics_scene() \endlink +- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_in_graphics_scene() \endlink +- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_in_graphics_scene() \endlink +- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_in_graphics_scene() \endlink +- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_in_graphics_scene() \endlink +- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphics_scene() \endlink +- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_in_graphics_scene() \endlink +- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_in_graphics_scene() \endlink */ diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index bd843f8c1ad2..1c7bfbb1a157 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -55,9 +55,9 @@ int main(void) { point_set.insert(it.first); } CGAL::Graphics_scene graphic_buffer; - CGAL::add_in_graphic_storage(point_set, graphic_buffer, Graphics_scene_options_green_points()); - CGAL::add_in_graphic_storage(output_mesh, graphic_buffer); - CGAL::draw_graphic_storage(graphic_buffer); + CGAL::add_in_graphics_scene(point_set, graphic_buffer, Graphics_scene_options_green_points()); + CGAL::add_in_graphics_scene(output_mesh, graphic_buffer); + CGAL::draw_graphics_scene(graphic_buffer); } else { return EXIT_FAILURE; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 4fb8bd75892c..7d90b5344b89 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -48,8 +48,8 @@ int main(void) { point_set.insert(it.first); } CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; - CGAL::add_in_graphic_storage(point_set, graphic_buffer1); - CGAL::add_in_graphic_storage(output_mesh, graphic_buffer2); + CGAL::add_in_graphics_scene(point_set, graphic_buffer1); + CGAL::add_in_graphics_scene(output_mesh, graphic_buffer2); /// (2) Qt code that create windows, add them in a layout, and create app. diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index a2f617d34487..80af57cb3e9b 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -101,7 +101,7 @@ int main(int argc, char* argv[]) Graphics_scene_options_small_faces gsosm(sm); CGAL::Graphics_scene buffer; - add_in_graphic_storage(sm, buffer, gsosm); + add_in_graphics_scene(sm, buffer, gsosm); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { @@ -117,7 +117,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); basic_viewer->clear(); - add_in_graphic_storage(sm, buffer, gsosm); + add_in_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -128,7 +128,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); basic_viewer->clear(); - add_in_graphic_storage(sm, buffer, gsosm); + add_in_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } else diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index 5d8ecbcf83e9..a98fadbbf46f 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -364,9 +364,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer void face_end() { gBuffer.face_end(); } - Graphics_scene& get_graphic_storage() + Graphics_scene& get_graphics_scene() { return gBuffer; } - const Graphics_scene& get_graphic_storage() const + const Graphics_scene& get_graphics_scene() const { return gBuffer; } virtual void redraw() @@ -1669,7 +1669,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_graphic_storage(Graphics_scene& graphic_storage, +void draw_graphics_scene(Graphics_scene& graphics_scene, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1686,7 +1686,7 @@ void draw_graphic_storage(Graphics_scene& graphic_storage, const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); Basic_viewer_qt basic_viewer(app.activeWindow(), - graphic_storage, title); + graphics_scene, title); basic_viewer.show(); app.exec(); diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 8308b4c4a30c..41ac6f489685 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -19,7 +19,7 @@ Viewer::Viewer(QWidget *parent) : Base(parent, m_graphic_buffer, ""), m_previous_scene_empty(true) { - m_drawing_functor.face_color=[](const LCC & alcc, + m_gs_options.face_color=[](const LCC & alcc, Dart_const_descriptor dh)->CGAL::IO::Color { if(alcc.template is_free<3>(dh)) @@ -38,13 +38,13 @@ Viewer::Viewer(QWidget *parent) return CGAL::IO::Color((c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2); }; - m_drawing_functor.colored_face=[](const LCC &, Dart_const_descriptor)->bool + m_gs_options.colored_face=[](const LCC &, Dart_const_descriptor)->bool { return true; }; - m_drawing_functor.draw_volume=[](const LCC & alcc, Dart_const_descriptor dh)->bool + m_gs_options.draw_volume=[](const LCC & alcc, Dart_const_descriptor dh)->bool { return alcc.template info<3>(dh).is_visible(); }; - m_drawing_functor.volume_wireframe=[](const LCC& alcc, Dart_const_descriptor dh)->bool + m_gs_options.volume_wireframe=[](const LCC& alcc, Dart_const_descriptor dh)->bool { return !(alcc.template info<3>(dh).is_filled()); }; } @@ -53,7 +53,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphic_storage(*scene->lcc, gBuffer, m_drawing_functor); } + { CGAL::add_in_graphics_scene(*scene->lcc, gBuffer, m_gs_options); } if (doredraw) { Base::redraw(); } @@ -62,7 +62,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { gBuffer.clear(); - CGAL::add_in_graphic_storage(*scene->lcc, gBuffer, m_drawing_functor); + CGAL::add_in_graphics_scene(*scene->lcc, gBuffer, m_gs_options); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index 85b8d6591ac6..a4df8965ff20 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -38,7 +38,7 @@ public Q_SLOTS: Dart_const_descriptor, Dart_const_descriptor, Dart_const_descriptor, - Dart_const_descriptor> m_drawing_functor; + Dart_const_descriptor> m_gs_options; CGAL::Graphics_scene m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 59b25e2371f3..36d6af07625b 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -17,7 +17,7 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 */ template - void add_in_graphic_storage(const LCC& alcc, CGAL::Graphics_scene& graphic_storage, + void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options); } /* namespace CGAL */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt index a66536220767..58c4d068dfbb 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt @@ -76,6 +76,6 @@ \cgalCRPSubsection{Draw a Linear Cell Complex} - \link PkgDrawLinearCellComplex CGAL::draw() \endlink -- \link PkgDrawLinearCellComplex CGAL::add_in_graphic_storage() \endlink +- \link PkgDrawLinearCellComplex CGAL::add_in_graphics_scene() \endlink */ diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 6ef9c4ada70e..a288dc68b5c7 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -61,7 +61,7 @@ template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptionsLCC& gs_options) { if (!gs_options.are_faces_enabled() || @@ -80,32 +80,32 @@ void compute_face(const LCC& lcc, if (gs_options.colored_volume(lcc, voldh)) { - graphic_storage.face_begin(gs_options.volume_color(lcc, voldh)); + graphics_scene.face_begin(gs_options.volume_color(lcc, voldh)); } else if (gs_options.colored_face(lcc, dh)) { - graphic_storage.face_begin(gs_options.face_color(lcc, dh)); + graphics_scene.face_begin(gs_options.face_color(lcc, dh)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } cur=dh; do { - graphic_storage.add_point_in_face + graphics_scene.add_point_in_face (lcc.point(cur), LCC_geom_utils::get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } while (cur!=dh); - graphic_storage.face_end(); + graphics_scene.face_end(); } template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled() || @@ -118,18 +118,18 @@ void compute_edge(const LCC& lcc, { if (gs_options.colored_edge(lcc, dh)) { - graphic_storage.add_segment(p1, lcc.point(d2), + graphics_scene.add_segment(p1, lcc.point(d2), gs_options.edge_color(lcc, dh)); } else - { graphic_storage.add_segment(p1, lcc.point(d2)); } + { graphics_scene.add_segment(p1, lcc.point(d2)); } } } template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptionsLCC& gs_options) { if (!gs_options.are_vertices_enabled() || @@ -138,16 +138,16 @@ void compute_vertex(const LCC& lcc, if (gs_options.colored_vertex(lcc, dh)) { - graphic_storage.add_point(lcc.point(dh), + graphics_scene.add_point(lcc.point(dh), gs_options.vertex_color(lcc, dh)); } else - { graphic_storage.add_point(lcc.point(dh)); } + { graphics_scene.add_point(lcc.point(dh)); } } template void compute_elements(const LCC& lcc, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typename LCC::size_type markvolumes = lcc.get_new_mark(); @@ -178,7 +178,7 @@ void compute_elements(const LCC& lcc, (!lcc.template is_free<3>(itv) && !gs_options.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && !gs_options.face_wireframe(lcc, itv)) - { compute_face(lcc, itv, it, graphic_storage, gs_options); } + { compute_face(lcc, itv, it, graphics_scene, gs_options); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator itf=lcc.template darts_of_cell_basic<2>(itv, markfaces).begin(), itfend=lcc.template darts_of_cell_basic<2>(itv, markfaces).end(); @@ -188,7 +188,7 @@ void compute_elements(const LCC& lcc, if (!lcc.is_marked(itf, markedges) && gs_options.draw_edge(lcc, itf)) { - compute_edge(lcc, itf, graphic_storage, gs_options); + compute_edge(lcc, itf, graphics_scene, gs_options); for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator ite=lcc.template darts_of_cell_basic<1>(itf, markedges).begin(), iteend=lcc.template darts_of_cell_basic<1>(itf, markedges).end(); @@ -198,7 +198,7 @@ void compute_elements(const LCC& lcc, if (!lcc.is_marked(ite, markvertices) && gs_options.draw_vertex(lcc, ite)) { - compute_vertex(lcc, ite, graphic_storage, gs_options); + compute_vertex(lcc, ite, graphics_scene, gs_options); CGAL::mark_cell(lcc, ite, markvertices); } } @@ -232,29 +232,29 @@ void compute_elements(const LCC& lcc, CGAL::Linear_cell_complex_base -// add_in_graphic_storage: to add a LCC in the given graphic buffer, with a +// add_in_graphics_scene: to add a LCC in the given graphic buffer, with a // graphics scene options. template class Map, class Refs, class Storage_, typename BufferType=float, class GSOptions> -void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_lcc::compute_elements(static_cast(alcc), - graphic_storage, gs_options); + graphics_scene, gs_options); } -// add_in_graphic_storage: to add a LCC in the given graphic buffer, without a +// add_in_graphics_scene: to add a LCC in the given graphic buffer, without a // graphics scene options. Use default drawing values. template class Map, class Refs, class Storage_, typename BufferType=float> -void add_in_graphic_storage(const CGAL_LCC_TYPE& alcc, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options buffer; - add_in_graphic_storage(alcc, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(alcc, buffer, gs_options); + draw_graphics_scene(buffer, title); } // Specialization of draw function for a LCC, without a graphics scene options. @@ -301,8 +301,8 @@ template buffer; - add_in_graphic_storage(alcc, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(alcc, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 49a56e023d13..594f48b4d4d9 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -95,11 +95,11 @@ class Nef_Visitor { public: Nef_Visitor(const Nef_Polyhedron&_nef, - CGAL::Graphics_scene& _graphic_storage, + CGAL::Graphics_scene& _graphics_scene, const GSOptions&_gs_options) : n_faces(0), n_edges(0), nef(_nef), - graphic_storage(_graphic_storage), + graphics_scene(_graphics_scene), gs_options(_gs_options) {} @@ -110,10 +110,10 @@ class Nef_Visitor { { return; } if(gs_options.colored_vertex(nef, vh)) - { graphic_storage.add_point(vh->point(), + { graphics_scene.add_point(vh->point(), gs_options.vertex_color(nef, vh)); } else - { graphic_storage.add_point(vh->point()); } + { graphics_scene.add_point(vh->point()); } } void visit(Halffacet_const_handle opposite_facet) @@ -135,9 +135,9 @@ class Nef_Visitor { { return; } //return if not-shalfedge if(gs_options.colored_face(nef, f)) - { graphic_storage.face_begin(gs_options.face_color(nef, f)); } + { graphics_scene.face_begin(gs_options.face_color(nef, f)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } SHalfedge_around_facet_const_circulator hc_start(se); SHalfedge_around_facet_const_circulator hc_end(hc_start); @@ -146,7 +146,7 @@ class Nef_Visitor { { Vertex_const_handle vh=hc_start->source()->center_vertex(); lastvh=vh; - graphic_storage.add_point_in_face(vh->point(), + graphics_scene.add_point_in_face(vh->point(), get_vertex_normal(vh)); } @@ -162,19 +162,19 @@ class Nef_Visitor { CGAL_For_all(hc_start, hc_end) { Vertex_const_handle vh=hc_start->source()->center_vertex(); - graphic_storage.add_point_in_face(vh->point(), + graphics_scene.add_point_in_face(vh->point(), get_vertex_normal(vh)); } - graphic_storage.add_point_in_face(hc_start->source()->center_vertex()->point(), + graphics_scene.add_point_in_face(hc_start->source()->center_vertex()->point(), get_vertex_normal (hc_start->source()->center_vertex())); - graphic_storage.add_point_in_face(lastvh->point(), + graphics_scene.add_point_in_face(lastvh->point(), get_vertex_normal(lastvh)); } ++fc; } - graphic_storage.face_end(); + graphics_scene.face_end(); facets_done[f]=true; ++n_faces; } @@ -191,10 +191,10 @@ class Nef_Visitor { { return; } // Edge already added if(gs_options.colored_edge(nef, he)) - { graphic_storage.add_segment(he->source()->point(), he->target()->point(), + { graphics_scene.add_segment(he->source()->point(), he->target()->point(), gs_options.edge_color(nef, he)); } else - { graphic_storage.add_segment(he->source()->point(), he->target()->point()); } + { graphics_scene.add_segment(he->source()->point(), he->target()->point()); } edges_done[he]=true; ++n_edges; } @@ -207,14 +207,14 @@ class Nef_Visitor { protected: std::unordered_map facets_done; std::unordered_map edges_done; - CGAL::Graphics_scene& graphic_storage; + CGAL::Graphics_scene& graphics_scene; const GSOptions& gs_options; const Nef_Polyhedron& nef; }; template void compute_elements(const Nef_Polyhedron &nef, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { @@ -224,7 +224,7 @@ void compute_elements(const Nef_Polyhedron &nef, Volume_const_iterator c; Nef_Visitor - V(nef, graphic_storage, gs_options); + V(nef, graphics_scene, gs_options); CGAL_forall_volumes(c, nef) { Shell_entry_const_iterator it; @@ -232,29 +232,29 @@ void compute_elements(const Nef_Polyhedron &nef, { nef.visit_shell_objects(SFace_const_handle(it), V); } } - graphic_storage.negate_all_normals(); + graphics_scene.negate_all_normals(); } } // namespace draw_function_for_nef_polyhedron #define CGAL_NEF3_TYPE Nef_polyhedron_3 -// add_in_graphic_storage +// add_in_graphics_scene template -void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphics_scene &graphic_storage, +void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { draw_function_for_nef_polyhedron::compute_elements(anef, - graphic_storage, + graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_NEF3_TYPE &anef, - CGAL::Graphics_scene &graphic_storage) +void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, + CGAL::Graphics_scene &graphics_scene) { // Default graphics view options. Graphics_scene_options buffer; - add_in_graphic_storage(anef, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(anef, buffer, gs_options); + draw_graphics_scene(buffer, title); } template buffer; - add_in_graphic_storage(anef, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(anef, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 3fcf78387c53..756ecdd24ba0 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -69,7 +69,7 @@ namespace draw_function_for_P2T2 template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // Construct the point in 9-sheeted covering space and add to viewer @@ -77,16 +77,16 @@ void compute_vertex(const P2T2 &p2t2, { return; } if(gs_options.colored_vertex(p2t2, pi)) - { graphic_storage.add_point(p2t2.point(*pi), + { graphics_scene.add_point(p2t2.point(*pi), gs_options.vertex_color(p2t2, pi)); } else - { graphic_storage.add_point(p2t2.point(*pi)); } + { graphics_scene.add_point(p2t2.point(*pi)); } } template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_edge(p2t2, si)) @@ -95,16 +95,16 @@ void compute_edge(const P2T2 &p2t2, // Construct the segment in 9-sheeted covering space and add to viewer typename P2T2::Segment s(p2t2.segment(*si)); if(gs_options.colored_edge(p2t2, si)) - { graphic_storage.add_segment(s[0], s[1], + { graphics_scene.add_segment(s[0], s[1], gs_options.edge_color(p2t2, si)); } else - { graphic_storage.add_segment(s[0], s[1]); } + { graphics_scene.add_segment(s[0], s[1]); } } template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_face(p2t2, ti)) @@ -114,19 +114,19 @@ void compute_face(const P2T2 &p2t2, typename P2T2::Triangle t(p2t2.triangle(*ti)); if(gs_options.colored_face(p2t2, ti)) - { graphic_storage.face_begin(gs_options.face_color(p2t2, ti)); } + { graphics_scene.face_begin(gs_options.face_color(p2t2, ti)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } - graphic_storage.add_point_in_face(t[0]); - graphic_storage.add_point_in_face(t[1]); - graphic_storage.add_point_in_face(t[2]); - graphic_storage.face_end(); + graphics_scene.add_point_in_face(t[0]); + graphics_scene.add_point_in_face(t[1]); + graphics_scene.add_point_in_face(t[2]); + graphics_scene.face_end(); } template void compute_domain(const P2T2& p2t2, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -145,17 +145,17 @@ void compute_domain(const P2T2& p2t2, Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); Kernel::Point_2 p4((orig_domain.max)()); - graphic_storage.add_segment(p1 + shift, p2 + shift, gs_options.domain_color); - graphic_storage.add_segment(p1 + shift, p3 + shift, gs_options.domain_color); - graphic_storage.add_segment(p2 + shift, p4 + shift, gs_options.domain_color); - graphic_storage.add_segment(p3 + shift, p4 + shift, gs_options.domain_color); + graphics_scene.add_segment(p1 + shift, p2 + shift, gs_options.domain_color); + graphics_scene.add_segment(p1 + shift, p3 + shift, gs_options.domain_color); + graphics_scene.add_segment(p2 + shift, p4 + shift, gs_options.domain_color); + graphics_scene.add_segment(p3 + shift, p4 + shift, gs_options.domain_color); } } } template void compute_elements(const P2T2& p2t2, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // Get the display type, iterate through periodic elements according @@ -168,27 +168,27 @@ void compute_elements(const P2T2& p2t2, { for (typename P2T2::Periodic_point_iterator it=p2t2.periodic_points_begin(it_type); it!=p2t2.periodic_points_end(it_type); ++it) - { compute_vertex(p2t2, it, graphic_storage, gs_options); } + { compute_vertex(p2t2, it, graphics_scene, gs_options); } } if(gs_options.are_edges_enabled()) { for (typename P2T2::Periodic_segment_iterator it=p2t2.periodic_segments_begin(it_type); it!=p2t2.periodic_segments_end(it_type); ++it) - { compute_edge(p2t2, it, graphic_storage, gs_options); } + { compute_edge(p2t2, it, graphics_scene, gs_options); } } if (gs_options.are_faces_enabled()) { for (typename P2T2::Periodic_triangle_iterator it=p2t2.periodic_triangles_begin(it_type); it!=p2t2.periodic_triangles_end(it_type); ++it) - { compute_face(p2t2, it, graphic_storage, gs_options); } + { compute_face(p2t2, it, graphics_scene, gs_options); } } if(gs_options.get_draw_domain()) { // Compute the (9-sheet covering space) domain of the periodic triangulation - compute_domain(p2t2, graphic_storage, gs_options); + compute_domain(p2t2, graphics_scene, gs_options); } } @@ -197,16 +197,16 @@ void compute_elements(const P2T2& p2t2, #define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 template -void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { - draw_function_for_P2T2::compute_elements(p2t2, graphic_storage, gs_options); + draw_function_for_P2T2::compute_elements(p2t2, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options_periodic_2_triangulation_2 gs_options; - add_in_graphic_storage(p2t2, graphic_storage, gs_options); + add_in_graphics_scene(p2t2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER @@ -226,8 +226,8 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ap2t2, buffer, gs_options); - draw_graphic_storage(buffer); + add_in_graphics_scene(ap2t2, buffer, gs_options); + draw_graphics_scene(buffer); } template @@ -241,7 +241,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, typename CGAL_P2T2_TYPE::Periodic_segment_iterator, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; - add_in_graphic_storage(ap2t2, buffer, gs_options); + add_in_graphics_scene(ap2t2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) { @@ -260,7 +260,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, "Unique cover")))); basic_viewer->clear(); draw_function_for_P2T2::compute_elements(ap2t2, - basic_viewer->get_graphic_storage(), + basic_viewer->get_graphics_scene(), gs_options); basic_viewer->redraw(); } diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 5560909c3782..72365c6e40c5 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -44,7 +44,7 @@ namespace draw_function_for_PointSet { template void compute_elements(const PointSet& pointset, - Graphics_scene& graphic_storage, + Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_vertices_enabled()) @@ -57,11 +57,11 @@ void compute_elements(const PointSet& pointset, { if (gs_options.colored_vertex(pointset, it)) { - graphic_storage.add_point(pointset.point(*it), + graphics_scene.add_point(pointset.point(*it), gs_options.vertex_color(pointset, it)); } else - { graphic_storage.add_point(pointset.point(*it)); } + { graphics_scene.add_point(pointset.point(*it)); } } } } @@ -69,23 +69,23 @@ void compute_elements(const PointSet& pointset, } // namespace draw_function_for_PointSet template -void add_in_graphic_storage(const Point_set_3& apointset, - Graphics_scene& graphic_storage, +void add_in_graphics_scene(const Point_set_3& apointset, + Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_PointSet::compute_elements(apointset, - graphic_storage, + graphics_scene, gs_options); } template -void add_in_graphic_storage(const Point_set_3& apointset, - Graphics_scene& graphic_storage) +void add_in_graphics_scene(const Point_set_3& apointset, + Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options, typename Point_set_3::const_iterator, int, int> gs_options; - add_in_graphic_storage(apointset, graphic_storage, gs_options); + add_in_graphics_scene(apointset, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER @@ -97,8 +97,8 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphics_scene buffer; - add_in_graphic_storage(apointset, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(apointset, buffer, gs_options); + draw_graphics_scene(buffer, title); } template @@ -106,8 +106,8 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphics_scene buffer; - add_in_graphic_storage(apointset, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(apointset, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 89ae5f70c689..eb670966aa9c 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -48,7 +48,7 @@ namespace draw_function_for_p2 { template void compute_elements(const P2& p2, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) { if (p2.is_empty()) @@ -59,9 +59,9 @@ void compute_elements(const P2& p2, if (gs_options.are_faces_enabled()) { if(gs_options.colored_face(p2, nullptr)) - { graphic_storage.face_begin(gs_options.face_color(p2, nullptr)); } + { graphics_scene.face_begin(gs_options.face_color(p2, nullptr)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } } for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); @@ -71,51 +71,51 @@ void compute_elements(const P2& p2, gs_options.draw_vertex(p2, i)) { // Add vertex if(gs_options.colored_vertex(p2, i)) - { graphic_storage.add_point(*i, gs_options.vertex_color(p2, i)); } + { graphics_scene.add_point(*i, gs_options.vertex_color(p2, i)); } else - { graphic_storage.add_point(*i); } + { graphics_scene.add_point(*i); } } if(gs_options.are_edges_enabled() && gs_options.draw_edge(p2, i)) { // Add edge with previous point if(gs_options.colored_vertex(p2, i)) - { graphic_storage.add_segment(prev, *i, gs_options.edge_color(p2, i)); } + { graphics_scene.add_segment(prev, *i, gs_options.edge_color(p2, i)); } else - { graphic_storage.add_segment(prev, *i); } + { graphics_scene.add_segment(prev, *i); } } if(gs_options.are_faces_enabled()) - { graphic_storage.add_point_in_face(*i); } // Add point in face + { graphics_scene.add_point_in_face(*i); } // Add point in face prev = *i; } if (gs_options.are_faces_enabled()) - { graphic_storage.face_end(); } + { graphics_scene.face_end(); } } } // namespace draw_function_for_p2 #define CGAL_P2_TYPE CGAL::Polygon_2 -// Specializations of add_in_graphic_storage function +// Specializations of add_in_graphics_scene function template -void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) -{ draw_function_for_p2::compute_elements(ap2, graphic_storage, gs_options); } +{ draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_P2_TYPE& ap2, - CGAL::Graphics_scene &graphic_storage) +void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, + CGAL::Graphics_scene &graphics_scene) { CGAL::Graphics_scene_options gs_options; - draw_function_for_p2::compute_elements(ap2, graphic_storage, gs_options); + draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); } // Specialization of draw function. @@ -127,8 +127,8 @@ void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ap2, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ap2, buffer); + draw_graphics_scene(buffer, title); } template @@ -137,8 +137,8 @@ void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ap2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ap2, buffer, gs_options); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 03a428f40091..9889a0639547 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -55,12 +55,12 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, - Graphics_scene &graphic_storage, + Graphics_scene &graphics_scene, bool hole, const GSOptions& gs_options) { if (hole && gs_options.are_faces_enabled()) - { graphic_storage.add_point_in_face(aloop.vertex(aloop.size()-1)); } + { graphics_scene.add_point_in_face(aloop.vertex(aloop.size()-1)); } typename P2::General_polygon_2::Vertex_const_iterator prev; for(typename P2::General_polygon_2::Vertex_const_iterator i=aloop.vertices_begin(); @@ -70,9 +70,9 @@ void compute_one_loop_elements(const P2& ap2, gs_options.draw_vertex(ap2, i)) { // Add vertex if(gs_options.colored_vertex(ap2, i)) - { graphic_storage.add_point(*i, gs_options.vertex_color(ap2, i)); } + { graphics_scene.add_point(*i, gs_options.vertex_color(ap2, i)); } else - { graphic_storage.add_point(*i); } + { graphics_scene.add_point(*i); } } if(i!=aloop.vertices_begin() && @@ -80,13 +80,13 @@ void compute_one_loop_elements(const P2& ap2, gs_options.draw_edge(ap2, i)) { // Add segment with previous point if(gs_options.colored_vertex(ap2, i)) - { graphic_storage.add_segment(*prev, *i, gs_options.edge_color(ap2, i)); } + { graphics_scene.add_segment(*prev, *i, gs_options.edge_color(ap2, i)); } else - { graphic_storage.add_segment(*prev, *i); } + { graphics_scene.add_segment(*prev, *i); } } if(gs_options.are_faces_enabled()) - { graphic_storage.add_point_in_face(*i); } // Add point in face + { graphics_scene.add_point_in_face(*i); } // Add point in face prev=i; } @@ -94,11 +94,11 @@ void compute_one_loop_elements(const P2& ap2, // Add the last segment between the last point and the first one if(gs_options.are_edges_enabled() && gs_options.draw_edge(ap2, aloop.vertices_begin())) - { graphic_storage.add_segment(*prev, *(aloop.vertices_begin())); } + { graphics_scene.add_segment(*prev, *(aloop.vertices_begin())); } } template -void compute_elements(const P2& p2, Graphics_scene &graphic_storage, +void compute_elements(const P2& p2, Graphics_scene &graphics_scene, const GSOptions& gs_options) { if (p2.outer_boundary().is_empty()) return; @@ -106,26 +106,26 @@ void compute_elements(const P2& p2, Graphics_scene &graphic_storage, if (gs_options.are_faces_enabled()) { if(gs_options.colored_face(p2, nullptr)) - { graphic_storage.face_begin(gs_options.face_color(p2, nullptr)); } + { graphics_scene.face_begin(gs_options.face_color(p2, nullptr)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } } - compute_one_loop_elements(p2, p2.outer_boundary(), graphic_storage, + compute_one_loop_elements(p2, p2.outer_boundary(), graphics_scene, false, gs_options); for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { - compute_one_loop_elements(p2, *it, graphic_storage, + compute_one_loop_elements(p2, *it, graphics_scene, true, gs_options); if (gs_options.are_faces_enabled()) - { graphic_storage.add_point_in_face(p2.outer_boundary().vertex + { graphics_scene.add_point_in_face(p2.outer_boundary().vertex (p2.outer_boundary().size()-1)); } } if (gs_options.are_faces_enabled()) - { graphic_storage.face_end(); } + { graphics_scene.face_end(); } } } // draw_function_for_ph2 @@ -133,24 +133,24 @@ void compute_elements(const P2& p2, Graphics_scene &graphic_storage, #define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 template -void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, + CGAL::Graphics_scene& graphics_scene, const GSOptions &gs_options) { - draw_function_for_ph2_with_holes::compute_elements(p2, graphic_storage, + draw_function_for_ph2_with_holes::compute_elements(p2, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options gs_options; - add_in_graphic_storage(p2, graphic_storage, gs_options); + add_in_graphics_scene(p2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER @@ -161,8 +161,8 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const GSOptions &gs_options, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ap2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ap2, buffer, gs_options); + draw_graphics_scene(buffer, title); } template @@ -170,8 +170,8 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ap2, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ap2, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index c9f7cb47f099..5694e9a0b50d 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -26,7 +26,7 @@ namespace CGAL #define CGAL_POLY_TYPE CGAL::Polyhedron_3 \ -// Specialization of add_in_graphic_storage function. +// Specialization of add_in_graphics_scene function. template @@ -34,10 +34,10 @@ template -void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphics_scene &graphic_storage, +void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) -{ add_in_graphic_storage_for_fg(apoly, graphic_storage, gs_options); } +{ add_in_graphics_scene_for_fg(apoly, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_POLY_TYPE& apoly, - CGAL::Graphics_scene &graphic_storage) -{ add_in_graphic_storage_for_fg(apoly, graphic_storage); } +void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, + CGAL::Graphics_scene &graphics_scene) +{ add_in_graphics_scene_for_fg(apoly, graphics_scene); } // Specialization of draw function: require Qt and the CGAL basic viewer. #ifdef CGAL_USE_BASIC_VIEWER @@ -62,8 +62,8 @@ void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage_for_fg(apoly, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene_for_fg(apoly, buffer); + draw_graphics_scene(buffer, title); } template buffer; - add_in_graphic_storage_for_fg(apoly, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene_for_fg(apoly, buffer, gs_options); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 7552a10469f3..4be05c54ba9f 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -26,7 +26,7 @@ namespace draw_function_for_ss2 { template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_edge(ss2, eh)) @@ -34,13 +34,13 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, if (gs_options.colored_edge(ss2, eh)) { - graphic_storage.add_segment(eh->opposite()->vertex()->point(), + graphics_scene.add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point(), gs_options.edge_color(ss2, eh)); } else { - graphic_storage.add_segment(eh->opposite()->vertex()->point(), + graphics_scene.add_segment(eh->opposite()->vertex()->point(), eh->vertex()->point()); } } @@ -48,7 +48,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // TODO? an option different from draw_edge to allow to show only some labels ?? @@ -60,14 +60,14 @@ void print_halfedge_labels(const SS2& ss2, label << "H" << h->opposite()->id() << " (V" << h->opposite()->vertex()->id() << ") "; - graphic_storage.add_text( + graphics_scene.add_text( CGAL::midpoint(h->opposite()->vertex()->point(), h->vertex()->point()), label.str()); } template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_vertex(ss2, vh)) @@ -75,16 +75,16 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, if (gs_options.colored_vertex(ss2, vh)) { - graphic_storage.add_point(vh->point(), gs_options.vertex_color(ss2, vh)); + graphics_scene.add_point(vh->point(), gs_options.vertex_color(ss2, vh)); } else - { graphic_storage.add_point(vh->point()); } + { graphics_scene.add_point(vh->point()); } } template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // TODO? an option different from draw_vertex to allow to show only some labels ?? @@ -93,12 +93,12 @@ void print_vertex_label(const SS2& ss2, std::stringstream label; label << "V" << vh->id() << std::ends; - graphic_storage.add_text(vh->point(), label.str()); + graphics_scene.add_text(vh->point(), label.str()); } template void compute_elements(const SS2& ss2, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled()) @@ -108,8 +108,8 @@ void compute_elements(const SS2& ss2, { if (it->id()opposite()->id()) { - compute_edge(ss2, it, graphic_storage, gs_options); - print_halfedge_labels(ss2, it, graphic_storage, gs_options); + compute_edge(ss2, it, graphics_scene, gs_options); + print_halfedge_labels(ss2, it, graphics_scene, gs_options); } } } @@ -119,8 +119,8 @@ void compute_elements(const SS2& ss2, for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); it!=ss2.vertices_end(); ++it) { - compute_vertex(ss2, it, graphic_storage, gs_options); - print_vertex_label(ss2, it, graphic_storage, gs_options); + compute_vertex(ss2, it, graphics_scene, gs_options); + print_vertex_label(ss2, it, graphics_scene, gs_options); } } } @@ -130,17 +130,17 @@ void compute_elements(const SS2& ss2, #define CGAL_SS_TYPE CGAL::Straight_skeleton_2 template -void add_in_graphic_storage(const CGAL_SS_TYPE &ass2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_SS_TYPE &ass2, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { - draw_function_for_ss2::compute_elements(ass2, graphic_storage, + draw_function_for_ss2::compute_elements(ass2, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_SS_TYPE& ass2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_SS_TYPE& ass2, + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options buffer; - add_in_graphic_storage(ass2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ass2, buffer, gs_options); + draw_graphics_scene(buffer, title); } template @@ -196,8 +196,8 @@ void draw(const CGAL_SS_TYPE &ass2, const char *title="Straight Skeleton Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ass2, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ass2, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index e41050d297cb..e7180663c98d 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -95,15 +95,15 @@ struct Graphics_scene_options_surface_mesh }; template -void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphics_scene &graphic_storage, +void add_in_graphics_scene(const Surface_mesh& amesh, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) -{ add_in_graphic_storage_for_fg(amesh, graphic_storage, gs_options); } +{ add_in_graphics_scene_for_fg(amesh, graphics_scene, gs_options); } template -void add_in_graphic_storage(const Surface_mesh& amesh, - CGAL::Graphics_scene &graphic_storage) -{ add_in_graphic_storage_for_fg(amesh, graphic_storage, +void add_in_graphics_scene(const Surface_mesh& amesh, + CGAL::Graphics_scene &graphics_scene) +{ add_in_graphics_scene_for_fg(amesh, graphics_scene, Graphics_scene_options_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER @@ -114,8 +114,8 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(amesh, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(amesh, buffer); + draw_graphics_scene(buffer, title); } template @@ -124,8 +124,8 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(amesh, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(amesh, buffer, gs_options); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 698eab17e1e4..76135c4e682a 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -145,7 +145,7 @@ template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { if(!gs_options.draw_face(lcc, dh)) @@ -171,21 +171,21 @@ void compute_face(const Mesh& mesh, while(cur!=dh); if(gs_options.colored_face(lcc, dh)) - { graphic_storage.face_begin(gs_options.face_color(lcc, dh)); } + { graphics_scene.face_begin(gs_options.face_color(lcc, dh)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } cur=dh; do { - graphic_storage.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(mesh, cur), + graphics_scene.add_point_in_face(draw_function_for_face_graph_with_paths::get_point(mesh, cur), draw_function_for_lcc::LCC_geom_utils:: get_vertex_normal(lcc, cur)); cur=lcc.next(cur); } while(cur!=dh); - graphic_storage.face_end(); + graphics_scene.face_end(); } template @@ -193,7 +193,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options, bool draw_marked_darts=true) { @@ -213,9 +213,9 @@ void compute_edge(const Mesh &mesh, { if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) - { graphic_storage.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } + { graphics_scene.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } else - { graphic_storage.add_segment(p1, get_point(mesh, d2)); } + { graphics_scene.add_segment(p1, get_point(mesh, d2)); } } } @@ -224,7 +224,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphics_scene& graphic_storage) + CGAL::Graphics_scene& graphics_scene) { typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; @@ -235,25 +235,25 @@ void compute_edge(const Mesh &mesh, Point p1=get_point(mesh, dh); Dart_const_descriptor d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) - { graphic_storage.add_segment(p1, get_point(mesh, d2), color); } + { graphics_scene.add_segment(p1, get_point(mesh, d2), color); } } template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - graphic_storage.add_point(get_point(mesh, dh)); + graphics_scene.add_point(get_point(mesh, dh)); } template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const std::vector>* m_paths, std::size_t i, typename Get_map::type::size_type amark) @@ -269,12 +269,12 @@ void compute_path(const Mesh &mesh, CGAL::Random random(static_cast(i)); CGAL::IO::Color color = get_random_color(random); - graphic_storage.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); + graphics_scene.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) { if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) { - compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphic_storage, lcc); + compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphics_scene, lcc); lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); } } @@ -282,7 +282,7 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const GSOptions &m_gs_options, const std::vector>* m_paths, typename Get_map::type::size_type amark) @@ -311,19 +311,19 @@ void compute_elements(const Mesh &mesh, if (m_current_dart!=lcc.darts().end()) { // We want to draw only one dart Dart_const_descriptor selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); - compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphic_storage, lcc); + compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphics_scene, lcc); lcc.template mark_cell<1>(selected_dart, markedges); - compute_vertex(selected_dart, mesh, graphic_storage); + compute_vertex(selected_dart, mesh, graphics_scene); if ( !m_nofaces ) - { compute_face(selected_dart, mesh, graphic_storage, lcc); } + { compute_face(selected_dart, mesh, graphics_scene, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) { if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphic_storage, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } } @@ -333,10 +333,10 @@ void compute_elements(const Mesh &mesh, if (m_current_path==m_paths->size()) { for (std::size_t i=0; isize(); ++i) - { compute_path(i, markedges, mesh, graphic_storage, m_paths, lcc); } + { compute_path(i, markedges, mesh, graphics_scene, m_paths, lcc); } } else if (m_current_path!=m_paths->size()+1) - { compute_path(m_current_path, markedges, mesh, graphic_storage, m_paths, lcc); } + { compute_path(m_current_path, markedges, mesh, graphics_scene, m_paths, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) @@ -344,19 +344,19 @@ void compute_elements(const Mesh &mesh, if (!m_nofaces && !lcc.is_marked(it, markfaces) && !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) { - compute_face(it, mesh, graphic_storage, lcc); + compute_face(it, mesh, graphics_scene, lcc); lcc.template mark_cell<2>(it, markfaces); } if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphic_storage, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } if ( !lcc.is_marked(it, markvertices) ) { - compute_vertex(it, mesh, graphic_storage); + compute_vertex(it, mesh, graphics_scene); lcc.template mark_cell<0>(it, markvertices); } } @@ -370,22 +370,22 @@ void compute_elements(const Mesh &mesh, } // namespace draw_function_for_face_graph_with_paths template -void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, const GSOptions& gs_options, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) { draw_function_for_face_graph_with_paths::compute_elements(mesh, - graphic_storage, + graphics_scene, gs_options, paths, amark); } template -void add_in_graphic_storage(const Mesh& mesh, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) @@ -397,7 +397,7 @@ void add_in_graphic_storage(const Mesh& mesh, typename Get_map::type::Dart_const_descriptor /*fh*/> gs_options; - add_in_graphic_storage(mesh, graphic_storage, gs_options, paths, amark); + add_in_graphics_scene(mesh, graphics_scene, gs_options, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER @@ -410,8 +410,8 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(mesh, buffer, &paths, amark); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(mesh, buffer, &paths, amark); + draw_graphics_scene(buffer, title); } template @@ -423,8 +423,8 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(mesh, buffer, gs_options, &paths, amark); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(mesh, buffer, gs_options, &paths, amark); + draw_graphics_scene(buffer, title); } template @@ -436,8 +436,8 @@ void draw(const Mesh& mesh, { std::vector> paths=l; CGAL::Graphics_scene buffer; - add_in_graphic_storage(mesh, buffer, &paths, amark); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(mesh, buffer, &paths, amark); + draw_graphics_scene(buffer, title); } } // End namespace CGAL diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 857d8db8b2a5..5f42a8463acd 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -32,7 +32,7 @@ adds the vertices, edges and faces of `at2` into the given graphic storage `gs`. */ template -void add_in_graphic_storage(const T2& at2, +void add_in_graphics_scene(const T2& at2, CGAL::Graphics_scene& gs, const CGAL::Graphics_scene_options #include #include -#include "polygon_triangulation_drawing_functor.h" +#include "polygon_triangulation_graphics_scene_options.h" #include #include @@ -58,7 +58,7 @@ int main( ) assert(count > 0); assert(count < cdt.number_of_faces()); - CGAL::Polygon_triangulation_drawing_functor myfunctor(in_domain); + CGAL::Polygon_triangulation_gs_options myfunctor(in_domain); CGAL::draw(cdt, myfunctor); return 0; } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h similarity index 88% rename from Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h rename to Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h index 7cca28a1948f..02f467dcb58b 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_drawing_functor.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h @@ -9,8 +9,8 @@ // // Author(s) : Andreas Fabri -#ifndef CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H -#define CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H +#ifndef CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H +#define CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H #include #include @@ -60,7 +60,7 @@ struct Polygon_triangulation_gs_options : template -void add_in_graphic_storage(const CGAL_CT2_TYPE& ct2, +void add_in_graphics_scene(const CGAL_CT2_TYPE& ct2, CGAL::Graphics_scene& graphic_buffer, const GSOptions& gs_options) { @@ -75,8 +75,8 @@ void draw(const CGAL_CT2_TYPE &ct2, const GSOptions &gs_options, const char *title="Constrained Triangulation_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(ct2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(ct2, buffer, gs_options); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER @@ -85,4 +85,4 @@ void draw(const CGAL_CT2_TYPE &ct2, const GSOptions &gs_options, }; // end namespace CGAL -#endif // CGAL_POLYGON_TRIANGULATION_DRAWING_FUNCTOR_H +#endif // CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index c56938f8eecf..eb7b4e8d72f1 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -27,8 +27,8 @@ namespace CGAL #define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 template -void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, + CGAL::Graphics_scene& graphics_scene) { using BASET2=CGAL::Triangulation_2; @@ -54,15 +54,15 @@ void add_in_graphic_storage(const CGAL_T2_TYPE& at2, InDomainPmap ipm, [&ipm](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> CGAL::IO::Color { return get(ipm, fh)? CGAL::IO::yellow() : CGAL::IO::white(); }; - add_in_graphic_storage(at2, graphic_storage, drawingFunctor); + add_in_graphics_scene(at2, graphics_scene, drawingFunctor); } template -void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_T2_TYPE& at2, + CGAL::Graphics_scene& graphics_scene) { internal::In_domain in_domain; - add_in_graphic_storage(at2, in_domain, graphic_storage); + add_in_graphics_scene(at2, in_domain, graphics_scene); } template @@ -70,8 +70,8 @@ void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, const char *title="Constrained Triangulation_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(at2, ipm, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(at2, ipm, buffer); + draw_graphics_scene(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 56b0c8b9b337..c214b01ab0d2 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -27,27 +27,27 @@ namespace draw_function_for_t2 { template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_face(t2, fh)) { return; } if (gs_options.colored_face(t2, fh)) - { graphic_storage.face_begin(gs_options.face_color(t2, fh)); } + { graphics_scene.face_begin(gs_options.face_color(t2, fh)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } - graphic_storage.add_point_in_face(fh->vertex(0)->point()); - graphic_storage.add_point_in_face(fh->vertex(1)->point()); - graphic_storage.add_point_in_face(fh->vertex(2)->point()); + graphics_scene.add_point_in_face(fh->vertex(0)->point()); + graphics_scene.add_point_in_face(fh->vertex(1)->point()); + graphics_scene.add_point_in_face(fh->vertex(2)->point()); - graphic_storage.face_end(); + graphics_scene.face_end(); } template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_edge(t2, eh)) @@ -55,14 +55,14 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, if (gs_options.colored_edge(t2, eh)) { - graphic_storage.add_segment + graphics_scene.add_segment (eh->first->vertex(eh->first->cw(eh->second))->point(), eh->first->vertex(eh->first->ccw(eh->second))->point(), gs_options.edge_color(t2, eh)); } else { - graphic_storage.add_segment + graphics_scene.add_segment (eh->first->vertex(eh->first->cw(eh->second))->point(), eh->first->vertex(eh->first->ccw(eh->second))->point()); } @@ -70,7 +70,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_vertex(t2, vh)) @@ -78,38 +78,38 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, if (gs_options.colored_vertex(t2, vh)) { - graphic_storage.add_point(vh->point(), gs_options.vertex_color(t2, vh)); + graphics_scene.add_point(vh->point(), gs_options.vertex_color(t2, vh)); } else { - graphic_storage.add_point(vh->point()); + graphics_scene.add_point(vh->point()); } } template void compute_elements(const T2& t2, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) { for (typename T2::Finite_faces_iterator it=t2.finite_faces_begin(); it!=t2.finite_faces_end(); ++it) - { compute_face(t2, it, graphic_storage, gs_options); } + { compute_face(t2, it, graphics_scene, gs_options); } } if (gs_options.are_edges_enabled()) { for (typename T2::Finite_edges_iterator it=t2.finite_edges_begin(); it!=t2.finite_edges_end(); ++it) - { compute_edge(t2, it, graphic_storage, gs_options); } + { compute_edge(t2, it, graphics_scene, gs_options); } } if (gs_options.are_vertices_enabled()) { for (typename T2::Finite_vertices_iterator it=t2.finite_vertices_begin(); it!=t2.finite_vertices_end(); ++it) - { compute_vertex(t2, it, graphic_storage, gs_options); } + { compute_vertex(t2, it, graphics_scene, gs_options); } } } @@ -118,16 +118,16 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 template -void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_T2_TYPE& at2, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { - draw_function_for_t2::compute_elements(at2, graphic_storage, gs_options); + draw_function_for_t2::compute_elements(at2, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_T2_TYPE& at2, + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options buffer; - add_in_graphic_storage(at2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(at2, buffer, gs_options); + draw_graphics_scene(buffer, title); } template @@ -166,8 +166,8 @@ void draw(const CGAL_T2_TYPE& at2, const char *title="Triangulation_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(at2, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(at2, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index e9fca016eda0..7d59f696eb8e 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -28,29 +28,29 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, const GSOptions& gs_options, - CGAL::Graphics_scene& graphic_storage, const T3 *t3) + CGAL::Graphics_scene& graphics_scene, const T3 *t3) { if(!gs_options.draw_face(*t3, fh)) { return; } if(gs_options.colored_face(*t3, fh)) - { graphic_storage.face_begin(gs_options.face_color(*t3, fh)); } + { graphics_scene.face_begin(gs_options.face_color(*t3, fh)); } else - { graphic_storage.face_begin(); } + { graphics_scene.face_begin(); } - graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 1) % 4)-> + graphics_scene.add_point_in_face(fh->first->vertex((fh->second + 1) % 4)-> point()); - graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 2) % 4)-> + graphics_scene.add_point_in_face(fh->first->vertex((fh->second + 2) % 4)-> point()); - graphic_storage.add_point_in_face(fh->first->vertex((fh->second + 3) % 4)-> + graphics_scene.add_point_in_face(fh->first->vertex((fh->second + 3) % 4)-> point()); - graphic_storage.face_end(); + graphics_scene.face_end(); } template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_edge(*t3, eh)) @@ -58,19 +58,19 @@ void compute_edge(typename T3::Finite_edges_iterator eh, if(gs_options.colored_edge(*t3, eh)) { - graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), + graphics_scene.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point(), gs_options.edge_color(*t3, eh)); } else { - graphic_storage.add_segment(eh->first->vertex(eh->second)->point(), + graphics_scene.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point()); } } template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_vertex(*t3, vh)) @@ -78,36 +78,36 @@ void compute_vertex(typename T3::Vertex_handle vh, if(gs_options.colored_vertex(*t3, vh)) { - graphic_storage.add_point(vh->point(), gs_options.vertex_color(*t3, vh)); + graphics_scene.add_point(vh->point(), gs_options.vertex_color(*t3, vh)); } else - { graphic_storage.add_point(vh->point()); } + { graphics_scene.add_point(vh->point()); } } template void compute_elements(const T3* t3, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) { for (typename T3::Finite_facets_iterator it=t3->finite_facets_begin(); it!=t3->finite_facets_end(); ++it) - { compute_face(it, gs_options, graphic_storage, t3); } + { compute_face(it, gs_options, graphics_scene, t3); } } if (gs_options.are_edges_enabled()) { for (typename T3::Finite_edges_iterator it=t3->finite_edges_begin(); it!=t3->finite_edges_end(); ++it) - { compute_edge(it, graphic_storage,gs_options, t3); } + { compute_edge(it, graphics_scene,gs_options, t3); } } if (gs_options.are_vertices_enabled()) { for (typename T3::Finite_vertices_iterator it=t3->finite_vertices_begin(); it!=t3->finite_vertices_end(); ++it) - { compute_vertex(it, graphic_storage, gs_options, t3); } + { compute_vertex(it, graphics_scene, gs_options, t3); } } } @@ -117,17 +117,17 @@ void compute_elements(const T3* t3, template -void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_T3_TYPE& at3, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { - draw_function_for_t3::compute_elements(&at3, graphic_storage, gs_options); + draw_function_for_t3::compute_elements(&at3, graphics_scene, gs_options); } template -void add_in_graphic_storage(const CGAL_T3_TYPE& at3, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_T3_TYPE& at3, + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options buffer; - add_in_graphic_storage(at3, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(at3, buffer, gs_options); + draw_graphics_scene(buffer, title); } template void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(at3, buffer); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(at3, buffer); + draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 48e5065ee8ef..e7286b0c0d93 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -72,29 +72,29 @@ typedef Local_kernel::Vector_3 Local_vector; template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_vertex(v2, vh)) { return; } if(gs_options.colored_vertex(v2, vh)) - { graphic_storage.add_point(vh->point(), gs_options.vertex_color(v2, vh)); } + { graphics_scene.add_point(vh->point(), gs_options.vertex_color(v2, vh)); } else - { graphic_storage.add_point(vh->point()); } + { graphics_scene.add_point(vh->point()); } } template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphics_scene &graphic_storage, + CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) -{ graphic_storage.add_point(vi->point(), gs_options.dual_vertex_color); } +{ graphics_scene.add_point(vi->point(), gs_options.dual_vertex_color); } template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -104,12 +104,12 @@ void add_segments_and_update_bounding_box(const V2& v2, { if(gs_options.colored_edge(v2, he)) { - graphic_storage.add_segment(he->source()->point(), he->target()->point(), + graphics_scene.add_segment(he->source()->point(), he->target()->point(), gs_options.edge_color(v2, he)); } else { - graphic_storage.add_segment(he->source()->point(), he->target()->point()); + graphics_scene.add_segment(he->source()->point(), he->target()->point()); } } else @@ -127,10 +127,10 @@ void add_segments_and_update_bounding_box(const V2& v2, end_point = he->source()->point(); // update_bounding_box_for_ray(end_point, direction); - Local_point lp = graphic_storage.get_local_point(end_point); - Local_vector lv = graphic_storage.get_local_vector(direction); + Local_point lp = graphics_scene.get_local_point(end_point); + Local_vector lv = graphics_scene.get_local_vector(direction); CGAL::Bbox_3 b = (lp + lv).bbox(); - graphic_storage.update_bounding_box(b); + graphics_scene.update_bounding_box(b); } } else if (he->is_bisector()) @@ -143,12 +143,12 @@ void add_segments_and_update_bounding_box(const V2& v2, // update_bounding_box_for_line(pointOnLine, direction, // perpendicularDirection); - Local_point lp = graphic_storage.get_local_point(pointOnLine); - Local_vector lv = graphic_storage.get_local_vector(direction); - Local_vector lpv = graphic_storage.get_local_vector(perpendicularDirection); + Local_point lp = graphics_scene.get_local_point(pointOnLine); + Local_vector lv = graphics_scene.get_local_vector(direction); + Local_vector lpv = graphics_scene.get_local_vector(perpendicularDirection); CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - graphic_storage.update_bounding_box(b); + graphics_scene.update_bounding_box(b); } } } @@ -224,7 +224,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -239,39 +239,39 @@ void compute_rays_and_bisectors(const V2&, { if (he->has_source()) { - // add_ray_segment(he->source()->point(), get_second_point(he, graphic_storage.get_bounding_box())); - graphic_storage.add_ray(he->source()->point(), direction, gs_options.ray_color); + // add_ray_segment(he->source()->point(), get_second_point(he, graphics_scene.get_bounding_box())); + graphics_scene.add_ray(he->source()->point(), direction, gs_options.ray_color); } } else if (he->is_bisector()) { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); - graphic_storage.add_line(pointOnLine, direction, gs_options.bisector_color); + graphics_scene.add_line(pointOnLine, direction, gs_options.bisector_color); } } template void compute_face(const V2& v2, typename V2::Face_iterator fh, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& m_gs_options) { if(fh->is_unbounded() || !m_gs_options.draw_face(v2, fh)) { return; } if(m_gs_options.colored_face(v2, fh)) - { graphic_storage.face_begin(m_gs_options.face_color(v2, fh)); } - else { graphic_storage.face_begin(); } + { graphics_scene.face_begin(m_gs_options.face_color(v2, fh)); } + else { graphics_scene.face_begin(); } typename V2::Ccb_halfedge_circulator ec_start=fh->ccb(); typename V2::Ccb_halfedge_circulator ec=ec_start; do { - graphic_storage.add_point_in_face(ec->source()->point()); + graphics_scene.add_point_in_face(ec->source()->point()); } while (++ec!=ec_start); - graphic_storage.face_end(); + graphics_scene.face_end(); // Test: for unbounded faces (??) // else { @@ -280,7 +280,7 @@ void compute_face(const V2& v2, // add_point_in_face(ec->source()->point()); // } // else{ - // add_point_in_face(get_second_point(ec->twin(), graphic_storage.get_bounding_box())); + // add_point_in_face(get_second_point(ec->twin(), graphics_scene.get_bounding_box())); // } // } while(++ec != ec_start); // } @@ -288,7 +288,7 @@ void compute_face(const V2& v2, template void compute_elements(const V2& v2, - CGAL::Graphics_scene& graphic_storage, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(gs_options.are_vertices_enabled()) @@ -298,7 +298,7 @@ void compute_elements(const V2& v2, { for (typename V2::Vertex_iterator it=v2.vertices_begin(); it!=v2.vertices_end(); ++it) - { compute_vertex(v2, it, graphic_storage, gs_options); } + { compute_vertex(v2, it, graphics_scene, gs_options); } } // Draw the dual vertices @@ -307,7 +307,7 @@ void compute_elements(const V2& v2, for (typename V2::Delaunay_graph::Finite_vertices_iterator it=v2.dual().finite_vertices_begin(); it!=v2.dual().finite_vertices_end(); ++it) - { compute_dual_vertex(v2, it, graphic_storage, gs_options); } + { compute_dual_vertex(v2, it, graphics_scene, gs_options); } } } @@ -317,17 +317,17 @@ void compute_elements(const V2& v2, for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) { add_segments_and_update_bounding_box(v2, it, - graphic_storage, gs_options); } + graphics_scene, gs_options); } } for (typename V2::Halfedge_iterator it=v2.halfedges_begin(); it!=v2.halfedges_end(); ++it) - { compute_rays_and_bisectors(v2, it, graphic_storage, gs_options); } + { compute_rays_and_bisectors(v2, it, graphics_scene, gs_options); } if (gs_options.are_faces_enabled()) { for (typename V2::Face_iterator it=v2.faces_begin(); it!=v2.faces_end(); ++it) - { compute_face(v2, it, graphic_storage, gs_options); } + { compute_face(v2, it, graphics_scene, gs_options); } } } @@ -337,16 +337,16 @@ void compute_elements(const V2& v2, template -void add_in_graphic_storage(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphics_scene& graphic_storage, +void add_in_graphics_scene(const CGAL_VORONOI_TYPE &v2, + CGAL::Graphics_scene& graphics_scene, const GSOptions& m_gs_options) { - draw_function_for_v2::compute_elements(v2, graphic_storage, m_gs_options); + draw_function_for_v2::compute_elements(v2, graphics_scene, m_gs_options); } template -void add_in_graphic_storage(const CGAL_VORONOI_TYPE& v2, - CGAL::Graphics_scene& graphic_storage) +void add_in_graphics_scene(const CGAL_VORONOI_TYPE& v2, + CGAL::Graphics_scene& graphics_scene) { // Default graphics view options. CGAL::Graphics_scene_options_voronoi gs_options; - add_in_graphic_storage(v2, graphic_storage, gs_options); + add_in_graphics_scene(v2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER @@ -368,8 +368,8 @@ void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphic_storage(av2, buffer, gs_options); - draw_graphic_storage(buffer, title); + add_in_graphics_scene(av2, buffer, gs_options); + draw_graphics_scene(buffer, title); } template @@ -384,7 +384,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, typename CGAL_VORONOI_TYPE::Face_iterator> gs_options; - add_in_graphic_storage(av2, buffer, gs_options); + add_in_graphics_scene(av2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) @@ -414,7 +414,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphic_storage(), + basic_viewer->get_graphics_scene(), gs_options); basic_viewer->redraw(); } @@ -429,7 +429,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, basic_viewer->clear(); draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphic_storage(), + basic_viewer->get_graphics_scene(), gs_options); basic_viewer->redraw(); } From da7da48aeac62d9691cc867b8b34b18d4e58acb0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 13:44:40 +0200 Subject: [PATCH 178/341] Basic viewer doc --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index 9c6388c6698b..468eb1f59dde 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the storage. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam BufferType the type used for point coordinates: `float` by default. @@ -115,7 +115,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// returns the mono color used for faces. const CGAL::IO::Color& get_faces_mono_color() const; - /// clears the basic viewer, i.e. remove all its elements. + /// clears the basic viewer, i.e., remove all its elements. void clear(); /// returns `true` if the viewer is empty. @@ -195,22 +195,22 @@ class Basic_viewer_qt : public CGAL::QGLViewer template void add_text(const KPoint &kp, const std::string &txt); - /// returns the graphic storage of the viewer. + /// returns the graphics scene of the viewer. Graphics_scene& get_graphics_scene(); - /// returns the graphic storage of the viewer, const version. + /// returns the graphics scene of the viewer, const version. const Graphics_scene& get_graphics_scene() const; - /// negates all normal of vertices and faces. + /// negates all normals of vertices and faces. void negate_all_normals(); - /// returns true if the data structure in in 2D, i.e. lies on a plane. + /// returns `true` if the data structure in in 2D, i.e., lies on a plane. bool is_two_dimensional() const; /// draws the viewer without recomputing all internal buffers. virtual void draw(); - /// redraws the viewer, i.e. recompute all internal buffers and update the window. + /// redraws the viewer, i.e., recompute all internal buffers and update the window. virtual void redraw(); /// Function called when a key is pressed. Users can define their own function in order @@ -223,7 +223,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /*! \ingroup PkgBasicViewerClasses -The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but ran by the run method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam BufferType the type used for point coordinates: `float` by default. @@ -236,7 +236,7 @@ class QApplication_and_basic_viewer QApplication_and_basic_viewer(CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"); - /// runs the `QApplication`, i.e. open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. + /// runs the `QApplication`, i.e., open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); /// returns a reference to the `Basic_viewer_qt` associated with this. @@ -245,11 +245,11 @@ class QApplication_and_basic_viewer //------------------------------------------------------------------------------ /*! - opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro CGAL_USE_BASIC_VIEWER is defined. Linking with the cmake target CGAL::CGAL_Basic_viewer will link with CGAL_Qt5 and add the definition CGAL_USE_BASIC_VIEWER. + opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. */ template void draw_graphics_scene(Graphics_scene& graphic_buffer, - const char *title="CGAL Basic Viewer") + const char *title="CGAL Basic Viewer") {} } // End namespace CGAL From c999b12ac26a62d031a345d75e6112cb615575f3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 29 Sep 2023 07:22:43 +0200 Subject: [PATCH 179/341] Basic viewer doc --- .../doc/Basic_viewer/CGAL/Basic_viewer_qt.h | 6 +- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- .../CGAL/Graphics_scene_options.h | 86 ++++++++----------- 3 files changed, 39 insertions(+), 55 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h index 468eb1f59dde..4ca7cf8925ac 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam BufferType the type used for point coordinates: `float` by default. +\tparam BufferType the number type used for point coordinates: `float` by default. */ template @@ -128,7 +128,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_clipping_plane_enabled() const; /// returns the clipping plane when it is enabled. - Local_kernel::Plane_3 clipping_plane() const; + CGAL::Exact_predicates_inexact_constructions_kernel::Plane_3 clipping_plane() const; /// adds the given point in the viewer. template @@ -225,7 +225,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam BufferType the type used for point coordinates: `float` by default. +\tparam BufferType the number type used for point coordinates: `float` by default. */ template diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index e9cef86e6d94..750b8c492c94 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -80,7 +80,7 @@ class Graphics_scene { /// returns `true` iff the storage has no element. bool is_empty() const; - /// clears the storage, i.e. removes all points, segments, triangles and text. + /// clears the storage, i.e., removes all points, segments, triangles and text. void clear(); }; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 3b0408f3f841..fe574bef90c8 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -6,17 +6,21 @@ namespace CGAL { The class `Graphics_scene_options` is used to tune the way that the cells of a given data structure of \cgal are considered. The different `std::function` can be modified to change for example the behavior of the drawing. +`VolumeDescriptor` can be `void` for data structures that do not represent volumes. In such a case, all methods about volumes do not exist. \tparam DS a data structure of \cgal. \tparam VertexDescriptor a descriptor of vertices of `DS`. \tparam EdgeDescriptor a descriptor of edges of `DS`. \tparam FaceDescriptor a descriptor of faces of `DS`. +\tparam VolumeDescriptor a descriptor of volumes of `DS`. `void` by default. */ + template + typename FaceDescriptor, + typename VolumeDescriptor=void> struct Graphics_scene_options { public: @@ -32,85 +36,65 @@ struct Graphics_scene_options /// Returns `true` by default. std::function ignore_face; + /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. + /// Exists only if `VolumeDescriptor` is not `void`. + /// Returns `false` by default. + std::function ignore_volume; + /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. std::function colored_vertex; /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_edge; + std::function colored_edge; /// `std::function` that returns `true` if the given face is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_face; + std::function colored_face; + + /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. + /// Returns `false` by default. + /// Exists only if `VolumeDescriptor` is not `void`. + std::function colored_volume; /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. /// Returns `false` by default. std::function face_wireframe; + /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. + /// Returns `false` by default. + /// Exists only if `VolumeDescriptor` is not `void`. + std::function volume_wireframe; + /// `std::function` that returns the color of the given vertex. /// nullptr by default. std::function vertex_color; /// `std::function` that returns the color of the given edge. /// nullptr by default. - std::function edge_color; + std::function edge_color; /// `std::function` that returns the color of the given face. /// nullptr by default. - std::function face_color; + std::function face_color; - /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex` returns `true`. - void ignore_all_vertices(bool b); + /// `std::function` that returns the color of the given volume. + /// nullptr by default. + /// Exists only if `VolumeDescriptor` is not `void`. + std::function volume_color; - /// ignores all edges when `b` is `true`; otherwise ignores only edges for which `ignore_edge` returns `true`. + /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex()` returns `true`. void ignore_all_vertices(bool b); - /// ignores all faces when `b` is `true`; otherwise ignores only faces for which `ignore_face` returns `true`. - void ignore_all_vertices(bool b); -}; + /// ignores all edges when `b` is `true`; otherwise ignores only edges for which `ignore_edge()` returns `true`. + void ignore_all_edges(bool b); -/*! -\ingroup PkgBasicViewerClasses - -The class `Graphics_scene_options` is used to tune the way that the cells of a given data structure of \cgal are considered, for a data structure that contains volumes. -The different `std::function` can be modified to change for example the behavior of the drawing. - -\tparam DS a data structure of \cgal. -\tparam VertexDescriptor a descriptor of vertices of `DS`. -\tparam EdgeDescriptor a descriptor of edges of `DS`. -\tparam FaceDescriptor a descriptor of faces of `DS`. -\tparam VolumeDescriptor a descriptor of volumes of `DS`. - -*/ - -// Cell parameters for a volumic data structure (with vertices, edges, faces and volumes) -template -struct Graphics_scene_options : - public Graphics_scene_options -{ -public: - /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. - /// Returns `false` by default. - std::function ignore_volume; - - /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. - /// Returns `false` by default. - std::function colored_volume; - - /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. - /// Returns `false` by default. - std::function volume_wireframe; - - /// `std::function` that returns the color of the given volume. - /// nullptr by default. - std::function volume_color; + /// ignores all faces when `b` is `true`; otherwise ignores only faces for which `ignore_face()` returns `true`. + void ignore_all_faces(bool b); - /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume` returns `true`. + /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume()` returns `true`. + /// Exists only if `VolumeDescriptor` is not `void`. void ignore_all_volumes(bool b); }; From 218be312d4394f0ad1b7500cc7e0ef8bed4f8f2f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 29 Sep 2023 07:22:58 +0200 Subject: [PATCH 180/341] Basic viewer examples --- Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp | 2 +- Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp | 2 +- Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp | 2 +- .../examples/Basic_viewer/draw_surface_mesh_small_faces.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 1c7bfbb1a157..9704e39bc78c 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -35,7 +35,7 @@ int main(void) CGAL::parameters::point_map(CGAL::First_of_pair_property_map()) .normal_map(CGAL::Second_of_pair_property_map()))) { - std::cerr << "Error: cannot read input file!" << std::endl; + std::cerr << "Error: cannot read input file " << CGAL::data_file_path("points_3/kitten.xyz") << std::endl; return EXIT_FAILURE; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 7d90b5344b89..0db6619d3194 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -27,7 +27,7 @@ int main(void) CGAL::parameters::point_map(CGAL::First_of_pair_property_map()) .normal_map(CGAL::Second_of_pair_property_map()))) { - std::cerr << "Error: cannot read input file!" << std::endl; + std::cerr << "Error: cannot read input file " << CGAL::data_file_path("points_3/kitten.xyz") << std::endl; return EXIT_FAILURE; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index 851518b2e861..15a82026f97e 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -58,7 +58,7 @@ int main(int argc, char* argv[]) Mesh sm; if(!CGAL::IO::read_polygon_mesh(filename, sm)) { - std::cerr << "Invalid input file." << std::endl; + std::cerr << "Invalid input file: " << filename << std::endl; return EXIT_FAILURE; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 80af57cb3e9b..d478d910c82a 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -84,7 +84,7 @@ int main(int argc, char* argv[]) Mesh sm; if(!CGAL::IO::read_polygon_mesh(filename, sm)) { - std::cerr << "Invalid input file." << std::endl; + std::cerr << "Invalid input file: " << filename << std::endl; return EXIT_FAILURE; } From 55509a64ff4b66557458d8312aaff6818729ef8b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 29 Sep 2023 08:44:03 +0200 Subject: [PATCH 181/341] GPL instead of LGPL (?) --- Basic_viewer/package_info/Basic_viewer/license.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/package_info/Basic_viewer/license.txt b/Basic_viewer/package_info/Basic_viewer/license.txt index 5c1c5d8436f8..8bb8efcb72b0 100644 --- a/Basic_viewer/package_info/Basic_viewer/license.txt +++ b/Basic_viewer/package_info/Basic_viewer/license.txt @@ -1 +1 @@ -LGPL (v3 or later) +GPL (v3 or later) From 2755f2c427b097f5cad349bafa4ab948c8b1aeee Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 29 Sep 2023 08:57:33 +0200 Subject: [PATCH 182/341] Basic viewer logo + move include file --- .../CGAL/{ => Qt}/Basic_viewer_qt.h | 0 .../doc/Basic_viewer/PackageDescription.txt | 2 +- .../fig/basic_viewer_diagramme_class.svg | 530 ++++++++++++++++++ .../Basic_viewer/fig/basic_viewer_logo.png | Bin 0 -> 19274 bytes .../Basic_viewer/fig/draw_mesh_and_points.png | Bin 0 -> 70311 bytes .../Basic_viewer/fig/draw_several_windows.png | Bin 0 -> 45882 bytes .../Basic_viewer/fig/draw_surface_height.png | Bin 0 -> 97895 bytes .../fig/draw_surface_mesh_small_faces.png | Bin 0 -> 60389 bytes .../fig/draw_surface_mesh_vcolor.png | Bin 0 -> 47798 bytes .../doc/Basic_viewer/fig/lcc_draw.png | Bin 0 -> 9961 bytes 10 files changed, 531 insertions(+), 1 deletion(-) rename Basic_viewer/doc/Basic_viewer/CGAL/{ => Qt}/Basic_viewer_qt.h (100%) create mode 100644 Basic_viewer/doc/Basic_viewer/fig/basic_viewer_diagramme_class.svg create mode 100644 Basic_viewer/doc/Basic_viewer/fig/basic_viewer_logo.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/draw_mesh_and_points.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/draw_several_windows.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/draw_surface_height.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/draw_surface_mesh_small_faces.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/draw_surface_mesh_vcolor.png create mode 100644 Basic_viewer/doc/Basic_viewer/fig/lcc_draw.png diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h similarity index 100% rename from Basic_viewer/doc/Basic_viewer/CGAL/Basic_viewer_qt.h rename to Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index a9e27a2cd74b..6687dd8140e0 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -6,7 +6,7 @@ /*! \addtogroup PkgBasicViewerRef \cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} -\cgalPkgPicture{TODO.png} +\cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin \cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} \cgalPkgDesc{This package implements basic viewer class.} diff --git a/Basic_viewer/doc/Basic_viewer/fig/basic_viewer_diagramme_class.svg b/Basic_viewer/doc/Basic_viewer/fig/basic_viewer_diagramme_class.svg new file mode 100644 index 000000000000..3ec94e9d1af8 --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/fig/basic_viewer_diagramme_class.svg @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic_viewer + + + + + Graphics_scene + + + void add_point(apoint) + + + void add_point(apoint, acolor) + + + + + + + + void add_segment(apoint1, apoint2, acolor) + + void add_segment(apoint1, apoint2) + + void face_begin(acolor) + + void add_point_in_face(apoint) + + void face_begin() + + void face_end() + ... + + Basic_viewer (QWidget *parent, const Graphics_scene &scene)+ void draw()+ void redraw()... + + + 1 + + + + QApplication_and_basic_viewer + + QApplication_and_basic_viewer (const Graphics_scene &scene)+ void run()+ Basic_viewer & basic_viewer () + + + 1 + void draw_graphics_scene(const Graphics_scene& gs) + void draw(const DS& ds) + + void draw(const DS& ds, const Graphics_scene_option& gso) + void add_to_graphics_scene(const DS& ds, Graphics_scene& gs) + void add_to_graphics_scene(const DS& ds, Graphics_scene& gs, const Graphics_scene_option& gso) + + diff --git a/Basic_viewer/doc/Basic_viewer/fig/basic_viewer_logo.png b/Basic_viewer/doc/Basic_viewer/fig/basic_viewer_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05df4ad850c7835e769ef61288cefc78f5a7b392 GIT binary patch literal 19274 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 v1`S`B^^Rqfi!K82SGnKnXMg literal 0 HcmV?d00001 diff --git a/Basic_viewer/doc/Basic_viewer/fig/draw_mesh_and_points.png b/Basic_viewer/doc/Basic_viewer/fig/draw_mesh_and_points.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd65f7d50215d427ad22dd5e936b45a09c75f4d GIT binary patch literal 70311 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�)IHxhH5r~4vU7$9Ja|W^a~xhl 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 literal 0 HcmV?d00001 diff --git a/Basic_viewer/doc/Basic_viewer/fig/draw_surface_height.png b/Basic_viewer/doc/Basic_viewer/fig/draw_surface_height.png new file mode 100644 index 0000000000000000000000000000000000000000..082b3a29228656cc945d940636f53d7c374594c7 GIT binary patch literal 97895 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%0D@E{P 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 literal 0 HcmV?d00001 diff --git a/Basic_viewer/doc/Basic_viewer/fig/draw_surface_mesh_small_faces.png b/Basic_viewer/doc/Basic_viewer/fig/draw_surface_mesh_small_faces.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b4066ca7fbf1388c3134311fa291f148044647 GIT binary patch literal 60389 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 Date: Mon, 2 Oct 2023 09:09:01 +0200 Subject: [PATCH 183/341] lcc doc (temp) --- .../Linear_cell_complex/CGAL/draw_linear_cell_complex.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 36d6af07625b..2b5e7b939c0b 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -7,6 +7,7 @@ opens a new window and draws `alcc`, a model of the `LinearCellComplex` concept. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam LCC a model of the `LinearCellComplex` concept. \param alcc the linear cell complex to draw. +\param gs_options graphics scene options. */ template @@ -15,6 +16,12 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 /*! \ingroup PkgDrawLinearCellComplex +Add in the given graphics scene the elements of alcc. + +\param alcc the linear cell complex to draw. +\param graphics_scene the graphics scene. +\param gs_options graphics scene options. + */ template void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, From 823392af852d45ca1dbeaa031b65e3da0431a3ed Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 3 Oct 2023 21:27:17 +0200 Subject: [PATCH 184/341] Update Basic_viewer/doc/Basic_viewer/PackageDescription.txt Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 6687dd8140e0..3f98ea413dd5 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -22,8 +22,8 @@ \cgalClassifedRefPages \cgalCRPSection{Classes} -- `CGAL::Graphics_scene_options` -- `CGAL::Graphics_scene_options` +- `CGAL::Graphics_scene_options` +- `CGAL::Graphics_scene_options` - `CGAL::Graphics_scene` - `CGAL::Basic_viewer_qt` - `CGAL::QApplication_and_basic_viewer` From a8e68cabfcfa11e3f51fb84a52199946a19a423e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 3 Oct 2023 21:27:28 +0200 Subject: [PATCH 185/341] Update Basic_viewer/doc/Basic_viewer/PackageDescription.txt Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 3f98ea413dd5..682dd327600b 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -50,7 +50,7 @@ - `Triangulation_3` \link PkgDrawTriangulation3 CGAL::draw() \endlink - `Voronoi_diagram_2` \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink -\cgalCRPSubsection{Fill Graphic Storage for Different Packages} +\cgalCRPSubsection{Fill Graphics Scene for Different Packages} - Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphics_scene() \endlink - Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_in_graphics_scene() \endlink From 5d1ae463fd238b1c465d93992ab41124de663430 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 3 Oct 2023 21:27:38 +0200 Subject: [PATCH 186/341] Update Basic_viewer/doc/Basic_viewer/PackageDescription.txt Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 682dd327600b..44c977044b8d 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -28,7 +28,7 @@ - `CGAL::Basic_viewer_qt` - `CGAL::QApplication_and_basic_viewer` -\cgalCRPSubsection{Draw a Graphic Storage} +\cgalCRPSubsection{Draw a Graphics Scene} - `CGAL::draw_graphics_scene()` From ac1c4896eeea2ec0b4dd82353829c2be864f20c1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 6 Oct 2023 07:46:16 +0200 Subject: [PATCH 187/341] Update names following Andreas remarks --- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 10 +- .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 100 +++++++++--------- .../doc/Basic_viewer/PackageDescription.txt | 1 - 3 files changed, 55 insertions(+), 56 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 750b8c492c94..e21da6ec2509 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -54,19 +54,19 @@ class Graphics_scene { void face_begin(const CGAL::IO::Color &acolor); /// return `true` iff a face is started. - bool is_a_face_started() const; + bool a_face_started() const; /// adds the given point in the current face. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` template bool add_point_in_face(const KPoint &kp); /// adds the given point in the current face, having the vertex normal. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); /// end the current face. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` void face_end(); /// adds the given text at the given position in the storage. @@ -78,7 +78,7 @@ class Graphics_scene { void add_text(const KPoint &kp, const std::string &txt); /// returns `true` iff the storage has no element. - bool is_empty() const; + bool empty() const; /// clears the storage, i.e., removes all points, segments, triangles and text. void clear(); diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 4ca7cf8925ac..478467909afa 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -20,112 +20,112 @@ class Basic_viewer_qt : public CGAL::QGLViewer const char* title=""); /// enables or disables the drawing of vertices. - void set_draw_vertices(bool b); + void draw_vertices(bool b); /// enables or disables the drawing of edges. - void set_draw_edges(bool b); + void draw_edges(bool b); /// enables or disables the drawing of rays. - void set_draw_rays(bool b); + void draw_rays(bool b); /// enables or disables the drawing of lines. - void set_draw_lines(bool b); + void draw_lines(bool b); /// enables or disables the drawing of faces. - void set_draw_faces(bool b); + void draw_faces(bool b); /// enables or disables the use of only one color (if `b` is `true`) or the use of multiple colors (if `b` is `false`). - void set_use_mono_color(bool b); + void use_mono_color(bool b); /// enables or disables the drawing of texts. - void set_draw_text(bool b); + void draw_text(bool b); /// sets the color used for vertices in mono_color mode. - void set_vertices_mono_color(const CGAL::IO::Color& c); + void vertices_mono_color(const CGAL::IO::Color& c); /// sets the color used for edges in mono_color mode. - void set_edges_mono_color(const CGAL::IO::Color& c); + void edges_mono_color(const CGAL::IO::Color& c); /// sets the color used for rays in mono_color mode. - void set_rays_mono_color(const CGAL::IO::Color& c); + void rays_mono_color(const CGAL::IO::Color& c); /// sets the color used for lines in mono_color mode. - void set_lines_mono_color(const CGAL::IO::Color& c); + void lines_mono_color(const CGAL::IO::Color& c); /// sets the color used for faces in mono_color mode. - void set_faces_mono_color(const CGAL::IO::Color& c); + void faces_mono_color(const CGAL::IO::Color& c); - /// negates the drawing of vertices (becomes `true` if it was `false` and reciprocally). - void negate_draw_vertices(); + /// toggles the drawing of vertices. + void toggle_draw_vertices(); - /// negates the drawing of edges (becomes `true` if it was `false` and reciprocally). - void negate_draw_edges(); + /// toggles the drawing of edges. + void toggle_draw_edges(); - /// negates the drawing of rays (becomes `true` if it was `false` and reciprocally). - void negate_draw_rays(); + /// toggles the drawing of rays. + void toggle_draw_rays(); - /// negates the drawing of lines (becomes `true` if it was `false` and reciprocally). - void negate_draw_lines(); + /// toggles the drawing of lines. + void toggle_draw_lines(); - /// negates the drawing of faces (becomes `true` if it was `false` and reciprocally). - void negate_draw_faces(); + /// toggles the drawing of faces. + void toggle_draw_faces(); - /// negates the use of mono color mode (becomes `true` if it was `false` and reciprocally). - void negate_use_mono_color(); + /// toggles the use of mono color mode. + void toggle_use_mono_color(); - /// negates the drawing of text (becomes `true` if it was `false` and reciprocally). - void negate_draw_text(); + /// toggles the drawing of text. + void toggle_draw_text(); /// returns `true` if vertices are drawn. - bool get_draw_vertices() const; + bool draw_vertices() const; /// returns `true` if edges are drawn. - bool get_draw_edges() const; + bool draw_edges() const; /// returns `true` if rays are drawn. - bool get_draw_rays() const; + bool draw_rays() const; /// returns `true` if lines are drawn. - bool get_draw_lines() const; + bool draw_lines() const; /// returns `true` if faces are drawn. - bool get_draw_faces() const; + bool draw_faces() const; /// returns `true` if mono color mode is used. - bool get_use_mono_color() const; + bool use_mono_color() const; /// returns `true` if normal are reversed. - bool get_inverse_normal() const; + bool reverse_normal() const; /// returns `true` if text are drawn. - bool get_draw_text() const; + bool draw_text() const; /// returns the mono color used for vertices. - const CGAL::IO::Color& get_vertices_mono_color() const; + const CGAL::IO::Color& vertices_mono_color() const; /// returns the mono color used for edges. - const CGAL::IO::Color& get_edges_mono_color() const; + const CGAL::IO::Color& edges_mono_color() const; /// returns the mono color used for rays. - const CGAL::IO::Color& get_rays_mono_color() const; + const CGAL::IO::Color& rays_mono_color() const; /// returns the mono color used for lines. - const CGAL::IO::Color& get_lines_mono_color() const; + const CGAL::IO::Color& lines_mono_color() const; /// returns the mono color used for faces. - const CGAL::IO::Color& get_faces_mono_color() const; + const CGAL::IO::Color& faces_mono_color() const; /// clears the basic viewer, i.e., remove all its elements. void clear(); /// returns `true` if the viewer is empty. - bool is_empty() const; + bool empty() const; /// returns the bounding box of all the elements in the viewer. const CGAL::Bbox_3& bounding_box() const; /// returns `true` if the clipping plane is enabled. - bool is_clipping_plane_enabled() const; + bool clipping_plane_enabled() const; /// returns the clipping plane when it is enabled. CGAL::Exact_predicates_inexact_constructions_kernel::Plane_3 clipping_plane() const; @@ -172,19 +172,19 @@ class Basic_viewer_qt : public CGAL::QGLViewer void face_begin(const CGAL::IO::Color &acolor); /// returns `true` iff a face is started. - bool is_a_face_started() const; + bool a_face_started() const; /// adds the given point in the current face. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` template bool add_point_in_face(const KPoint &kp); /// adds the given point in the current face, having the vertex normal. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); /// ends the current face. - /// @pre `is_a_face_started()` + /// @pre `a_face_started()` void face_end(); /// adds the given text at the given position in the viewer. @@ -196,16 +196,16 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_text(const KPoint &kp, const std::string &txt); /// returns the graphics scene of the viewer. - Graphics_scene& get_graphics_scene(); + Graphics_scene& graphics_scene(); /// returns the graphics scene of the viewer, const version. - const Graphics_scene& get_graphics_scene() const; + const Graphics_scene& graphics_scene() const; - /// negates all normals of vertices and faces. - void negate_all_normals(); + /// reverses all normals of vertices and faces. + void reverse_all_normals(); /// returns `true` if the data structure in in 2D, i.e., lies on a plane. - bool is_two_dimensional() const; + bool two_dimensional() const; /// draws the viewer without recomputing all internal buffers. virtual void draw(); diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 44c977044b8d..47970d7f5234 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -22,7 +22,6 @@ \cgalClassifedRefPages \cgalCRPSection{Classes} -- `CGAL::Graphics_scene_options` - `CGAL::Graphics_scene_options` - `CGAL::Graphics_scene` - `CGAL::Basic_viewer_qt` From 93183fc2b7a2b5ad40438599392ba7c63272db86 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 6 Oct 2023 07:52:15 +0200 Subject: [PATCH 188/341] document draw and add_in_graphics_scene for lcc (for validation) --- .../CGAL/draw_linear_cell_complex.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 2b5e7b939c0b..38a33ace8013 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -6,18 +6,24 @@ namespace CGAL { opens a new window and draws `alcc`, a model of the `LinearCellComplex` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam LCC a model of the `LinearCellComplex` concept. +\tparam GSOptions a class having the same methods than `Graphics_scene_options`: `Graphics_scene_options` by default. + \param alcc the linear cell complex to draw. \param gs_options graphics scene options. */ template - void draw(const LCC& alcc, const GSOptions& gs_options); + void draw(const LCC& alcc, const GSOptions& gs_options=GSOptions()); /*! \ingroup PkgDrawLinearCellComplex Add in the given graphics scene the elements of alcc. +\tparam LCC a model of the `LinearCellComplex` concept. +\tparam BufferType the number type used for point coordinates: `float` by default. +\tparam GSOptions a class having the same methods than `Graphics_scene_options`: `Graphics_scene_options` by default. + \param alcc the linear cell complex to draw. \param graphics_scene the graphics scene. \param gs_options graphics scene options. @@ -25,7 +31,7 @@ Add in the given graphics scene the elements of alcc. */ template void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options); + const GSOptions& gs_options=GSOptions()); } /* namespace CGAL */ From 163e8ae2b3b3d28de634c15219ab5feeb8ce0fda Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 13 Oct 2023 10:50:04 +0200 Subject: [PATCH 189/341] Doc basic viewer --- .../doc/Basic_viewer/Basic_viewer.txt | 2 +- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 24 +++++++------- .../CGAL/draw_triangulation_2.h | 33 ++++++++++--------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 766ccf8c7798..0ec0627a8106 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -18,7 +18,7 @@ draw(XXX) Graphics_scene_options -\subsection Basic_viewerDoc_3 Graphic storage +\subsection Basic_viewerDoc_3 Graphic Scene \subsection Basic_viewerDoc_4 Basic viewer Qt diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index e21da6ec2509..1a799c850cc2 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -12,37 +12,37 @@ The class `Graphics_scene` stores points, segments, triangles, rays and lines. E template class Graphics_scene { public: - /// adds the given point in the storage. + /// adds the given point in the scene. template void add_point(const KPoint &p); - /// adds the given colored point in the storage. + /// adds the given colored point in the scene. template void add_point(const KPoint &p, const CGAL::IO::Color &acolor); - /// adds the given segment in the storage. + /// adds the given segment in the scene. template void add_segment(const KPoint &p1, const KPoint &p2); - /// adds the given colored segment in the storage. + /// adds the given colored segment in the scene. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// adds the given ray in the storage: an half line starting from `p` and having `v` as direction. + /// adds the given ray in the scene: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); - /// adds the given colored ray in the storage: an half line starting from `p` and having `v` as direction. + /// adds the given colored ray in the scene: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); - /// adds the given line in the storage, defined by `p` and `v` as direction. + /// adds the given line in the scene, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v); - /// adds the given colored line in the storage, defined by `p` and `v` as direction. + /// adds the given colored line in the scene, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); @@ -69,18 +69,18 @@ class Graphics_scene { /// @pre `a_face_started()` void face_end(); - /// adds the given text at the given position in the storage. + /// adds the given text at the given position in the scene. template void add_text(const KPoint &kp, const char *txt); - /// adds the given text at the given position in the storage. + /// adds the given text at the given position in the scene. template void add_text(const KPoint &kp, const std::string &txt); - /// returns `true` iff the storage has no element. + /// returns `true` iff the scene has no element. bool empty() const; - /// clears the storage, i.e., removes all points, segments, triangles and text. + /// clears the scene, i.e., removes all points, segments, triangles and text. void clear(); }; diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 5f42a8463acd..a47d2628461a 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation2 -opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional cell parameter. +opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with @@ -11,32 +11,35 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with \tparam T2 a triangulation class derived from `Triangulation_2` \param at2 the triangulation to draw. -\param cp the cell parameters. +\param gso the graphics scene options parameter, `Graphics_scene_options()` by default. */ template -void draw(const T2& at2, const CGAL::Graphics_scene_options& cp=default); +void draw(const T2& at2, + const CGAL::Graphics_scene_options& gso=default); /*! \ingroup PkgDrawTriangulation2 -adds the vertices, edges and faces of `at2` into the given graphic storage `gs`. Parameters of the cells are taken from the optional cell parameters `cp` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam T2 a triangulation class derived from `Triangulation_2` +\tparam BufferType the number type used for point coordinates: `float` by default. + \param at2 the triangulation to draw. -\param gs the graphic storage to fill. -\param cp the cell parameters. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter, `Graphics_scene_options()` by default. */ -template +template void add_in_graphics_scene(const T2& at2, - CGAL::Graphics_scene& gs, - const CGAL::Graphics_scene_options& cp=default); + CGAL::Graphics_scene& gs, + const CGAL::Graphics_scene_options& gso=default); } /* namespace CGAL */ From 40b9b1046f31865019b0cbf68c158d6d6f2acb64 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:02:29 +0200 Subject: [PATCH 190/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 1a799c850cc2..8c6b3a41f36f 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -29,7 +29,7 @@ class Graphics_scene { void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// adds the given ray in the scene: an half line starting from `p` and having `v` as direction. + /// adds the given ray in the scene: a half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); From b47694cd80970cbac841e3dd9c21ed3210ab044d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:02:41 +0200 Subject: [PATCH 191/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 8c6b3a41f36f..e5c8c039533d 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -33,7 +33,7 @@ class Graphics_scene { template void add_ray(const KPoint &p, const KVector &v); - /// adds the given colored ray in the scene: an half line starting from `p` and having `v` as direction. + /// adds the given colored ray in the scene: a half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor); From 12365d7cf966019bc997a3c89e6e630562e0639d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:02:48 +0200 Subject: [PATCH 192/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index e5c8c039533d..9bcf7ede97c9 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -65,7 +65,7 @@ class Graphics_scene { template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); - /// end the current face. + /// ends the current face. /// @pre `a_face_started()` void face_end(); From eca66e9682d327ae5377cf9e4e8aeb9e9cda7b7b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:02:55 +0200 Subject: [PATCH 193/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 9bcf7ede97c9..ab690cf88de7 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -80,7 +80,7 @@ class Graphics_scene { /// returns `true` iff the scene has no element. bool empty() const; - /// clears the scene, i.e., removes all points, segments, triangles and text. + /// clears the scene, i.e., removes all points, segments, triangles, and text. void clear(); }; From a33b4e33560180baec60d9ec0f2ac2cb71a7fd50 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:22:55 +0200 Subject: [PATCH 194/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 478467909afa..dd69acc75770 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -40,7 +40,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// enables or disables the drawing of texts. void draw_text(bool b); - /// sets the color used for vertices in mono_color mode. + /// sets the color used for vertices in mono color mode. void vertices_mono_color(const CGAL::IO::Color& c); /// sets the color used for edges in mono_color mode. From 67b41d91a2defa3a700977fe1100e199e54ab91d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:23:05 +0200 Subject: [PATCH 195/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index dd69acc75770..fd214d701b85 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -49,7 +49,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// sets the color used for rays in mono_color mode. void rays_mono_color(const CGAL::IO::Color& c); - /// sets the color used for lines in mono_color mode. + /// sets the color used for lines in mono color mode. void lines_mono_color(const CGAL::IO::Color& c); /// sets the color used for faces in mono_color mode. From bfa138dfeda93c95586841a2140c937e47d31bce Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:23:24 +0200 Subject: [PATCH 196/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index fd214d701b85..0de667741ab7 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -147,7 +147,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &acolor); - /// adds the given ray in the viewer: an half line starting from `p` and having `v` as direction. + /// adds the given ray in the viewer: a half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v); From c551b6cd40e060d77252e622f119f73f15a13968 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:23:50 +0200 Subject: [PATCH 197/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 0de667741ab7..d53538e9e818 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -16,7 +16,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphics_scene`. /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, - Graphics_scene& buf, + Graphics_scene& scene, const char* title=""); /// enables or disables the drawing of vertices. From dfb32ba6c349cb8313ce6ee734070ca6c87925cb Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:24:02 +0200 Subject: [PATCH 198/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index d53538e9e818..d940320c62ff 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -94,7 +94,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// returns `true` if mono color mode is used. bool use_mono_color() const; - /// returns `true` if normal are reversed. + /// returns `true` if normals are reversed. bool reverse_normal() const; /// returns `true` if text are drawn. From 46ddf990fcf36dd97abd886b96ce7a5ead4a8b73 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:24:14 +0200 Subject: [PATCH 199/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index d940320c62ff..0aa2ca098104 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -52,7 +52,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// sets the color used for lines in mono color mode. void lines_mono_color(const CGAL::IO::Color& c); - /// sets the color used for faces in mono_color mode. + /// sets the color used for faces in mono color mode. void faces_mono_color(const CGAL::IO::Color& c); /// toggles the drawing of vertices. From 66eba9f2dbd813aea4c43d653daaf6e99c972b83 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:24:26 +0200 Subject: [PATCH 200/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 0aa2ca098104..b7caa43e7e98 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -46,7 +46,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// sets the color used for edges in mono_color mode. void edges_mono_color(const CGAL::IO::Color& c); - /// sets the color used for rays in mono_color mode. + /// sets the color used for rays in mono color mode. void rays_mono_color(const CGAL::IO::Color& c); /// sets the color used for lines in mono color mode. From cb2ab73e3da28743c01826a0fac96d8319f35b31 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:24:33 +0200 Subject: [PATCH 201/341] Update Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index b7caa43e7e98..69425636fed2 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -43,7 +43,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// sets the color used for vertices in mono color mode. void vertices_mono_color(const CGAL::IO::Color& c); - /// sets the color used for edges in mono_color mode. + /// sets the color used for edges in mono color mode. void edges_mono_color(const CGAL::IO::Color& c); /// sets the color used for rays in mono color mode. From ef73057d540a1ccffc27d7d6c1ec5b1fd53bbd20 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 09:29:40 +0200 Subject: [PATCH 202/341] acolor -> color --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 10 +++++----- .../doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index ab690cf88de7..d92e4a497126 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -18,7 +18,7 @@ class Graphics_scene { /// adds the given colored point in the scene. template - void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + void add_point(const KPoint &p, const CGAL::IO::Color &color); /// adds the given segment in the scene. template @@ -27,7 +27,7 @@ class Graphics_scene { /// adds the given colored segment in the scene. template void add_segment(const KPoint &p1, const KPoint &p2, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// adds the given ray in the scene: a half line starting from `p` and having `v` as direction. template @@ -36,7 +36,7 @@ class Graphics_scene { /// adds the given colored ray in the scene: a half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// adds the given line in the scene, defined by `p` and `v` as direction. template @@ -45,13 +45,13 @@ class Graphics_scene { /// adds the given colored line in the scene, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// starts a new face. void face_begin(); /// starts a new colored face. - void face_begin(const CGAL::IO::Color &acolor); + void face_begin(const CGAL::IO::Color &color); /// return `true` iff a face is started. bool a_face_started() const; diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 69425636fed2..4529095e2542 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -136,7 +136,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// adds the given colored point in the viewer. template - void add_point(const KPoint &p, const CGAL::IO::Color &acolor); + void add_point(const KPoint &p, const CGAL::IO::Color &color); /// adds the given segment in the viewer. template @@ -145,7 +145,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// adds the given colored segment in the viewer. template void add_segment(const KPoint &p1, const KPoint &p2, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// adds the given ray in the viewer: a half line starting from `p` and having `v` as direction. template @@ -154,7 +154,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// adds the given colored ray in the viewer: an half line starting from `p` and having `v` as direction. template void add_ray(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// adds the given line in the viewer, defined by `p` and `v` as direction. template @@ -163,13 +163,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// adds the given colored line in the viewer, defined by `p` and `v` as direction. template void add_line(const KPoint &p, const KVector &v, - const CGAL::IO::Color &acolor); + const CGAL::IO::Color &color); /// starts a new face. void face_begin(); /// starts a new colored face. - void face_begin(const CGAL::IO::Color &acolor); + void face_begin(const CGAL::IO::Color &color); /// returns `true` iff a face is started. bool a_face_started() const; From d213747c80df186a58c052565ff16647902160d5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 18 Oct 2023 15:55:43 +0200 Subject: [PATCH 203/341] nullptr must be quoted --- .../doc/Basic_viewer/CGAL/Graphics_scene_options.h | 8 ++++---- .../include/CGAL/Linear_cell_complex_base.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index fe574bef90c8..27bb711ab496 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -68,19 +68,19 @@ struct Graphics_scene_options std::function volume_wireframe; /// `std::function` that returns the color of the given vertex. - /// nullptr by default. + /// `nullptr` by default. std::function vertex_color; /// `std::function` that returns the color of the given edge. - /// nullptr by default. + /// `nullptr` by default. std::function edge_color; /// `std::function` that returns the color of the given face. - /// nullptr by default. + /// `nullptr` by default. std::function face_color; /// `std::function` that returns the color of the given volume. - /// nullptr by default. + /// `nullptr` by default. /// Exists only if `VolumeDescriptor` is not `void`. std::function volume_color; diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h index 4669765f4935..6681a4bb8b3c 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h @@ -806,7 +806,7 @@ namespace CGAL { /** Compute the dual of a Linear_cell_complex. * @param alcc the lcc in which we build the dual of this lcc. - * @param adart a dart of the initial lcc, nullptr by default. + * @param adart a dart of the initial lcc, `nullptr` by default. * @return adart of the dual lcc, the dual of adart if adart!=nullptr, * any dart otherwise. * As soon as we don't modify this lcc and alcc lcc, we can iterate From 31d79bdae582a3786a731965f844edbc4561167c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 18 Oct 2023 15:55:56 +0200 Subject: [PATCH 204/341] fix a copy-paste typo --- Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index a98fadbbf46f..cbd3355700c7 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -1109,9 +1109,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer vao[VAO_COLORED_LINES].bind(); if (m_use_mono_color) { - color.setRgbF((double)m_rays_mono_color.red()/(double)255, - (double)m_rays_mono_color.green()/(double)255, - (double)m_rays_mono_color.blue()/(double)255); + color.setRgbF((double)m_lines_mono_color.red()/(double)255, + (double)m_lines_mono_color.green()/(double)255, + (double)m_lines_mono_color.blue()/(double)255); rendering_program_p_l.disableAttributeArray("color"); rendering_program_p_l.setAttributeValue("color",color); } From 136962824460c204e508700623259eb8838b3d7b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 16:24:32 +0200 Subject: [PATCH 205/341] Update Basic_viewer/doc/Basic_viewer/PackageDescription.txt Co-authored-by: Andreas Fabri --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 47970d7f5234..dd222f1997a8 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -9,7 +9,7 @@ \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin \cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} -\cgalPkgDesc{This package implements basic viewer class.} +\cgalPkgDesc{This package provides a basic viewer class.} \cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin From eea01ce5fed7613c88df23ee81b027efbd940f36 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 16:23:09 +0200 Subject: [PATCH 206/341] Replace some flot by BufferType --- Basic_viewer/include/CGAL/Buffer_for_vao.h | 24 +++++++++++----------- Basic_viewer/include/CGAL/Graphics_scene.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Basic_viewer/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h index 438b15153547..c161c009d4e9 100644 --- a/Basic_viewer/include/CGAL/Buffer_for_vao.h +++ b/Basic_viewer/include/CGAL/Buffer_for_vao.h @@ -459,31 +459,31 @@ class Buffer_for_vao /// adds `kp` coordinates to `buffer` template - static void add_point_in_buffer(const KPoint& kp, std::vector& buffer) + static void add_point_in_buffer(const KPoint& kp, std::vector& buffer) { Local_point p=get_local_point(kp); - buffer.push_back(static_cast(p.x())); - buffer.push_back(static_cast(p.y())); - buffer.push_back(static_cast(p.z())); + buffer.push_back(static_cast(p.x())); + buffer.push_back(static_cast(p.y())); + buffer.push_back(static_cast(p.z())); } /// adds `kv` coordinates to `buffer` template - static void add_normal_in_buffer(const KVector& kv, std::vector& buffer, + static void add_normal_in_buffer(const KVector& kv, std::vector& buffer, bool inverse_normal=false) { Local_vector n=(inverse_normal?-get_local_vector(kv):get_local_vector(kv)); - buffer.push_back(static_cast(n.x())); - buffer.push_back(static_cast(n.y())); - buffer.push_back(static_cast(n.z())); + buffer.push_back(static_cast(n.x())); + buffer.push_back(static_cast(n.y())); + buffer.push_back(static_cast(n.z())); } ///adds `acolor` RGB components to `buffer` - static void add_color_in_buffer(const CGAL::IO::Color& acolor, std::vector& buffer) + static void add_color_in_buffer(const CGAL::IO::Color& acolor, std::vector& buffer) { - buffer.push_back((float)acolor.red()/(float)255); - buffer.push_back((float)acolor.green()/(float)255); - buffer.push_back((float)acolor.blue()/(float)255); + buffer.push_back((BufferType)acolor.red()/(BufferType)255); + buffer.push_back((BufferType)acolor.green()/(BufferType)255); + buffer.push_back((BufferType)acolor.blue()/(BufferType)255); } /// @return true iff the points of 'facet' form a convex face diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index fd5fcc4cde18..ed5a256daa36 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -128,7 +128,7 @@ class Graphics_scene const CGAL::Bbox_3 &get_bounding_box() const { return m_bounding_box; } - std::vector &get_array_of_index(int index) { return arrays[index]; } + std::vector &get_array_of_index(int index) { return arrays[index]; } int get_size_of_index(int index) const { return static_cast(arrays[index].size()*sizeof(BufferType)); } @@ -410,7 +410,7 @@ class Graphics_scene std::vector> m_texts; - std::vector arrays[LAST_INDEX]; + std::vector arrays[LAST_INDEX]; CGAL::Bbox_3 m_bounding_box; }; From e3f1772037d3a615c7ec76065aa79c92b2c33dd7 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 18 Oct 2023 16:54:16 +0200 Subject: [PATCH 207/341] Rename add_in_graphics_scene -> add_to_graphics_scene --- .../doc/Basic_viewer/PackageDescription.txt | 28 +++++++++---------- .../CGAL/draw_triangulation_2.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index dd222f1997a8..a6dae494221b 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -51,20 +51,20 @@ \cgalCRPSubsection{Fill Graphics Scene for Different Packages} -- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphics_scene() \endlink -- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_in_graphics_scene() \endlink -- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_in_graphics_scene() \endlink -- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_in_graphics_scene() \endlink -- Point_set_3 \link PkgDrawPointSet3D CGAL::add_in_graphics_scene() \endlink -- Polygon_2 \link PkgDrawPolygon2 CGAL::add_in_graphics_scene() \endlink -- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_in_graphics_scene() \endlink -- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_in_graphics_scene() \endlink -- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_in_graphics_scene() \endlink -- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_in_graphics_scene() \endlink -- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_in_graphics_scene() \endlink -- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_in_graphics_scene() \endlink -- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_in_graphics_scene() \endlink -- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_in_graphics_scene() \endlink +- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink +- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink +- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_to_graphics_scene() \endlink +- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_to_graphics_scene() \endlink +- Point_set_3 \link PkgDrawPointSet3D CGAL::add_to_graphics_scene() \endlink +- Polygon_2 \link PkgDrawPolygon2 CGAL::add_to_graphics_scene() \endlink +- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_to_graphics_scene() \endlink +- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_to_graphics_scene() \endlink +- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_to_graphics_scene() \endlink +- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_to_graphics_scene() \endlink +- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_to_graphics_scene() \endlink +- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink +- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_to_graphics_scene() \endlink +- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_to_graphics_scene() \endlink */ diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index a47d2628461a..fb5b68ce026c 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -35,7 +35,7 @@ adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. P */ template -void add_in_graphics_scene(const T2& at2, +void add_to_graphics_scene(const T2& at2, CGAL::Graphics_scene& gs, const CGAL::Graphics_scene_options Date: Wed, 18 Oct 2023 17:03:12 +0200 Subject: [PATCH 208/341] Start to rewrite draw_polygon_set_2.h (NYF) --- .../include/CGAL/draw_polygon_set_2.h | 164 ++++++++++-------- 1 file changed, 92 insertions(+), 72 deletions(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index cc4452f99c63..6b0a117217f8 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -40,16 +40,82 @@ void draw(const PS& aps); } /* namespace CGAL */ #endif -#ifdef CGAL_USE_BASIC_VIEWER - -#include #include namespace CGAL { -template -class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { - using Base = Basic_viewer_qt; +namespace draw_function_for_boolean_set_2 { + +template +void compute_loop(const typename PS2::Polygon_2& p, bool hole, + CGAL::Graphics_scene& gs, + const GSOptions& gso) +{ + if (hole) + { gs.add_point_in_face(p.vertex(p.size()-1)); } + + auto prev = p.vertices_begin(); + auto it = prev; + gs.add_point(*it); + gs.add_point_in_face(*it); + for (++it; it != p.vertices_end(); ++it) + { + gs.add_point(*it); // add vertex + gs.add_segment(*prev, *it); // add segment with previous point + gs.add_point_in_face(*it); // add point in face + prev = it; + } + + // Add the last segment between the last point and the first one + gs.add_segment(*prev, *(p.vertices_begin())); +} + +/// Compute the elements of a polygon with holes. +template +void compute_elements(const PWH& pwh, + CGAL::Graphics_scene& gs, + const GSOptions& gso) +{ + if (!gso.draw_unbounded() && pwh.outer_boundary().is_empty()) return; + + CGAL::IO::Color c(75,160,255); + gs.face_begin(c); + + const typename PWH::Point_2* point_in_face; + if (pwh.outer_boundary().is_empty()) + { + typename PWH::Polygon_2 pgn; + pgn.push_back(Pnt(-gso.width(), -gso.height())); + pgn.push_back(Pnt(gso.width(), -gso.height())); + pgn.push_back(Pnt(gso.width(), gso.height())); + pgn.push_back(Pnt(-gso.width(), gso.height())); + compute_loop(pgn, false, gs); + point_in_face = &(pgn.vertex(pgn.size()-1)); + } + else + { + const auto& outer_boundary = pwh.outer_boundary(); + compute_loop(outer_boundary, false, gs); + point_in_face = &(outer_boundary.vertex(outer_boundary.size()-1)); + } + + for (auto it = pwh.holes_begin(); it != pwh.holes_end(); ++it) + { + compute_loop(*it, true, gs); + gs.add_point_in_face(*point_in_face); + } + + gs.face_end(); +} + +} // End namespace draw_function_for_boolean_set_2 + +#ifdef CGAL_USE_BASIC_VIEWER + +template +class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt +{ + using Base = Basic_viewer_qt; using Ps = PolygonSet_2; using Pwh = typename Ps::Polygon_with_holes_2; using Pgn = typename Ps::Polygon_2; @@ -57,6 +123,8 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { public: Polygon_set_2_basic_viewer_qt(QWidget* parent, const Ps& ps, + Graphics_scene& gs, + GSOptions& gs_options, const char* title = "Basic Polygon_set_2 Viewer", bool draw_unbounded = false, bool draw_vertices = false) : @@ -81,27 +149,28 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { m_width = width; m_height = height; CGAL::qglviewer::Vec p; - auto ratio = camera()->pixelGLRatio(p); + auto ratio = this->camera()->pixelGLRatio(p); if (ratio != m_pixel_ratio) { m_pixel_ratio = ratio; add_elements(); } } - /*! Compute the elements of a polygon set. + /*! Obtain the pixel ratio. */ - virtual void add_elements() { - clear(); + double pixel_ratio() const { return m_pixel_ratio; } + /*! Compute the elements of a polygon set. + */ + virtual void add_elements() + { + this->clear(); std::vector pwhs; m_ps.polygons_with_holes(std::back_inserter(pwhs)); - for (const auto& pwh : pwhs) add_elements(pwh); + for (const auto& pwh : pwhs) + { compute_elements(pwh, graphics_scene, graphics_scene_options); } } - /*! Obtain the pixel ratio. - */ - double pixel_ratio() const { return m_pixel_ratio; } - /*! Compute the bounding box. */ CGAL::Bbox_2 bounding_box() { @@ -119,57 +188,6 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { return bbox; } -protected: - /*! Compute the elements of a polygon with holes. - */ - void add_elements(const Pwh& pwh) { - if (! m_draw_unbounded && pwh.outer_boundary().is_empty()) return; - - CGAL::IO::Color c(75,160,255); - face_begin(c); - - const Pnt* point_in_face; - if (pwh.outer_boundary().is_empty()) { - Pgn pgn; - pgn.push_back(Pnt(-m_width, -m_height)); - pgn.push_back(Pnt(m_width, -m_height)); - pgn.push_back(Pnt(m_width, m_height)); - pgn.push_back(Pnt(-m_width, m_height)); - compute_loop(pgn, false); - point_in_face = &(pgn.vertex(pgn.size()-1)); - } - else { - const auto& outer_boundary = pwh.outer_boundary(); - compute_loop(outer_boundary, false); - point_in_face = &(outer_boundary.vertex(outer_boundary.size()-1)); - } - - for (auto it = pwh.holes_begin(); it != pwh.holes_end(); ++it) { - compute_loop(*it, true); - add_point_in_face(*point_in_face); - } - - face_end(); - } - - void compute_loop(const Pgn& p, bool hole) { - if (hole) add_point_in_face(p.vertex(p.size()-1)); - - auto prev = p.vertices_begin(); - auto it = prev; - add_point(*it); - add_point_in_face(*it); - for (++it; it != p.vertices_end(); ++it) { - add_point(*it); // add vertex - add_segment(*prev, *it); // add segment with previous point - add_point_in_face(*it); // add point in face - prev = it; - } - - // Add the last segment between the last point and the first one - add_segment(*prev, *(p.vertices_begin())); - } - private: //! The window width in pixels. int m_width = CGAL_BASIC_VIEWER_INIT_SIZE_X; @@ -185,8 +203,6 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { //! Indicates whether to draw unbounded polygons with holes. bool m_draw_unbounded = false; - - Graphics_scene gs; }; // Specialization of draw function. @@ -202,16 +218,20 @@ void draw(const CGAL::Polygon_set_2& ps, bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); #endif - if (! cgal_test_suite) { + if (! cgal_test_suite) + { using Ps = CGAL::Polygon_set_2; using Viewer = Polygon_set_2_basic_viewer_qt; CGAL::Qt::init_ogl_context(4,3); int argc = 1; const char* argv[2] = {"t2_viewer", nullptr}; QApplication app(argc, const_cast(argv)); - Viewer mainwindow(app.activeWindow(), ps, title, draw_unbounded, draw_vertices); - mainwindow.add_elements(); - mainwindow.show(); + Graphics_scene gs; + Graphics_scene_options gs; + Viewer basic_viewer(app.activeWindow(), ps, gs, gso, + title, draw_unbounded, draw_vertices); + basic_viewer.add_elements(); + basic_viewer.show(); app.exec(); } } From 175166d43e06e3bc83f5c7b0a23ee7876001e38d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 11:58:37 +0200 Subject: [PATCH 209/341] Remove all methods to add elements from Basic_viewer_qt. --- Basic_viewer/include/CGAL/Buffer_for_vao.h | 11 +- Basic_viewer/include/CGAL/Graphics_scene.h | 45 +++- .../include/CGAL/Qt/Basic_viewer_qt.h | 225 ++++-------------- .../demo/Linear_cell_complex/Viewer.cpp | 18 +- 4 files changed, 93 insertions(+), 206 deletions(-) diff --git a/Basic_viewer/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h index c161c009d4e9..7b44bbc7b6b3 100644 --- a/Basic_viewer/include/CGAL/Buffer_for_vao.h +++ b/Basic_viewer/include/CGAL/Buffer_for_vao.h @@ -204,11 +204,10 @@ class Buffer_for_vao bool has_zero_z() const { return m_zero_z; } - void negate_normals() + void negate_normals() const { m_inverse_normal=!m_inverse_normal; - for (std::vector*array=m_flat_normal_buffer; array!=nullptr; - array=(array==m_gouraud_normal_buffer?nullptr:m_gouraud_normal_buffer)) + for (std::vector*array: {m_flat_normal_buffer, m_gouraud_normal_buffer}) { for (std::size_t i=0; isize(); ++i) { (*array)[i]=-(*array)[i]; } @@ -899,8 +898,8 @@ class Buffer_for_vao std::vector* m_pos_buffer; std::vector* m_index_buffer; std::vector* m_color_buffer; - std::vector* m_flat_normal_buffer; - std::vector* m_gouraud_normal_buffer; + mutable std::vector* m_flat_normal_buffer; + mutable std::vector* m_gouraud_normal_buffer; CGAL::Bbox_3* m_bb; @@ -908,7 +907,7 @@ class Buffer_for_vao bool m_zero_y; /// True iff all points have y==0 bool m_zero_z; /// True iff all points have z==0 - bool m_inverse_normal; + mutable bool m_inverse_normal; // Local variables, used when we started a new face.g bool m_face_started; diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index ed5a256daa36..47feac4dab7e 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -123,12 +123,10 @@ class Graphics_scene const Buffer_for_vao &get_buffer_for_colored_faces() const { return m_buffer_for_colored_faces; } - const Buffer_for_vao &get_buffer_for_clipping_plane() const - { return m_buffer_for_clipping_plane; } + const CGAL::Bbox_3 &bounding_box() const { return m_bounding_box; } - const CGAL::Bbox_3 &get_bounding_box() const { return m_bounding_box; } - - std::vector &get_array_of_index(int index) { return arrays[index]; } + const std::vector &get_array_of_index(int index) const + { assert(index(arrays[index].size()*sizeof(BufferType)); } @@ -136,12 +134,30 @@ class Graphics_scene unsigned int number_of_elements(int index) const { return static_cast(arrays[index].size()/3); } - void update_bounding_box(const CGAL::Bbox_3 &box) { m_bounding_box+=box; } - void initiate_bounding_box(const CGAL::Bbox_3& new_bounding_box) { m_bounding_box = new_bounding_box; } - void negate_all_normals() + void update_bounding_box(const CGAL::Bbox_3 &box) { m_bounding_box+=box; } + + template + void update_bounding_box_for_ray(const KPoint &p, const KVector &v) + { + Local_point lp = get_local_point(p); + Local_vector lv = get_local_vector(v); + update_bounding_box((lp + lv).bbox()); + } + + template + void update_bounding_box_for_line(const KPoint &p, const KVector &v, + const KVector &pv) + { + Local_point lp = get_local_point(p); + Local_vector lv = get_local_vector(v); + Local_vector lpv = get_local_vector(pv); + update_bounding_box(lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox()); + } + + void negate_all_normals() const { m_buffer_for_mono_faces.negate_normals(); m_buffer_for_colored_faces.negate_normals(); @@ -308,6 +324,12 @@ class Graphics_scene m_buffer_for_colored_lines.has_zero_z(); } + // Returns true if the data structure lies on a XY or XZ or YZ plane + bool is_two_dimensional() const + { + return (!is_empty() && (has_zero_x() || has_zero_y() || has_zero_z())); + } + void clear() { m_buffer_for_mono_points.clear(); @@ -320,7 +342,6 @@ class Graphics_scene m_buffer_for_colored_lines.clear(); m_buffer_for_mono_faces.clear(); m_buffer_for_colored_faces.clear(); - m_buffer_for_clipping_plane.clear(); m_texts.clear(); m_bounding_box=CGAL::Bbox_3(); } @@ -356,10 +377,10 @@ class Graphics_scene void m_texts_clear() { m_texts.clear(); } - int m_texts_size() + int m_texts_size() const { return m_texts.size(); } - std::vector>& get_m_texts() + const std::vector>& get_m_texts() const { return m_texts; } public: @@ -377,7 +398,6 @@ class Graphics_scene POS_COLORED_LINES, POS_MONO_FACES, POS_COLORED_FACES, - POS_CLIPPING_PLANE, END_POS, BEGIN_COLOR = END_POS, COLOR_POINTS = BEGIN_COLOR, @@ -406,7 +426,6 @@ class Graphics_scene Buffer_for_vao m_buffer_for_colored_lines; Buffer_for_vao m_buffer_for_mono_faces; Buffer_for_vao m_buffer_for_colored_faces; - Buffer_for_vao m_buffer_for_clipping_plane; std::vector> m_texts; diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index cbd3355700c7..738a99a25c06 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -72,7 +72,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - Graphics_scene& buf, + const Graphics_scene& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -161,7 +161,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer ~Basic_viewer_qt() { makeCurrent(); - for (unsigned int i=0; iinverseTransformOf @@ -275,97 +248,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_clipping_plane_enabled() const { return (m_use_clipping_plane!=CLIPPING_PLANE_OFF); } - template - void add_point(const KPoint& p) - { gBuffer.add_point(p); } - - template - void add_point(const KPoint& p, const CGAL::IO::Color& acolor) - { gBuffer.add_point(p, acolor); } - - template - void add_segment(const KPoint& p1, const KPoint& p2) - { gBuffer.add_segment(p1, p2);} - - template - void add_segment(const KPoint& p1, const KPoint& p2, - const CGAL::IO::Color& acolor) - { gBuffer.add_segment(p1, p2, acolor);} - - template - void add_ray(const KPoint &p, const KVector &v) - { gBuffer.add_ray(p, v); } - - template - void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) - { gBuffer.add_ray(p, v, acolor); } - - template - void add_line(const KPoint &p, const KVector &v) - { gBuffer.add_line(p, v); } - - template - void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &acolor) - { gBuffer.add_line(p, v, acolor); } - - template - void add_text(const KPoint& kp, const QString& txt) - { gBuffer.add_text(kp, txt); } - - template - void add_text(const KPoint& kp, const char* txt) - { gBuffer.add_text(kp, txt); } - - template - void add_text(const KPoint& kp, const std::string& txt) - { gBuffer.add_text(kp, txt.c_str()); } - - template - void update_bounding_box_for_ray(const KPoint &p, const KVector &v) - { - Local_point lp = get_local_point(p); - Local_vector lv = get_local_vector(v); - CGAL::Bbox_3 b = (lp + lv).bbox(); - gBuffer.update_bounding_box(b); - } - - template - void update_bounding_box_for_line(const KPoint &p, const KVector &v, - const KVector &pv) - { - Local_point lp = get_local_point(p); - Local_vector lv = get_local_vector(v); - Local_vector lpv = get_local_vector(pv); - - CGAL::Bbox_3 b = lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox(); - gBuffer.update_bounding_box(b); - } - - bool is_a_face_started() const - { - return gBuffer.get_buffer_for_mono_faces().is_a_face_started() || - gBuffer.get_buffer_for_colored_faces().is_a_face_started(); - } - - void face_begin() - { gBuffer.face_begin(); } - - void face_begin(const CGAL::IO::Color& acolor) - { gBuffer.face_begin(acolor); } - - template - bool add_point_in_face(const KPoint &kp) - { return gBuffer.add_point_in_face(kp); } - - template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal) - { return gBuffer.add_point_in_face(kp, p_normal); } - - void face_end() - { gBuffer.face_end(); } - - Graphics_scene& get_graphics_scene() - { return gBuffer; } const Graphics_scene& get_graphics_scene() const { return gBuffer; } @@ -375,20 +257,6 @@ class Basic_viewer_qt : public CGAL::QGLViewer update(); } - // Shortcuts to simplify function calls. - template - static Local_point get_local_point(const KPoint& p) - { - return internal::Geom_utils::Kernel, Local_kernel>:: - get_local_point(p); - } - template - static Local_vector get_local_vector(const KVector& v) - { - return internal::Geom_utils::Kernel, Local_kernel>:: - get_local_vector(v); - } - void negate_all_normals() { m_inverse_normal=!m_inverse_normal; @@ -397,10 +265,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer // Returns true if the data structure lies on a plane bool is_two_dimensional() const - { - return (!is_empty() && !m_no_2D_mode && - (has_zero_x() || has_zero_y() || has_zero_z())); - } + { return !m_no_2D_mode && gBuffer.is_two_dimensional(); } protected: void compile_shaders() @@ -410,7 +275,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.removeAllShaders(); // Create the buffers - for (unsigned int i=0; i(m_array_for_clipping_plane.size()*sizeof(BufferType))); rendering_program_clipping_plane.enableAttributeArray("vertex"); rendering_program_clipping_plane.setAttributeBuffer("vertex", GL_FLOAT, 0, 3); @@ -845,13 +710,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer 1.0f ); CGAL::Bbox_3 bb; - if (bb==bounding_box()) // Case of "empty" bounding box + if (bb==gBuffer.bounding_box()) // Case of "empty" bounding box { bb=Local_point(CGAL::ORIGIN).bbox(); bb=bb + Local_point(1,1,1).bbox(); // To avoid a warning from Qglviewer } else - { bb=bounding_box(); } + { bb=gBuffer.bounding_box(); } QVector4D position((bb.xmax()-bb.xmin())/2, (bb.ymax()-bb.ymin())/2, @@ -909,9 +774,9 @@ class Basic_viewer_qt : public CGAL::QGLViewer constraint.setTranslationConstraintType(CGAL::qglviewer::AxisPlaneConstraint::FREE); double cx=0., cy=0., cz=0.; - if (has_zero_x()) { cx=1.; } - else if (has_zero_y()) { cy=1.; } - else { cz=1.; } + if (gBuffer.has_zero_x()) { cx=1.; } + else if (gBuffer.has_zero_y()) { cy=1.; } + else { cz=1.; } camera()->setViewDirection(CGAL::qglviewer::Vec(-cx,-cy,-cz)); constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(cx, cy, cz)); @@ -1185,7 +1050,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer rendering_program_clipping_plane.bind(); vao[VAO_CLIPPING_PLANE].bind(); glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_CLIPPING_PLANE))); + glDrawArrays(GL_LINES, 0, static_cast((m_array_for_clipping_plane.size()/3))); glLineWidth(1.0f); vao[VAO_CLIPPING_PLANE].release(); rendering_program_clipping_plane.release(); @@ -1287,13 +1152,13 @@ class Basic_viewer_qt : public CGAL::QGLViewer compile_shaders(); CGAL::Bbox_3 bb; - if (bb==bounding_box()) // Case of "empty" bounding box + if (bb==gBuffer.bounding_box()) // Case of "empty" bounding box { bb=Local_point(CGAL::ORIGIN).bbox(); bb=bb + Local_point(1,1,1).bbox(); // To avoid a warning from Qglviewer } else - { bb=bounding_box(); } + { bb=gBuffer.bounding_box(); } this->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(bb.xmin(), bb.ymin(), bb.zmin()), @@ -1308,12 +1173,12 @@ class Basic_viewer_qt : public CGAL::QGLViewer void generate_clipping_plane() { - qreal size=((bounding_box().xmax() - bounding_box().xmin()) + - (bounding_box().ymax() - bounding_box().ymin()) + - (bounding_box().zmax() - bounding_box().zmin())); + qreal size=((gBuffer.bounding_box().xmax()-gBuffer.bounding_box().xmin()) + + (gBuffer.bounding_box().ymax()-gBuffer.bounding_box().ymin()) + + (gBuffer.bounding_box().zmax()-gBuffer.bounding_box().zmin())); const unsigned int nbSubdivisions=30; - auto& array = gBuffer.get_array_of_index(GS::POS_CLIPPING_PLANE); + auto& array = m_array_for_clipping_plane; array.clear(); for (unsigned int i=0; i<=nbSubdivisions; ++i) { @@ -1595,7 +1460,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer std::function *)> on_key_pressed; protected: - Graphics_scene& gBuffer; + const Graphics_scene& gBuffer; bool m_draw_vertices; bool m_draw_edges; @@ -1619,6 +1484,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer int m_use_clipping_plane=CLIPPING_PLANE_OFF; CGAL::qglviewer::ManipulatedFrame* m_frame_plane=nullptr; + // Buffer for clipping plane is not stored in the scene because it is not + // filled by users but by the basic viewer. + std::vector m_array_for_clipping_plane; + double m_size_points; double m_size_edges; double m_size_rays; @@ -1636,10 +1505,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer // CGAL::qglviewer::LocalConstraint constraint; CGAL::qglviewer::WorldConstraint constraint; - static const unsigned int NB_VBO_BUFFERS=(GS::END_POS-GS::BEGIN_POS)+ - (GS::END_COLOR-GS::BEGIN_COLOR)+2; // +2 for 2 vectors of normals + static const unsigned int NB_GL_BUFFERS=(GS::END_POS-GS::BEGIN_POS)+ + (GS::END_COLOR-GS::BEGIN_COLOR)+3; // +2 for normals (mono and color), +1 for clipping plane - QGLBuffer buffers[NB_VBO_BUFFERS]; + QGLBuffer buffers[NB_GL_BUFFERS]; // +1 for the vbo buffer of clipping plane // The following enum gives the indices of the different vao. enum @@ -1669,8 +1538,8 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; template -void draw_graphics_scene(Graphics_scene& graphics_scene, - const char *title="CGAL Basic Viewer") +void draw_graphics_scene(const Graphics_scene& graphics_scene, + const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; @@ -1698,7 +1567,7 @@ template class QApplication_and_basic_viewer { public: - QApplication_and_basic_viewer(CGAL::Graphics_scene& buffer, + QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"): m_application(nullptr), m_basic_viewer(nullptr), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 41ac6f489685..4039bb460fcf 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -53,7 +53,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphics_scene(*scene->lcc, gBuffer, m_gs_options); } + { CGAL::add_in_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); } if (doredraw) { Base::redraw(); } @@ -61,16 +61,16 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { - gBuffer.clear(); - CGAL::add_in_graphics_scene(*scene->lcc, gBuffer, m_gs_options); + m_graphic_buffer.clear(); + CGAL::add_in_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); this->camera()->setSceneBoundingBox( - CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmin(), - gBuffer.get_bounding_box().ymin(), - gBuffer.get_bounding_box().zmin()), - CGAL::qglviewer::Vec(gBuffer.get_bounding_box().xmax(), - gBuffer.get_bounding_box().ymax(), - gBuffer.get_bounding_box().zmax())); + CGAL::qglviewer::Vec(gBuffer.bounding_box().xmin(), + gBuffer.bounding_box().ymin(), + gBuffer.bounding_box().zmin()), + CGAL::qglviewer::Vec(gBuffer.bounding_box().xmax(), + gBuffer.bounding_box().ymax(), + gBuffer.bounding_box().zmax())); Base::redraw(); if (m_previous_scene_empty) { this->showEntireScene(); } From d8e190c9e9136924228bc84a5e6d34c8b777298d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 12:07:52 +0200 Subject: [PATCH 210/341] Basic viewer doc --- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 7 ++ .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 86 +------------------ 2 files changed, 10 insertions(+), 83 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index d92e4a497126..96d40e589991 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -82,6 +82,13 @@ class Graphics_scene { /// clears the scene, i.e., removes all points, segments, triangles, and text. void clear(); + + /// returns the bounding box of all the elements in the scene. + const CGAL::Bbox_3& bounding_box() const; + + /// returns `true` if the data structure in in 2D, i.e., lies on XY or XZ or YZ plane. + bool two_dimensional() const; + }; } // namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index 4529095e2542..d81fcab0d5c7 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -16,7 +16,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphics_scene`. /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, - Graphics_scene& scene, + const Graphics_scene& scene, const char* title=""); /// enables or disables the drawing of vertices. @@ -115,98 +115,18 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// returns the mono color used for faces. const CGAL::IO::Color& faces_mono_color() const; - /// clears the basic viewer, i.e., remove all its elements. - void clear(); - - /// returns `true` if the viewer is empty. - bool empty() const; - - /// returns the bounding box of all the elements in the viewer. - const CGAL::Bbox_3& bounding_box() const; - /// returns `true` if the clipping plane is enabled. bool clipping_plane_enabled() const; /// returns the clipping plane when it is enabled. CGAL::Exact_predicates_inexact_constructions_kernel::Plane_3 clipping_plane() const; - /// adds the given point in the viewer. - template - void add_point(const KPoint &p); - - /// adds the given colored point in the viewer. - template - void add_point(const KPoint &p, const CGAL::IO::Color &color); - - /// adds the given segment in the viewer. - template - void add_segment(const KPoint &p1, const KPoint &p2); - - /// adds the given colored segment in the viewer. - template - void add_segment(const KPoint &p1, const KPoint &p2, - const CGAL::IO::Color &color); - - /// adds the given ray in the viewer: a half line starting from `p` and having `v` as direction. - template - void add_ray(const KPoint &p, const KVector &v); - - /// adds the given colored ray in the viewer: an half line starting from `p` and having `v` as direction. - template - void add_ray(const KPoint &p, const KVector &v, - const CGAL::IO::Color &color); - - /// adds the given line in the viewer, defined by `p` and `v` as direction. - template - void add_line(const KPoint &p, const KVector &v); - - /// adds the given colored line in the viewer, defined by `p` and `v` as direction. - template - void add_line(const KPoint &p, const KVector &v, - const CGAL::IO::Color &color); - - /// starts a new face. - void face_begin(); - - /// starts a new colored face. - void face_begin(const CGAL::IO::Color &color); - - /// returns `true` iff a face is started. - bool a_face_started() const; - - /// adds the given point in the current face. - /// @pre `a_face_started()` - template bool add_point_in_face(const KPoint &kp); - - /// adds the given point in the current face, having the vertex normal. - /// @pre `a_face_started()` - template - bool add_point_in_face(const KPoint &kp, const KVector &p_normal); - - /// ends the current face. - /// @pre `a_face_started()` - void face_end(); - - /// adds the given text at the given position in the viewer. - template - void add_text(const KPoint &kp, const char *txt); - - /// adds the given text at the given position in the viewer. - template - void add_text(const KPoint &kp, const std::string &txt); - /// returns the graphics scene of the viewer. - Graphics_scene& graphics_scene(); - - /// returns the graphics scene of the viewer, const version. const Graphics_scene& graphics_scene() const; /// reverses all normals of vertices and faces. void reverse_all_normals(); - /// returns `true` if the data structure in in 2D, i.e., lies on a plane. - bool two_dimensional() const; - /// draws the viewer without recomputing all internal buffers. virtual void draw(); @@ -233,7 +153,7 @@ class QApplication_and_basic_viewer { public: /// Constructor given a `Graphics_scene` and possibly a title. - QApplication_and_basic_viewer(CGAL::Graphics_scene& buffer, + QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"); /// runs the `QApplication`, i.e., open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. @@ -248,7 +168,7 @@ class QApplication_and_basic_viewer opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. */ template -void draw_graphics_scene(Graphics_scene& graphic_buffer, +void draw_graphics_scene(const Graphics_scene& graphic_buffer, const char *title="CGAL Basic Viewer") {} From e1cd107698632cdd61c78b4a8963872fa0b575fc Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 12:10:01 +0200 Subject: [PATCH 211/341] typo --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 96d40e589991..f1b9636093b7 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -86,9 +86,8 @@ class Graphics_scene { /// returns the bounding box of all the elements in the scene. const CGAL::Bbox_3& bounding_box() const; - /// returns `true` if the data structure in in 2D, i.e., lies on XY or XZ or YZ plane. + /// returns `true` if the scene is in 2D, i.e., lies on XY or XZ or YZ plane. bool two_dimensional() const; - }; } // namespace CGAL From 0c8704f1efaea4fda3457a664109bc2017d8cab9 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 12:12:51 +0200 Subject: [PATCH 212/341] Basic viewer doc: variable name --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index d81fcab0d5c7..d1fab4746648 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -168,7 +168,7 @@ class QApplication_and_basic_viewer opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. */ template -void draw_graphics_scene(const Graphics_scene& graphic_buffer, +void draw_graphics_scene(const Graphics_scene& graphic_scene, const char *title="CGAL Basic Viewer") {} From 3fa4c703249d6c5478e23719419a33982c6889df Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 12:15:53 +0200 Subject: [PATCH 213/341] Basic viewer doc typo --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index f1b9636093b7..47056f7d79f5 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -86,7 +86,7 @@ class Graphics_scene { /// returns the bounding box of all the elements in the scene. const CGAL::Bbox_3& bounding_box() const; - /// returns `true` if the scene is in 2D, i.e., lies on XY or XZ or YZ plane. + /// returns `true` if the scene is in 2D, i.e., lies on the XY or XZ or YZ plane. bool two_dimensional() const; }; From 45d9708f0799a26a82073132799d2206cecdc20e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 14:53:26 +0200 Subject: [PATCH 214/341] Basic viewer names in doc --- .../doc/Basic_viewer/CGAL/Graphics_scene_options.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 27bb711ab496..1f142ee0b369 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -43,29 +43,29 @@ struct Graphics_scene_options /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_vertex; + std::function is_vertex_colored; /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_edge; + std::function is_edge_colored; /// `std::function` that returns `true` if the given face is colored, `false` otherwise. /// Returns `false` by default. - std::function colored_face; + std::function is_face_colored; /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. /// Returns `false` by default. /// Exists only if `VolumeDescriptor` is not `void`. - std::function colored_volume; + std::function is_volume_colored; /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. /// Returns `false` by default. - std::function face_wireframe; + std::function is_face_wireframe; /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. /// Returns `false` by default. /// Exists only if `VolumeDescriptor` is not `void`. - std::function volume_wireframe; + std::function is_volume_wireframe; /// `std::function` that returns the color of the given vertex. /// `nullptr` by default. From cf797a5d31afcf2e9f42bf0c17f8bf24e6c325f1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 20 Oct 2023 14:53:48 +0200 Subject: [PATCH 215/341] basic viewer does not have clear anymore --- .../examples/Basic_viewer/draw_surface_mesh_small_faces.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index d478d910c82a..10f85c6d85e7 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -116,7 +116,7 @@ int main(int argc, char* argv[]) basic_viewer->displayMessage (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); - basic_viewer->clear(); + buffer.clear(); add_in_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } @@ -127,7 +127,7 @@ int main(int argc, char* argv[]) basic_viewer->displayMessage (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); - basic_viewer->clear(); + buffer.clear(); add_in_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } From d74a3dbeacf29438d03635be1b4a32778f7e0d36 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Sun, 22 Oct 2023 17:12:21 +0200 Subject: [PATCH 216/341] Remove template parameter for graphics scene --- BGL/include/CGAL/draw_face_graph.h | 12 +++--- .../Basic_viewer/draw_mesh_and_points.cpp | 2 +- .../Basic_viewer/draw_several_windows.cpp | 2 +- .../draw_surface_mesh_small_faces.cpp | 4 +- Basic_viewer/include/CGAL/Buffer_for_vao.h | 3 +- Basic_viewer/include/CGAL/Graphics_scene.h | 43 ++++++++++--------- .../include/CGAL/Qt/Basic_viewer_qt.h | 30 ++++++------- Point_set_3/include/CGAL/draw_point_set_3.h | 16 +++---- Polyhedron/include/CGAL/draw_polyhedron.h | 16 +++---- Surface_mesh/include/CGAL/draw_surface_mesh.h | 18 ++++---- .../include/CGAL/draw_triangulation_2.h | 9 ++-- 11 files changed, 77 insertions(+), 78 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 4172b25fcb71..20f4cf12899f 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -24,9 +24,9 @@ namespace CGAL { namespace draw_function_for_FG { -template +template void compute_elements(const FG &fg, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &m_gs_options) { using Point=typename boost::property_map_value::type; @@ -118,17 +118,17 @@ void compute_elements(const FG &fg, } // draw_function_for_FG -template +template void add_in_graphics_scene_for_fg(const FG &fg, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { draw_function_for_FG::compute_elements(fg, graphics_scene, gs_options); } -template +template void add_in_graphics_scene_for_fg(const FG &fg, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { Graphics_scene_options::vertex_descriptor, diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 9704e39bc78c..e378696c071f 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -54,7 +54,7 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphics_scene graphic_buffer; + CGAL::Graphics_scene graphic_buffer; CGAL::add_in_graphics_scene(point_set, graphic_buffer, Graphics_scene_options_green_points()); CGAL::add_in_graphics_scene(output_mesh, graphic_buffer); CGAL::draw_graphics_scene(graphic_buffer); diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 0db6619d3194..a84472e51838 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -47,7 +47,7 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; + CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; CGAL::add_in_graphics_scene(point_set, graphic_buffer1); CGAL::add_in_graphics_scene(output_mesh, graphic_buffer2); diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 10f85c6d85e7..2bc04da399be 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -99,14 +99,14 @@ int main(int argc, char* argv[]) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } Graphics_scene_options_small_faces gsosm(sm); - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(sm, buffer, gsosm); CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { app.basic_viewer().on_key_pressed= - [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) diff --git a/Basic_viewer/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h index 7b44bbc7b6b3..3209ec93b0a1 100644 --- a/Basic_viewer/include/CGAL/Buffer_for_vao.h +++ b/Basic_viewer/include/CGAL/Buffer_for_vao.h @@ -128,10 +128,11 @@ namespace internal } // End namespace internal //------------------------------------------------------------------------------ -template class Buffer_for_vao { public: + using BufferType=float; + using IndexType=std::size_t; typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index 47feac4dab7e..5c8101b1fadf 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -55,10 +55,11 @@ inline CGAL::IO::Color get_random_color(CGAL::Random& random) //------------------------------------------------------------------------------ // This class is responsible for dealing with available CGAL data structures and // handling buffers. -template class Graphics_scene { public: + using BufferType=float; + typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; @@ -93,34 +94,34 @@ class Graphics_scene &arrays[SMOOTH_NORMAL_COLORED_FACES]) {} - const Buffer_for_vao &get_buffer_for_mono_points() const + const Buffer_for_vao &get_buffer_for_mono_points() const { return m_buffer_for_mono_points; } - const Buffer_for_vao &get_buffer_for_colored_points() const + const Buffer_for_vao &get_buffer_for_colored_points() const { return m_buffer_for_colored_points; } - const Buffer_for_vao &get_buffer_for_mono_segments() const + const Buffer_for_vao &get_buffer_for_mono_segments() const { return m_buffer_for_mono_segments; } - const Buffer_for_vao &get_buffer_for_colored_segments() const + const Buffer_for_vao &get_buffer_for_colored_segments() const { return m_buffer_for_colored_segments; } - const Buffer_for_vao &get_buffer_for_mono_rays() const + const Buffer_for_vao &get_buffer_for_mono_rays() const { return m_buffer_for_mono_rays; } - const Buffer_for_vao &get_buffer_for_colored_rays() const + const Buffer_for_vao &get_buffer_for_colored_rays() const { return m_buffer_for_colored_rays; } - const Buffer_for_vao &get_buffer_for_mono_lines() const + const Buffer_for_vao &get_buffer_for_mono_lines() const { return m_buffer_for_mono_lines; } - const Buffer_for_vao &get_buffer_for_colored_lines() const + const Buffer_for_vao &get_buffer_for_colored_lines() const { return m_buffer_for_colored_lines; } - const Buffer_for_vao &get_buffer_for_mono_faces() const + const Buffer_for_vao &get_buffer_for_mono_faces() const { return m_buffer_for_mono_faces; } - const Buffer_for_vao &get_buffer_for_colored_faces() const + const Buffer_for_vao &get_buffer_for_colored_faces() const { return m_buffer_for_colored_faces; } const CGAL::Bbox_3 &bounding_box() const { return m_bounding_box; } @@ -416,16 +417,16 @@ class Graphics_scene }; protected: - Buffer_for_vao m_buffer_for_mono_points; - Buffer_for_vao m_buffer_for_colored_points; - Buffer_for_vao m_buffer_for_mono_segments; - Buffer_for_vao m_buffer_for_colored_segments; - Buffer_for_vao m_buffer_for_mono_rays; - Buffer_for_vao m_buffer_for_colored_rays; - Buffer_for_vao m_buffer_for_mono_lines; - Buffer_for_vao m_buffer_for_colored_lines; - Buffer_for_vao m_buffer_for_mono_faces; - Buffer_for_vao m_buffer_for_colored_faces; + Buffer_for_vao m_buffer_for_mono_points; + Buffer_for_vao m_buffer_for_colored_points; + Buffer_for_vao m_buffer_for_mono_segments; + Buffer_for_vao m_buffer_for_colored_segments; + Buffer_for_vao m_buffer_for_mono_rays; + Buffer_for_vao m_buffer_for_colored_rays; + Buffer_for_vao m_buffer_for_mono_lines; + Buffer_for_vao m_buffer_for_colored_lines; + Buffer_for_vao m_buffer_for_mono_faces; + Buffer_for_vao m_buffer_for_colored_faces; std::vector> m_texts; diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h index 738a99a25c06..0d107922a75c 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h @@ -61,18 +61,18 @@ namespace CGAL { //------------------------------------------------------------------------------ -template class Basic_viewer_qt : public CGAL::QGLViewer { public: + using BufferType=float; typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; - using GS=Graphics_scene; + using GS=Graphics_scene; // Constructor/Destructor Basic_viewer_qt(QWidget* parent, - const Graphics_scene& buf, + const Graphics_scene& buf, const char* title="", bool draw_vertices=false, bool draw_edges=true, @@ -248,7 +248,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer bool is_clipping_plane_enabled() const { return (m_use_clipping_plane!=CLIPPING_PLANE_OFF); } - const Graphics_scene& get_graphics_scene() const + const Graphics_scene& get_graphics_scene() const { return gBuffer; } virtual void redraw() @@ -1457,10 +1457,10 @@ class Basic_viewer_qt : public CGAL::QGLViewer return text; } public: - std::function *)> on_key_pressed; + std::function on_key_pressed; protected: - const Graphics_scene& gBuffer; + const Graphics_scene& gBuffer; bool m_draw_vertices; bool m_draw_edges; @@ -1537,8 +1537,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer }; -template -void draw_graphics_scene(const Graphics_scene& graphics_scene, +void draw_graphics_scene(const Graphics_scene& graphics_scene, const char *title="CGAL Basic Viewer") { #if defined(CGAL_TEST_SUITE) @@ -1554,8 +1553,8 @@ void draw_graphics_scene(const Graphics_scene& graphics_scene, int argc = 1; const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - Basic_viewer_qt basic_viewer(app.activeWindow(), - graphics_scene, title); + Basic_viewer_qt basic_viewer(app.activeWindow(), + graphics_scene, title); basic_viewer.show(); app.exec(); @@ -1563,11 +1562,10 @@ void draw_graphics_scene(const Graphics_scene& graphics_scene, } //------------------------------------------------------------------------------ -template class QApplication_and_basic_viewer { public: - QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, + QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"): m_application(nullptr), m_basic_viewer(nullptr), @@ -1588,8 +1586,8 @@ class QApplication_and_basic_viewer Qt::init_ogl_context(4, 3); m_application=new QApplication(m_argc, const_cast(m_argv)); - m_basic_viewer=new Basic_viewer_qt(m_application->activeWindow(), - buffer, title); + m_basic_viewer=new Basic_viewer_qt(m_application->activeWindow(), + buffer, title); } ~QApplication_and_basic_viewer() @@ -1611,7 +1609,7 @@ class QApplication_and_basic_viewer } } - Basic_viewer_qt& basic_viewer() + Basic_viewer_qt& basic_viewer() { CGAL_assertion(m_basic_viewer!=nullptr); return *m_basic_viewer; @@ -1619,7 +1617,7 @@ class QApplication_and_basic_viewer protected: QApplication* m_application; - Basic_viewer_qt* m_basic_viewer; + Basic_viewer_qt* m_basic_viewer; char *m_argv[2]; int m_argc; }; diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 72365c6e40c5..c1f9ccbcca61 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -42,9 +42,9 @@ namespace CGAL { namespace draw_function_for_PointSet { -template +template void compute_elements(const PointSet& pointset, - Graphics_scene& graphics_scene, + Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_vertices_enabled()) @@ -68,9 +68,9 @@ void compute_elements(const PointSet& pointset, } // namespace draw_function_for_PointSet -template +template void add_in_graphics_scene(const Point_set_3& apointset, - Graphics_scene& graphics_scene, + Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_PointSet::compute_elements(apointset, @@ -78,9 +78,9 @@ void add_in_graphics_scene(const Point_set_3& apointset, gs_options); } -template +template void add_in_graphics_scene(const Point_set_3& apointset, - Graphics_scene& graphics_scene) + Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options, typename Point_set_3::const_iterator, @@ -96,7 +96,7 @@ void draw(const Point_set_3& apointset, const GSOptions& gs_options, const char *title="Point_set_3 Basic Viewer") { - Graphics_scene buffer; + Graphics_scene buffer; add_in_graphics_scene(apointset, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -105,7 +105,7 @@ template void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { - Graphics_scene buffer; + Graphics_scene buffer; add_in_graphics_scene(apointset, buffer); draw_graphics_scene(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 5694e9a0b50d..5043f0d7ef7b 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -32,10 +32,9 @@ template class T_HDS, class Alloc, - typename BufferType=float, class GSOptions> void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { add_in_graphics_scene_for_fg(apoly, graphics_scene, gs_options); } @@ -43,10 +42,9 @@ template class T_HDS, - class Alloc, - typename BufferType=float> + class Alloc> void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { add_in_graphics_scene_for_fg(apoly, graphics_scene); } // Specialization of draw function: require Qt and the CGAL basic viewer. @@ -56,12 +54,11 @@ template class T_HDS, - class Alloc, - typename BufferType=float> + class Alloc> void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene_for_fg(apoly, buffer); draw_graphics_scene(buffer, title); } @@ -71,13 +68,12 @@ template class T_HDS, class Alloc, - typename BufferType=float, class GSOptions> void draw(const CGAL_POLY_TYPE& apoly, const GSOptions &gs_options, const char* title="Polyhedron Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene_for_fg(apoly, buffer, gs_options); draw_graphics_scene(buffer, title); } diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index e7180663c98d..af41ce4abcf2 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -94,36 +94,36 @@ struct Graphics_scene_options_surface_mesh typename SM::template Property_map fcolors; }; -template +template void add_in_graphics_scene(const Surface_mesh& amesh, - CGAL::Graphics_scene &graphics_scene, - const GSOptions &gs_options) + CGAL::Graphics_scene &graphics_scene, + const GSOptions &gs_options) { add_in_graphics_scene_for_fg(amesh, graphics_scene, gs_options); } -template +template void add_in_graphics_scene(const Surface_mesh& amesh, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { add_in_graphics_scene_for_fg(amesh, graphics_scene, Graphics_scene_options_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template +template void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(amesh, buffer); draw_graphics_scene(buffer, title); } -template +template void draw(const Surface_mesh& amesh, const GSOptions &gs_options, const char* title="Surface_mesh Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(amesh, buffer, gs_options); draw_graphics_scene(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index c214b01ab0d2..6865cc54f436 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -117,10 +117,13 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 -template +template void add_in_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options) + CGAL::Graphics_scene& graphics_scene, + const CGAL::Graphics_scene_options& & gs_options) { draw_function_for_t2::compute_elements(at2, graphics_scene, gs_options); } From c9d93bac3b87eb444ac2713bdf59a6b65b2af01a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Sun, 22 Oct 2023 17:14:18 +0200 Subject: [PATCH 217/341] Add GraphicsSceneOptions concept; use it to document draw(T2); waiting @Laurent remarks... --- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 3 - .../CGAL/Graphics_scene_options.h | 75 +---------- .../Basic_viewer/CGAL/Qt/Basic_viewer_qt.h | 19 +-- .../Concepts/GraphicsSceneOptions.h | 124 ++++++++++++++++++ .../doc/Basic_viewer/PackageDescription.txt | 7 + .../CGAL/draw_triangulation_2.h | 33 +++-- 6 files changed, 155 insertions(+), 106 deletions(-) create mode 100644 Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 47056f7d79f5..5bc9d40f5a29 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -6,10 +6,7 @@ namespace CGAL { The class `Graphics_scene` stores points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. -\tparam BufferType the number type used for point coordinates: `float` by default. - */ -template class Graphics_scene { public: /// adds the given point in the scene. diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 1f142ee0b369..5461da7ecb47 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -8,12 +8,15 @@ The class `Graphics_scene_options` is used to tune the way that the cells of a g The different `std::function` can be modified to change for example the behavior of the drawing. `VolumeDescriptor` can be `void` for data structures that do not represent volumes. In such a case, all methods about volumes do not exist. +This class is a model of `GraphicsSceneOptions` when `VolumeDescriptor` is `void`, or a model of `GraphicsSceneOptionsWithVolumes` otherwise (`VolumeDescriptor` non `void`). + \tparam DS a data structure of \cgal. \tparam VertexDescriptor a descriptor of vertices of `DS`. \tparam EdgeDescriptor a descriptor of edges of `DS`. \tparam FaceDescriptor a descriptor of faces of `DS`. \tparam VolumeDescriptor a descriptor of volumes of `DS`. `void` by default. +\cgalModels{GraphicsSceneOptions or GraphicsSceneOptionsWithVolumes} */ template ignore_vertex; - - /// `std::function` that returns `true` if the given edge must be ignored, `false` otherwise. - /// Returns `true` by default. - std::function ignore_edge; - - /// `std::function` that returns `true` if the given face must be ignored, `false` otherwise. - /// Returns `true` by default. - std::function ignore_face; - - /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. - /// Exists only if `VolumeDescriptor` is not `void`. - /// Returns `false` by default. - std::function ignore_volume; - - /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. - /// Returns `false` by default. - std::function is_vertex_colored; - - /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. - /// Returns `false` by default. - std::function is_edge_colored; - - /// `std::function` that returns `true` if the given face is colored, `false` otherwise. - /// Returns `false` by default. - std::function is_face_colored; - - /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. - /// Returns `false` by default. - /// Exists only if `VolumeDescriptor` is not `void`. - std::function is_volume_colored; - - /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. - /// Returns `false` by default. - std::function is_face_wireframe; - - /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. - /// Returns `false` by default. - /// Exists only if `VolumeDescriptor` is not `void`. - std::function is_volume_wireframe; - - /// `std::function` that returns the color of the given vertex. - /// `nullptr` by default. - std::function vertex_color; - - /// `std::function` that returns the color of the given edge. - /// `nullptr` by default. - std::function edge_color; - - /// `std::function` that returns the color of the given face. - /// `nullptr` by default. - std::function face_color; - - /// `std::function` that returns the color of the given volume. - /// `nullptr` by default. - /// Exists only if `VolumeDescriptor` is not `void`. - std::function volume_color; - - /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex()` returns `true`. - void ignore_all_vertices(bool b); - - /// ignores all edges when `b` is `true`; otherwise ignores only edges for which `ignore_edge()` returns `true`. - void ignore_all_edges(bool b); - - /// ignores all faces when `b` is `true`; otherwise ignores only faces for which `ignore_face()` returns `true`. - void ignore_all_faces(bool b); - - /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume()` returns `true`. - /// Exists only if `VolumeDescriptor` is not `void`. - void ignore_all_volumes(bool b); }; } // End namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h index d1fab4746648..d33a29c49ce2 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h @@ -6,17 +6,14 @@ namespace CGAL { The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam BufferType the number type used for point coordinates: `float` by default. - */ -template class Basic_viewer_qt : public CGAL::QGLViewer { public: /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphics_scene`. /// `title` will be the title of the window. Basic_viewer_qt(QWidget* parent, - const Graphics_scene& scene, + const Graphics_scene& scene, const char* title=""); /// enables or disables the drawing of vertices. @@ -122,7 +119,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer CGAL::Exact_predicates_inexact_constructions_kernel::Plane_3 clipping_plane() const; /// returns the graphics scene of the viewer. - const Graphics_scene& graphics_scene() const; + const Graphics_scene& graphics_scene() const; /// reverses all normals of vertices and faces. void reverse_all_normals(); @@ -135,7 +132,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// Function called when a key is pressed. Users can define their own function in order /// to add specific behavior. - std::function *)> on_key_pressed; + std::function on_key_pressed; }; @@ -145,30 +142,26 @@ class Basic_viewer_qt : public CGAL::QGLViewer The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam BufferType the number type used for point coordinates: `float` by default. - */ -template class QApplication_and_basic_viewer { public: /// Constructor given a `Graphics_scene` and possibly a title. - QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, + QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, const char* title="CGAL Basic Viewer"); /// runs the `QApplication`, i.e., open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); /// returns a reference to the `Basic_viewer_qt` associated with this. - Basic_viewer_qt& basic_viewer(); + Basic_viewer_qt& basic_viewer(); }; //------------------------------------------------------------------------------ /*! opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. */ -template -void draw_graphics_scene(const Graphics_scene& graphic_scene, +void draw_graphics_scene(const Graphics_scene& graphic_scene, const char *title="CGAL Basic Viewer") {} diff --git a/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h new file mode 100644 index 000000000000..edca770142ea --- /dev/null +++ b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h @@ -0,0 +1,124 @@ +/*! +\ingroup PkgBasicViewerConcepts + +The concept `GraphicsSceneOptions` defines data and methods used to tune the way that the cells of a given data structure of \cgal are considered for drawing or to be added into a graphics scene. +The different `std::function` can be modified to change for example the behavior of the drawing. + +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Graphics_scene_options `CGAL::Graphics_scene_options`\endlink} +\cgalHasModelsEnd + +*/ +class GraphicsSceneOptions +{ +public: + /*! + A data structure of \cgal. + */ + typedef unspecified_type DS; + + /*! + A descriptor of vertices of `DS` + */ + typedef unspecified_type VertexDescriptor; + + /*! + A descriptor of edges of `DS` + */ + typedef unspecified_type EdgeDescriptor; + + /*! + A descriptor of faces of `DS` + */ + typedef unspecified_type FaceDescriptor; + + /// `std::function` that returns `true` if the given vertex must be ignored, `false` otherwise. + /// Returns `false` by default. + std::function ignore_vertex; + + /// `std::function` that returns `true` if the given edge must be ignored, `false` otherwise. + /// Returns `true` by default. + std::function ignore_edge; + + /// `std::function` that returns `true` if the given face must be ignored, `false` otherwise. + /// Returns `true` by default. + std::function ignore_face; + + /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. + /// Returns `false` by default. + std::function is_vertex_colored; + + /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. + /// Returns `false` by default. + std::function is_edge_colored; + + /// `std::function` that returns `true` if the given face is colored, `false` otherwise. + /// Returns `false` by default. + std::function is_face_colored; + + /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. + /// Returns `false` by default. + std::function is_face_wireframe; + + /// `std::function` that returns the color of the given vertex. + /// `nullptr` by default. + std::function vertex_color; + + /// `std::function` that returns the color of the given edge. + /// `nullptr` by default. + std::function edge_color; + + /// `std::function` that returns the color of the given face. + /// `nullptr` by default. + std::function face_color; + + /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex()` returns `true`. + void ignore_all_vertices(bool b); + + /// ignores all edges when `b` is `true`; otherwise ignores only edges for which `ignore_edge()` returns `true`. + void ignore_all_edges(bool b); + + /// ignores all faces when `b` is `true`; otherwise ignores only faces for which `ignore_face()` returns `true`. + void ignore_all_faces(bool b); +}; + +/*! +\ingroup PkgBasicViewerConcepts +\cgalConcept + +The concept `GraphicsSceneOptionsWithVolumes` extends the concept `GraphicsSceneOptions` to deal with data structures that represent volumes. + +\cgalRefines{GraphicsSceneOptions} + +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Graphics_scene_options `CGAL::Graphics_scene_options`\endlink} +\cgalHasModelsEnd + +*/ +class GraphicsSceneOptionsWithVolumes +{ +public: + /*! + %A descriptor of volumes of `DS`. + */ + typedef unspecified_type VolumeDescriptor; + + /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. + /// Returns `false` by default. + std::function ignore_volume; + + /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. + /// Returns `false` by default. + std::function is_volume_colored; + + /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. + /// Returns `false` by default. + std::function is_volume_wireframe; + + /// `std::function` that returns the color of the given volume. + /// `nullptr` by default. + std::function volume_color; + + /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume()` returns `true`. + void ignore_all_volumes(bool b); +}; diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index a6dae494221b..500c9f32dfbf 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -1,5 +1,8 @@ /// \defgroup PkgBasicViewerRef Basic Viewer Reference +/// \defgroup PkgBasicViewerConcepts Concepts +/// \ingroup PkgBasicViewerRef + /// \defgroup PkgBasicViewerClasses Classes /// \ingroup PkgBasicViewerRef @@ -21,6 +24,10 @@ \cgalClassifedRefPages +\cgalCRPSection{Concepts} +- `GraphicsSceneOptions` +- `GraphicsSceneOptionsWithVolumes` + \cgalCRPSection{Classes} - `CGAL::Graphics_scene_options` - `CGAL::Graphics_scene` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index fb5b68ce026c..cc14573bfbb2 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -9,37 +9,34 @@ A call to this function blocks the execution of the program until the drawing wi Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam T2 a triangulation class derived from `Triangulation_2` +\tparam Gt +\tparam Tds +\tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. + \param at2 the triangulation to draw. -\param gso the graphics scene options parameter, `Graphics_scene_options()` by default. +\param gso the graphics scene options parameter, `GSOptions()` by default. */ -template -void draw(const T2& at2, - const CGAL::Graphics_scene_options& gso=default); + template + void draw(const CGAL::Triangulation_2& at2, + const GSOptions& gso={}); /*! \ingroup PkgDrawTriangulation2 adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). -\tparam T2 a triangulation class derived from `Triangulation_2` -\tparam BufferType the number type used for point coordinates: `float` by default. +\tparam Gt +\tparam Tds +\tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. \param at2 the triangulation to draw. \param gs the graphic scene to fill. -\param gso the graphics scene options parameter, `Graphics_scene_options()` by default. - +\param gso the graphics scene options parameter, `GSOptions()` by default. */ -template -void add_to_graphics_scene(const T2& at2, +template +void add_to_graphics_scene(const CGAL::Triangulation_2& at2, CGAL::Graphics_scene& gs, - const CGAL::Graphics_scene_options& gso=default); + const GSOptions& gso={}); } /* namespace CGAL */ From 6daa2a0c3be5bb4800b688f200e3fc42bab1b5a8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 01:30:57 +0200 Subject: [PATCH 218/341] Graphics_scene is no more templated --- .../include/CGAL/draw_arrangement_2.h | 2 +- .../include/CGAL/draw_polygon_set_2.h | 8 +++---- .../CGAL/draw_linear_cell_complex.h | 2 +- .../include/CGAL/draw_linear_cell_complex.h | 16 +++++++------- Nef_3/include/CGAL/draw_nef_3.h | 14 ++++++------ .../CGAL/draw_periodic_2_triangulation_2.h | 18 +++++++-------- Polygon/include/CGAL/draw_polygon_2.h | 10 ++++----- .../include/CGAL/draw_polygon_with_holes_2.h | 12 +++++----- .../include/CGAL/draw_straight_skeleton_2.h | 18 +++++++-------- .../include/CGAL/draw_face_graph_with_paths.h | 22 +++++++++---------- .../CGAL/draw_triangulation_2.h | 2 +- .../CGAL/draw_constrained_triangulation_2.h | 6 ++--- .../include/CGAL/draw_triangulation_2.h | 16 +++++++------- .../include/CGAL/draw_triangulation_3.h | 16 +++++++------- .../include/CGAL/draw_voronoi_diagram_2.h | 20 ++++++++--------- 15 files changed, 91 insertions(+), 91 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index ef3fcbcf9995..86edc7fa9e02 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -626,7 +626,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { Color_generator m_color_generator; std::unordered_map m_visited; - CGAL::Graphics_scene m_graphics_scene; + CGAL::Graphics_scene m_graphics_scene; }; //! Basic viewer of a 2D arrangement. diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 6b0a117217f8..dae70337aea6 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -48,7 +48,7 @@ namespace draw_function_for_boolean_set_2 { template void compute_loop(const typename PS2::Polygon_2& p, bool hole, - CGAL::Graphics_scene& gs, + CGAL::Graphics_scene& gs, const GSOptions& gso) { if (hole) @@ -73,7 +73,7 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, /// Compute the elements of a polygon with holes. template void compute_elements(const PWH& pwh, - CGAL::Graphics_scene& gs, + CGAL::Graphics_scene& gs, const GSOptions& gso) { if (!gso.draw_unbounded() && pwh.outer_boundary().is_empty()) return; @@ -123,7 +123,7 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt public: Polygon_set_2_basic_viewer_qt(QWidget* parent, const Ps& ps, - Graphics_scene& gs, + Graphics_scene& gs, GSOptions& gs_options, const char* title = "Basic Polygon_set_2 Viewer", bool draw_unbounded = false, @@ -226,7 +226,7 @@ void draw(const CGAL::Polygon_set_2& ps, int argc = 1; const char* argv[2] = {"t2_viewer", nullptr}; QApplication app(argc, const_cast(argv)); - Graphics_scene gs; + Graphics_scene gs; Graphics_scene_options gs; Viewer basic_viewer(app.activeWindow(), ps, gs, gso, title, draw_unbounded, draw_vertices); diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 38a33ace8013..f42aa4256d0e 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -30,7 +30,7 @@ Add in the given graphics scene the elements of alcc. */ template - void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, + void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options=GSOptions()); } /* namespace CGAL */ diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index a288dc68b5c7..b80d10549b8a 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -61,7 +61,7 @@ template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptionsLCC& gs_options) { if (!gs_options.are_faces_enabled() || @@ -105,7 +105,7 @@ void compute_face(const LCC& lcc, template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled() || @@ -129,7 +129,7 @@ void compute_edge(const LCC& lcc, template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptionsLCC& gs_options) { if (!gs_options.are_vertices_enabled() || @@ -147,7 +147,7 @@ void compute_vertex(const LCC& lcc, template void compute_elements(const LCC& lcc, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typename LCC::size_type markvolumes = lcc.get_new_mark(); @@ -240,7 +240,7 @@ template void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_lcc::compute_elements(static_cast(alcc), @@ -254,7 +254,7 @@ template class Map, class Refs, class Storage_, typename BufferType=float> void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(alcc, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -300,7 +300,7 @@ template void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(alcc, buffer); draw_graphics_scene(buffer, title); } diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 594f48b4d4d9..e05a94081a35 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -95,7 +95,7 @@ class Nef_Visitor { public: Nef_Visitor(const Nef_Polyhedron&_nef, - CGAL::Graphics_scene& _graphics_scene, + CGAL::Graphics_scene& _graphics_scene, const GSOptions&_gs_options) : n_faces(0), n_edges(0), nef(_nef), @@ -207,14 +207,14 @@ class Nef_Visitor { protected: std::unordered_map facets_done; std::unordered_map edges_done; - CGAL::Graphics_scene& graphics_scene; + CGAL::Graphics_scene& graphics_scene; const GSOptions& gs_options; const Nef_Polyhedron& nef; }; template void compute_elements(const Nef_Polyhedron &nef, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { @@ -243,7 +243,7 @@ void compute_elements(const Nef_Polyhedron &nef, template void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { draw_function_for_nef_polyhedron::compute_elements(anef, @@ -254,7 +254,7 @@ void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, template void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { // Default graphics view options. Graphics_scene_options buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(anef, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -299,7 +299,7 @@ template buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(anef, buffer); draw_graphics_scene(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 756ecdd24ba0..381031c47b71 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -69,7 +69,7 @@ namespace draw_function_for_P2T2 template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // Construct the point in 9-sheeted covering space and add to viewer @@ -86,7 +86,7 @@ void compute_vertex(const P2T2 &p2t2, template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_edge(p2t2, si)) @@ -104,7 +104,7 @@ void compute_edge(const P2T2 &p2t2, template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_face(p2t2, ti)) @@ -126,7 +126,7 @@ void compute_face(const P2T2 &p2t2, template void compute_domain(const P2T2& p2t2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -155,7 +155,7 @@ void compute_domain(const P2T2& p2t2, template void compute_elements(const P2T2& p2t2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // Get the display type, iterate through periodic elements according @@ -198,7 +198,7 @@ void compute_elements(const P2T2& p2t2, template void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_P2T2::compute_elements(p2t2, graphics_scene, gs_options); @@ -206,7 +206,7 @@ void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, template void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options_periodic_2_triangulation_2 buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ap2t2, buffer, gs_options); draw_graphics_scene(buffer); } @@ -234,7 +234,7 @@ template void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; CGAL::Graphics_scene_options_periodic_2_triangulation_2 void compute_elements(const P2& p2, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) { if (p2.is_empty()) @@ -103,13 +103,13 @@ void compute_elements(const P2& p2, template void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); } template void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { CGAL::Graphics_scene_options void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ap2, buffer); draw_graphics_scene(buffer, title); } @@ -136,7 +136,7 @@ void draw(const CGAL_P2_TYPE &ap2, const GSOptions& gs_options, const char *title="Polygon_2 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ap2, buffer, gs_options); draw_graphics_scene(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 9889a0639547..75faaf8c6c79 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -55,7 +55,7 @@ namespace draw_function_for_ph2_with_holes { template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, - Graphics_scene &graphics_scene, + Graphics_scene &graphics_scene, bool hole, const GSOptions& gs_options) { @@ -98,7 +98,7 @@ void compute_one_loop_elements(const P2& ap2, } template -void compute_elements(const P2& p2, Graphics_scene &graphics_scene, +void compute_elements(const P2& p2, Graphics_scene &graphics_scene, const GSOptions& gs_options) { if (p2.outer_boundary().is_empty()) return; @@ -134,7 +134,7 @@ void compute_elements(const P2& p2, Graphics_scene &graphics_scene, template void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions &gs_options) { draw_function_for_ph2_with_holes::compute_elements(p2, graphics_scene, @@ -143,7 +143,7 @@ void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, template void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const GSOptions &gs_options, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ap2, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -169,7 +169,7 @@ template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ap2, buffer); draw_graphics_scene(buffer, title); } diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 4be05c54ba9f..104a4fa52cb7 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -26,7 +26,7 @@ namespace draw_function_for_ss2 { template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_edge(ss2, eh)) @@ -48,7 +48,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // TODO? an option different from draw_edge to allow to show only some labels ?? @@ -67,7 +67,7 @@ void print_halfedge_labels(const SS2& ss2, template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_vertex(ss2, vh)) @@ -84,7 +84,7 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { // TODO? an option different from draw_vertex to allow to show only some labels ?? @@ -98,7 +98,7 @@ void print_vertex_label(const SS2& ss2, template void compute_elements(const SS2& ss2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.are_edges_enabled()) @@ -131,7 +131,7 @@ void compute_elements(const SS2& ss2, template void add_in_graphics_scene(const CGAL_SS_TYPE &ass2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_ss2::compute_elements(ass2, graphics_scene, @@ -140,7 +140,7 @@ void add_in_graphics_scene(const CGAL_SS_TYPE &ass2, template void add_in_graphics_scene(const CGAL_SS_TYPE& ass2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options void draw(const CGAL_SS_TYPE &ass2, const GSOptions &gs_options, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ass2, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -195,7 +195,7 @@ template void draw(const CGAL_SS_TYPE &ass2, const char *title="Straight Skeleton Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(ass2, buffer); draw_graphics_scene(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 76135c4e682a..d354ab745319 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -145,7 +145,7 @@ template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { if(!gs_options.draw_face(lcc, dh)) @@ -193,7 +193,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type m_amark, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options, bool draw_marked_darts=true) { @@ -224,7 +224,7 @@ void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; @@ -241,7 +241,7 @@ void compute_edge(const Mesh &mesh, template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { typedef typename CGAL::Get_traits::Kernel Kernel; @@ -253,7 +253,7 @@ void compute_vertex(const Mesh &mesh, template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const std::vector>* m_paths, std::size_t i, typename Get_map::type::size_type amark) @@ -282,7 +282,7 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions &m_gs_options, const std::vector>* m_paths, typename Get_map::type::size_type amark) @@ -371,7 +371,7 @@ void compute_elements(const Mesh &mesh, template void add_in_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, const GSOptions& gs_options, typename Get_map::type::size_type amark= @@ -385,7 +385,7 @@ void add_in_graphics_scene(const Mesh& mesh, template void add_in_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) @@ -409,7 +409,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(mesh, buffer, &paths, amark); draw_graphics_scene(buffer, title); } @@ -422,7 +422,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(mesh, buffer, gs_options, &paths, amark); draw_graphics_scene(buffer, title); } @@ -435,7 +435,7 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { std::vector> paths=l; - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(mesh, buffer, &paths, amark); draw_graphics_scene(buffer, title); } diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index cc14573bfbb2..e46d9faebae1 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -36,7 +36,7 @@ adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. P */ template void add_to_graphics_scene(const CGAL::Triangulation_2& at2, - CGAL::Graphics_scene& gs, + CGAL::Graphics_scene& gs, const GSOptions& gso={}); } /* namespace CGAL */ diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index eb7b4e8d72f1..99e6aee57278 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -28,7 +28,7 @@ namespace CGAL template void add_in_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { using BASET2=CGAL::Triangulation_2; @@ -59,7 +59,7 @@ void add_in_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, template void add_in_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { internal::In_domain in_domain; add_in_graphics_scene(at2, in_domain, graphics_scene); @@ -69,7 +69,7 @@ template void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, const char *title="Constrained Triangulation_2 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(at2, ipm, buffer); draw_graphics_scene(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 6865cc54f436..747c2348e1fb 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -27,7 +27,7 @@ namespace draw_function_for_t2 { template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_face(t2, fh)) @@ -47,7 +47,7 @@ void compute_face(const T2& t2, template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_edge(t2, eh)) @@ -70,7 +70,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (!gs_options.draw_vertex(t2, vh)) @@ -88,7 +88,7 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, template void compute_elements(const T2& t2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) @@ -119,7 +119,7 @@ void compute_elements(const T2& t2, template void add_in_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const CGAL::Graphics_scene_options void add_in_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options void draw(const CGAL_T2_TYPE &at2, const GSOptions &gs_options, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(at2, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -168,7 +168,7 @@ template void draw(const CGAL_T2_TYPE& at2, const char *title="Triangulation_2 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(at2, buffer); draw_graphics_scene(buffer, title); } diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 7d59f696eb8e..22819f1c235a 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -28,7 +28,7 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, const GSOptions& gs_options, - CGAL::Graphics_scene& graphics_scene, const T3 *t3) + CGAL::Graphics_scene& graphics_scene, const T3 *t3) { if(!gs_options.draw_face(*t3, fh)) { return; } @@ -50,7 +50,7 @@ void compute_face(typename T3::Finite_facets_iterator fh, template void compute_edge(typename T3::Finite_edges_iterator eh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_edge(*t3, eh)) @@ -70,7 +70,7 @@ void compute_edge(typename T3::Finite_edges_iterator eh, template void compute_vertex(typename T3::Vertex_handle vh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) { if(!gs_options.draw_vertex(*t3, vh)) @@ -86,7 +86,7 @@ void compute_vertex(typename T3::Vertex_handle vh, template void compute_elements(const T3* t3, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if (gs_options.are_faces_enabled()) @@ -118,7 +118,7 @@ void compute_elements(const T3* t3, template void add_in_graphics_scene(const CGAL_T3_TYPE& at3, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_t3::compute_elements(&at3, graphics_scene, gs_options); @@ -127,7 +127,7 @@ void add_in_graphics_scene(const CGAL_T3_TYPE& at3, template void add_in_graphics_scene(const CGAL_T3_TYPE& at3, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options void draw(const CGAL_T3_TYPE &at3, const GSOptions &gs_options, const char *title="T3 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(at3, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -169,7 +169,7 @@ void draw(const CGAL_T3_TYPE &at3, const GSOptions &gs_options, template void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(at3, buffer); draw_graphics_scene(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index e7286b0c0d93..f14c9403412d 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -72,7 +72,7 @@ typedef Local_kernel::Vector_3 Local_vector; template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(!gs_options.draw_vertex(v2, vh)) @@ -87,14 +87,14 @@ void compute_vertex(const V2& v2, template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, - CGAL::Graphics_scene &graphics_scene, + CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) { graphics_scene.add_point(vi->point(), gs_options.dual_vertex_color); } template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -224,7 +224,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -254,7 +254,7 @@ void compute_rays_and_bisectors(const V2&, template void compute_face(const V2& v2, typename V2::Face_iterator fh, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& m_gs_options) { if(fh->is_unbounded() || !m_gs_options.draw_face(v2, fh)) @@ -288,7 +288,7 @@ void compute_face(const V2& v2, template void compute_elements(const V2& v2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { if(gs_options.are_vertices_enabled()) @@ -338,7 +338,7 @@ void compute_elements(const V2& v2, template void add_in_graphics_scene(const CGAL_VORONOI_TYPE &v2, - CGAL::Graphics_scene& graphics_scene, + CGAL::Graphics_scene& graphics_scene, const GSOptions& m_gs_options) { draw_function_for_v2::compute_elements(v2, graphics_scene, m_gs_options); @@ -346,7 +346,7 @@ void add_in_graphics_scene(const CGAL_VORONOI_TYPE &v2, template void add_in_graphics_scene(const CGAL_VORONOI_TYPE& v2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { // Default graphics view options. CGAL::Graphics_scene_options_voronoi buffer; + CGAL::Graphics_scene buffer; add_in_graphics_scene(av2, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -376,7 +376,7 @@ template void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene buffer; CGAL::Graphics_scene_options_voronoi Date: Mon, 23 Oct 2023 01:35:11 +0200 Subject: [PATCH 219/341] Basic_viewer_qt is no more templated --- Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h | 2 +- Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h | 6 +++--- .../include/CGAL/draw_periodic_2_triangulation_2.h | 2 +- Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 86edc7fa9e02..6aa3b9fcd1c7 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -50,7 +50,7 @@ struct Default_color_generator { // Viewer class for`< Polygon_2 template -class Aos_2_basic_viewer_qt : public Basic_viewer_qt { +class Aos_2_basic_viewer_qt : public Basic_viewer_qt { using Aos = ArrangementOnSurface_2; using Color_generator = ColorGenerator; using Base = Basic_viewer_qt; diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index dae70337aea6..376bf8540e2c 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -112,10 +112,10 @@ void compute_elements(const PWH& pwh, #ifdef CGAL_USE_BASIC_VIEWER -template -class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt +template +class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt { - using Base = Basic_viewer_qt; + using Base = Basic_viewer_qt; using Ps = PolygonSet_2; using Pwh = typename Ps::Polygon_with_holes_2; using Pgn = typename Ps::Polygon_2; diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 381031c47b71..fb86c03e7a0a 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -247,7 +247,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index f14c9403412d..2517c302a06c 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -391,7 +391,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&av2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&av2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) From 761fde02bef8d5de0e79957d741f3cb65d7029d3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 01:52:38 +0200 Subject: [PATCH 220/341] add_in_graphics_scene -> add_to_graphics_scene; plus remove template parameter NumberType --- BGL/include/CGAL/draw_face_graph.h | 6 +- .../include/CGAL/draw_polygon_set_2.h | 22 +++---- .../CGAL/draw_linear_cell_complex.h | 5 +- .../include/CGAL/draw_linear_cell_complex.h | 26 ++++----- Nef_3/include/CGAL/draw_nef_3.h | 28 +++++---- .../CGAL/draw_periodic_2_triangulation_2.h | 28 ++++----- Point_set_3/include/CGAL/draw_point_set_3.h | 10 ++-- Polygon/include/CGAL/draw_polygon_2.h | 16 ++--- .../include/CGAL/draw_polygon_with_holes_2.h | 30 +++++----- Polyhedron/include/CGAL/draw_polyhedron.h | 14 ++--- .../include/CGAL/draw_straight_skeleton_2.h | 24 ++++---- Surface_mesh/include/CGAL/draw_surface_mesh.h | 12 ++-- .../include/CGAL/draw_face_graph_with_paths.h | 58 +++++++++---------- .../CGAL/draw_constrained_triangulation_2.h | 14 ++--- .../include/CGAL/draw_triangulation_2.h | 22 +++---- .../include/CGAL/draw_triangulation_3.h | 23 ++++---- .../include/CGAL/draw_voronoi_diagram_2.h | 32 +++++----- 17 files changed, 182 insertions(+), 188 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index 20f4cf12899f..f7d95b45d35f 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -119,7 +119,7 @@ void compute_elements(const FG &fg, } // draw_function_for_FG template -void add_in_graphics_scene_for_fg(const FG &fg, +void add_to_graphics_scene_for_fg(const FG &fg, CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { @@ -127,7 +127,7 @@ void add_in_graphics_scene_for_fg(const FG &fg, } template -void add_in_graphics_scene_for_fg(const FG &fg, +void add_to_graphics_scene_for_fg(const FG &fg, CGAL::Graphics_scene &graphics_scene) { Graphics_scene_options + +template void compute_loop(const typename PS2::Polygon_2& p, bool hole, CGAL::Graphics_scene& gs, const GSOptions& gso) { if (hole) { gs.add_point_in_face(p.vertex(p.size()-1)); } - + auto prev = p.vertices_begin(); auto it = prev; gs.add_point(*it); @@ -65,22 +65,22 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, gs.add_point_in_face(*it); // add point in face prev = it; } - + // Add the last segment between the last point and the first one gs.add_segment(*prev, *(p.vertices_begin())); } /// Compute the elements of a polygon with holes. -template +template void compute_elements(const PWH& pwh, CGAL::Graphics_scene& gs, const GSOptions& gso) { if (!gso.draw_unbounded() && pwh.outer_boundary().is_empty()) return; - + CGAL::IO::Color c(75,160,255); gs.face_begin(c); - + const typename PWH::Point_2* point_in_face; if (pwh.outer_boundary().is_empty()) { @@ -104,12 +104,12 @@ void compute_elements(const PWH& pwh, compute_loop(*it, true, gs); gs.add_point_in_face(*point_in_face); } - + gs.face_end(); } - + } // End namespace draw_function_for_boolean_set_2 - + #ifdef CGAL_USE_BASIC_VIEWER template @@ -218,7 +218,7 @@ void draw(const CGAL::Polygon_set_2& ps, bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); #endif - if (! cgal_test_suite) + if (! cgal_test_suite) { using Ps = CGAL::Polygon_set_2; using Viewer = Polygon_set_2_basic_viewer_qt; diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index f42aa4256d0e..6f6041e94004 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -21,7 +21,6 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5 Add in the given graphics scene the elements of alcc. \tparam LCC a model of the `LinearCellComplex` concept. -\tparam BufferType the number type used for point coordinates: `float` by default. \tparam GSOptions a class having the same methods than `Graphics_scene_options`: `Graphics_scene_options` by default. \param alcc the linear cell complex to draw. @@ -29,8 +28,8 @@ Add in the given graphics scene the elements of alcc. \param gs_options graphics scene options. */ - template - void add_in_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, + template + void add_to_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options=GSOptions()); } /* namespace CGAL */ diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index b80d10549b8a..bb21109dceaa 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -57,7 +57,7 @@ struct LCC_geom_utils } }; -template +template void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, @@ -102,7 +102,7 @@ void compute_face(const LCC& lcc, graphics_scene.face_end(); } -template +template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphics_scene& graphics_scene, @@ -126,7 +126,7 @@ void compute_edge(const LCC& lcc, } } -template +template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphics_scene& graphics_scene, @@ -145,7 +145,7 @@ void compute_vertex(const LCC& lcc, { graphics_scene.add_point(lcc.point(dh)); } } -template +template void compute_elements(const LCC& lcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -232,14 +232,14 @@ void compute_elements(const LCC& lcc, CGAL::Linear_cell_complex_base -// add_in_graphics_scene: to add a LCC in the given graphic buffer, with a +// add_to_graphics_scene: to add a LCC in the given graphic buffer, with a // graphics scene options. template class Map, class Refs, class Storage_, - typename BufferType=float, class GSOptions> -void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, + class GSOptions> +void add_to_graphics_scene(const CGAL_LCC_TYPE& alcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { @@ -247,13 +247,13 @@ void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, graphics_scene, gs_options); } -// add_in_graphics_scene: to add a LCC in the given graphic buffer, without a +// add_to_graphics_scene: to add a LCC in the given graphic buffer, without a // graphics scene options. Use default drawing values. template class Map, - class Refs, class Storage_, typename BufferType=float> -void add_in_graphics_scene(const CGAL_LCC_TYPE& alcc, + class Refs, class Storage_> +void add_to_graphics_scene(const CGAL_LCC_TYPE& alcc, CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options +template class Nef_Visitor { typedef typename Nef_Polyhedron::Halfedge_const_handle Halfedge_const_handle; @@ -212,7 +212,7 @@ class Nef_Visitor { const Nef_Polyhedron& nef; }; -template +template void compute_elements(const Nef_Polyhedron &nef, CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) @@ -223,7 +223,7 @@ void compute_elements(const Nef_Polyhedron &nef, typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; Volume_const_iterator c; - Nef_Visitor + Nef_Visitor V(nef, graphics_scene, gs_options); CGAL_forall_volumes(c, nef) { @@ -239,10 +239,10 @@ void compute_elements(const Nef_Polyhedron &nef, #define CGAL_NEF3_TYPE Nef_polyhedron_3 -// add_in_graphics_scene +// add_to_graphics_scene template -void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, + class GSOptions> +void add_to_graphics_scene(const CGAL_NEF3_TYPE &anef, CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) { @@ -251,9 +251,8 @@ void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, gs_options); } -template -void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, +template +void add_to_graphics_scene(const CGAL_NEF3_TYPE &anef, CGAL::Graphics_scene &graphics_scene) { // Default graphics view options. @@ -277,30 +276,29 @@ void add_in_graphics_scene(const CGAL_NEF3_TYPE &anef, return get_random_color(random); }; - add_in_graphics_scene(anef, graphics_scene, gs_options); + add_to_graphics_scene(anef, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function template + class GSOptions> void draw(const CGAL_NEF3_TYPE &anef, const GSOptions &gs_options, const char *title="Nef Polyhedron Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(anef, buffer, gs_options); + add_to_graphics_scene(anef, buffer, gs_options); draw_graphics_scene(buffer, title); } -template +template void draw(const CGAL_NEF3_TYPE &anef, const char *title="Nef Polyhedron Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(anef, buffer); + add_to_graphics_scene(anef, buffer); draw_graphics_scene(buffer, title); } diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index fb86c03e7a0a..e11fb2baaffa 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -66,7 +66,7 @@ struct Graphics_scene_options_periodic_2_triangulation_2 : namespace draw_function_for_P2T2 { -template +template void compute_vertex(const P2T2 &p2t2, typename P2T2::Periodic_point_iterator pi, CGAL::Graphics_scene& graphics_scene, @@ -83,7 +83,7 @@ void compute_vertex(const P2T2 &p2t2, { graphics_scene.add_point(p2t2.point(*pi)); } } -template +template void compute_edge(const P2T2 &p2t2, typename P2T2::Periodic_segment_iterator si, CGAL::Graphics_scene& graphics_scene, @@ -101,7 +101,7 @@ void compute_edge(const P2T2 &p2t2, { graphics_scene.add_segment(s[0], s[1]); } } -template +template void compute_face(const P2T2 &p2t2, typename P2T2::Periodic_triangle_iterator ti, CGAL::Graphics_scene& graphics_scene, @@ -124,7 +124,7 @@ void compute_face(const P2T2 &p2t2, graphics_scene.face_end(); } -template +template void compute_domain(const P2T2& p2t2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -153,7 +153,7 @@ void compute_domain(const P2T2& p2t2, } } -template +template void compute_elements(const P2T2& p2t2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -196,16 +196,16 @@ void compute_elements(const P2T2& p2t2, #define CGAL_P2T2_TYPE CGAL::Periodic_2_triangulation_2 -template -void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, +template +void add_to_graphics_scene(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_P2T2::compute_elements(p2t2, graphics_scene, gs_options); } -template -void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, +template +void add_to_graphics_scene(const CGAL_P2T2_TYPE& p2t2, CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options_periodic_2_triangulation_2 @@ -214,23 +214,23 @@ void add_in_graphics_scene(const CGAL_P2T2_TYPE& p2t2, typename CGAL_P2T2_TYPE::Periodic_segment_iterator, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; - add_in_graphics_scene(p2t2, graphics_scene, gs_options); + add_to_graphics_scene(p2t2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function -template +template void draw(const CGAL_P2T2_TYPE& ap2t2, const GSOptions& gs_options, const char* title="2D Periodic Triangulation Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(ap2t2, buffer, gs_options); + add_to_graphics_scene(ap2t2, buffer, gs_options); draw_graphics_scene(buffer); } -template +template void draw(const CGAL_P2T2_TYPE& ap2t2, const char* title="2D Periodic Triangulation Viewer") { @@ -241,7 +241,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, typename CGAL_P2T2_TYPE::Periodic_segment_iterator, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; - add_in_graphics_scene(ap2t2, buffer, gs_options); + add_to_graphics_scene(ap2t2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) { diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index c1f9ccbcca61..13fefed8a391 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -69,7 +69,7 @@ void compute_elements(const PointSet& pointset, } // namespace draw_function_for_PointSet template -void add_in_graphics_scene(const Point_set_3& apointset, +void add_to_graphics_scene(const Point_set_3& apointset, Graphics_scene& graphics_scene, const GSOptions& gs_options) { @@ -79,13 +79,13 @@ void add_in_graphics_scene(const Point_set_3& apointset, } template -void add_in_graphics_scene(const Point_set_3& apointset, +void add_to_graphics_scene(const Point_set_3& apointset, Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options, typename Point_set_3::const_iterator, int, int> gs_options; - add_in_graphics_scene(apointset, graphics_scene, gs_options); + add_to_graphics_scene(apointset, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER @@ -97,7 +97,7 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphics_scene buffer; - add_in_graphics_scene(apointset, buffer, gs_options); + add_to_graphics_scene(apointset, buffer, gs_options); draw_graphics_scene(buffer, title); } @@ -106,7 +106,7 @@ void draw(const Point_set_3& apointset, const char *title="Point_set_3 Basic Viewer") { Graphics_scene buffer; - add_in_graphics_scene(apointset, buffer); + add_to_graphics_scene(apointset, buffer); draw_graphics_scene(buffer, title); } diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 8184f6258b89..971c84ddce4a 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -46,7 +46,7 @@ namespace CGAL { namespace draw_function_for_p2 { -template +template void compute_elements(const P2& p2, CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) @@ -99,16 +99,16 @@ void compute_elements(const P2& p2, #define CGAL_P2_TYPE CGAL::Polygon_2 -// Specializations of add_in_graphics_scene function +// Specializations of add_to_graphics_scene function -template -void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, +template +void add_to_graphics_scene(const CGAL_P2_TYPE& ap2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); } -template -void add_in_graphics_scene(const CGAL_P2_TYPE& ap2, +template +void add_to_graphics_scene(const CGAL_P2_TYPE& ap2, CGAL::Graphics_scene &graphics_scene) { CGAL::Graphics_scene_options +template void compute_one_loop_elements(const P2& ap2, const typename P2::General_polygon_2& aloop, Graphics_scene &graphics_scene, @@ -97,7 +97,7 @@ void compute_one_loop_elements(const P2& ap2, { graphics_scene.add_segment(*prev, *(aloop.vertices_begin())); } } -template +template void compute_elements(const P2& p2, Graphics_scene &graphics_scene, const GSOptions& gs_options) { @@ -111,13 +111,13 @@ void compute_elements(const P2& p2, Graphics_scene &graphics_scene, { graphics_scene.face_begin(); } } - compute_one_loop_elements(p2, p2.outer_boundary(), graphics_scene, - false, gs_options); + compute_one_loop_elements(p2, p2.outer_boundary(), graphics_scene, + false, gs_options); for (typename P2::Hole_const_iterator it=p2.holes_begin(); it!=p2.holes_end(); ++it) { - compute_one_loop_elements(p2, *it, graphics_scene, - true, gs_options); + compute_one_loop_elements(p2, *it, graphics_scene, + true, gs_options); if (gs_options.are_faces_enabled()) { graphics_scene.add_point_in_face(p2.outer_boundary().vertex (p2.outer_boundary().size()-1)); @@ -132,8 +132,8 @@ void compute_elements(const P2& p2, Graphics_scene &graphics_scene, #define CGAL_P2_WITH_HOLES_TYPE CGAL::Polygon_with_holes_2 -template -void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, +template +void add_to_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphics_scene& graphics_scene, const GSOptions &gs_options) { @@ -141,8 +141,8 @@ void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, gs_options); } -template -void add_in_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, +template +void add_to_graphics_scene(const CGAL_P2_WITH_HOLES_TYPE& p2, CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options gs_options; - add_in_graphics_scene(p2, graphics_scene, gs_options); + add_to_graphics_scene(p2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template +template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const GSOptions &gs_options, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(ap2, buffer, gs_options); + add_to_graphics_scene(ap2, buffer, gs_options); draw_graphics_scene(buffer, title); } -template +template void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, const char* title="Polygon with Holes Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(ap2, buffer); + add_to_graphics_scene(ap2, buffer); draw_graphics_scene(buffer, title); } diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 5043f0d7ef7b..37d090cabb76 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -26,26 +26,26 @@ namespace CGAL #define CGAL_POLY_TYPE CGAL::Polyhedron_3 \ -// Specialization of add_in_graphics_scene function. +// Specialization of add_to_graphics_scene function. template class T_HDS, class Alloc, class GSOptions> -void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, +void add_to_graphics_scene(const CGAL_POLY_TYPE& apoly, CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) -{ add_in_graphics_scene_for_fg(apoly, graphics_scene, gs_options); } +{ add_to_graphics_scene_for_fg(apoly, graphics_scene, gs_options); } template class T_HDS, class Alloc> -void add_in_graphics_scene(const CGAL_POLY_TYPE& apoly, +void add_to_graphics_scene(const CGAL_POLY_TYPE& apoly, CGAL::Graphics_scene &graphics_scene) -{ add_in_graphics_scene_for_fg(apoly, graphics_scene); } +{ add_to_graphics_scene_for_fg(apoly, graphics_scene); } // Specialization of draw function: require Qt and the CGAL basic viewer. #ifdef CGAL_USE_BASIC_VIEWER @@ -59,7 +59,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene_for_fg(apoly, buffer); + add_to_graphics_scene_for_fg(apoly, buffer); draw_graphics_scene(buffer, title); } @@ -74,7 +74,7 @@ void draw(const CGAL_POLY_TYPE& apoly, const char* title="Polyhedron Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene_for_fg(apoly, buffer, gs_options); + add_to_graphics_scene_for_fg(apoly, buffer, gs_options); draw_graphics_scene(buffer, title); } #endif // CGAL_USE_BASIC_VIEWER diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index 104a4fa52cb7..d4766f5a903c 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -24,7 +24,7 @@ namespace CGAL { namespace draw_function_for_ss2 { -template +template void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -45,7 +45,7 @@ void compute_edge(const SS2& ss2, typename SS2::Halfedge_const_handle eh, } } -template +template void print_halfedge_labels(const SS2& ss2, typename SS2::Halfedge_const_handle h, CGAL::Graphics_scene& graphics_scene, @@ -65,7 +65,7 @@ void print_halfedge_labels(const SS2& ss2, label.str()); } -template +template void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -81,7 +81,7 @@ void compute_vertex(const SS2& ss2, typename SS2::Vertex_const_handle vh, { graphics_scene.add_point(vh->point()); } } -template +template void print_vertex_label(const SS2& ss2, typename SS2::Vertex_const_handle vh, CGAL::Graphics_scene& graphics_scene, @@ -96,7 +96,7 @@ void print_vertex_label(const SS2& ss2, graphics_scene.add_text(vh->point(), label.str()); } -template +template void compute_elements(const SS2& ss2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -129,8 +129,8 @@ void compute_elements(const SS2& ss2, #define CGAL_SS_TYPE CGAL::Straight_skeleton_2 -template -void add_in_graphics_scene(const CGAL_SS_TYPE &ass2, +template +void add_to_graphics_scene(const CGAL_SS_TYPE &ass2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { @@ -138,8 +138,8 @@ void add_in_graphics_scene(const CGAL_SS_TYPE &ass2, gs_options); } -template -void add_in_graphics_scene(const CGAL_SS_TYPE& ass2, +template +void add_to_graphics_scene(const CGAL_SS_TYPE& ass2, CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options -void add_in_graphics_scene(const Surface_mesh& amesh, +void add_to_graphics_scene(const Surface_mesh& amesh, CGAL::Graphics_scene &graphics_scene, const GSOptions &gs_options) -{ add_in_graphics_scene_for_fg(amesh, graphics_scene, gs_options); } +{ add_to_graphics_scene_for_fg(amesh, graphics_scene, gs_options); } template -void add_in_graphics_scene(const Surface_mesh& amesh, +void add_to_graphics_scene(const Surface_mesh& amesh, CGAL::Graphics_scene &graphics_scene) -{ add_in_graphics_scene_for_fg(amesh, graphics_scene, +{ add_to_graphics_scene_for_fg(amesh, graphics_scene, Graphics_scene_options_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER @@ -114,7 +114,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(amesh, buffer); + add_to_graphics_scene(amesh, buffer); draw_graphics_scene(buffer, title); } @@ -124,7 +124,7 @@ void draw(const Surface_mesh& amesh, const char* title="Surface_mesh Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(amesh, buffer, gs_options); + add_to_graphics_scene(amesh, buffer, gs_options); draw_graphics_scene(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index d354ab745319..837fd33f908e 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -141,7 +141,7 @@ const typename CGAL::Get_traits::Point& get_point return CGAL::Get_traits::get_point(mesh, dh); } -template +template void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, @@ -188,7 +188,7 @@ void compute_face(const Mesh& mesh, graphics_scene.face_end(); } -template +template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, @@ -219,7 +219,7 @@ void compute_edge(const Mesh &mesh, } } -template +template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, @@ -238,7 +238,7 @@ void compute_edge(const Mesh &mesh, { graphics_scene.add_segment(p1, get_point(mesh, d2), color); } } -template +template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphics_scene& graphics_scene, @@ -250,7 +250,7 @@ void compute_vertex(const Mesh &mesh, graphics_scene.add_point(get_point(mesh, dh)); } -template +template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, CGAL::Graphics_scene &graphics_scene, @@ -280,7 +280,7 @@ void compute_path(const Mesh &mesh, } } -template +template void compute_elements(const Mesh &mesh, CGAL::Graphics_scene &graphics_scene, const GSOptions &m_gs_options, @@ -311,19 +311,19 @@ void compute_elements(const Mesh &mesh, if (m_current_dart!=lcc.darts().end()) { // We want to draw only one dart Dart_const_descriptor selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); - compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphics_scene, lcc); + compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphics_scene, lcc); lcc.template mark_cell<1>(selected_dart, markedges); - compute_vertex(selected_dart, mesh, graphics_scene); + compute_vertex(selected_dart, mesh, graphics_scene); if ( !m_nofaces ) - { compute_face(selected_dart, mesh, graphics_scene, lcc); } + { compute_face(selected_dart, mesh, graphics_scene, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) { if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } } @@ -333,10 +333,10 @@ void compute_elements(const Mesh &mesh, if (m_current_path==m_paths->size()) { for (std::size_t i=0; isize(); ++i) - { compute_path(i, markedges, mesh, graphics_scene, m_paths, lcc); } + { compute_path(i, markedges, mesh, graphics_scene, m_paths, lcc); } } else if (m_current_path!=m_paths->size()+1) - { compute_path(m_current_path, markedges, mesh, graphics_scene, m_paths, lcc); } + { compute_path(m_current_path, markedges, mesh, graphics_scene, m_paths, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) @@ -344,19 +344,19 @@ void compute_elements(const Mesh &mesh, if (!m_nofaces && !lcc.is_marked(it, markfaces) && !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) { - compute_face(it, mesh, graphics_scene, lcc); + compute_face(it, mesh, graphics_scene, lcc); lcc.template mark_cell<2>(it, markfaces); } if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } if ( !lcc.is_marked(it, markvertices) ) { - compute_vertex(it, mesh, graphics_scene); + compute_vertex(it, mesh, graphics_scene); lcc.template mark_cell<0>(it, markvertices); } } @@ -369,8 +369,8 @@ void compute_elements(const Mesh &mesh, } // namespace draw_function_for_face_graph_with_paths -template -void add_in_graphics_scene(const Mesh& mesh, +template +void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, const GSOptions& gs_options, @@ -383,8 +383,8 @@ void add_in_graphics_scene(const Mesh& mesh, paths, amark); } -template -void add_in_graphics_scene(const Mesh& mesh, +template +void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, typename Get_map::type::size_type amark= @@ -397,12 +397,12 @@ void add_in_graphics_scene(const Mesh& mesh, typename Get_map::type::Dart_const_descriptor /*fh*/> gs_options; - add_in_graphics_scene(mesh, graphics_scene, gs_options, paths, amark); + add_to_graphics_scene(mesh, graphics_scene, gs_options, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER -template +template void draw(const Mesh& mesh, const std::vector >& paths, typename Get_map::type::size_type amark= @@ -410,11 +410,11 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(mesh, buffer, &paths, amark); + add_to_graphics_scene(mesh, buffer, &paths, amark); draw_graphics_scene(buffer, title); } -template +template void draw(const Mesh& mesh, const std::vector >& paths, const GSOptions& gs_options, @@ -423,11 +423,11 @@ void draw(const Mesh& mesh, const char* title="Mesh Viewer With Path") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(mesh, buffer, gs_options, &paths, amark); + add_to_graphics_scene(mesh, buffer, gs_options, &paths, amark); draw_graphics_scene(buffer, title); } -template +template void draw(const Mesh& mesh, std::initializer_list> l, typename Get_map::type::size_type amark= @@ -436,7 +436,7 @@ void draw(const Mesh& mesh, { std::vector> paths=l; CGAL::Graphics_scene buffer; - add_in_graphics_scene(mesh, buffer, &paths, amark); + add_to_graphics_scene(mesh, buffer, &paths, amark); draw_graphics_scene(buffer, title); } @@ -447,7 +447,7 @@ void draw(const Mesh& mesh, namespace CGAL { - template + template void draw(const Mesh&, const std::vector >&, typename Get_map::type::size_type= @@ -457,7 +457,7 @@ namespace CGAL std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + template void draw(const Mesh&, const std::vector >&, const GSOptions&, @@ -468,7 +468,7 @@ namespace CGAL std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< + template void draw(const Mesh&, std::initializer_list>, const char* ="", diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index 99e6aee57278..6fc3d8f3bbe0 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -26,8 +26,8 @@ namespace CGAL // Specialization of draw function. #define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 -template -void add_in_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, +template +void add_to_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, CGAL::Graphics_scene& graphics_scene) { using BASET2=CGAL::Triangulation_2; @@ -54,15 +54,15 @@ void add_in_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, [&ipm](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> CGAL::IO::Color { return get(ipm, fh)? CGAL::IO::yellow() : CGAL::IO::white(); }; - add_in_graphics_scene(at2, graphics_scene, drawingFunctor); + add_to_graphics_scene(at2, graphics_scene, drawingFunctor); } -template -void add_in_graphics_scene(const CGAL_T2_TYPE& at2, +template +void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene) { internal::In_domain in_domain; - add_in_graphics_scene(at2, in_domain, graphics_scene); + add_to_graphics_scene(at2, in_domain, graphics_scene); } template @@ -70,7 +70,7 @@ void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, const char *title="Constrained Triangulation_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(at2, ipm, buffer); + add_to_graphics_scene(at2, ipm, buffer); draw_graphics_scene(buffer, title); } diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 747c2348e1fb..702aa32cd663 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -24,7 +24,7 @@ namespace CGAL { namespace draw_function_for_t2 { -template +template void compute_face(const T2& t2, typename T2::Finite_faces_iterator fh, CGAL::Graphics_scene& graphics_scene, @@ -45,7 +45,7 @@ void compute_face(const T2& t2, graphics_scene.face_end(); } -template +template void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -68,7 +68,7 @@ void compute_edge(const T2& t2, typename T2::Finite_edges_iterator eh, } } -template +template void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -86,7 +86,7 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, } } -template +template void compute_elements(const T2& t2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -117,8 +117,8 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 -template -void add_in_graphics_scene(const CGAL_T2_TYPE& at2, +template +void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene, const CGAL::Graphics_scene_options -void add_in_graphics_scene(const CGAL_T2_TYPE& at2, +template +void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options +template void compute_face(typename T3::Finite_facets_iterator fh, const GSOptions& gs_options, CGAL::Graphics_scene& graphics_scene, const T3 *t3) @@ -48,7 +48,7 @@ void compute_face(typename T3::Finite_facets_iterator fh, graphics_scene.face_end(); } -template +template void compute_edge(typename T3::Finite_edges_iterator eh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) @@ -68,7 +68,7 @@ void compute_edge(typename T3::Finite_edges_iterator eh, } } -template +template void compute_vertex(typename T3::Vertex_handle vh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options, const T3* t3) @@ -84,7 +84,7 @@ void compute_vertex(typename T3::Vertex_handle vh, { graphics_scene.add_point(vh->point()); } } -template +template void compute_elements(const T3* t3, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -116,17 +116,16 @@ void compute_elements(const T3* t3, #define CGAL_T3_TYPE CGAL::Triangulation_3 template -void add_in_graphics_scene(const CGAL_T3_TYPE& at3, + class GSOptions> +void add_to_graphics_scene(const CGAL_T3_TYPE& at3, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { draw_function_for_t3::compute_elements(&at3, graphics_scene, gs_options); } -template -void add_in_graphics_scene(const CGAL_T3_TYPE& at3, +template +void add_to_graphics_scene(const CGAL_T3_TYPE& at3, CGAL::Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options void draw(const CGAL_T3_TYPE &at3, const char *title="T3 Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(at3, buffer); + add_to_graphics_scene(at3, buffer); draw_graphics_scene(buffer, title); } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 2517c302a06c..2a1cfba81f7d 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -69,7 +69,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; typedef Local_kernel::Point_3 Local_point; typedef Local_kernel::Vector_3 Local_vector; -template +template void compute_vertex(const V2& v2, typename V2::Vertex_iterator vh, CGAL::Graphics_scene& graphics_scene, @@ -84,14 +84,14 @@ void compute_vertex(const V2& v2, { graphics_scene.add_point(vh->point()); } } -template +template void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) { graphics_scene.add_point(vi->point(), gs_options.dual_vertex_color); } -template +template void add_segments_and_update_bounding_box(const V2& v2, typename V2::Halfedge_iterator he, CGAL::Graphics_scene& graphics_scene, @@ -221,7 +221,7 @@ Local_kernel::Point_2 get_second_point(typename V2::Halfedge_handle ray, } // Halfedge_const_handle -template +template void compute_rays_and_bisectors(const V2&, typename V2::Halfedge_iterator he, CGAL::Graphics_scene& graphics_scene, @@ -251,7 +251,7 @@ void compute_rays_and_bisectors(const V2&, } } -template +template void compute_face(const V2& v2, typename V2::Face_iterator fh, CGAL::Graphics_scene& graphics_scene, @@ -286,7 +286,7 @@ void compute_face(const V2& v2, // } } -template +template void compute_elements(const V2& v2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -335,17 +335,16 @@ void compute_elements(const V2& v2, #define CGAL_VORONOI_TYPE CGAL::Voronoi_diagram_2 -template -void add_in_graphics_scene(const CGAL_VORONOI_TYPE &v2, +template +void add_to_graphics_scene(const CGAL_VORONOI_TYPE &v2, CGAL::Graphics_scene& graphics_scene, const GSOptions& m_gs_options) { draw_function_for_v2::compute_elements(v2, graphics_scene, m_gs_options); } -template -void add_in_graphics_scene(const CGAL_VORONOI_TYPE& v2, +template +void add_to_graphics_scene(const CGAL_VORONOI_TYPE& v2, CGAL::Graphics_scene& graphics_scene) { // Default graphics view options. @@ -355,24 +354,23 @@ void add_in_graphics_scene(const CGAL_VORONOI_TYPE& v2, typename CGAL_VORONOI_TYPE::Face_iterator> gs_options; - add_in_graphics_scene(v2, graphics_scene, gs_options); + add_to_graphics_scene(v2, graphics_scene, gs_options); } #ifdef CGAL_USE_BASIC_VIEWER // Specialization of draw function. -template +template void draw(const CGAL_VORONOI_TYPE& av2, const GSOptions& gs_options, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphics_scene buffer; - add_in_graphics_scene(av2, buffer, gs_options); + add_to_graphics_scene(av2, buffer, gs_options); draw_graphics_scene(buffer, title); } -template +template void draw(const CGAL_VORONOI_TYPE& av2, const char *title="2D Voronoi Diagram Basic Viewer") { @@ -384,7 +382,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, typename CGAL_VORONOI_TYPE::Face_iterator> gs_options; - add_in_graphics_scene(av2, buffer, gs_options); + add_to_graphics_scene(av2, buffer, gs_options); QApplication_and_basic_viewer app(buffer, title); if(app) From 43328892591c9256e3f0fb59d75760c24f73013a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 02:03:48 +0200 Subject: [PATCH 221/341] remove template for Buffer_for_vao --- .../Polyhedron/Plugins/AABB_tree/Scene_movable_sm_item.cpp | 2 +- .../demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp | 2 +- Polyhedron/demo/Polyhedron/Scene_lcc_item.cpp | 2 +- Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Scene_movable_sm_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Scene_movable_sm_item.cpp index 96051a607c4b..049cfd6611b5 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Scene_movable_sm_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Scene_movable_sm_item.cpp @@ -92,7 +92,7 @@ void Scene_movable_sm_item_priv::compute_elements() const typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef boost::graph_traits::edge_descriptor edge_descriptor; - typedef CGAL::Buffer_for_vao CPF; + typedef CGAL::Buffer_for_vao CPF; flat_vertices.clear(); flat_normals.clear(); edges_vertices.clear(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp index fc6d564379b2..c037ebb2b745 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp @@ -131,7 +131,7 @@ class Scene_heat_item void computeElements() const Q_DECL_OVERRIDE { - typedef CGAL::Buffer_for_vao CPF; + typedef CGAL::Buffer_for_vao CPF; QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/Polyhedron/demo/Polyhedron/Scene_lcc_item.cpp b/Polyhedron/demo/Polyhedron/Scene_lcc_item.cpp index 1247ab267f1b..917a75bb6468 100644 --- a/Polyhedron/demo/Polyhedron/Scene_lcc_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_lcc_item.cpp @@ -88,7 +88,7 @@ struct lcc_priv{ faces.push_back(pt->z() + offset.z); } } - else if (CGAL::Buffer_for_vao::is_facet_convex(f.points,f.normal)) + else if (CGAL::Buffer_for_vao::is_facet_convex(f.points,f.normal)) { if (f.size()==4) { diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 49e2da75e659..59dfda31041b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -447,7 +447,7 @@ void Scene_surface_mesh_item_priv::compute_elements(Scene_item_rendering_helper: idx_data_.reserve(num_faces(*smesh_) * 3); - typedef CGAL::Buffer_for_vao CPF; + typedef CGAL::Buffer_for_vao CPF; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef boost::graph_traits::edge_descriptor edge_descriptor; @@ -2517,7 +2517,7 @@ void Scene_surface_mesh_item::fill_flat_vertex_map() typedef EPICK::Point_3 Point; typedef CGAL::Surface_mesh SMesh; typedef boost::graph_traits::face_descriptor face_descriptor; - typedef CGAL::Buffer_for_vao CPF; + typedef CGAL::Buffer_for_vao CPF; if(d->flat_vertex_map_ready) return; From e416fc875165c80b9381e70c2e6f464da4b26bc5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 15:38:43 +0200 Subject: [PATCH 222/341] new test for doc of draw --- .../CGAL/draw_triangulation_2.h | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index e46d9faebae1..4707f22bff27 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -6,36 +6,40 @@ namespace CGAL { opens a new window and draws a triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with -`CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam Gt -\tparam Tds +\cgalAdvancedBegin +The code of this function is not templated by a class `T2`, but by the template parameters of a `CGAL::Triangulation_2` in order to take directly the `CGAL::Triangulation_2` as parameter and thus allow mixing several drawings of different data structures in the same code. This is not documented here to avoid too many technical details. +\cgalAdvancedEnd + +\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. \param at2 the triangulation to draw. \param gso the graphics scene options parameter, `GSOptions()` by default. */ - template - void draw(const CGAL::Triangulation_2& at2, - const GSOptions& gso={}); + template + void draw(const T2& at2, const GSOptions& gso={}); /*! \ingroup PkgDrawTriangulation2 adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). -\tparam Gt -\tparam Tds +\cgalAdvancedBegin +The code of this function is not templated by a class `T2`, but by the template parameters of a `CGAL::Triangulation_2` in order to take directly the `CGAL::Triangulation_2` as parameter and thus allow mixing several drawings of different data structures in the same code. This is not documented here to avoid too many technical details. +\cgalAdvancedEnd + +\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. \param at2 the triangulation to draw. \param gs the graphic scene to fill. \param gso the graphics scene options parameter, `GSOptions()` by default. */ -template -void add_to_graphics_scene(const CGAL::Triangulation_2& at2, +template +void add_to_graphics_scene(const T2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso={}); From 2e955e1a241cc54fd0cdf091a0893d04b1b710f0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 16:07:28 +0200 Subject: [PATCH 223/341] The return of GSOptions template --- Triangulation_2/include/CGAL/draw_triangulation_2.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 702aa32cd663..f57691b079f1 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -117,18 +117,15 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 -template + template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene, - const CGAL::Graphics_scene_options& & gs_options) + const GSOptions& gs_options) { draw_function_for_t2::compute_elements(at2, graphics_scene, gs_options); } -template + template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene) { From 5ea9ac3db8bff8700229cdea1efce97e6425d7c4 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 18:41:20 +0200 Subject: [PATCH 224/341] Remove _qt suffix from Basic_viewer --- .../Qt/{Basic_viewer_qt.h => Basic_viewer.h} | 18 ++++---- .../doc/Basic_viewer/PackageDescription.txt | 8 ++-- .../Qt/{Basic_viewer_qt.h => Basic_viewer.h} | 46 +++++++++---------- 3 files changed, 36 insertions(+), 36 deletions(-) rename Basic_viewer/doc/Basic_viewer/CGAL/Qt/{Basic_viewer_qt.h => Basic_viewer.h} (79%) rename Basic_viewer/include/CGAL/Qt/{Basic_viewer_qt.h => Basic_viewer.h} (98%) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h similarity index 79% rename from Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h rename to Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index d33a29c49ce2..7996bed24b30 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -4,17 +4,17 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Basic_viewer_qt` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. */ -class Basic_viewer_qt : public CGAL::QGLViewer +class Basic_viewer : public CGAL::QGLViewer { public: /// Constructor given a pointer on a `QWidget` (can be a `nullptr`) and a `Graphics_scene`. /// `title` will be the title of the window. - Basic_viewer_qt(QWidget* parent, - const Graphics_scene& scene, - const char* title=""); + Basic_viewer(QWidget* parent, + const Graphics_scene& scene, + const char* title=""); /// enables or disables the drawing of vertices. void draw_vertices(bool b); @@ -132,7 +132,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /// Function called when a key is pressed. Users can define their own function in order /// to add specific behavior. - std::function on_key_pressed; + std::function on_key_pressed; }; @@ -140,7 +140,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer /*! \ingroup PkgBasicViewerClasses -The class `QApplication_and_basic_viewer` regroups a `Basic_viewer_qt` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer_qt` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. */ class QApplication_and_basic_viewer @@ -153,8 +153,8 @@ class QApplication_and_basic_viewer /// runs the `QApplication`, i.e., open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. void run(); - /// returns a reference to the `Basic_viewer_qt` associated with this. - Basic_viewer_qt& basic_viewer(); + /// returns a reference to the `Basic_viewer` associated with this. + Basic_viewer& basic_viewer(); }; //------------------------------------------------------------------------------ diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 500c9f32dfbf..550e146be4a4 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -11,7 +11,7 @@ \cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin -\cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} +\cgalPkgAuthor{Guillaume Damiand} \cgalPkgDesc{This package provides a basic viewer class.} \cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd @@ -29,10 +29,10 @@ - `GraphicsSceneOptionsWithVolumes` \cgalCRPSection{Classes} +- `CGAL::Basic_viewer` +- `CGAL::Graphics_scene` - `CGAL::Graphics_scene_options` -- `CGAL::Graphics_scene` -- `CGAL::Basic_viewer_qt` -- `CGAL::QApplication_and_basic_viewer` +- `CGAL::QApplication_and_basic_viewer` \cgalCRPSubsection{Draw a Graphics Scene} diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h similarity index 98% rename from Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h rename to Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 0d107922a75c..0271c9ef19a4 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer_qt.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -11,8 +11,8 @@ // Author(s) : Guillaume Damiand // Mostafa Ashraf -#ifndef CGAL_BASIC_VIEWER_QT_H -#define CGAL_BASIC_VIEWER_QT_H +#ifndef CGAL_BASIC_VIEWER_H +#define CGAL_BASIC_VIEWER_H #include #include @@ -61,7 +61,7 @@ namespace CGAL { //------------------------------------------------------------------------------ -class Basic_viewer_qt : public CGAL::QGLViewer +class Basic_viewer : public CGAL::QGLViewer { public: using BufferType=float; @@ -71,18 +71,18 @@ class Basic_viewer_qt : public CGAL::QGLViewer using GS=Graphics_scene; // Constructor/Destructor - Basic_viewer_qt(QWidget* parent, - const Graphics_scene& buf, - const char* title="", - bool draw_vertices=false, - bool draw_edges=true, - bool draw_faces=true, - bool use_mono_color=false, - bool inverse_normal=false, - bool draw_rays=true, - bool draw_lines=true, - bool draw_text=true, - bool no_2D_mode=false) : + Basic_viewer(QWidget* parent, + const Graphics_scene& buf, + const char* title="", + bool draw_vertices=false, + bool draw_edges=true, + bool draw_faces=true, + bool use_mono_color=false, + bool inverse_normal=false, + bool draw_rays=true, + bool draw_lines=true, + bool draw_text=true, + bool no_2D_mode=false) : CGAL::QGLViewer(parent), gBuffer(buf), m_draw_vertices(draw_vertices), @@ -158,7 +158,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer { negate_all_normals(); } } - ~Basic_viewer_qt() + ~Basic_viewer() { makeCurrent(); for (unsigned int i=0; i on_key_pressed; + std::function on_key_pressed; protected: const Graphics_scene& gBuffer; @@ -1553,7 +1553,7 @@ void draw_graphics_scene(const Graphics_scene& graphics_scene, int argc = 1; const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - Basic_viewer_qt basic_viewer(app.activeWindow(), + Basic_viewer basic_viewer(app.activeWindow(), graphics_scene, title); basic_viewer.show(); @@ -1586,8 +1586,8 @@ class QApplication_and_basic_viewer Qt::init_ogl_context(4, 3); m_application=new QApplication(m_argc, const_cast(m_argv)); - m_basic_viewer=new Basic_viewer_qt(m_application->activeWindow(), - buffer, title); + m_basic_viewer=new Basic_viewer(m_application->activeWindow(), + buffer, title); } ~QApplication_and_basic_viewer() @@ -1609,7 +1609,7 @@ class QApplication_and_basic_viewer } } - Basic_viewer_qt& basic_viewer() + Basic_viewer& basic_viewer() { CGAL_assertion(m_basic_viewer!=nullptr); return *m_basic_viewer; @@ -1617,7 +1617,7 @@ class QApplication_and_basic_viewer protected: QApplication* m_application; - Basic_viewer_qt* m_basic_viewer; + Basic_viewer* m_basic_viewer; char *m_argv[2]; int m_argc; }; @@ -1639,4 +1639,4 @@ namespace CGAL #endif // CGAL_USE_BASIC_VIEWER -#endif // CGAL_BASIC_VIEWER_QT_H +#endif // CGAL_BASIC_VIEWER_H From 2f07fbbb5450d5e27d95995d030a8ba27974541f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 23 Oct 2023 19:17:52 +0200 Subject: [PATCH 225/341] Update basic viewer doc following last remarks (Laurent and Andreas) --- .../doc/Basic_viewer/CGAL/Graphics_scene.h | 21 ++++++++- .../doc/Basic_viewer/CGAL/Qt/Basic_viewer.h | 4 +- .../doc/Basic_viewer/PackageDescription.txt | 3 +- Basic_viewer/doc/Basic_viewer/dependencies | 1 + .../CGAL/draw_constrained_triangulation_2.h | 2 +- .../CGAL/draw_triangulation_2.h | 45 +++++++++++++++---- .../Triangulation_2/PackageDescription.txt | 2 +- .../doc/Triangulation_2/dependencies | 1 + 8 files changed, 64 insertions(+), 15 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h index 5bc9d40f5a29..8d1abd593f81 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene.h @@ -4,42 +4,54 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Graphics_scene` stores points, segments, triangles, rays and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. +The class `Graphics_scene` stores points, segments, triangles, rays, and lines. Elements can be added, possibly with associated colors. Non triangular faces can be directly added and are triangulated internally. */ class Graphics_scene { public: /// adds the given point in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_point(const KPoint &p); /// adds the given colored point in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_point(const KPoint &p, const CGAL::IO::Color &color); /// adds the given segment in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_segment(const KPoint &p1, const KPoint &p2); /// adds the given colored segment in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_segment(const KPoint &p1, const KPoint &p2, const CGAL::IO::Color &color); /// adds the given ray in the scene: a half line starting from `p` and having `v` as direction. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. + /// \tparam KVector a model of `Kernel::Vector_2` or `Kernel::Vector_3`. template void add_ray(const KPoint &p, const KVector &v); /// adds the given colored ray in the scene: a half line starting from `p` and having `v` as direction. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. + /// \tparam KVector a model of `Kernel::Vector_2` or `Kernel::Vector_3`. template void add_ray(const KPoint &p, const KVector &v, const CGAL::IO::Color &color); /// adds the given line in the scene, defined by `p` and `v` as direction. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. + /// \tparam KVector a model of `Kernel::Vector_2` or `Kernel::Vector_3`. template void add_line(const KPoint &p, const KVector &v); /// adds the given colored line in the scene, defined by `p` and `v` as direction. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. + /// \tparam KVector a model of `Kernel::Vector_2` or `Kernel::Vector_3`. template void add_line(const KPoint &p, const KVector &v, const CGAL::IO::Color &color); @@ -55,10 +67,13 @@ class Graphics_scene { /// adds the given point in the current face. /// @pre `a_face_started()` + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template bool add_point_in_face(const KPoint &kp); /// adds the given point in the current face, having the vertex normal. /// @pre `a_face_started()` + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. + /// \tparam KVector a model of `Kernel::Vector_2` or `Kernel::Vector_3`. template bool add_point_in_face(const KPoint &kp, const KVector &p_normal); @@ -67,10 +82,12 @@ class Graphics_scene { void face_end(); /// adds the given text at the given position in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_text(const KPoint &kp, const char *txt); /// adds the given text at the given position in the scene. + /// \tparam KPoint a model of `Kernel::Point_2`, `Kernel::Point_3`, `Kernel::WeightedPoint_2` or `Kernel::WeightedPoint_3`. template void add_text(const KPoint &kp, const std::string &txt); @@ -84,7 +101,7 @@ class Graphics_scene { const CGAL::Bbox_3& bounding_box() const; /// returns `true` if the scene is in 2D, i.e., lies on the XY or XZ or YZ plane. - bool two_dimensional() const; + bool is_two_dimensional() const; }; } // namespace CGAL diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index 7996bed24b30..adcdbbc266af 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -159,7 +159,9 @@ class QApplication_and_basic_viewer //------------------------------------------------------------------------------ /*! - opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. + \ingroup PkgBasicViewerClasses + + opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. */ void draw_graphics_scene(const Graphics_scene& graphic_scene, const char *title="CGAL Basic Viewer") diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 550e146be4a4..728e5504e347 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -12,7 +12,7 @@ \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin \cgalPkgAuthor{Guillaume Damiand} -\cgalPkgDesc{This package provides a basic viewer class.} +\cgalPkgDesc{This package provides a basic viewer class TODO.} \cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin @@ -38,7 +38,6 @@ - `CGAL::draw_graphics_scene()` - \cgalCRPSubsection{Draw for Different Packages} - `Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index 67a91f218f5e..3db1960593c5 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -11,3 +11,4 @@ Surface_mesh_topology Triangulation_2 Triangulation_3 Voronoi_diagram_2 +Kernel_23 diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h index e67670bcbc9c..2ef649265112 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -17,7 +17,7 @@ Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with */ template -void draw(const T2& at2); +void draw(const T2& at2, TODO); /*! \ingroup PkgDrawConstrainedTriangulation2 diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 4707f22bff27..bb9b106a7a7d 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -9,18 +9,32 @@ A call to this function blocks the execution of the program until the drawing wi Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalAdvancedBegin -The code of this function is not templated by a class `T2`, but by the template parameters of a `CGAL::Triangulation_2` in order to take directly the `CGAL::Triangulation_2` as parameter and thus allow mixing several drawings of different data structures in the same code. This is not documented here to avoid too many technical details. +The real declaration of this function template is: + + + template + + void CGAL::draw(const Triangulation_2& at2, const GSOptions& gso); + \cgalAdvancedEnd \tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. \param at2 the triangulation to draw. -\param gso the graphics scene options parameter, `GSOptions()` by default. +\param gso the graphics scene options parameter. */ template - void draw(const T2& at2, const GSOptions& gso={}); + void draw(const T2& at2, const GSOptions& gso); + +/*! +\ingroup PkgDrawTriangulation2 + +A shortcut to `draw(at2, Graphics_scene_options{})`. +*/ + template + void draw(const T2& at2); /*! \ingroup PkgDrawTriangulation2 @@ -28,19 +42,34 @@ The code of this function is not templated by a class `T2`, but by the template adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \cgalAdvancedBegin -The code of this function is not templated by a class `T2`, but by the template parameters of a `CGAL::Triangulation_2` in order to take directly the `CGAL::Triangulation_2` as parameter and thus allow mixing several drawings of different data structures in the same code. This is not documented here to avoid too many technical details. +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); + \cgalAdvancedEnd \tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept, `Graphics_scene_options` by defafult. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. \param at2 the triangulation to draw. \param gs the graphic scene to fill. -\param gso the graphics scene options parameter, `GSOptions()` by default. +\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const T2& at2, CGAL::Graphics_scene& gs, - const GSOptions& gso={}); + const GSOptions& gso); + +/*! +\ingroup PkgDrawTriangulation2 + +A shortcut to `add_to_graphics_scene(at2, gs, Graphics_scene_options{})`. +*/ +template +void add_to_graphics_scene(const T2& at2, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index 9ff05f26d24b..596f2ae4a425 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -21,7 +21,7 @@ /*! \code - #include + #include \endcode */ /// \defgroup PkgDrawConstrainedTriangulation2 Draw a Constrained Triangulation 2 diff --git a/Triangulation_2/doc/Triangulation_2/dependencies b/Triangulation_2/doc/Triangulation_2/dependencies index 22ae69dcfef0..db6625f491cc 100644 --- a/Triangulation_2/doc/Triangulation_2/dependencies +++ b/Triangulation_2/doc/Triangulation_2/dependencies @@ -10,3 +10,4 @@ Triangulation_3 Spatial_sorting Polygon Polyline_simplification_2 +Basic_viewer From 126b9360c9871943dc1468e44a3e15259168ee89 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 24 Oct 2023 08:27:18 +0200 Subject: [PATCH 226/341] Remove _qt from Basic viewer name --- .../CGAL/draw_arrangement_2.h | 2 +- .../include/CGAL/draw_arrangement_2.h | 20 ++--- Basic_viewer/include/CGAL/Graphics_scene.h | 2 +- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 80 +++++++++---------- .../demo/Linear_cell_complex/Viewer.cpp | 6 +- .../demo/Linear_cell_complex/Viewer.h | 16 ++-- .../include/CGAL/draw_linear_cell_complex.h | 2 +- 7 files changed, 64 insertions(+), 64 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h index f415f5c9e7ec..1f23f97d5d5d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h @@ -17,7 +17,7 @@ #ifndef CGAL_DRAW_ARRANGEMENT_2_H #define CGAL_DRAW_ARRANGEMENT_2_H -#include +#include #ifdef DOXYGEN_RUNNING diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 6aa3b9fcd1c7..9d3248073482 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -23,7 +23,7 @@ #include #include -#include +#include #ifdef CGAL_USE_BASIC_VIEWER @@ -50,10 +50,10 @@ struct Default_color_generator { // Viewer class for`< Polygon_2 template -class Aos_2_basic_viewer_qt : public Basic_viewer_qt { +class Aos_2_basic_viewer_qt : public Basic_viewer { using Aos = ArrangementOnSurface_2; using Color_generator = ColorGenerator; - using Base = Basic_viewer_qt; + using Base = Basic_viewer; using Gt = typename Aos::Geometry_traits_2; using Point = typename Aos::Point_2; using X_monotone_curve = typename Aos::X_monotone_curve_2; @@ -185,7 +185,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { void add_elements() { // std::cout << "add_elements()\n"; // std::cout << "ratio: " << this->pixel_ratio() << std::endl; - clear(); + m_graphics_scene.clear(); m_visited.clear(); if (m_aos.is_empty()) return; @@ -276,8 +276,8 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { auto it = polyline.begin(); auto prev = it++; for (; it != polyline.end(); prev = it++) { - this->add_segment(*prev, *it); - this->add_point_in_face(*prev); + m_graphics_scene.add_segment(*prev, *it); + m_graphics_scene.add_point_in_face(*prev); } } @@ -383,7 +383,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { * For now we use C++14 features. */ auto color = m_color_generator(circ->face()); - this->face_begin(color); + m_graphics_scene.face_begin(color); const auto* traits = this->m_aos.geometry_traits(); auto ext = find_smallest(circ, *traits); @@ -396,7 +396,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { curr = curr->next(); } while (curr != ext); - this->face_end(); + m_graphics_scene.face_end(); } /*! Draw a curve using aproximate coordinates. @@ -414,7 +414,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { if (polyline.empty()) return; auto it = polyline.begin(); auto prev = it++; - for (; it != polyline.end(); prev = it++) this->add_segment(*prev, *it); + for (; it != polyline.end(); prev = it++) m_graphics_scene.add_segment(*prev, *it); } /*! Compile time dispatching @@ -534,7 +534,7 @@ class Aos_2_basic_viewer_qt : public Basic_viewer_qt { #else template void draw_point_impl1(const Point& p, T const& traits, int) - { add_point(traits.approximate_2_object()(p)); } + { m_graphics_scene.add_point(traits.approximate_2_object()(p)); } #endif template diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index 5c8101b1fadf..c6c6b433b91a 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -158,7 +158,7 @@ class Graphics_scene update_bounding_box(lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox()); } - void negate_all_normals() const + void reverse_normals() const { m_buffer_for_mono_faces.negate_normals(); m_buffer_for_colored_faces.negate_normals(); diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 0271c9ef19a4..acd9d8b66ddf 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -155,7 +155,7 @@ class Basic_viewer : public CGAL::QGLViewer resize(CGAL_BASIC_VIEWER_INIT_SIZE_X, CGAL_BASIC_VIEWER_INIT_SIZE_Y); if (inverse_normal) - { negate_all_normals(); } + { reverse_normals(); } } ~Basic_viewer() @@ -168,73 +168,73 @@ class Basic_viewer : public CGAL::QGLViewer vao[i].destroy(); } - void set_draw_vertices(bool b) + void draw_vertices(bool b) { m_draw_vertices = b; } - void set_draw_edges(bool b) + void draw_edges(bool b) { m_draw_edges = b; } - void set_draw_rays(bool b) + void draw_rays(bool b) { m_draw_rays = b; } - void set_draw_lines(bool b) + void draw_lines(bool b) { m_draw_lines = b; } - void set_draw_faces(bool b) + void draw_faces(bool b) { m_draw_faces = b; } - void set_use_mono_color(bool b) + void use_mono_color(bool b) { m_use_mono_color = b; } - void set_draw_text(bool b) + void draw_text(bool b) { m_draw_text = b; } - void set_vertices_mono_color(const CGAL::IO::Color& c) + void vertices_mono_color(const CGAL::IO::Color& c) { m_vertices_mono_color=c; } - void set_edges_mono_color(const CGAL::IO::Color& c) + void edges_mono_color(const CGAL::IO::Color& c) { m_edges_mono_color=c; } - void set_rays_mono_color(const CGAL::IO::Color& c) + void rays_mono_color(const CGAL::IO::Color& c) { m_rays_mono_color=c; } - void set_lines_mono_color(const CGAL::IO::Color& c) + void lines_mono_color(const CGAL::IO::Color& c) { m_lines_mono_color=c; } - void set_faces_mono_color(const CGAL::IO::Color& c) + void faces_mono_color(const CGAL::IO::Color& c) { m_faces_mono_color=c; } - void negate_draw_vertices() + void toggle_draw_vertices() { m_draw_vertices = !m_draw_vertices; } - void negate_draw_edges() + void toggle_draw_edges() { m_draw_edges = !m_draw_edges; } - void negate_draw_rays() + void toggle_draw_rays() { m_draw_rays = !m_draw_rays; } - void negate_draw_lines() + void toggle_draw_lines() { m_draw_lines = !m_draw_lines; } - void negate_draw_faces() + void toggle_draw_faces() { m_draw_faces = !m_draw_faces; } - void negate_use_mono_color() + void toggle_use_mono_color() { m_use_mono_color = !m_use_mono_color; } - void negate_draw_text() + void toggle_draw_text() { m_draw_text = !m_draw_text; } - bool get_draw_vertices() const + bool draw_vertices() const { return m_draw_vertices; } - bool get_draw_edges() const + bool draw_edges() const { return m_draw_edges; } - bool get_draw_rays() const + bool draw_rays() const { return m_draw_rays; } - bool get_draw_lines() const + bool draw_lines() const { return m_draw_lines; } - bool get_draw_faces() const + bool draw_faces() const { return m_draw_faces; } - bool get_use_mono_color() const + bool use_mono_color() const { return m_use_mono_color; } - bool get_inverse_normal() const + bool reverse_normal() const { return m_inverse_normal; } - bool get_draw_text() const + bool draw_text() const { return m_draw_text; } - const CGAL::IO::Color& get_vertices_mono_color() const + const CGAL::IO::Color& vertices_mono_color() const { return m_vertices_mono_color; } - const CGAL::IO::Color& get_edges_mono_color() const + const CGAL::IO::Color& edges_mono_color() const { return m_edges_mono_color; } - const CGAL::IO::Color& get_rays_mono_color() const + const CGAL::IO::Color& rays_mono_color() const { return m_rays_mono_color; } - const CGAL::IO::Color& get_lines_mono_color() const + const CGAL::IO::Color& lines_mono_color() const { return m_lines_mono_color; } - const CGAL::IO::Color& get_faces_mono_color() const + const CGAL::IO::Color& faces_mono_color() const { return m_faces_mono_color; } Local_kernel::Plane_3 clipping_plane() const @@ -245,10 +245,10 @@ class Basic_viewer : public CGAL::QGLViewer return Local_kernel::Plane_3(n[0], n[1], n[2], -n*pos); } - bool is_clipping_plane_enabled() const + bool clipping_plane_enabled() const { return (m_use_clipping_plane!=CLIPPING_PLANE_OFF); } - const Graphics_scene& get_graphics_scene() const + const Graphics_scene& graphics_scene() const { return gBuffer; } virtual void redraw() @@ -257,10 +257,10 @@ class Basic_viewer : public CGAL::QGLViewer update(); } - void negate_all_normals() + void reverse_normals() { m_inverse_normal=!m_inverse_normal; - gBuffer.negate_all_normals(); + gBuffer.reverse_normals(); } // Returns true if the data structure lies on a plane @@ -1254,7 +1254,7 @@ class Basic_viewer : public CGAL::QGLViewer } else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) { - negate_all_normals(); + reverse_normals(); displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); redraw(); } @@ -1537,6 +1537,7 @@ class Basic_viewer : public CGAL::QGLViewer }; +inline void draw_graphics_scene(const Graphics_scene& graphics_scene, const char *title="CGAL Basic Viewer") { @@ -1553,8 +1554,7 @@ void draw_graphics_scene(const Graphics_scene& graphics_scene, int argc = 1; const char *argv[2] = {title, nullptr}; QApplication app(argc, const_cast(argv)); - Basic_viewer basic_viewer(app.activeWindow(), - graphics_scene, title); + Basic_viewer basic_viewer(app.activeWindow(), graphics_scene, title); basic_viewer.show(); app.exec(); diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 4039bb460fcf..e7ff28d2ef2e 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -20,7 +20,7 @@ Viewer::Viewer(QWidget *parent) m_previous_scene_empty(true) { m_gs_options.face_color=[](const LCC & alcc, - Dart_const_descriptor dh)->CGAL::IO::Color + Dart_const_descriptor dh)->CGAL::IO::Color { if(alcc.template is_free<3>(dh)) { return alcc.template info<3>(dh).color(); } @@ -53,7 +53,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) scene = scene_; if (scene->lcc!=nullptr) - { CGAL::add_in_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); } + { CGAL::add_to_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); } if (doredraw) { Base::redraw(); } @@ -62,7 +62,7 @@ void Viewer::setScene(Scene *scene_, bool doredraw) void Viewer::sceneChanged() { m_graphic_buffer.clear(); - CGAL::add_in_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); + CGAL::add_to_graphics_scene(*scene->lcc, m_graphic_buffer, m_gs_options); this->camera()->setSceneBoundingBox( CGAL::qglviewer::Vec(gBuffer.bounding_box().xmin(), diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h index a4df8965ff20..951672054599 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.h @@ -16,13 +16,13 @@ #include "typedefs.h" #include -#include +#include -class Viewer : public CGAL::Basic_viewer_qt +class Viewer : public CGAL::Basic_viewer { Q_OBJECT - typedef CGAL::Basic_viewer_qt Base; + typedef CGAL::Basic_viewer Base; public: Viewer(QWidget* parent); @@ -35,11 +35,11 @@ public Q_SLOTS: private: CGAL::Graphics_scene_options m_gs_options; - CGAL::Graphics_scene m_graphic_buffer; + Dart_const_descriptor, + Dart_const_descriptor, + Dart_const_descriptor, + Dart_const_descriptor> m_gs_options; + CGAL::Graphics_scene m_graphic_buffer; Scene* scene; bool m_previous_scene_empty; }; diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index bb21109dceaa..652935b14447 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -13,7 +13,7 @@ #ifndef CGAL_DRAW_LCC_H #define CGAL_DRAW_LCC_H -#include +#include #include #include #include From 2b69e29fe57d3d5cc867006bebb0c09cd85cf525 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 25 Oct 2023 08:49:24 +0200 Subject: [PATCH 227/341] Basic viewer is now in namespace Qt --- .../doc/Basic_viewer/CGAL/Qt/Basic_viewer.h | 7 ++- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 58 ++++++++++--------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index adcdbbc266af..5ef340bd40dc 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -1,10 +1,11 @@ namespace CGAL { + namespace Qt { //------------------------------------------------------------------------------ /*! \ingroup PkgBasicViewerClasses -The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements can either be added directly in the viewer or through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements are added through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. */ class Basic_viewer : public CGAL::QGLViewer @@ -132,7 +133,7 @@ class Basic_viewer : public CGAL::QGLViewer /// Function called when a key is pressed. Users can define their own function in order /// to add specific behavior. - std::function on_key_pressed; + std::function on_key_pressed; }; @@ -157,6 +158,8 @@ class QApplication_and_basic_viewer Basic_viewer& basic_viewer(); }; +} // End namespace Qt + //------------------------------------------------------------------------------ /*! \ingroup PkgBasicViewerClasses diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index acd9d8b66ddf..60b16ff2b208 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -59,7 +59,7 @@ #define CGAL_BASIC_VIEWER_INIT_SIZE_Y 450 namespace CGAL { - +namespace Qt { //------------------------------------------------------------------------------ class Basic_viewer : public CGAL::QGLViewer { @@ -1457,7 +1457,7 @@ class Basic_viewer : public CGAL::QGLViewer return text; } public: - std::function on_key_pressed; + std::function on_key_pressed; protected: const Graphics_scene& gBuffer; @@ -1537,30 +1537,6 @@ class Basic_viewer : public CGAL::QGLViewer }; -inline -void draw_graphics_scene(const Graphics_scene& graphics_scene, - const char *title="CGAL Basic Viewer") -{ -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite = true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (!cgal_test_suite) - { - Qt::init_ogl_context(4, 3); - - int argc = 1; - const char *argv[2] = {title, nullptr}; - QApplication app(argc, const_cast(argv)); - Basic_viewer basic_viewer(app.activeWindow(), graphics_scene, title); - - basic_viewer.show(); - app.exec(); - } -} - //------------------------------------------------------------------------------ class QApplication_and_basic_viewer { @@ -1622,6 +1598,36 @@ class QApplication_and_basic_viewer int m_argc; }; +} // End namespace Qt + +// A shortcut to use directly CGAL::Basic_viewer instead of CGAL::Qt::Basic_viewer. +// Can be changed later if we have several viewers. +using Qt::Basic_viewer; + +inline +void draw_graphics_scene(const Graphics_scene& graphics_scene, + const char *title="CGAL Basic Viewer") +{ +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite = true; +#else + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (!cgal_test_suite) + { + Qt::init_ogl_context(4, 3); + + int argc = 1; + const char *argv[2] = {title, nullptr}; + QApplication app(argc, const_cast(argv)); + Basic_viewer basic_viewer(app.activeWindow(), graphics_scene, title); + + basic_viewer.show(); + app.exec(); + } +} + } // End namespace CGAL #else // CGAL_USE_BASIC_VIEWER From 2bad25fddc52f63e185f083bcd785a33f688dcfe Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 6 Nov 2023 18:43:02 +0100 Subject: [PATCH 228/341] draw cont (nyf) --- .../include/CGAL/draw_polygon_set_2.h | 21 ++++++++++--------- .../include/CGAL/draw_face_graph_with_paths.h | 16 +++++++------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index e1fca5ad98b2..d95561e83e0f 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -17,7 +17,9 @@ #ifndef CGAL_DRAW_POLYGON_SET_2_H #define CGAL_DRAW_POLYGON_SET_2_H -#include +#include +#include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -112,10 +114,10 @@ void compute_elements(const PWH& pwh, #ifdef CGAL_USE_BASIC_VIEWER -template -class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt +template +class Polygon_set_2_basic_viewer_qt : public Basic_viewer { - using Base = Basic_viewer_qt; + using Base = Basic_viewer; using Ps = PolygonSet_2; using Pwh = typename Ps::Polygon_with_holes_2; using Pgn = typename Ps::Polygon_2; @@ -123,12 +125,10 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt public: Polygon_set_2_basic_viewer_qt(QWidget* parent, const Ps& ps, - Graphics_scene& gs, - GSOptions& gs_options, const char* title = "Basic Polygon_set_2 Viewer", bool draw_unbounded = false, bool draw_vertices = false) : - Base(parent, gs, title, draw_vertices), + Base(parent, graphics_scene, title, draw_vertices), m_ps(ps), m_draw_unbounded(draw_unbounded) { @@ -203,6 +203,9 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer_qt //! Indicates whether to draw unbounded polygons with holes. bool m_draw_unbounded = false; + + Graphics_scene graphics_scene; + Graphics_scene_options graphics_scene_options; }; // Specialization of draw function. @@ -226,9 +229,7 @@ void draw(const CGAL::Polygon_set_2& ps, int argc = 1; const char* argv[2] = {"t2_viewer", nullptr}; QApplication app(argc, const_cast(argv)); - Graphics_scene gs; - Graphics_scene_options gs; - Viewer basic_viewer(app.activeWindow(), ps, gs, gso, + Viewer basic_viewer(app.activeWindow(), ps, title, draw_unbounded, draw_vertices); basic_viewer.add_elements(); basic_viewer.show(); diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 837fd33f908e..43e65312acb3 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -50,7 +50,7 @@ struct Graphics_scene_options_face_graph_with_paths : { return true; } } - std::function color_of_path; + std::function color_of_path; std::function draw_path; protected: @@ -192,7 +192,7 @@ template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - typename Get_map::type::size_type m_amark, + typename Get_map::type::size_type aamark, CGAL::Graphics_scene& graphics_scene, GSOptions& gs_options, bool draw_marked_darts=true) @@ -211,8 +211,8 @@ void compute_edge(const Mesh &mesh, Dart_const_descriptor d2 = lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK && - (lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.opposite2(dh), m_amark))) + if (draw_marked_darts && amark!=LCC::INVALID_MARK && + (lcc.is_marked(dh, amark) || lcc.is_marked(lcc.opposite2(dh), amark))) { graphics_scene.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } else { graphics_scene.add_segment(p1, get_point(mesh, d2)); } @@ -238,7 +238,7 @@ void compute_edge(const Mesh &mesh, { graphics_scene.add_segment(p1, get_point(mesh, d2), color); } } -template +template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphics_scene& graphics_scene, @@ -299,7 +299,7 @@ void compute_elements(const Mesh &mesh, typename LCC::Dart_range::const_iterator m_current_dart = lcc.darts().end(); typename LCC::size_type m_oriented_mark = lcc.get_new_mark(); std::size_t m_current_path = m_paths->size(); - typename LCC::size_type m_amark=amark==(std::numeric_limits::max)()? + typename LCC::size_type amark=amark==(std::numeric_limits::max)()? LCC::INVALID_MARK:amark; // If !=INVALID_MARK, show darts marked with this mark lcc.orient(m_oriented_mark); @@ -323,7 +323,7 @@ void compute_elements(const Mesh &mesh, { if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, amark, draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } } @@ -350,7 +350,7 @@ void compute_elements(const Mesh &mesh, if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphics_scene, lcc, m_amark, m_draw_marked_darts); + compute_edge(it, mesh, graphics_scene, lcc, amark, draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } From 97721a0c1212ce4266ee381da386e898e2a375c6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 13 Nov 2023 11:11:46 +0000 Subject: [PATCH 229/341] namespace fixes --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 5 ++--- Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp | 6 +++--- .../examples/Basic_viewer/draw_surface_mesh_small_faces.cpp | 2 +- Triangulation_3/include/CGAL/draw_triangulation_3.h | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 728e5504e347..d85d6ab1927e 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -29,10 +29,10 @@ - `GraphicsSceneOptionsWithVolumes` \cgalCRPSection{Classes} -- `CGAL::Basic_viewer` +- `CGAL::Qt::Basic_viewer` - `CGAL::Graphics_scene` - `CGAL::Graphics_scene_options` -- `CGAL::QApplication_and_basic_viewer` +- `CGAL::Qt::QApplication_and_basic_viewer` \cgalCRPSubsection{Draw a Graphics Scene} @@ -73,4 +73,3 @@ - Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_to_graphics_scene() \endlink */ - diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index a84472e51838..54b9af99ab77 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include @@ -69,8 +69,8 @@ int main(void) QWidget *centralWidget = new QWidget(mainWindow); QHBoxLayout* layout = new QHBoxLayout(mainWindow); - CGAL::Basic_viewer_qt bv1(mainWindow, graphic_buffer1); - CGAL::Basic_viewer_qt bv2(mainWindow, graphic_buffer2); + CGAL::Qt::Basic_viewer bv1(mainWindow, graphic_buffer1); + CGAL::Qt::Basic_viewer bv2(mainWindow, graphic_buffer2); bv1.set_draw_vertices(true); layout->addWidget(&bv1); diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 2bc04da399be..a933a431eef4 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -102,7 +102,7 @@ int main(int argc, char* argv[]) CGAL::Graphics_scene buffer; add_in_graphics_scene(sm, buffer, gsosm); - CGAL::QApplication_and_basic_viewer app(buffer, "Small faces"); + CGAL::Qt::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { app.basic_viewer().on_key_pressed= diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 1cf62b22457a..50044bd845b0 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_T3_H #include -#include +#include #include #include #include From e62cb1661a70724a64eed8020ada2ca35639f167 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 13 Nov 2023 18:56:31 +0000 Subject: [PATCH 230/341] add_to --- .../examples/Basic_viewer/draw_mesh_and_points.cpp | 6 +++--- .../examples/Basic_viewer/draw_several_windows.cpp | 6 +++--- .../examples/Basic_viewer/draw_surface_mesh_height.cpp | 2 +- .../Basic_viewer/draw_surface_mesh_small_faces.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index e378696c071f..01b476b91e2d 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; @@ -55,8 +55,8 @@ int main(void) { point_set.insert(it.first); } CGAL::Graphics_scene graphic_buffer; - CGAL::add_in_graphics_scene(point_set, graphic_buffer, Graphics_scene_options_green_points()); - CGAL::add_in_graphics_scene(output_mesh, graphic_buffer); + CGAL::add_to_graphics_scene(point_set, graphic_buffer, Graphics_scene_options_green_points()); + CGAL::add_to_graphics_scene(output_mesh, graphic_buffer); CGAL::draw_graphics_scene(graphic_buffer); } else diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 54b9af99ab77..cd387484c1f3 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -9,7 +9,7 @@ #include #include -#include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; @@ -48,8 +48,8 @@ int main(void) { point_set.insert(it.first); } CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; - CGAL::add_in_graphics_scene(point_set, graphic_buffer1); - CGAL::add_in_graphics_scene(output_mesh, graphic_buffer2); + CGAL::add_to_graphics_scene(point_set, graphic_buffer1); + CGAL::add_to_graphics_scene(output_mesh, graphic_buffer2); /// (2) Qt code that create windows, add them in a layout, and create app. diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index 15a82026f97e..d1ef948609eb 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include typedef CGAL::Simple_cartesian Kernel; typedef Kernel::Point_3 Point; diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index a933a431eef4..aba2a0e1b037 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include @@ -101,7 +101,7 @@ int main(int argc, char* argv[]) Graphics_scene_options_small_faces gsosm(sm); CGAL::Graphics_scene buffer; - add_in_graphics_scene(sm, buffer, gsosm); + add_to_graphics_scene(sm, buffer, gsosm); CGAL::Qt::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { @@ -117,7 +117,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); buffer.clear(); - add_in_graphics_scene(sm, buffer, gsosm); + add_to_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -128,7 +128,7 @@ int main(int argc, char* argv[]) (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); buffer.clear(); - add_in_graphics_scene(sm, buffer, gsosm); + add_to_graphics_scene(sm, buffer, gsosm); basic_viewer->redraw(); } else From 1ffb64e2acbbc3e911089360dd2e614779e2e04e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 13 Nov 2023 18:58:30 +0000 Subject: [PATCH 231/341] buffer -> scene --- .../examples/Basic_viewer/draw_mesh_and_points.cpp | 8 ++++---- .../examples/Basic_viewer/draw_several_windows.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 01b476b91e2d..665b006feea2 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -54,10 +54,10 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphics_scene graphic_buffer; - CGAL::add_to_graphics_scene(point_set, graphic_buffer, Graphics_scene_options_green_points()); - CGAL::add_to_graphics_scene(output_mesh, graphic_buffer); - CGAL::draw_graphics_scene(graphic_buffer); + CGAL::Graphics_scene scene; + CGAL::add_to_graphics_scene(point_set, scene, Graphics_scene_options_green_points()); + CGAL::add_to_graphics_scene(output_mesh, scene); + CGAL::draw_graphics_scene(scene); } else { return EXIT_FAILURE; } diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index cd387484c1f3..945680df1477 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -47,9 +47,9 @@ int main(void) for(Pwn& it: points) { point_set.insert(it.first); } - CGAL::Graphics_scene graphic_buffer1, graphic_buffer2; - CGAL::add_to_graphics_scene(point_set, graphic_buffer1); - CGAL::add_to_graphics_scene(output_mesh, graphic_buffer2); + CGAL::Graphics_scene scene1, scene2; + CGAL::add_to_graphics_scene(point_set, scene1); + CGAL::add_to_graphics_scene(output_mesh, scene2); /// (2) Qt code that create windows, add them in a layout, and create app. @@ -69,8 +69,8 @@ int main(void) QWidget *centralWidget = new QWidget(mainWindow); QHBoxLayout* layout = new QHBoxLayout(mainWindow); - CGAL::Qt::Basic_viewer bv1(mainWindow, graphic_buffer1); - CGAL::Qt::Basic_viewer bv2(mainWindow, graphic_buffer2); + CGAL::Qt::Basic_viewer bv1(mainWindow, scene1); + CGAL::Qt::Basic_viewer bv2(mainWindow, scene2); bv1.set_draw_vertices(true); layout->addWidget(&bv1); From 525cc0f27ea64470d3b2d10ebd55b845f75793b5 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 14 Nov 2023 09:16:37 +0000 Subject: [PATCH 232/341] Descriptor -> _descriptor --- .../CGAL/Graphics_scene_options.h | 5 +++ .../Concepts/GraphicsSceneOptions.h | 36 +++++++++---------- .../include/CGAL/Graphics_scene_options.h | 10 ++++++ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 5461da7ecb47..21bff4b2a649 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -27,6 +27,11 @@ template ignore_vertex; + std::function ignore_vertex; /// `std::function` that returns `true` if the given edge must be ignored, `false` otherwise. /// Returns `true` by default. - std::function ignore_edge; + std::function ignore_edge; /// `std::function` that returns `true` if the given face must be ignored, `false` otherwise. /// Returns `true` by default. - std::function ignore_face; + std::function ignore_face; /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. - std::function is_vertex_colored; + std::function is_vertex_colored; /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. /// Returns `false` by default. - std::function is_edge_colored; + std::function is_edge_colored; /// `std::function` that returns `true` if the given face is colored, `false` otherwise. /// Returns `false` by default. - std::function is_face_colored; + std::function is_face_colored; /// `std::function` that returns `true` if the given face is in wireframe, `false` otherwise. /// Returns `false` by default. - std::function is_face_wireframe; + std::function is_face_wireframe; /// `std::function` that returns the color of the given vertex. /// `nullptr` by default. - std::function vertex_color; + std::function vertex_color; /// `std::function` that returns the color of the given edge. /// `nullptr` by default. - std::function edge_color; + std::function edge_color; /// `std::function` that returns the color of the given face. /// `nullptr` by default. - std::function face_color; + std::function face_color; /// ignores all vertices when `b` is `true`; otherwise ignores only vertices for which `ignore_vertex()` returns `true`. void ignore_all_vertices(bool b); @@ -101,23 +101,23 @@ class GraphicsSceneOptionsWithVolumes /*! %A descriptor of volumes of `DS`. */ - typedef unspecified_type VolumeDescriptor; + typedef unspecified_type volume_descriptor; /// `std::function` that returns `true` if the given volume must be ignored, `false` otherwise. /// Returns `false` by default. - std::function ignore_volume; + std::function ignore_volume; /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. /// Returns `false` by default. - std::function is_volume_colored; + std::function is_volume_colored; /// `std::function` that returns `true` if the given volume is in wireframe, `false` otherwise. /// Returns `false` by default. - std::function is_volume_wireframe; + std::function is_volume_wireframe; /// `std::function` that returns the color of the given volume. /// `nullptr` by default. - std::function volume_color; + std::function volume_color; /// ignores all volumes when `b` is `true`; otherwise ignore only volumes for which `ignore_volume()` returns `true`. void ignore_all_volumes(bool b); diff --git a/Basic_viewer/include/CGAL/Graphics_scene_options.h b/Basic_viewer/include/CGAL/Graphics_scene_options.h index 6a085c2397f3..d19194beacb1 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/include/CGAL/Graphics_scene_options.h @@ -34,6 +34,11 @@ template struct Graphics_scene_options { + + typedef VertexHandle vertex_descriptor; + typedef EdgeHandle edge_descriptor; + typedef FaceHandle face_descriptor; + Graphics_scene_options(): m_enabled_vertices(true), m_enabled_edges(true), m_enabled_faces(true) @@ -92,6 +97,11 @@ template { + typedef VertexHandle vertex_descriptor; + typedef EdgeHandle edge_descriptor; + typedef FaceHandle face_descriptor; + typedef VolumeHandle volume_descriptor; + Graphics_scene_options() : m_enabled_volumes(true) { draw_volume=[](const DS &, VolumeHandle)->bool { return true; }; From 4e5082b6b59750231a180ea5c9745438f0961b7a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 14 Nov 2023 09:25:00 +0000 Subject: [PATCH 233/341] remove _qt --- Nef_3/include/CGAL/draw_nef_3.h | 2 +- .../include/CGAL/draw_periodic_2_triangulation_2.h | 4 ++-- Point_set_3/include/CGAL/draw_point_set_3.h | 2 +- Polygon/include/CGAL/draw_polygon_2.h | 2 +- Polygon/include/CGAL/draw_polygon_with_holes_2.h | 2 +- Polyhedron/include/CGAL/draw_polyhedron.h | 2 +- Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h | 2 +- Surface_mesh/include/CGAL/draw_surface_mesh.h | 2 +- .../include/CGAL/draw_face_graph_with_paths.h | 2 +- Triangulation_2/include/CGAL/draw_triangulation_2.h | 2 +- Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h | 4 ++-- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index b8d4e37ae87d..452185e26c4c 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -15,7 +15,7 @@ #define DRAW_NEF_3_H #include -#include +#include #include #include #include diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index e11fb2baaffa..7a423e66fae6 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -14,7 +14,7 @@ #define DRAW_PERIODIC_2_TRIANGULATION_2_H #include -#include +#include #include #include #include @@ -247,7 +247,7 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 13fefed8a391..f831c3b73e25 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -15,7 +15,7 @@ #define CGAL_DRAW_POINT_SET_3_H #include -#include +#include #include #include #include diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 971c84ddce4a..1b2b211ac5e7 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -18,7 +18,7 @@ #ifndef CGAL_DRAW_POLYGON_2_H #define CGAL_DRAW_POLYGON_2_H -#include +#include #include #include #include diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 6157b9118d2a..d2c01edf7c70 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -18,7 +18,7 @@ #ifndef CGAL_DRAW_POLYGON_WITH_HOLES_2_H #define CGAL_DRAW_POLYGON_WITH_HOLES_2_H -#include +#include #include #include #include diff --git a/Polyhedron/include/CGAL/draw_polyhedron.h b/Polyhedron/include/CGAL/draw_polyhedron.h index 37d090cabb76..c45ea4e0dd4f 100644 --- a/Polyhedron/include/CGAL/draw_polyhedron.h +++ b/Polyhedron/include/CGAL/draw_polyhedron.h @@ -18,7 +18,7 @@ #include #include #include -#include +#include namespace CGAL { diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index d4766f5a903c..e5efae9c2bee 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_SS2_H #include -#include +#include #include #include #include diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 0641211dc1e4..b6f91ec5d832 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -34,7 +34,7 @@ void draw(const SM& asm); #include #include #include -#include +#include namespace CGAL { diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 43e65312acb3..75e772ac603e 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -15,7 +15,7 @@ #include -#include +#include #include #include diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index f57691b079f1..22141bf7d974 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_T2_H #include -#include +#include #include #include #include diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 2a1cfba81f7d..d7831e8ccdfe 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -14,7 +14,7 @@ #define CGAL_DRAW_VORONOI_DIAGRAM_2_H #include -#include +#include #include #include #include @@ -389,7 +389,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&av2, &gs_options] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&av2, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) From 09b175b63ebfded4b75075e7022649397616b8a9 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 17 Nov 2023 18:48:53 +0100 Subject: [PATCH 234/341] Explain what to do for non colored cells --- Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h index 90741ad58812..1ad90562e2a2 100644 --- a/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h +++ b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h @@ -46,13 +46,16 @@ class GraphicsSceneOptions /// `std::function` that returns `true` if the given vertex is colored, `false` otherwise. /// Returns `false` by default. + /// For non colored vertices, this is the role of the user of a graphic scene to decide which color must be used (cf. for example `Basic_viewer`, `vertices_mono_color`). std::function is_vertex_colored; /// `std::function` that returns `true` if the given edge is colored, `false` otherwise. + /// For non colored edges, this is the role of the user of a graphic scene to decide which color must be used (cf. for example `Basic_viewer`, `edges_mono_color`). /// Returns `false` by default. std::function is_edge_colored; /// `std::function` that returns `true` if the given face is colored, `false` otherwise. + /// For non colored faces, this is the role of the user of a graphic scene to decide which color must be used (cf. for example `Basic_viewer`, `faces_mono_color`). /// Returns `false` by default. std::function is_face_colored; @@ -108,6 +111,7 @@ class GraphicsSceneOptionsWithVolumes std::function ignore_volume; /// `std::function` that returns `true` if the given volume is colored, `false` otherwise. + /// For non colored volumes, this is the role of the user of a graphic scene to decide which color must be used (cf. for example `Basic_viewer`, `faces_mono_color`). /// Returns `false` by default. std::function is_volume_colored; From 8111fdfcd332490dc8cb03578f35d177423c14bd Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 17 Nov 2023 18:56:41 +0100 Subject: [PATCH 235/341] color of volumes --- Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h index 1ad90562e2a2..f845dc792813 100644 --- a/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h +++ b/Basic_viewer/doc/Basic_viewer/Concepts/GraphicsSceneOptions.h @@ -119,7 +119,7 @@ class GraphicsSceneOptionsWithVolumes /// Returns `false` by default. std::function is_volume_wireframe; - /// `std::function` that returns the color of the given volume. + /// `std::function` that returns the color of the given volume, i.e. the color of all the faces of this volume. /// `nullptr` by default. std::function volume_color; From e3ac9932dc1c2c7a3ee20923571891f61f537ad3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 08:34:13 +0100 Subject: [PATCH 236/341] Doc: add a link to qglviewer --- Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index 5ef340bd40dc..34c72f8c70a0 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -7,6 +7,7 @@ namespace CGAL { The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements are added through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +CGAL::QGLViewer is our internal fork of QGLViewer class which is A versatile 3D OpenGL viewer based on QOpenGLWidget. */ class Basic_viewer : public CGAL::QGLViewer { From db97ebbf1f611804442fa1e95617e0bc011e9124 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 09:03:46 +0100 Subject: [PATCH 237/341] Update code according to final doc api --- Basic_viewer/include/CGAL/Graphics_scene.h | 34 +- .../include/CGAL/Graphics_scene_options.h | 88 +- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 852 +++++++++--------- 3 files changed, 487 insertions(+), 487 deletions(-) diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index c6c6b433b91a..4caddad03435 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -13,7 +13,7 @@ #ifndef CGAL_GRAPHICS_SCENE_H #define CGAL_GRAPHICS_SCENE_H -#include +// TODO #include #include #include @@ -231,7 +231,7 @@ class Graphics_scene return false; } - bool is_a_face_started() const + bool a_face_started() const { return m_buffer_for_mono_faces.is_a_face_started() || m_buffer_for_colored_faces.is_a_face_started(); @@ -269,7 +269,21 @@ class Graphics_scene { m_buffer_for_colored_faces.face_end(); } } - bool is_empty() const + template + void add_text(const KPoint &kp, const QString &txt) + { + Local_point p = get_local_point(kp); + m_texts.push_back(std::make_tuple(p, txt)); + } + + template void add_text(const KPoint &kp, const char *txt) + { add_text(kp, QString(txt)); } + + template + void add_text(const KPoint &kp, const std::string &txt) + { add_text(kp, txt.c_str()); } + + bool empty() const { return (m_buffer_for_mono_points.is_empty() && m_buffer_for_colored_points.is_empty() && @@ -361,20 +375,6 @@ class Graphics_scene Local_kernel>::get_local_vector(v); } - template - void add_text(const KPoint &kp, const QString &txt) - { - Local_point p = get_local_point(kp); - m_texts.push_back(std::make_tuple(p, txt)); - } - - template void add_text(const KPoint &kp, const char *txt) - { add_text(kp, QString(txt)); } - - template - void add_text(const KPoint &kp, const std::string &txt) - { add_text(kp, txt.c_str()); } - void m_texts_clear() { m_texts.clear(); } diff --git a/Basic_viewer/include/CGAL/Graphics_scene_options.h b/Basic_viewer/include/CGAL/Graphics_scene_options.h index d19194beacb1..b610665ed40a 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/include/CGAL/Graphics_scene_options.h @@ -20,56 +20,56 @@ namespace CGAL { template + typename VertexDescriptor, + typename EdgeDescriptor, + typename FaceDescriptor, + typename VolumeDescriptor=void> struct Graphics_scene_options; // Drawing functor for a 2D combinatorial data structure // (with vertices, edges and faces) template -struct Graphics_scene_options + typename VertexDescriptor, + typename EdgeDescriptor, + typename FaceDescriptor> +struct Graphics_scene_options { - typedef VertexHandle vertex_descriptor; - typedef EdgeHandle edge_descriptor; - typedef FaceHandle face_descriptor; + typedef VertexDescriptor vertex_descriptor; + typedef EdgeDescriptor edge_descriptor; + typedef FaceDescriptor face_descriptor; Graphics_scene_options(): m_enabled_vertices(true), m_enabled_edges(true), m_enabled_faces(true) { - draw_vertex=[](const DS &, VertexHandle)->bool { return true; }; - draw_edge=[](const DS &, EdgeHandle)->bool { return true; }; - draw_face=[](const DS &, FaceHandle)->bool { return true; }; + draw_vertex=[](const DS &, vertex_descriptor)->bool { return true; }; + draw_edge=[](const DS &, edge_descriptor)->bool { return true; }; + draw_face=[](const DS &, face_descriptor)->bool { return true; }; - colored_vertex=[](const DS &, VertexHandle)->bool { return false; }; - colored_edge=[](const DS &, EdgeHandle)->bool { return false; }; - colored_face=[](const DS &, FaceHandle)->bool { return false; }; + colored_vertex=[](const DS &, vertex_descriptor)->bool { return false; }; + colored_edge=[](const DS &, edge_descriptor)->bool { return false; }; + colored_face=[](const DS &, face_descriptor)->bool { return false; }; - face_wireframe=[](const DS &, FaceHandle)->bool { return false; }; + face_wireframe=[](const DS &, face_descriptor)->bool { return false; }; } // The seven following functions should not be null - std::function draw_vertex; - std::function draw_edge; - std::function draw_face; + std::function draw_vertex; + std::function draw_edge; + std::function draw_face; - std::function colored_vertex; - std::function colored_edge; - std::function colored_face; + std::function colored_vertex; + std::function colored_edge; + std::function colored_face; - std::function face_wireframe; + std::function face_wireframe; // These functions must be non null if the corresponding colored_XXX function // returns true. - std::function vertex_color; - std::function edge_color; - std::function face_color; + std::function vertex_color; + std::function edge_color; + std::function face_color; void disable_vertices() { m_enabled_vertices=false; } void enable_vertices() { m_enabled_vertices=true; } @@ -90,29 +90,29 @@ struct Graphics_scene_options // Drawing functor for a 3D combinatorial data structure // (with vertices, edges, faces and volumes) template + typename VertexDescriptor, + typename EdgeDescriptor, + typename FaceDescriptor, + typename VolumeDescriptor> struct Graphics_scene_options: - public Graphics_scene_options + public Graphics_scene_options { - typedef VertexHandle vertex_descriptor; - typedef EdgeHandle edge_descriptor; - typedef FaceHandle face_descriptor; - typedef VolumeHandle volume_descriptor; + typedef VertexDescriptor vertex_descriptor; + typedef EdgeDescriptor edge_descriptor; + typedef FaceDescriptor face_descriptor; + typedef VolumeDescriptor volume_descriptor; Graphics_scene_options() : m_enabled_volumes(true) { - draw_volume=[](const DS &, VolumeHandle)->bool { return true; }; - colored_volume=[](const DS &, VolumeHandle)->bool { return false; }; - volume_wireframe=[](const DS &, VolumeHandle)->bool { return false; }; + draw_volume=[](const DS &, volume_descriptor)->bool { return true; }; + colored_volume=[](const DS &, volume_descriptor)->bool { return false; }; + volume_wireframe=[](const DS &, volume_descriptor)->bool { return false; }; } - std::function draw_volume; - std::function colored_volume; - std::function volume_wireframe; - std::function volume_color; + std::function draw_volume; + std::function colored_volume; + std::function volume_wireframe; + std::function volume_color; void disable_volumes() { m_enabled_volumes=false; } void enable_volumes() { m_enabled_volumes=true; } diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 60b16ff2b208..73cb5a2f9e61 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -14,7 +14,7 @@ #ifndef CGAL_BASIC_VIEWER_H #define CGAL_BASIC_VIEWER_H -#include +// TODO #include #include #include #include @@ -257,7 +257,7 @@ class Basic_viewer : public CGAL::QGLViewer update(); } - void reverse_normals() + void reverse_all_normals() { m_inverse_normal=!m_inverse_normal; gBuffer.reverse_normals(); @@ -267,111 +267,455 @@ class Basic_viewer : public CGAL::QGLViewer bool is_two_dimensional() const { return !m_no_2D_mode && gBuffer.is_two_dimensional(); } -protected: - void compile_shaders() + virtual void draw() { - rendering_program_face.removeAllShaders(); - rendering_program_p_l.removeAllShaders(); - rendering_program_clipping_plane.removeAllShaders(); + glEnable(GL_DEPTH_TEST); - // Create the buffers - for (unsigned int i=0; imatrix()[i]; } + QVector4D clipPlane = clipping_mMatrix * QVector4D(0.0, 0.0, 1.0, 0.0); + QVector4D plane_point = clipping_mMatrix * QVector4D(0,0,0,1); + if(!m_are_buffers_initialized) + { initialize_buffers(); } - for (unsigned int i=0; i(gBuffer.number_of_elements(GS::POS_MONO_POINTS))); + vao[VAO_MONO_POINTS].release(); - QOpenGLShader *vertex_shader_p_l = new QOpenGLShader(QOpenGLShader::Vertex); - if(!vertex_shader_p_l->compileSourceCode(source_)) - { std::cerr<<"Compiling vertex source FAILED"<(gBuffer.number_of_elements(GS::POS_COLORED_POINTS))); + vao[VAO_COLORED_POINTS].release(); + }; - source_ = isOpenGL_4_3() - ? fragment_source_p_l - : fragment_source_p_l_comp; + enum { + DRAW_ALL = -1, // draw all + DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane + DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane + }; - QOpenGLShader *fragment_shader_p_l= new QOpenGLShader(QOpenGLShader::Fragment); - if(!fragment_shader_p_l->compileSourceCode(source_)) - { std::cerr<<"Compiling fragmentsource FAILED"<(gBuffer.number_of_elements(GS::POS_MONO_SEGMENTS))); + vao[VAO_MONO_SEGMENTS].release(); - QOpenGLShader *vertex_shader_face = new QOpenGLShader(QOpenGLShader::Vertex); - if(!vertex_shader_face->compileSourceCode(source_)) - { std::cerr<<"Compiling vertex source FAILED"<(gBuffer.number_of_elements(GS::POS_COLORED_SEGMENTS))); + vao[VAO_COLORED_SEGMENTS].release(); + }; - source_ = isOpenGL_4_3() - ? fragment_source_color - : fragment_source_color_comp; + enum { + DRAW_ALL = -1, // draw all + DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane + DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane + }; - QOpenGLShader *fragment_shader_face= new QOpenGLShader(QOpenGLShader::Fragment); - if(!fragment_shader_face->compileSourceCode(source_)) - { std::cerr<<"Compiling fragment source FAILED"<compileSourceCode(source_)) - { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + vao[VAO_MONO_RAYS].bind(); + color.setRgbF((double)m_rays_mono_color.red()/(double)255, + (double)m_rays_mono_color.green()/(double)255, + (double)m_rays_mono_color.blue()/(double)255); + rendering_program_p_l.setAttributeValue("color",color); + glLineWidth(m_size_rays); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_RAYS))); + vao[VAO_MONO_RAYS].release(); - source_ = fragment_source_clipping_plane; + vao[VAO_COLORED_RAYS].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_rays_mono_color.red()/(double)255, + (double)m_rays_mono_color.green()/(double)255, + (double)m_rays_mono_color.blue()/(double)255); + rendering_program_p_l.disableAttributeArray("color"); + rendering_program_p_l.setAttributeValue("color",color); + } + else + { + rendering_program_p_l.enableAttributeArray("color"); + } + glLineWidth(m_size_rays); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_RAYS))); + vao[VAO_COLORED_RAYS].release(); - QOpenGLShader *fragment_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Fragment); - if (!fragment_shader_clipping_plane->compileSourceCode(source_)) - { std::cerr << "Compiling fragment source for clipping plane FAILED" << std::endl; } + rendering_program_p_l.release(); + } - if (!rendering_program_clipping_plane.addShader(vertex_shader_clipping_plane)) - { std::cerr << "Adding vertex shader for clipping plane FAILED" << std::endl;} - if (!rendering_program_clipping_plane.addShader(fragment_shader_clipping_plane)) - { std::cerr << "Adding fragment shader for clipping plane FAILED" << std::endl; } - if (!rendering_program_clipping_plane.link()) - { std::cerr << "Linking Program for clipping plane FAILED" << std::endl; } + if(m_draw_lines) + { + rendering_program_p_l.bind(); - } + vao[VAO_MONO_LINES].bind(); + color.setRgbF((double)m_lines_mono_color.red()/(double)255, + (double)m_lines_mono_color.green()/(double)255, + (double)m_lines_mono_color.blue()/(double)255); + rendering_program_p_l.setAttributeValue("color",color); + glLineWidth(m_size_lines); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_LINES))); + vao[VAO_MONO_LINES].release(); - // source_ = isOpenGL_4_3() - // ? vertex_source_clipping_plane - // : vertex_source_clipping_plane_comp; + rendering_program_p_l.release(); - // QOpenGLShader *vertex_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Vertex); - // if (!vertex_shader_clipping_plane->compileSourceCode(source_)) - // { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + vao[VAO_COLORED_LINES].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_lines_mono_color.red()/(double)255, + (double)m_lines_mono_color.green()/(double)255, + (double)m_lines_mono_color.blue()/(double)255); + rendering_program_p_l.disableAttributeArray("color"); + rendering_program_p_l.setAttributeValue("color",color); + } + else + { + rendering_program_p_l.enableAttributeArray("color"); + } + glLineWidth(m_size_lines); + glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_LINES))); + vao[VAO_COLORED_LINES].release(); - // source_ = isOpenGL_4_3() - // ? fragment_source_clipping_plane - // : fragment_source_clipping_plane_comp; + rendering_program_p_l.release(); + } + + // Fix Z-fighting by drawing faces at a depth + GLfloat offset_factor; + GLfloat offset_units; + if (is_two_dimensional()) { + glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &offset_factor); + glGetFloatv(GL_POLYGON_OFFSET_UNITS, &offset_units); + glPolygonOffset(0.1f, 0.9f); + } + + if (m_draw_faces) + { + rendering_program_face.bind(); + + // reference: https://stackoverflow.com/questions/37780345/opengl-how-to-create-order-independent-transparency + // rendering_mode == -1: draw all as solid; + // rendering_mode == 0: draw solid only; + // rendering_mode == 1: draw transparent only; + auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { + + vao[VAO_MONO_FACES].bind(); + color.setRgbF((double)m_faces_mono_color.red()/(double)255, + (double)m_faces_mono_color.green()/(double)255, + (double)m_faces_mono_color.blue()/(double)255); + rendering_program_face.setAttributeValue("color",color); + rendering_program_face.setUniformValue("rendering_mode", rendering_mode); + rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); + rendering_program_face.setUniformValue("clipPlane", clipPlane); + rendering_program_face.setUniformValue("pointPlane", plane_point); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_FACES))); + vao[VAO_MONO_FACES].release(); + + vao[VAO_COLORED_FACES].bind(); + if (m_use_mono_color) + { + color.setRgbF((double)m_faces_mono_color.red()/(double)255, + (double)m_faces_mono_color.green()/(double)255, + (double)m_faces_mono_color.blue()/(double)255); + rendering_program_face.disableAttributeArray("color"); + rendering_program_face.setAttributeValue("color",color); + } + else + { + rendering_program_face.enableAttributeArray("color"); + } + rendering_program_face.setUniformValue("rendering_mode", rendering_mode); + rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); + rendering_program_face.setUniformValue("clipPlane", clipPlane); + rendering_program_face.setUniformValue("pointPlane", plane_point); + glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_FACES))); + vao[VAO_COLORED_FACES].release(); + }; + + auto renderer_clipping_plane = [this](bool clipping_plane_rendering) { + if (!isOpenGL_4_3()) return; + if (!clipping_plane_rendering) return; + // render clipping plane here + rendering_program_clipping_plane.bind(); + vao[VAO_CLIPPING_PLANE].bind(); + glLineWidth(0.1f); + glDrawArrays(GL_LINES, 0, static_cast((m_array_for_clipping_plane.size()/3))); + glLineWidth(1.0f); + vao[VAO_CLIPPING_PLANE].release(); + rendering_program_clipping_plane.release(); + }; + + enum { + DRAW_SOLID_ALL = -1, // draw all mesh in solid mode + DRAW_SOLID_HALF, // draw only the mesh inside the clipping plane as solid + DRAW_TRANSPARENT_HALF // draw only the mesh outside the clipping plane as transparent + }; + + if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF) + { + // The z-buffer will prevent transparent objects from being displayed behind other transparent objects. + // Before rendering all transparent objects, disable z-testing first. + + // 1. draw solid first + renderer(DRAW_SOLID_HALF); + + // 2. draw transparent layer second with back face culling to avoid messy triangles + glDepthMask(false); //disable z-testing + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CW); + renderer(DRAW_TRANSPARENT_HALF); + + // 3. draw solid again without culling and blend to make sure the solid mesh is visible + glDepthMask(true); //enable z-testing + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + renderer(DRAW_SOLID_HALF); + + // 4. render clipping plane here + renderer_clipping_plane(clipping_plane_rendering); + } + else if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_WIRE_HALF || + m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) + { + // 1. draw solid HALF + renderer(DRAW_SOLID_HALF); + + // 2. render clipping plane here + renderer_clipping_plane(clipping_plane_rendering); + } + else + { + // 1. draw solid FOR ALL + renderer(DRAW_SOLID_ALL); + } + + if (is_two_dimensional()) + glPolygonOffset(offset_factor, offset_units); + + rendering_program_face.release(); + } + + if (m_draw_text) + { + glDisable(GL_LIGHTING); + for (std::size_t i=0; iprojectedCoordinatesOf + (CGAL::qglviewer::Vec(std::get<0>(m_texts_vec[i]).x(), + std::get<0>(m_texts_vec[i]).y(), + std::get<0>(m_texts_vec[i]).z())); + + drawText((int)screenPos[0], (int)screenPos[1], std::get<1>(m_texts_vec[i])); + } + glEnable(GL_LIGHTING); + } + + // Multiply matrix to get in the frame coordinate system. + // glMultMatrixd(manipulatedFrame()->matrix()); // Linker error + // Scale down the drawings + // glScalef(0.3f, 0.3f, 0.3f); // Linker error + // Draw an axis using the QGLViewer static function + // drawAxis(); + } + +protected: + void compile_shaders() + { + rendering_program_face.removeAllShaders(); + rendering_program_p_l.removeAllShaders(); + rendering_program_clipping_plane.removeAllShaders(); + + // Create the buffers + for (unsigned int i=0; icompileSourceCode(source_)) + { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(source_)) + { std::cerr<<"Compiling fragmentsource FAILED"<compileSourceCode(source_)) + { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(source_)) + { std::cerr<<"Compiling fragment source FAILED"<compileSourceCode(source_)) + { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + + source_ = fragment_source_clipping_plane; + + QOpenGLShader *fragment_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Fragment); + if (!fragment_shader_clipping_plane->compileSourceCode(source_)) + { std::cerr << "Compiling fragment source for clipping plane FAILED" << std::endl; } + + if (!rendering_program_clipping_plane.addShader(vertex_shader_clipping_plane)) + { std::cerr << "Adding vertex shader for clipping plane FAILED" << std::endl;} + if (!rendering_program_clipping_plane.addShader(fragment_shader_clipping_plane)) + { std::cerr << "Adding fragment shader for clipping plane FAILED" << std::endl; } + if (!rendering_program_clipping_plane.link()) + { std::cerr << "Linking Program for clipping plane FAILED" << std::endl; } + + } + + // source_ = isOpenGL_4_3() + // ? vertex_source_clipping_plane + // : vertex_source_clipping_plane_comp; + + // QOpenGLShader *vertex_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Vertex); + // if (!vertex_shader_clipping_plane->compileSourceCode(source_)) + // { std::cerr << "Compiling vertex source for clipping plane FAILED" << std::endl; } + + // source_ = isOpenGL_4_3() + // ? fragment_source_clipping_plane + // : fragment_source_clipping_plane_comp; // QOpenGLShader *fragment_shader_clipping_plane = new QOpenGLShader(QOpenGLShader::Fragment); // if (!fragment_shader_clipping_plane->compileSourceCode(source_)) @@ -789,350 +1133,6 @@ class Basic_viewer : public CGAL::QGLViewer } } - virtual void draw() - { - glEnable(GL_DEPTH_TEST); - - QMatrix4x4 clipping_mMatrix; - clipping_mMatrix.setToIdentity(); - for(int i=0; i< 16 ; i++) - { clipping_mMatrix.data()[i] = m_frame_plane->matrix()[i]; } - QVector4D clipPlane = clipping_mMatrix * QVector4D(0.0, 0.0, 1.0, 0.0); - QVector4D plane_point = clipping_mMatrix * QVector4D(0,0,0,1); - if(!m_are_buffers_initialized) - { initialize_buffers(); } - - QColor color; - attrib_buffers(this); - - if(m_draw_vertices) - { - rendering_program_p_l.bind(); - - // rendering_mode == -1: draw all - // rendering_mode == 0: draw inside clipping plane - // rendering_mode == 1: draw outside clipping plane - auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { - vao[VAO_MONO_POINTS].bind(); - color.setRgbF((double)m_vertices_mono_color.red()/(double)255, - (double)m_vertices_mono_color.green()/(double)255, - (double)m_vertices_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); - rendering_program_p_l.setUniformValue("clipPlane", clipPlane); - rendering_program_p_l.setUniformValue("pointPlane", plane_point); - rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_POINTS))); - vao[VAO_MONO_POINTS].release(); - - vao[VAO_COLORED_POINTS].bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_vertices_mono_color.red()/(double)255, - (double)m_vertices_mono_color.green()/(double)255, - (double)m_vertices_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); - rendering_program_p_l.setAttributeValue("color",color); - } - else - { - rendering_program_p_l.enableAttributeArray("color"); - } - rendering_program_p_l.setUniformValue("point_size", GLfloat(m_size_points)); - rendering_program_p_l.setUniformValue("clipPlane", clipPlane); - rendering_program_p_l.setUniformValue("pointPlane", plane_point); - rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glDrawArrays(GL_POINTS, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_POINTS))); - vao[VAO_COLORED_POINTS].release(); - }; - - enum { - DRAW_ALL = -1, // draw all - DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane - DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane - }; - - if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) - { - renderer(DRAW_INSIDE_ONLY); - } - else - { - renderer(DRAW_ALL); - } - - rendering_program_p_l.release(); - } - - if(m_draw_edges) - { - rendering_program_p_l.bind(); - - // rendering_mode == -1: draw all - // rendering_mode == 0: draw inside clipping plane - // rendering_mode == 1: draw outside clipping plane - auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { - vao[VAO_MONO_SEGMENTS].bind(); - color.setRgbF((double)m_edges_mono_color.red()/(double)255, - (double)m_edges_mono_color.green()/(double)255, - (double)m_edges_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - rendering_program_p_l.setUniformValue("clipPlane", clipPlane); - rendering_program_p_l.setUniformValue("pointPlane", plane_point); - rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_SEGMENTS))); - vao[VAO_MONO_SEGMENTS].release(); - - vao[VAO_COLORED_SEGMENTS].bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_edges_mono_color.red()/(double)255, - (double)m_edges_mono_color.green()/(double)255, - (double)m_edges_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); - rendering_program_p_l.setAttributeValue("color",color); - } - else - { - rendering_program_p_l.enableAttributeArray("color"); - } - rendering_program_p_l.setUniformValue("clipPlane", clipPlane); - rendering_program_p_l.setUniformValue("pointPlane", plane_point); - rendering_program_p_l.setUniformValue("rendering_mode", rendering_mode); - glLineWidth(m_size_edges); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_SEGMENTS))); - vao[VAO_COLORED_SEGMENTS].release(); - }; - - enum { - DRAW_ALL = -1, // draw all - DRAW_INSIDE_ONLY, // draw only the part inside the clipping plane - DRAW_OUTSIDE_ONLY // draw only the part outside the clipping plane - }; - - if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) - { - renderer(DRAW_INSIDE_ONLY); - } - else - { - renderer(DRAW_ALL); - } - - rendering_program_p_l.release(); - } - - if(m_draw_rays) - { - rendering_program_p_l.bind(); - - vao[VAO_MONO_RAYS].bind(); - color.setRgbF((double)m_rays_mono_color.red()/(double)255, - (double)m_rays_mono_color.green()/(double)255, - (double)m_rays_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_RAYS))); - vao[VAO_MONO_RAYS].release(); - - vao[VAO_COLORED_RAYS].bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_rays_mono_color.red()/(double)255, - (double)m_rays_mono_color.green()/(double)255, - (double)m_rays_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); - rendering_program_p_l.setAttributeValue("color",color); - } - else - { - rendering_program_p_l.enableAttributeArray("color"); - } - glLineWidth(m_size_rays); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_RAYS))); - vao[VAO_COLORED_RAYS].release(); - - rendering_program_p_l.release(); - } - - if(m_draw_lines) - { - rendering_program_p_l.bind(); - - vao[VAO_MONO_LINES].bind(); - color.setRgbF((double)m_lines_mono_color.red()/(double)255, - (double)m_lines_mono_color.green()/(double)255, - (double)m_lines_mono_color.blue()/(double)255); - rendering_program_p_l.setAttributeValue("color",color); - glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_LINES))); - vao[VAO_MONO_LINES].release(); - - rendering_program_p_l.release(); - - vao[VAO_COLORED_LINES].bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_lines_mono_color.red()/(double)255, - (double)m_lines_mono_color.green()/(double)255, - (double)m_lines_mono_color.blue()/(double)255); - rendering_program_p_l.disableAttributeArray("color"); - rendering_program_p_l.setAttributeValue("color",color); - } - else - { - rendering_program_p_l.enableAttributeArray("color"); - } - glLineWidth(m_size_lines); - glDrawArrays(GL_LINES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_LINES))); - vao[VAO_COLORED_LINES].release(); - - rendering_program_p_l.release(); - } - - // Fix Z-fighting by drawing faces at a depth - GLfloat offset_factor; - GLfloat offset_units; - if (is_two_dimensional()) { - glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &offset_factor); - glGetFloatv(GL_POLYGON_OFFSET_UNITS, &offset_units); - glPolygonOffset(0.1f, 0.9f); - } - - if (m_draw_faces) - { - rendering_program_face.bind(); - - // reference: https://stackoverflow.com/questions/37780345/opengl-how-to-create-order-independent-transparency - // rendering_mode == -1: draw all as solid; - // rendering_mode == 0: draw solid only; - // rendering_mode == 1: draw transparent only; - auto renderer = [this, &color, &clipPlane, &plane_point](float rendering_mode) { - - vao[VAO_MONO_FACES].bind(); - color.setRgbF((double)m_faces_mono_color.red()/(double)255, - (double)m_faces_mono_color.green()/(double)255, - (double)m_faces_mono_color.blue()/(double)255); - rendering_program_face.setAttributeValue("color",color); - rendering_program_face.setUniformValue("rendering_mode", rendering_mode); - rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); - rendering_program_face.setUniformValue("clipPlane", clipPlane); - rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_MONO_FACES))); - vao[VAO_MONO_FACES].release(); - - vao[VAO_COLORED_FACES].bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_faces_mono_color.red()/(double)255, - (double)m_faces_mono_color.green()/(double)255, - (double)m_faces_mono_color.blue()/(double)255); - rendering_program_face.disableAttributeArray("color"); - rendering_program_face.setAttributeValue("color",color); - } - else - { - rendering_program_face.enableAttributeArray("color"); - } - rendering_program_face.setUniformValue("rendering_mode", rendering_mode); - rendering_program_face.setUniformValue("rendering_transparency", clipping_plane_rendering_transparency); - rendering_program_face.setUniformValue("clipPlane", clipPlane); - rendering_program_face.setUniformValue("pointPlane", plane_point); - glDrawArrays(GL_TRIANGLES, 0, static_cast(gBuffer.number_of_elements(GS::POS_COLORED_FACES))); - vao[VAO_COLORED_FACES].release(); - }; - - auto renderer_clipping_plane = [this](bool clipping_plane_rendering) { - if (!isOpenGL_4_3()) return; - if (!clipping_plane_rendering) return; - // render clipping plane here - rendering_program_clipping_plane.bind(); - vao[VAO_CLIPPING_PLANE].bind(); - glLineWidth(0.1f); - glDrawArrays(GL_LINES, 0, static_cast((m_array_for_clipping_plane.size()/3))); - glLineWidth(1.0f); - vao[VAO_CLIPPING_PLANE].release(); - rendering_program_clipping_plane.release(); - }; - - enum { - DRAW_SOLID_ALL = -1, // draw all mesh in solid mode - DRAW_SOLID_HALF, // draw only the mesh inside the clipping plane as solid - DRAW_TRANSPARENT_HALF // draw only the mesh outside the clipping plane as transparent - }; - - if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_TRANSPARENT_HALF) - { - // The z-buffer will prevent transparent objects from being displayed behind other transparent objects. - // Before rendering all transparent objects, disable z-testing first. - - // 1. draw solid first - renderer(DRAW_SOLID_HALF); - - // 2. draw transparent layer second with back face culling to avoid messy triangles - glDepthMask(false); //disable z-testing - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glFrontFace(GL_CW); - renderer(DRAW_TRANSPARENT_HALF); - - // 3. draw solid again without culling and blend to make sure the solid mesh is visible - glDepthMask(true); //enable z-testing - glDisable(GL_CULL_FACE); - glDisable(GL_BLEND); - renderer(DRAW_SOLID_HALF); - - // 4. render clipping plane here - renderer_clipping_plane(clipping_plane_rendering); - } - else if (m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_WIRE_HALF || - m_use_clipping_plane == CLIPPING_PLANE_SOLID_HALF_ONLY) - { - // 1. draw solid HALF - renderer(DRAW_SOLID_HALF); - - // 2. render clipping plane here - renderer_clipping_plane(clipping_plane_rendering); - } - else - { - // 1. draw solid FOR ALL - renderer(DRAW_SOLID_ALL); - } - - if (is_two_dimensional()) - glPolygonOffset(offset_factor, offset_units); - - rendering_program_face.release(); - } - - if (m_draw_text) - { - glDisable(GL_LIGHTING); - for (std::size_t i=0; iprojectedCoordinatesOf - (CGAL::qglviewer::Vec(std::get<0>(m_texts_vec[i]).x(), - std::get<0>(m_texts_vec[i]).y(), - std::get<0>(m_texts_vec[i]).z())); - - drawText((int)screenPos[0], (int)screenPos[1], std::get<1>(m_texts_vec[i])); - } - glEnable(GL_LIGHTING); - } - - // Multiply matrix to get in the frame coordinate system. - // glMultMatrixd(manipulatedFrame()->matrix()); // Linker error - // Scale down the drawings - // glScalef(0.3f, 0.3f, 0.3f); // Linker error - // Draw an axis using the QGLViewer static function - // drawAxis(); - } - virtual void init() { set_camera_mode(); From d2d114cf2473839693d0aba3cef6408d6c7affe9 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 09:33:28 +0100 Subject: [PATCH 238/341] Update code to follow last api --- Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp | 2 +- .../examples/Basic_viewer/draw_surface_mesh_small_faces.cpp | 2 +- Basic_viewer/include/CGAL/Graphics_scene.h | 6 +++--- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 4 ++-- Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h | 2 +- Nef_3/include/CGAL/draw_nef_3.h | 2 +- .../include/CGAL/draw_periodic_2_triangulation_2.h | 2 +- Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h | 6 +++--- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index 945680df1477..e1680f30eccc 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -71,7 +71,7 @@ int main(void) CGAL::Qt::Basic_viewer bv1(mainWindow, scene1); CGAL::Qt::Basic_viewer bv2(mainWindow, scene2); - bv1.set_draw_vertices(true); + bv1.draw_vertices(true); layout->addWidget(&bv1); layout->addWidget(&bv2); diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index aba2a0e1b037..555363d72711 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -106,7 +106,7 @@ int main(int argc, char* argv[]) if(app) { app.basic_viewer().on_key_pressed= - [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Basic_viewer_qt* basic_viewer) -> bool + [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index 4caddad03435..fd9b2bd9ed74 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -239,7 +239,7 @@ class Graphics_scene void face_begin() { - if (is_a_face_started()) + if (a_face_started()) { std::cerr << "You cannot start a new face before to finish the previous one." @@ -251,7 +251,7 @@ class Graphics_scene void face_begin(const CGAL::IO::Color &acolor) { - if (is_a_face_started()) + if (a_face_started()) { std::cerr << "You cannot start a new face before to finish the previous one." @@ -342,7 +342,7 @@ class Graphics_scene // Returns true if the data structure lies on a XY or XZ or YZ plane bool is_two_dimensional() const { - return (!is_empty() && (has_zero_x() || has_zero_y() || has_zero_z())); + return (!empty() && (has_zero_x() || has_zero_y() || has_zero_z())); } void clear() diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 73cb5a2f9e61..82187ce85ae6 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -155,7 +155,7 @@ class Basic_viewer : public CGAL::QGLViewer resize(CGAL_BASIC_VIEWER_INIT_SIZE_X, CGAL_BASIC_VIEWER_INIT_SIZE_Y); if (inverse_normal) - { reverse_normals(); } + { reverse_all_normals(); } } ~Basic_viewer() @@ -1254,7 +1254,7 @@ class Basic_viewer : public CGAL::QGLViewer } else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton)) { - reverse_normals(); + reverse_all_normals(); displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); redraw(); } diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index d95561e83e0f..0d83d0a4a529 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -164,7 +164,7 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer */ virtual void add_elements() { - this->clear(); + graphics_scene.clear(); std::vector pwhs; m_ps.polygons_with_holes(std::back_inserter(pwhs)); for (const auto& pwh : pwhs) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 452185e26c4c..833db0d0188d 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -232,7 +232,7 @@ void compute_elements(const Nef_Polyhedron &nef, { nef.visit_shell_objects(SFace_const_handle(it), V); } } - graphics_scene.negate_all_normals(); + graphics_scene.reverse_all_normals(); } } // namespace draw_function_for_nef_polyhedron diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index 7a423e66fae6..aca45e789d1e 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -41,7 +41,7 @@ struct Graphics_scene_options_periodic_2_triangulation_2 : { return m_draw_domain; } void set_draw_domain(bool b) { m_draw_domain=b; } - void negate_draw_domain() + void toggle_draw_domain() { m_draw_domain=!m_draw_domain; } typename DS::Iterator_type current_display_type() const diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index d7831e8ccdfe..831a66810849 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -46,12 +46,12 @@ struct Graphics_scene_options_voronoi : void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } - void negate_draw_voronoi_vertices() { m_draw_voronoi_vertices=!m_draw_voronoi_vertices; } + void toggle_draw_voronoi_vertices() { m_draw_voronoi_vertices=!m_draw_voronoi_vertices; } void disable_dual_vertices() { m_draw_dual_vertices=false; } void enable_dual_vertices() { m_draw_dual_vertices=true; } bool are_dual_vertices_enabled() const { return m_draw_dual_vertices; } - void negate_draw_dual_vertices() { m_draw_dual_vertices=!m_draw_dual_vertices; } + void toggle_draw_dual_vertices() { m_draw_dual_vertices=!m_draw_dual_vertices; } CGAL::IO::Color dual_vertex_color; CGAL::IO::Color ray_color; @@ -394,7 +394,7 @@ void draw(const CGAL_VORONOI_TYPE& av2, const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { - basic_viewer->negate_draw_rays(); + basic_viewer->toggle_draw_rays(); basic_viewer->displayMessage (QString("Draw rays=%1.").arg(basic_viewer->get_draw_rays()?"true":"false")); From db9ca1a3fbd51b2a7a00c58f97cbca50f8c1adad Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 09:37:36 +0100 Subject: [PATCH 239/341] reverse all normals --- Basic_viewer/include/CGAL/Graphics_scene.h | 2 +- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index fd9b2bd9ed74..1d1def2810b4 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -158,7 +158,7 @@ class Graphics_scene update_bounding_box(lp.bbox() + (lp + lv).bbox() + (lp + lpv).bbox()); } - void reverse_normals() const + void reverse_all_normals() const { m_buffer_for_mono_faces.negate_normals(); m_buffer_for_colored_faces.negate_normals(); diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 82187ce85ae6..4d54c9958e2f 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -260,7 +260,7 @@ class Basic_viewer : public CGAL::QGLViewer void reverse_all_normals() { m_inverse_normal=!m_inverse_normal; - gBuffer.reverse_normals(); + gBuffer.reverse_all_normals(); } // Returns true if the data structure lies on a plane From 12e7492f33ed55264266ea9f8b798236d08bc1b1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 10:19:19 +0100 Subject: [PATCH 240/341] update draw --- .../CGAL/draw_periodic_2_triangulation_2.h | 10 ++++------ .../include/CGAL/draw_voronoi_diagram_2.h | 18 +++++++----------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index aca45e789d1e..c3a7bafca673 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -242,12 +242,12 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, typename CGAL_P2T2_TYPE::Periodic_triangle_iterator> gs_options; add_to_graphics_scene(ap2t2, buffer, gs_options); - QApplication_and_basic_viewer app(buffer, title); + CGAL::Qt::QApplication_and_basic_viewer app(buffer, title); if(app) { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&ap2t2, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool + [&ap2t2, &buffer, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -258,10 +258,8 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, (gs_options.current_display_type()==1?"Unique": (gs_options.current_display_type()==2?"Stored cover": "Unique cover")))); - basic_viewer->clear(); - draw_function_for_P2T2::compute_elements(ap2t2, - basic_viewer->get_graphics_scene(), - gs_options); + buffer.clear(); + draw_function_for_P2T2::compute_elements(ap2t2, buffer, gs_options); basic_viewer->redraw(); } else diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 831a66810849..79c3501bf81e 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -384,19 +384,19 @@ void draw(const CGAL_VORONOI_TYPE& av2, add_to_graphics_scene(av2, buffer, gs_options); - QApplication_and_basic_viewer app(buffer, title); + CGAL::Qt::QApplication_and_basic_viewer app(buffer, title); if(app) { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&av2, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool + [&av2, &buffer, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_R) && (modifiers == ::Qt::NoButton)) { basic_viewer->toggle_draw_rays(); basic_viewer->displayMessage - (QString("Draw rays=%1.").arg(basic_viewer->get_draw_rays()?"true":"false")); + (QString("Draw rays=%1.").arg(basic_viewer->draw_rays()?"true":"false")); basic_viewer->redraw(); } @@ -410,10 +410,8 @@ void draw(const CGAL_VORONOI_TYPE& av2, (QString("Voronoi vertices=%1."). arg(gs_options.are_voronoi_vertices_enabled()?"true":"false")); - basic_viewer->clear(); - draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphics_scene(), - gs_options); + buffer.clear(); + draw_function_for_v2::compute_elements(av2, buffer, gs_options); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -425,10 +423,8 @@ void draw(const CGAL_VORONOI_TYPE& av2, basic_viewer->displayMessage(QString("Dual vertices=%1."). arg(gs_options.are_dual_vertices_enabled()?"true":"false")); - basic_viewer->clear(); - draw_function_for_v2::compute_elements(av2, - basic_viewer->get_graphics_scene(), - gs_options); + buffer.clear(); + draw_function_for_v2::compute_elements(av2, buffer, gs_options); basic_viewer->redraw(); } else From c379872a79a38e365f8cb364f3bd5ec2e0ee6106 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 20 Nov 2023 18:24:17 +0100 Subject: [PATCH 241/341] draw polygon set --- .../include/CGAL/draw_polygon_set_2.h | 181 ++++++++++++++---- Polygon/include/CGAL/draw_polygon_2.h | 44 ++--- 2 files changed, 163 insertions(+), 62 deletions(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 0d83d0a4a529..c735670a4bd1 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -46,6 +46,41 @@ void draw(const PS& aps); namespace CGAL { +template +struct Graphics_scene_options_polygon_set_2 : + public CGAL::Graphics_scene_options +{ + void unbounded_face_color(const CGAL::IO::Color& c) + { m_unbounded_face_color=c; } + const CGAL::IO::Color& unbounded_face_color() const + { return m_unbounded_face_color; } + + bool draw_unbounded() const + { return m_draw_unbounded; } + void draw_unbounded(bool b) const + { m_draw_unbounded=b; } + void toggle_draw_unbounded() + { m_draw_unbounded=!m_draw_unbounded; } + + int height() const + { return m_height; } + int width() const + { return m_width; } + + void height(int i) + { m_height=i; } + void width(int i) + { m_width=i; } + +protected: + bool m_draw_unbounded=true; + CGAL::IO::Color m_unbounded_face_color=CGAL::IO::Color(75,160,255); + int m_width=0, m_height=0; +}; + namespace draw_function_for_boolean_set_2 { template @@ -53,23 +88,57 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, CGAL::Graphics_scene& gs, const GSOptions& gso) { - if (hole) + if (gso.are_faces_enabled() && hole) { gs.add_point_in_face(p.vertex(p.size()-1)); } auto prev = p.vertices_begin(); auto it = prev; - gs.add_point(*it); - gs.add_point_in_face(*it); - for (++it; it != p.vertices_end(); ++it) + + if (gso.are_vertices_enabled() && + gso.draw_vertex(p, it)) + { + if(gso.colored_vertex(p, it)) + { gs.add_point(*it, gso.vertex_color(p, it)); } + else + { gs.add_point(*it); } + } + + if (gso.are_faces_enabled()) + { gs.add_point_in_face(*it); } + + for (++it; it!=p.vertices_end(); ++it) { - gs.add_point(*it); // add vertex - gs.add_segment(*prev, *it); // add segment with previous point - gs.add_point_in_face(*it); // add point in face + if (gso.are_vertices_enabled() && + gso.draw_vertex(p, it)) + { // Add point + if(gso.colored_vertex(p, it)) + { gs.add_point(*it, gso.vertex_color(p, it)); } + else + { gs.add_point(*it); } + } + + if (gso.are_edges_enabled() && + gso.draw_edge(p, prev)) + { // Add segment with previous point + if(gso.colored_edge(p, prev)) + { gs.add_segment(*prev, *it, gso.edge_color(p, prev)); } + else + { gs.add_segment(*prev, *it); } + } + + if (gso.are_faces_enabled()) + { gs.add_point_in_face(*it); } // add point in face prev = it; } - // Add the last segment between the last point and the first one - gs.add_segment(*prev, *(p.vertices_begin())); + if (gso.are_edges_enabled() && + gso.draw_edge(p, prev)) + { // Add the last segment between the last point and the first one + if(gso.colored_edge(p, prev)) + { gs.add_segment(*prev, *(p.vertices_begin()), gso.edge_color(p, prev)); } + else + { gs.add_segment(*prev, *(p.vertices_begin())); } + } } /// Compute the elements of a polygon with holes. @@ -80,41 +149,44 @@ void compute_elements(const PWH& pwh, { if (!gso.draw_unbounded() && pwh.outer_boundary().is_empty()) return; - CGAL::IO::Color c(75,160,255); - gs.face_begin(c); + if (gso.are_faces_enabled()) + { gs.face_begin(gso.unbounded_face_color()); } - const typename PWH::Point_2* point_in_face; - if (pwh.outer_boundary().is_empty()) + using Pnt=typename PWH::Polygon_2::Point_2; + const Pnt* point_in_face=nullptr; + if (pwh.outer_boundary().is_empty() && (gso.width()!=0 || gso.height()!=0)) { typename PWH::Polygon_2 pgn; pgn.push_back(Pnt(-gso.width(), -gso.height())); pgn.push_back(Pnt(gso.width(), -gso.height())); pgn.push_back(Pnt(gso.width(), gso.height())); pgn.push_back(Pnt(-gso.width(), gso.height())); - compute_loop(pgn, false, gs); + draw_function_for_boolean_set_2::compute_loop(pgn, false, gs, gso); point_in_face = &(pgn.vertex(pgn.size()-1)); } else { const auto& outer_boundary = pwh.outer_boundary(); - compute_loop(outer_boundary, false, gs); + draw_function_for_boolean_set_2::compute_loop(outer_boundary, false, gs, gso); point_in_face = &(outer_boundary.vertex(outer_boundary.size()-1)); } for (auto it = pwh.holes_begin(); it != pwh.holes_end(); ++it) { - compute_loop(*it, true, gs); - gs.add_point_in_face(*point_in_face); + draw_function_for_boolean_set_2::compute_loop(*it, true, gs, gso); + if (gso.are_faces_enabled()) + { gs.add_point_in_face(*point_in_face); } } - gs.face_end(); + if (gso.are_faces_enabled()) + { gs.face_end(); } } } // End namespace draw_function_for_boolean_set_2 #ifdef CGAL_USE_BASIC_VIEWER -template +template class Polygon_set_2_basic_viewer_qt : public Basic_viewer { using Base = Basic_viewer; @@ -125,12 +197,11 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer public: Polygon_set_2_basic_viewer_qt(QWidget* parent, const Ps& ps, - const char* title = "Basic Polygon_set_2 Viewer", - bool draw_unbounded = false, - bool draw_vertices = false) : - Base(parent, graphics_scene, title, draw_vertices), + GSOptions& gs_options, + const char* title = "Basic Polygon_set_2 Viewer") : + Base(parent, graphics_scene, title), m_ps(ps), - m_draw_unbounded(draw_unbounded) + gso(gs_options) { if (ps.is_empty()) return; @@ -146,11 +217,12 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer */ virtual void resizeGL(int width, int height) { CGAL::QGLViewer::resizeGL(width, height); - m_width = width; - m_height = height; + gso.width(width); + gso.height(height); CGAL::qglviewer::Vec p; auto ratio = this->camera()->pixelGLRatio(p); - if (ratio != m_pixel_ratio) { + if (ratio != m_pixel_ratio) + { m_pixel_ratio = ratio; add_elements(); } @@ -168,7 +240,7 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer std::vector pwhs; m_ps.polygons_with_holes(std::back_inserter(pwhs)); for (const auto& pwh : pwhs) - { compute_elements(pwh, graphics_scene, graphics_scene_options); } + { draw_function_for_boolean_set_2::compute_elements(pwh, graphics_scene, gso); } } /*! Compute the bounding box. @@ -205,15 +277,37 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer bool m_draw_unbounded = false; Graphics_scene graphics_scene; - Graphics_scene_options graphics_scene_options; + GSOptions& gso; }; -// Specialization of draw function. +#endif // CGAL_USE_BASIC_VIEWER + +#define CGAL_PS2_TYPE CGAL::Polygon_set_2 + +// Specializations of add_to_graphics_scene function +template +void add_to_graphics_scene(const CGAL_PS2_TYPE& ap2, + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso) +{ draw_function_for_boolean_set_2::compute_elements(ap2, graphics_scene, gso); } + template -void draw(const CGAL::Polygon_set_2& ps, - const char* title = "Polygon_set_2 Basic Viewer", - bool draw_vertices = false, - bool draw_unbounded = false) +void add_to_graphics_scene(const CGAL_PS2_TYPE& ap2, + CGAL::Graphics_scene &graphics_scene) +{ + CGAL::Graphics_scene_options_polygon_set_2 gso; + draw_function_for_boolean_set_2::compute_elements(ap2, graphics_scene, gso); +} + +#ifdef CGAL_USE_BASIC_VIEWER + +// Specialization of draw function. +template +void draw(const CGAL_PS2_TYPE& ps, GSOptions& gso, + const char* title = "Polygon_set_2 Basic Viewer") { #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; @@ -224,21 +318,30 @@ void draw(const CGAL::Polygon_set_2& ps, if (! cgal_test_suite) { using Ps = CGAL::Polygon_set_2; - using Viewer = Polygon_set_2_basic_viewer_qt; + using Viewer = Polygon_set_2_basic_viewer_qt; CGAL::Qt::init_ogl_context(4,3); int argc = 1; const char* argv[2] = {"t2_viewer", nullptr}; QApplication app(argc, const_cast(argv)); - Viewer basic_viewer(app.activeWindow(), ps, - title, draw_unbounded, draw_vertices); - basic_viewer.add_elements(); + Viewer basic_viewer(app.activeWindow(), ps, gso, title); basic_viewer.show(); app.exec(); } } -} // End namespace CGAL +template +void draw(const CGAL_PS2_TYPE& ps, + const char* title = "Polygon_set_2 Basic Viewer") +{ + CGAL::Graphics_scene_options_polygon_set_2 gso; + draw(ps, gso, title); +} #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // CGAL_DRAW_POLYGON_SET_2_H diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 1b2b211ac5e7..42ef92d12c62 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -49,17 +49,17 @@ namespace draw_function_for_p2 { template void compute_elements(const P2& p2, CGAL::Graphics_scene &graphics_scene, - const GSOptions& gs_options) + const GSOptions& gso) { if (p2.is_empty()) return; typename P2::Point_2 prev=p2.vertex(p2.size()-1); - if (gs_options.are_faces_enabled()) + if (gso.are_faces_enabled()) { - if(gs_options.colored_face(p2, nullptr)) - { graphics_scene.face_begin(gs_options.face_color(p2, nullptr)); } + if(gso.colored_face(p2, nullptr)) + { graphics_scene.face_begin(gso.face_color(p2, nullptr)); } else { graphics_scene.face_begin(); } } @@ -67,31 +67,31 @@ void compute_elements(const P2& p2, for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); i!=p2.vertices_end(); ++i) { - if(gs_options.are_vertices_enabled() && - gs_options.draw_vertex(p2, i)) + if(gso.are_vertices_enabled() && + gso.draw_vertex(p2, i)) { // Add vertex - if(gs_options.colored_vertex(p2, i)) - { graphics_scene.add_point(*i, gs_options.vertex_color(p2, i)); } + if(gso.colored_vertex(p2, i)) + { graphics_scene.add_point(*i, gso.vertex_color(p2, i)); } else { graphics_scene.add_point(*i); } } - if(gs_options.are_edges_enabled() && - gs_options.draw_edge(p2, i)) + if(gso.are_edges_enabled() && + gso.draw_edge(p2, i)) { // Add edge with previous point - if(gs_options.colored_vertex(p2, i)) - { graphics_scene.add_segment(prev, *i, gs_options.edge_color(p2, i)); } + if(gso.colored_edge(p2, i)) + { graphics_scene.add_segment(prev, *i, gso.edge_color(p2, i)); } else { graphics_scene.add_segment(prev, *i); } } - if(gs_options.are_faces_enabled()) + if(gso.are_faces_enabled()) { graphics_scene.add_point_in_face(*i); } // Add point in face prev = *i; } - if (gs_options.are_faces_enabled()) + if (gso.are_faces_enabled()) { graphics_scene.face_end(); } } @@ -100,12 +100,11 @@ void compute_elements(const P2& p2, #define CGAL_P2_TYPE CGAL::Polygon_2 // Specializations of add_to_graphics_scene function - template void add_to_graphics_scene(const CGAL_P2_TYPE& ap2, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options) -{ draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); } + const GSOptions& gso) +{ draw_function_for_p2::compute_elements(ap2, graphics_scene, gso); } template void add_to_graphics_scene(const CGAL_P2_TYPE& ap2, @@ -114,14 +113,13 @@ void add_to_graphics_scene(const CGAL_P2_TYPE& ap2, CGAL::Graphics_scene_options gs_options; - draw_function_for_p2::compute_elements(ap2, graphics_scene, gs_options); + void*> gso; + draw_function_for_p2::compute_elements(ap2, graphics_scene, gso); } -// Specialization of draw function. - #ifdef CGAL_USE_BASIC_VIEWER +// Specialization of draw function. template void draw(const CGAL_P2_TYPE &ap2, const char *title="Polygon_2 Basic Viewer") @@ -133,11 +131,11 @@ void draw(const CGAL_P2_TYPE &ap2, template void draw(const CGAL_P2_TYPE &ap2, - const GSOptions& gs_options, + const GSOptions& gso, const char *title="Polygon_2 Basic Viewer") { CGAL::Graphics_scene buffer; - add_to_graphics_scene(ap2, buffer, gs_options); + add_to_graphics_scene(ap2, buffer, gso); draw_graphics_scene(buffer, title); } From 28ec0e65349ef6ffe27bab74c8003dc665d209dd Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 21 Nov 2023 09:42:57 +0100 Subject: [PATCH 242/341] draw fg with paths (nyf) --- .../include/CGAL/draw_face_graph_with_paths.h | 113 ++++++++---------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 75e772ac603e..8b22d30faa3c 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -15,7 +15,6 @@ #include -#include #include #include @@ -38,7 +37,7 @@ template { - Graphics_scene_options_face_graph_with_paths(std::size_t nbpaths): m_nbpaths(nbpaths) + Graphics_scene_options_face_graph_with_paths() { color_of_path=[](std::size_t i)->CGAL::IO::Color { @@ -47,14 +46,11 @@ struct Graphics_scene_options_face_graph_with_paths : }; draw_path=[](std::size_t)->bool - { return true; } + { return true; }; } std::function color_of_path; std::function draw_path; - -protected: - std::size_t m_nbpaths; }; namespace draw_function_for_lcc @@ -146,9 +142,9 @@ void compute_face(const Mesh& mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphics_scene& graphics_scene, - GSOptions& gs_options) + GSOptions& gso) { - if(!gs_options.draw_face(lcc, dh)) + if(!gso.draw_face(lcc, dh)) { return; } typedef typename Get_map::type LCC; @@ -170,8 +166,8 @@ void compute_face(const Mesh& mesh, } while(cur!=dh); - if(gs_options.colored_face(lcc, dh)) - { graphics_scene.face_begin(gs_options.face_color(lcc, dh)); } + if(gso.colored_face(lcc, dh)) + { graphics_scene.face_begin(gso.face_color(lcc, dh)); } else { graphics_scene.face_begin(); } @@ -192,12 +188,12 @@ template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - typename Get_map::type::size_type aamark, + typename Get_map::type::size_type amark, CGAL::Graphics_scene& graphics_scene, - GSOptions& gs_options, + GSOptions& gso, bool draw_marked_darts=true) { - if(!gs_options.draw_edge(lcc, dh)) + if(!gso.draw_edge(lcc, dh)) { return; } typedef typename Get_map::type LCC; @@ -242,19 +238,18 @@ template void compute_vertex(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, CGAL::Graphics_scene& graphics_scene, - GSOptions& gs_options) + GSOptions& gso) { - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; - graphics_scene.add_point(get_point(mesh, dh)); + if(gso.draw_vertex(mesh, dh)) + { graphics_scene.add_point(get_point(mesh, dh)); } } -template +template void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, CGAL::Graphics_scene &graphics_scene, - const std::vector>* m_paths, + const GSOptions &gso, + const std::vector>* paths, std::size_t i, typename Get_map::type::size_type amark) { @@ -263,19 +258,19 @@ void compute_path(const Mesh &mesh, typedef typename CGAL::Get_traits::Point Point; typedef typename CGAL::Get_traits::Vector Vector; - if ((*m_paths)[i].is_empty() || !gs_options.draw_path(i)) + if ((*paths)[i].is_empty() || !gso.draw_path(i)) { return; } CGAL::Random random(static_cast(i)); CGAL::IO::Color color = get_random_color(random); - graphics_scene.add_point(get_point(mesh, (*m_paths)[i].get_ith_dart(0)), color); - for (std::size_t j=0; j<(*m_paths)[i].length(); ++j) + graphics_scene.add_point(get_point(mesh, (*paths)[i].get_ith_dart(0)), color); + for (std::size_t j=0; j<(*paths)[i].length(); ++j) { - if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) ) + if ( !lcc.is_marked( (*paths)[i].get_ith_dart(j), amark) ) { - compute_edge(mesh, lcc, (*m_paths)[i].get_ith_dart(j), color, mesh, graphics_scene, lcc); - lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark); + compute_edge(mesh, lcc, (*paths)[i].get_ith_dart(j), color, graphics_scene); + lcc.template mark_cell<1>((*paths)[i].get_ith_dart(j), amark); } } } @@ -283,9 +278,9 @@ void compute_path(const Mesh &mesh, template void compute_elements(const Mesh &mesh, CGAL::Graphics_scene &graphics_scene, - const GSOptions &m_gs_options, - const std::vector>* m_paths, - typename Get_map::type::size_type amark) + const GSOptions &gso, + const std::vector>* paths, + typename Get_map::type::size_type mark) { typedef typename Get_map::type LCC; typedef typename LCC::size_type size_type; @@ -295,27 +290,27 @@ void compute_elements(const Mesh &mesh, typedef typename CGAL::Get_traits::Vector Vector; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typename Get_map::storage_type alcc(mesh); - typename LCC::Dart_range::const_iterator m_current_dart = lcc.darts().end(); - typename LCC::size_type m_oriented_mark = lcc.get_new_mark(); - std::size_t m_current_path = m_paths->size(); - typename LCC::size_type amark=amark==(std::numeric_limits::max)()? - LCC::INVALID_MARK:amark; // If !=INVALID_MARK, show darts marked with this mark + typename Get_map::storage_type lcc(mesh); + typename LCC::Dart_range::const_iterator current_dart = lcc.darts().end(); + typename LCC::size_type oriented_mark = lcc.get_new_mark(); + std::size_t current_path = paths->size(); + typename LCC::size_type amark=mark==(std::numeric_limits::max)()? + LCC::INVALID_MARK:mark; // If !=INVALID_MARK, show darts marked with this mark - lcc.orient(m_oriented_mark); + lcc.orient(oriented_mark); typename LCC::size_type markfaces = lcc.get_new_mark(); typename LCC::size_type markedges = lcc.get_new_mark(); typename LCC::size_type markvertices = lcc.get_new_mark(); - if (m_current_dart!=lcc.darts().end()) + /* if (current_dart!=lcc.darts().end()) { // We want to draw only one dart - Dart_const_descriptor selected_dart=m_current_dart; //lcc.dart_handle(m_current_dart); + Dart_const_descriptor selected_dart=current_dart; //lcc.dart_handle(current_dart); compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphics_scene, lcc); lcc.template mark_cell<1>(selected_dart, markedges); compute_vertex(selected_dart, mesh, graphics_scene); - if ( !m_nofaces ) + if (gso.are_faces_enabled()) { compute_face(selected_dart, mesh, graphics_scene, lcc); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), @@ -328,35 +323,35 @@ void compute_elements(const Mesh &mesh, } } } - else + else */ { - if (m_current_path==m_paths->size()) + if (current_path==paths->size()) { - for (std::size_t i=0; isize(); ++i) - { compute_path(i, markedges, mesh, graphics_scene, m_paths, lcc); } + for (std::size_t i=0; isize(); ++i) + { compute_path(mesh, lcc, graphics_scene, gso, paths, i, markedges); } } - else if (m_current_path!=m_paths->size()+1) - { compute_path(m_current_path, markedges, mesh, graphics_scene, m_paths, lcc); } + else if (current_path!=paths->size()+1) + { compute_path(mesh, lcc, graphics_scene, gso, paths, current_path, markedges); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), itend=lcc.darts().end(); it!=itend; ++it ) { - if (!m_nofaces && !lcc.is_marked(it, markfaces) && - !lcc.is_perforated(it) && lcc.is_marked(it, m_oriented_mark)) + if (gso.are_faces_enabled() && !lcc.is_marked(it, markfaces) && + !lcc.is_perforated(it) && lcc.is_marked(it, oriented_mark)) { - compute_face(it, mesh, graphics_scene, lcc); + compute_face(mesh, lcc, it, graphics_scene, gso); lcc.template mark_cell<2>(it, markfaces); } if ( !lcc.is_marked(it, markedges) ) { - compute_edge(it, mesh, graphics_scene, lcc, amark, draw_marked_darts); + compute_edge(mesh, lcc, it, amark, graphics_scene, gso, draw_marked_darts); lcc.template mark_cell<1>(it, markedges); } if ( !lcc.is_marked(it, markvertices) ) { - compute_vertex(it, mesh, graphics_scene); + compute_vertex(mesh, it, graphics_scene, gso); lcc.template mark_cell<0>(it, markvertices); } } @@ -372,15 +367,13 @@ void compute_elements(const Mesh &mesh, template void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso, const std::vector>* paths, - const GSOptions& gs_options, typename Get_map::type::size_type amark= typename Get_map::type::INVALID_MARK) { - draw_function_for_face_graph_with_paths::compute_elements(mesh, - graphics_scene, - gs_options, - paths, amark); + draw_function_for_face_graph_with_paths::compute_elements(mesh, graphics_scene, + gso, paths, amark); } template @@ -391,13 +384,13 @@ void add_to_graphics_scene(const Mesh& mesh, typename Get_map::type::INVALID_MARK) { // Default graphics view options. - Graphics_scene_options::type::Dart_const_descriptor /*vh*/, typename Get_map::type::Dart_const_descriptor /*eh*/, typename Get_map::type::Dart_const_descriptor /*fh*/> - gs_options; + gso; - add_to_graphics_scene(mesh, graphics_scene, gs_options, paths, amark); + add_to_graphics_scene(mesh, graphics_scene, gso, paths, amark); } #ifdef CGAL_USE_BASIC_VIEWER @@ -417,13 +410,13 @@ void draw(const Mesh& mesh, template void draw(const Mesh& mesh, const std::vector >& paths, - const GSOptions& gs_options, + const GSOptions& gso, typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)(), const char* title="Mesh Viewer With Path") { CGAL::Graphics_scene buffer; - add_to_graphics_scene(mesh, buffer, gs_options, &paths, amark); + add_to_graphics_scene(mesh, buffer, gso, &paths, amark); draw_graphics_scene(buffer, title); } From 2c77ba397c41ab17b4c04a418c2e9593e45b5811 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 29 Nov 2023 15:50:26 +0100 Subject: [PATCH 243/341] draw face graph with path --- .../examples/Basic_viewer/CMakeLists.txt | 6 +- .../include/CGAL/draw_linear_cell_complex.h | 71 +++--- .../include/CGAL/draw_face_graph_with_paths.h | 215 +++++++----------- 3 files changed, 115 insertions(+), 177 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index 2ba9f5b9dae8..6b3bdddd1969 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -9,8 +9,8 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Basic_viewer_Examples) -#CGAL_Qt5 is needed for the drawing. -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +#CGAL_Qt6 is needed for the drawing. +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Eigen3 3.1.0) include(CGAL_Eigen3_support) @@ -19,7 +19,7 @@ create_single_source_cgal_program("draw_several_windows.cpp") create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") create_single_source_cgal_program("draw_surface_mesh_height.cpp") -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) #link it with the required CGAL libraries target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_several_windows PUBLIC CGAL::CGAL_Basic_viewer) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 652935b14447..e9e98ecc6b7f 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -62,10 +62,10 @@ void compute_face(const LCC& lcc, typename LCC::Dart_const_handle dh, typename LCC::Dart_const_handle voldh, CGAL::Graphics_scene& graphics_scene, - const GSOptionsLCC& gs_options) + const GSOptionsLCC& gso) { - if (!gs_options.are_faces_enabled() || - !gs_options.draw_face(lcc, dh)) + if (!gso.are_faces_enabled() || + !gso.draw_face(lcc, dh)) { return; } // We fill only closed faces. @@ -78,13 +78,13 @@ void compute_face(const LCC& lcc, } while (cur!=dh); - if (gs_options.colored_volume(lcc, voldh)) + if (gso.colored_volume(lcc, voldh)) { - graphics_scene.face_begin(gs_options.volume_color(lcc, voldh)); + graphics_scene.face_begin(gso.volume_color(lcc, voldh)); } - else if (gs_options.colored_face(lcc, dh)) + else if (gso.colored_face(lcc, dh)) { - graphics_scene.face_begin(gs_options.face_color(lcc, dh)); + graphics_scene.face_begin(gso.face_color(lcc, dh)); } else { graphics_scene.face_begin(); } @@ -106,20 +106,20 @@ template void compute_edge(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options) + const GSOptions& gso) { - if (!gs_options.are_edges_enabled() || - !gs_options.draw_edge(lcc, dh)) + if (!gso.are_edges_enabled() || + !gso.draw_edge(lcc, dh)) { return; } const typename LCC::Point& p1=lcc.point(dh); typename LCC::Dart_const_handle d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (gs_options.colored_edge(lcc, dh)) + if (gso.colored_edge(lcc, dh)) { graphics_scene.add_segment(p1, lcc.point(d2), - gs_options.edge_color(lcc, dh)); + gso.edge_color(lcc, dh)); } else { graphics_scene.add_segment(p1, lcc.point(d2)); } @@ -130,16 +130,15 @@ template void compute_vertex(const LCC& lcc, typename LCC::Dart_const_handle dh, CGAL::Graphics_scene& graphics_scene, - const GSOptionsLCC& gs_options) + const GSOptionsLCC& gso) { - if (!gs_options.are_vertices_enabled() || - !gs_options.draw_vertex(lcc, dh)) + if (!gso.are_vertices_enabled() || !gso.draw_vertex(lcc, dh)) { return; } - if (gs_options.colored_vertex(lcc, dh)) + if (gso.colored_vertex(lcc, dh)) { graphics_scene.add_point(lcc.point(dh), - gs_options.vertex_color(lcc, dh)); + gso.vertex_color(lcc, dh)); } else { graphics_scene.add_point(lcc.point(dh)); } @@ -148,7 +147,7 @@ void compute_vertex(const LCC& lcc, template void compute_elements(const LCC& lcc, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options) + const GSOptions& gso) { typename LCC::size_type markvolumes = lcc.get_new_mark(); typename LCC::size_type markfaces = lcc.get_new_mark(); @@ -162,7 +161,7 @@ void compute_elements(const LCC& lcc, itend=lcc.darts().end(); it!=itend; ++it) { if (!lcc.is_marked(it, markvolumes) && - gs_options.draw_volume(lcc, it)) + gso.draw_volume(lcc, it)) { for(typename LCC::template Dart_of_cell_basic_range<3>::const_iterator itv=lcc.template darts_of_cell_basic<3>(it, markvolumes).begin(), @@ -172,13 +171,13 @@ void compute_elements(const LCC& lcc, lcc.mark(itv, markvolumes); if (!lcc.is_marked(itv, markfaces) && lcc.is_marked(itv, oriented_mark) && - gs_options.draw_face(lcc, itv)) + gso.draw_face(lcc, itv)) { - if ((!gs_options.volume_wireframe(lcc, itv) || + if ((!gso.volume_wireframe(lcc, itv) || (!lcc.template is_free<3>(itv) && - !gs_options.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && - !gs_options.face_wireframe(lcc, itv)) - { compute_face(lcc, itv, it, graphics_scene, gs_options); } + !gso.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && + !gso.face_wireframe(lcc, itv)) + { compute_face(lcc, itv, it, graphics_scene, gso); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator itf=lcc.template darts_of_cell_basic<2>(itv, markfaces).begin(), itfend=lcc.template darts_of_cell_basic<2>(itv, markfaces).end(); @@ -186,9 +185,9 @@ void compute_elements(const LCC& lcc, { lcc.mark(itf, markfaces); if (!lcc.is_marked(itf, markedges) && - gs_options.draw_edge(lcc, itf)) + gso.draw_edge(lcc, itf)) { - compute_edge(lcc, itf, graphics_scene, gs_options); + compute_edge(lcc, itf, graphics_scene, gso); for(typename LCC::template Dart_of_cell_basic_range<1>::const_iterator ite=lcc.template darts_of_cell_basic<1>(itf, markedges).begin(), iteend=lcc.template darts_of_cell_basic<1>(itf, markedges).end(); @@ -196,9 +195,9 @@ void compute_elements(const LCC& lcc, { lcc.mark(ite, markedges); if (!lcc.is_marked(ite, markvertices) && - gs_options.draw_vertex(lcc, ite)) + gso.draw_vertex(lcc, ite)) { - compute_vertex(lcc, ite, graphics_scene, gs_options); + compute_vertex(lcc, ite, graphics_scene, gso); CGAL::mark_cell(lcc, ite, markvertices); } } @@ -241,10 +240,10 @@ template void add_to_graphics_scene(const CGAL_LCC_TYPE& alcc, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options) + const GSOptions& gso) { draw_function_for_lcc::compute_elements(static_cast(alcc), - graphics_scene, gs_options); + graphics_scene, gso); } // add_to_graphics_scene: to add a LCC in the given graphic buffer, without a @@ -261,20 +260,20 @@ void add_to_graphics_scene(const CGAL_LCC_TYPE& alcc, typename CGAL_LCC_TYPE::Dart_const_handle, typename CGAL_LCC_TYPE::Dart_const_handle, typename CGAL_LCC_TYPE::Dart_const_handle> - gs_options; + gso; - gs_options.colored_volume = [](const CGAL_LCC_TYPE&, + gso.colored_volume = [](const CGAL_LCC_TYPE&, typename CGAL_LCC_TYPE::Dart_const_handle) -> bool { return true; }; - gs_options.volume_color = [] (const CGAL_LCC_TYPE& alcc, + gso.volume_color = [] (const CGAL_LCC_TYPE& alcc, typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color { CGAL::Random random((unsigned int)(alcc.darts().index(dh))); return get_random_color(random); }; - add_to_graphics_scene(alcc, graphics_scene, gs_options); + add_to_graphics_scene(alcc, graphics_scene, gso); } #ifdef CGAL_USE_BASIC_VIEWER @@ -285,11 +284,11 @@ template class Map, class Refs, class Storage_, class GSOptions> -void draw(const CGAL_LCC_TYPE& alcc, const GSOptions& gs_options, +void draw(const CGAL_LCC_TYPE& alcc, const GSOptions& gso, const char *title="LCC Basic Viewer") { CGAL::Graphics_scene buffer; - add_to_graphics_scene(alcc, buffer, gs_options); + add_to_graphics_scene(alcc, buffer, gso); draw_graphics_scene(buffer, title); } diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 8b22d30faa3c..aadf3f89e99e 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -49,8 +49,15 @@ struct Graphics_scene_options_face_graph_with_paths : { return true; }; } + const CGAL::IO::Color& color_of_marked_edges() const + { return m_color_of_marked_edges; } + void color_of_marked_edges(const CGAL::IO::Color& c) + { m_color_of_marked_edges=c; } + std::function color_of_path; std::function draw_path; +protected: + CGAL::IO::Color m_color_of_marked_edges=CGAL::IO::Color(0, 0, 255); }; namespace draw_function_for_lcc @@ -129,13 +136,7 @@ typedef Local_kernel::Vector_3 Local_vector; template const typename CGAL::Get_traits::Point& get_point (const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh) -{ - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; - - return CGAL::Get_traits::get_point(mesh, dh); -} +{ return CGAL::Get_traits::get_point(mesh, dh); } template void compute_face(const Mesh& mesh, @@ -144,16 +145,11 @@ void compute_face(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, GSOptions& gso) { - if(!gso.draw_face(lcc, dh)) + if(!gso.are_faces_enabled() || !gso.draw_face(mesh, dh)) { return; } - typedef typename Get_map::type LCC; - typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typedef typename LCC::size_type size_type; - - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; + typedef typename Get_map::type LCC; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; // We fill only closed faces. Dart_const_descriptor cur=dh; @@ -166,8 +162,8 @@ void compute_face(const Mesh& mesh, } while(cur!=dh); - if(gso.colored_face(lcc, dh)) - { graphics_scene.face_begin(gso.face_color(lcc, dh)); } + if(gso.colored_face(mesh, dh)) + { graphics_scene.face_begin(gso.face_color(mesh, dh)); } else { graphics_scene.face_begin(); } @@ -190,43 +186,47 @@ void compute_edge(const Mesh &mesh, typename Get_map::type::Dart_const_descriptor dh, typename Get_map::type::size_type amark, CGAL::Graphics_scene& graphics_scene, - GSOptions& gso, - bool draw_marked_darts=true) + GSOptions& gso) { - if(!gso.draw_edge(lcc, dh)) + if(!gso.are_edges_enabled() || !gso.draw_edge(mesh, dh)) { return; } - typedef typename Get_map::type LCC; - typedef typename LCC::size_type size_type; - typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; + typedef typename Get_map::type LCC; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; + typedef typename CGAL::Get_traits::Point Point; Point p1=get_point(mesh, dh); Dart_const_descriptor d2 = lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (draw_marked_darts && amark!=LCC::INVALID_MARK && + if (amark!=LCC::INVALID_MARK && (lcc.is_marked(dh, amark) || lcc.is_marked(lcc.opposite2(dh), amark))) - { graphics_scene.add_segment(p1, get_point(mesh, d2), CGAL::IO::Color(0, 0, 255)); } + { graphics_scene.add_segment(p1, get_point(mesh, d2), gso.color_of_marked_edges()); } else - { graphics_scene.add_segment(p1, get_point(mesh, d2)); } + { + if(gso.colored_edge(mesh, dh)) + { graphics_scene.add_segment(p1, get_point(mesh, d2), + gso.edge_color(mesh, dh)); } + else + { graphics_scene.add_segment(p1, get_point(mesh, d2)); } + } } } -template +template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, const CGAL::IO::Color& color, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene, + GSOptions& gso) { + if(!gso.are_edges_enabled() || !gso.draw_edge(mesh, dh)) + { return; } + typedef typename Get_map::type LCC; typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typedef typename CGAL::Get_traits::Kernel Kernel; typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; Point p1=get_point(mesh, dh); Dart_const_descriptor d2=lcc.other_extremity(dh); @@ -240,8 +240,16 @@ void compute_vertex(const Mesh &mesh, CGAL::Graphics_scene& graphics_scene, GSOptions& gso) { - if(gso.draw_vertex(mesh, dh)) - { graphics_scene.add_point(get_point(mesh, dh)); } + if(gso.are_vertices_enabled() && gso.draw_vertex(mesh, dh)) + { + if (gso.colored_vertex(mesh, dh)) + { + graphics_scene.add_point(get_point(mesh, dh), + gso.vertex_color(mesh, dh)); + } + else + { graphics_scene.add_point(get_point(mesh, dh)); } + } } template @@ -254,22 +262,16 @@ void compute_path(const Mesh &mesh, typename Get_map::type::size_type amark) { - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; - if ((*paths)[i].is_empty() || !gso.draw_path(i)) { return; } - CGAL::Random random(static_cast(i)); - CGAL::IO::Color color = get_random_color(random); - + CGAL::IO::Color color=gso.color_of_path(i); graphics_scene.add_point(get_point(mesh, (*paths)[i].get_ith_dart(0)), color); for (std::size_t j=0; j<(*paths)[i].length(); ++j) { - if ( !lcc.is_marked( (*paths)[i].get_ith_dart(j), amark) ) + if (!lcc.is_marked( (*paths)[i].get_ith_dart(j), amark)) { - compute_edge(mesh, lcc, (*paths)[i].get_ith_dart(j), color, graphics_scene); + compute_edge(mesh, lcc, (*paths)[i].get_ith_dart(j), color, graphics_scene, gso); lcc.template mark_cell<1>((*paths)[i].get_ith_dart(j), amark); } } @@ -291,7 +293,6 @@ void compute_elements(const Mesh &mesh, typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; typename Get_map::storage_type lcc(mesh); - typename LCC::Dart_range::const_iterator current_dart = lcc.darts().end(); typename LCC::size_type oriented_mark = lcc.get_new_mark(); std::size_t current_path = paths->size(); typename LCC::size_type amark=mark==(std::numeric_limits::max)()? @@ -303,57 +304,34 @@ void compute_elements(const Mesh &mesh, typename LCC::size_type markedges = lcc.get_new_mark(); typename LCC::size_type markvertices = lcc.get_new_mark(); - /* if (current_dart!=lcc.darts().end()) - { // We want to draw only one dart - Dart_const_descriptor selected_dart=current_dart; //lcc.dart_handle(current_dart); - compute_edge(selected_dart, CGAL::IO::Color(255,0,0), mesh, graphics_scene, lcc); - lcc.template mark_cell<1>(selected_dart, markedges); - compute_vertex(selected_dart, mesh, graphics_scene); - - if (gso.are_faces_enabled()) - { compute_face(selected_dart, mesh, graphics_scene, lcc); } + if (current_path==paths->size()) + { + for (std::size_t i=0; isize(); ++i) + { compute_path(mesh, lcc, graphics_scene, gso, paths, i, markedges); } + } + else if (current_path!=paths->size()+1) + { compute_path(mesh, lcc, graphics_scene, gso, paths, current_path, markedges); } - for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), - itend=lcc.darts().end(); it!=itend; ++it ) + for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), + itend=lcc.darts().end(); it!=itend; ++it ) + { + if (gso.are_faces_enabled() && !lcc.is_marked(it, markfaces) && + !lcc.is_perforated(it) && lcc.is_marked(it, oriented_mark)) { - if ( !lcc.is_marked(it, markedges) ) - { - compute_edge(it, mesh, graphics_scene, lcc, amark, draw_marked_darts); - lcc.template mark_cell<1>(it, markedges); - } + compute_face(mesh, lcc, it, graphics_scene, gso); + lcc.template mark_cell<2>(it, markfaces); } - } - else */ - { - if (current_path==paths->size()) + + if ( !lcc.is_marked(it, markedges) ) { - for (std::size_t i=0; isize(); ++i) - { compute_path(mesh, lcc, graphics_scene, gso, paths, i, markedges); } + compute_edge(mesh, lcc, it, amark, graphics_scene, gso); + lcc.template mark_cell<1>(it, markedges); } - else if (current_path!=paths->size()+1) - { compute_path(mesh, lcc, graphics_scene, gso, paths, current_path, markedges); } - for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), - itend=lcc.darts().end(); it!=itend; ++it ) + if ( !lcc.is_marked(it, markvertices) ) { - if (gso.are_faces_enabled() && !lcc.is_marked(it, markfaces) && - !lcc.is_perforated(it) && lcc.is_marked(it, oriented_mark)) - { - compute_face(mesh, lcc, it, graphics_scene, gso); - lcc.template mark_cell<2>(it, markfaces); - } - - if ( !lcc.is_marked(it, markedges) ) - { - compute_edge(mesh, lcc, it, amark, graphics_scene, gso, draw_marked_darts); - lcc.template mark_cell<1>(it, markedges); - } - - if ( !lcc.is_marked(it, markvertices) ) - { - compute_vertex(mesh, it, graphics_scene, gso); - lcc.template mark_cell<0>(it, markvertices); - } + compute_vertex(mesh, it, graphics_scene, gso); + lcc.template mark_cell<0>(it, markvertices); } } @@ -369,8 +347,8 @@ void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gso, const std::vector>* paths, - typename Get_map::type::size_type amark= - typename Get_map::type::INVALID_MARK) + typename Get_map::type::size_type amark=0) +//TODO typename Get_map::type::INVALID_MARK) { draw_function_for_face_graph_with_paths::compute_elements(mesh, graphics_scene, gso, paths, amark); @@ -380,8 +358,8 @@ template void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, - typename Get_map::type::size_type amark= - typename Get_map::type::INVALID_MARK) + typename Get_map::type::size_type amark=0) + // TODO typename Get_map::type::INVALID_MARK) { // Default graphics view options. Graphics_scene_options_face_graph_with_paths void draw(const Mesh& mesh, const std::vector >& paths, + const char* title="Mesh Viewer With Path", typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path") + (std::numeric_limits::type::size_type>::max)()) { CGAL::Graphics_scene buffer; add_to_graphics_scene(mesh, buffer, &paths, amark); @@ -411,9 +389,9 @@ template void draw(const Mesh& mesh, const std::vector >& paths, const GSOptions& gso, + const char* title="Mesh Viewer With Path", typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path") + (std::numeric_limits::type::size_type>::max)()) { CGAL::Graphics_scene buffer; add_to_graphics_scene(mesh, buffer, gso, &paths, amark); @@ -423,9 +401,9 @@ void draw(const Mesh& mesh, template void draw(const Mesh& mesh, std::initializer_list> l, + const char* title="Mesh Viewer With Path", typename Get_map::type::size_type amark= - (std::numeric_limits::type::size_type>::max)(), - const char* title="Mesh Viewer With Path") + (std::numeric_limits::type::size_type>::max)()) { std::vector> paths=l; CGAL::Graphics_scene buffer; @@ -435,45 +413,6 @@ void draw(const Mesh& mesh, } // End namespace CGAL -#else // CGAL_USE_BASIC_VIEWER - -namespace CGAL -{ - - template - void draw(const Mesh&, - const std::vector >&, - typename Get_map::type::size_type= - (std::numeric_limits::type::size_type>::max)(), - const char* ="") - { - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< - void draw(const Mesh&, - const std::vector >&, - const GSOptions&, - typename Get_map::type::size_type= - (std::numeric_limits::type::size_type>::max)(), - const char* ="") - { - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< - void draw(const Mesh&, - std::initializer_list>, - const char* ="", - typename Get_map::type::size_type= - (std::numeric_limits::type::size_type>::max)(), - const char* ="") - { - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Wed, 29 Nov 2023 16:29:04 +0100 Subject: [PATCH 244/341] SMT: draw face width --- .../Surface_mesh_topology/draw_facewidth.h | 104 ++++-------------- 1 file changed, 19 insertions(+), 85 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index e49b3a93f026..e2f781cfab83 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -9,85 +9,28 @@ #include template -struct Facewidth_graphics_scene_options +struct Facewidth_graphics_scene_options: + public CGAL::Graphics_scene_options { Facewidth_graphics_scene_options(typename ALCC::size_type amark1, typename ALCC::size_type amark2) : m_vertex_mark(amark1), m_face_mark(amark2) - {} - - template - bool colored_vertex(const LCC& alcc, typename LCC::Dart_const_descriptor dh) const - { return alcc.is_marked(dh, m_vertex_mark); } - - template - CGAL::IO::Color vertex_color(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* dh */) const - { return CGAL::IO::Color(0, 255, 0); } - - template - bool colored_edge(const LCC& /*alcc*/, typename LCC::Dart_const_descriptor /*dh*/) const - { return false; } - - template - CGAL::IO::Color edge_color(const LCC& /* alcc*/, - typename LCC::Dart_const_descriptor /* dh */) const - { return CGAL::IO::Color(0, 0, 255); } - - template - bool colored_face(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* dh */) const - {return true;} - - template - CGAL::IO::Color face_color(const LCC& alcc, typename LCC::Dart_const_descriptor dh) const - { return alcc.is_marked(dh, m_face_mark)?CGAL::IO::Color(255, 0, 0) - :CGAL::IO::Color(211, 211, 211); } - - template - bool colored_volume(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* dh */) const - { return false; } - - template - bool draw_volume (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool draw_face (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return true; } - - template - bool draw_edge (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return true; } - - template - bool volume_wireframe (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool face_wireframe (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool draw_vertex (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return true; } - - template - CGAL::IO::Color volume_color(const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const { - return CGAL::IO::Color(20, 10, 30); + { + this->colored_vertex=[this](const ALCC& alcc, typename ALCC::Dart_const_handle dh)->bool + { return alcc.is_marked(dh, m_vertex_mark); }; + this->vertex_color=[](const ALCC&, typename ALCC::Dart_const_handle)->CGAL::IO::Color + { return CGAL::IO::Color(0, 255, 0); }; + + this->colored_face=[this](const ALCC&, typename ALCC::Dart_const_handle)->bool + { return true; }; + this->face_color=[this](const ALCC& alcc, typename ALCC::Dart_const_handle dh)->CGAL::IO::Color + { return alcc.is_marked(dh, m_face_mark)?CGAL::IO::Color(255, 0, 0) + :CGAL::IO::Color(211, 211, 211); }; } - bool are_edges_enabled() const { return true; } - bool are_vertices_enabled() const { return true; } - bool are_faces_enabled() const { return true; } - typename ALCC::size_type m_vertex_mark, m_face_mark; }; @@ -99,10 +42,10 @@ void draw_facewidth(const LCC& lcc, typename LCC::size_type face_mark = lcc.get_new_mark(); for (std::size_t i=0; i(cycle[i], vertex_mark); } - // Color the face + // Color the faces if (!lcc.is_marked(cycle[i], face_mark)) { lcc.template mark_cell<2>(cycle[i], face_mark); } } @@ -114,15 +57,6 @@ void draw_facewidth(const LCC& lcc, lcc.free_mark(face_mark); } -#else // CGAL_USE_BASIC_VIEWER - -template -void draw_facewidth(const LCC&, - const std::vector&) -{ - std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Wed, 29 Nov 2023 16:39:41 +0100 Subject: [PATCH 245/341] SMT: draw face width and unsew edgewidth --- .../Surface_mesh_topology/draw_facewidth.h | 2 +- .../unsew_edgewidth_repeatedly.cpp | 92 ++++--------------- 2 files changed, 21 insertions(+), 73 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index e2f781cfab83..0fe598482d0e 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -5,7 +5,7 @@ #ifdef CGAL_USE_BASIC_VIEWER -#include +#include #include template diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp index 485f0fa6ddc3..5dc8900de231 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp @@ -34,83 +34,31 @@ struct Weight_functor #ifdef CGAL_USE_BASIC_VIEWER -struct Draw_functor +struct Draw_functor: public CGAL::Graphics_scene_options { Draw_functor(LCC_3::size_type am1, LCC_3::size_type am2) : is_root(am1), belong_to_cycle(am2) - {} - - template - bool colored_vertex(const LCC& alcc, typename LCC::Dart_const_descriptor d) const - { return alcc.is_marked(d, is_root); } - - template - CGAL::IO::Color vertex_color(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* d */) const - { return CGAL::IO::Color(0,255,0); } - - template - bool colored_edge(const LCC& alcc, typename LCC::Dart_const_descriptor d) const - { return alcc.is_marked(d, belong_to_cycle); } - - template - CGAL::IO::Color edge_color(const LCC& /* alcc*/, - typename LCC::Dart_const_descriptor /* d */) const - { return CGAL::IO::Color(0, 0, 255); } - - template - bool colored_face(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* d */) const {return true;} - - template - CGAL::IO::Color face_color(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* d */) const - {return CGAL::IO::Color(211, 211, 211);} - - template - bool colored_volume(const LCC& /* alcc */, - typename LCC::Dart_const_descriptor /* d */) const { return false; } - - template - bool draw_volume (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool draw_face (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool draw_edge (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool volume_wireframe (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool face_wireframe (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - bool draw_vertex (const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const - { return false; } - - template - CGAL::IO::Color volume_color(const LCC& /* alcc */, - typename LCC::Dart_const_handle /* dh */) const { - return CGAL::IO::Color(10, 20, 20); + { + this->colored_vertex=[this](const LCC_3& alcc, typename LCC_3::Dart_const_handle dh)->bool + { return alcc.is_marked(dh, is_root); }; + this->vertex_color=[](const LCC_3&, typename LCC_3::Dart_const_handle)->CGAL::IO::Color + { return CGAL::IO::Color(0, 255, 0); }; + + this->colored_edge=[this](const LCC_3& alcc, typename LCC_3::Dart_const_handle dh)->bool + { return alcc.is_marked(dh, belong_to_cycle); }; + this->edge_color=[](const LCC_3&, typename LCC_3::Dart_const_handle)->CGAL::IO::Color + { return CGAL::IO::Color(0, 0, 255); }; + + this->colored_face=[this](const LCC_3&, typename LCC_3::Dart_const_handle)->bool + { return true; }; + this->face_color=[](const LCC_3&, typename LCC_3::Dart_const_handle)->CGAL::IO::Color + { return CGAL::IO::Color(211, 211, 211); }; } - bool are_edges_enabled() const { return true; } - bool are_vertices_enabled() const { return true; } - bool are_faces_enabled() const { return true; } - LCC_3::size_type is_root; LCC_3::size_type belong_to_cycle; }; From 4feec0b274e23209392ab04fb0932174a84eb6a0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 29 Nov 2023 17:10:43 +0100 Subject: [PATCH 246/341] move end of namespace outside protected block --- .../include/CGAL/draw_face_graph_with_paths.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index aadf3f89e99e..375365eec38e 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -411,8 +411,8 @@ void draw(const Mesh& mesh, draw_graphics_scene(buffer, title); } -} // End namespace CGAL - #endif // CGAL_USE_BASIC_VIEWER +} // End namespace CGAL + #endif // CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H From f8a487d9ef362aac1c03ceb5180d8016c0001913 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 29 Nov 2023 18:12:09 +0100 Subject: [PATCH 247/341] update dependencies --- .../Arrangement_on_surface_2/dependencies | 2 +- .../package_info/Basic_viewer/dependencies | 31 +++++++++++++++++-- .../Boolean_set_operations_2/dependencies | 8 ++++- .../Linear_cell_complex/dependencies | 6 +++- Nef_3/package_info/Nef_3/dependencies | 2 +- .../Periodic_2_triangulation_2/dependencies | 8 ++++- .../package_info/Point_set_3/dependencies | 17 +++++++++- Polygon/package_info/Polygon/dependencies | 20 +++++++++++- .../dependencies | 2 +- .../package_info/Polyhedron/dependencies | 9 +++++- .../Straight_skeleton_2/dependencies | 6 +++- .../package_info/Surface_mesh/dependencies | 12 ++++++- .../Surface_mesh_topology/dependencies | 6 +++- .../package_info/Triangulation_2/dependencies | 3 +- .../package_info/Triangulation_3/dependencies | 5 ++- .../Voronoi_diagram_2/dependencies | 17 +++++++++- 16 files changed, 136 insertions(+), 18 deletions(-) diff --git a/Arrangement_on_surface_2/package_info/Arrangement_on_surface_2/dependencies b/Arrangement_on_surface_2/package_info/Arrangement_on_surface_2/dependencies index a723fb58f63c..c830d4b62e7c 100644 --- a/Arrangement_on_surface_2/package_info/Arrangement_on_surface_2/dependencies +++ b/Arrangement_on_surface_2/package_info/Arrangement_on_surface_2/dependencies @@ -3,6 +3,7 @@ Algebraic_kernel_d Arithmetic_kernel Arrangement_on_surface_2 BGL +Basic_viewer CGAL_Core Cartesian_kernel Circular_kernel_2 @@ -10,7 +11,6 @@ Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView HalfedgeDS Hash_map Homogeneous_kernel diff --git a/Basic_viewer/package_info/Basic_viewer/dependencies b/Basic_viewer/package_info/Basic_viewer/dependencies index d2dd8a53bd84..ea5d80f6165c 100644 --- a/Basic_viewer/package_info/Basic_viewer/dependencies +++ b/Basic_viewer/package_info/Basic_viewer/dependencies @@ -1,3 +1,28 @@ -Poisson_surface_reconstruction_3 -Polyhedron -Surface_mesh +Algebraic_foundations +Arithmetic_kernel +BGL +Basic_viewer +Cartesian_kernel +Circulator +Distance_2 +Distance_3 +Filtered_kernel +Hash_map +Homogeneous_kernel +Installation +Intersections_2 +Intersections_3 +Interval_support +Kernel_23 +Kernel_d +Modular_arithmetic +Number_types +Polygon +Profiling_tools +Property_map +Random_numbers +STL_Extension +Spatial_sorting +Stream_support +TDS_2 +Triangulation_2 diff --git a/Boolean_set_operations_2/package_info/Boolean_set_operations_2/dependencies b/Boolean_set_operations_2/package_info/Boolean_set_operations_2/dependencies index a4d2b53c7b30..bd14178031b3 100644 --- a/Boolean_set_operations_2/package_info/Boolean_set_operations_2/dependencies +++ b/Boolean_set_operations_2/package_info/Boolean_set_operations_2/dependencies @@ -1,6 +1,8 @@ Algebraic_foundations Arithmetic_kernel Arrangement_on_surface_2 +BGL +Basic_viewer Boolean_set_operations_2 Cartesian_kernel Circular_kernel_2 @@ -8,7 +10,6 @@ Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView HalfedgeDS Hash_map Homogeneous_kernel @@ -22,7 +23,12 @@ Modular_arithmetic Number_types Polygon Profiling_tools +Property_map +Random_numbers STL_Extension +Spatial_sorting Stream_support Surface_sweep_2 +TDS_2 +Triangulation_2 Union_find diff --git a/Linear_cell_complex/package_info/Linear_cell_complex/dependencies b/Linear_cell_complex/package_info/Linear_cell_complex/dependencies index 53e5ce3f1530..e73c219a56b1 100644 --- a/Linear_cell_complex/package_info/Linear_cell_complex/dependencies +++ b/Linear_cell_complex/package_info/Linear_cell_complex/dependencies @@ -1,6 +1,7 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Combinatorial_map @@ -8,7 +9,6 @@ Distance_2 Distance_3 Filtered_kernel Generalized_map -GraphicsView HalfedgeDS Hash_map Homogeneous_kernel @@ -21,8 +21,12 @@ Kernel_d Linear_cell_complex Modular_arithmetic Number_types +Polygon Profiling_tools Property_map Random_numbers STL_Extension +Spatial_sorting Stream_support +TDS_2 +Triangulation_2 diff --git a/Nef_3/package_info/Nef_3/dependencies b/Nef_3/package_info/Nef_3/dependencies index 7fec88e23734..20c1fbadbb85 100644 --- a/Nef_3/package_info/Nef_3/dependencies +++ b/Nef_3/package_info/Nef_3/dependencies @@ -1,13 +1,13 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer Box_intersection_d Cartesian_kernel Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView HalfedgeDS Hash_map Homogeneous_kernel diff --git a/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies b/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies index 22f0ba917dfa..3681bf5ae04b 100644 --- a/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies +++ b/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies @@ -1,21 +1,27 @@ Algebraic_foundations +Arithmetic_kernel +BGL +Basic_viewer Cartesian_kernel Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView Hash_map +Homogeneous_kernel Installation Intersections_2 Intersections_3 Interval_support Kernel_23 +Kernel_d Modular_arithmetic Number_types Periodic_2_triangulation_2 +Polygon Profiling_tools Property_map +Random_numbers STL_Extension Spatial_sorting Stream_support diff --git a/Point_set_3/package_info/Point_set_3/dependencies b/Point_set_3/package_info/Point_set_3/dependencies index 6f0ec394588d..fec9cf39bc0b 100644 --- a/Point_set_3/package_info/Point_set_3/dependencies +++ b/Point_set_3/package_info/Point_set_3/dependencies @@ -1,16 +1,31 @@ Algebraic_foundations +Arithmetic_kernel BGL +Basic_viewer +Cartesian_kernel Circulator -GraphicsView +Distance_2 +Distance_3 +Filtered_kernel +Hash_map +Homogeneous_kernel Installation +Intersections_2 +Intersections_3 Interval_support Kernel_23 +Kernel_d Modular_arithmetic Number_types Point_set_3 Point_set_processing_3 +Polygon Profiling_tools Property_map +Random_numbers STL_Extension +Spatial_sorting Stream_support Surface_mesh +TDS_2 +Triangulation_2 diff --git a/Polygon/package_info/Polygon/dependencies b/Polygon/package_info/Polygon/dependencies index 3312eb37e462..ea5d80f6165c 100644 --- a/Polygon/package_info/Polygon/dependencies +++ b/Polygon/package_info/Polygon/dependencies @@ -1,10 +1,28 @@ Algebraic_foundations +Arithmetic_kernel +BGL +Basic_viewer +Cartesian_kernel Circulator -GraphicsView +Distance_2 +Distance_3 +Filtered_kernel +Hash_map +Homogeneous_kernel Installation +Intersections_2 +Intersections_3 +Interval_support Kernel_23 +Kernel_d +Modular_arithmetic Number_types Polygon Profiling_tools +Property_map +Random_numbers STL_Extension +Spatial_sorting Stream_support +TDS_2 +Triangulation_2 diff --git a/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies b/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies index 650e4a65343e..dccdbe6d25ab 100644 --- a/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies +++ b/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies @@ -21,8 +21,8 @@ Number_types Point_set_3 Point_set_processing_3 Polygon -Polygonal_surface_reconstruction Polygon_mesh_processing +Polygonal_surface_reconstruction Principal_component_analysis Principal_component_analysis_LGPL Profiling_tools diff --git a/Polyhedron/package_info/Polyhedron/dependencies b/Polyhedron/package_info/Polyhedron/dependencies index 53bd7918c4d8..64c00615ce37 100644 --- a/Polyhedron/package_info/Polyhedron/dependencies +++ b/Polyhedron/package_info/Polyhedron/dependencies @@ -1,10 +1,12 @@ Algebraic_foundations +Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Distance_2 Distance_3 -GraphicsView +Filtered_kernel HalfedgeDS Hash_map Homogeneous_kernel @@ -13,12 +15,17 @@ Intersections_2 Intersections_3 Interval_support Kernel_23 +Kernel_d Modifier Modular_arithmetic Number_types +Polygon Polyhedron Profiling_tools Property_map Random_numbers STL_Extension +Spatial_sorting Stream_support +TDS_2 +Triangulation_2 diff --git a/Straight_skeleton_2/package_info/Straight_skeleton_2/dependencies b/Straight_skeleton_2/package_info/Straight_skeleton_2/dependencies index ca2e964a1732..0fb898c6ec48 100644 --- a/Straight_skeleton_2/package_info/Straight_skeleton_2/dependencies +++ b/Straight_skeleton_2/package_info/Straight_skeleton_2/dependencies @@ -1,13 +1,13 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer CGAL_Core Cartesian_kernel Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView HalfedgeDS Hash_map Homogeneous_kernel @@ -22,6 +22,10 @@ Number_types Polygon Profiling_tools Property_map +Random_numbers STL_Extension +Spatial_sorting Straight_skeleton_2 Stream_support +TDS_2 +Triangulation_2 diff --git a/Surface_mesh/package_info/Surface_mesh/dependencies b/Surface_mesh/package_info/Surface_mesh/dependencies index bb41a0ba6250..5b83e82360eb 100644 --- a/Surface_mesh/package_info/Surface_mesh/dependencies +++ b/Surface_mesh/package_info/Surface_mesh/dependencies @@ -1,19 +1,29 @@ Algebraic_foundations +Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Distance_2 Distance_3 -GraphicsView +Filtered_kernel Hash_map +Homogeneous_kernel Installation +Intersections_2 +Intersections_3 Interval_support Kernel_23 +Kernel_d Modular_arithmetic Number_types +Polygon Profiling_tools Property_map Random_numbers STL_Extension +Spatial_sorting Stream_support Surface_mesh +TDS_2 +Triangulation_2 diff --git a/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies b/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies index dc2f511d1b24..41ec9a9515b2 100644 --- a/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies +++ b/Surface_mesh_topology/package_info/Surface_mesh_topology/dependencies @@ -1,6 +1,7 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Combinatorial_map @@ -8,7 +9,6 @@ Distance_2 Distance_3 Filtered_kernel Generalized_map -GraphicsView Hash_map Homogeneous_kernel Installation @@ -20,9 +20,13 @@ Kernel_d Linear_cell_complex Modular_arithmetic Number_types +Polygon Profiling_tools Property_map Random_numbers STL_Extension +Spatial_sorting Stream_support Surface_mesh_topology +TDS_2 +Triangulation_2 diff --git a/Triangulation_2/package_info/Triangulation_2/dependencies b/Triangulation_2/package_info/Triangulation_2/dependencies index c8d90b721ca3..ea5d80f6165c 100644 --- a/Triangulation_2/package_info/Triangulation_2/dependencies +++ b/Triangulation_2/package_info/Triangulation_2/dependencies @@ -1,12 +1,12 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView Hash_map Homogeneous_kernel Installation @@ -20,6 +20,7 @@ Number_types Polygon Profiling_tools Property_map +Random_numbers STL_Extension Spatial_sorting Stream_support diff --git a/Triangulation_3/package_info/Triangulation_3/dependencies b/Triangulation_3/package_info/Triangulation_3/dependencies index a68982ddaa59..ba51950d993f 100644 --- a/Triangulation_3/package_info/Triangulation_3/dependencies +++ b/Triangulation_3/package_info/Triangulation_3/dependencies @@ -1,12 +1,12 @@ Algebraic_foundations Arithmetic_kernel BGL +Basic_viewer Cartesian_kernel Circulator Distance_2 Distance_3 Filtered_kernel -GraphicsView Hash_map Homogeneous_kernel Installation @@ -17,11 +17,14 @@ Kernel_23 Kernel_d Modular_arithmetic Number_types +Polygon Profiling_tools Property_map Random_numbers STL_Extension Spatial_sorting Stream_support +TDS_2 TDS_3 +Triangulation_2 Triangulation_3 diff --git a/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies b/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies index 47ba473b7014..d2c77619e206 100644 --- a/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies +++ b/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies @@ -1,15 +1,30 @@ Algebraic_foundations Apollonius_graph_2 +Arithmetic_kernel +BGL +Basic_viewer +Cartesian_kernel Circulator -GraphicsView +Distance_2 +Distance_3 +Filtered_kernel Hash_map +Homogeneous_kernel Installation +Intersections_2 +Intersections_3 Interval_support Kernel_23 +Kernel_d Modular_arithmetic Number_types +Polygon Profiling_tools +Property_map +Random_numbers STL_Extension +Spatial_sorting Stream_support TDS_2 +Triangulation_2 Voronoi_diagram_2 From a000007c8c66e31c53c2fe140369a5fea00f2b3c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 29 Nov 2023 23:50:24 +0100 Subject: [PATCH 248/341] fix the install of /include/CGAL/Qt --- Installation/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index d9a0eecee3cc..ccae6f601632 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -73,6 +73,8 @@ if(CGAL_BRANCH_BUILD) set(CGAL_GRAPHICSVIEW_PACKAGE_DIR "${CGAL_SOURCE_DIR}/GraphicsView" CACHE INTERNAL "Directory containing the GraphicsView package") + file(GLOB INCLUDE_CGAL_QT_DIRECTORIES "${CGAL_SOURCE_DIR}/*/include/CGAL/Qt") + message(STATUS "Include CGAL/Qt directories: ${INCLUDE_CGAL_QT_DIRECTORIES}") message(STATUS "Installation package directory: ${CGAL_INSTALLATION_PACKAGE_DIR}") message(STATUS "Maintenance package directory: ${CGAL_MAINTENANCE_PACKAGE_DIR}") @@ -104,6 +106,7 @@ else(CGAL_BRANCH_BUILD) set(CGAL_GRAPHICSVIEW_PACKAGE_DIR "${CGAL_SOURCE_DIR}" CACHE INTERNAL "Directory containing the GraphicsView package") + set(INCLUDE_CGAL_QT_DIRECTORIES "${CGAL_SOURCE_DIR}/include/CGAL/Qt") # Enable testing with BUILD_TESTING option(BUILD_TESTING "Build the testing tree." OFF) @@ -647,7 +650,7 @@ cache_get(CGAL_3RD_PARTY_INCLUDE_DIRS ) cache_get(CGAL_3RD_PARTY_LIBRARIES ) cache_get(CGAL_3RD_PARTY_LIBRARIES_DIRS) -install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/" DESTINATION "${CGAL_INSTALL_INC_DIR}/CGAL/Qt" COMPONENT CGAL_Qt6) +install(DIRECTORY ${INCLUDE_CGAL_QT_DIRECTORIES} DESTINATION "${CGAL_INSTALL_INC_DIR}/CGAL/" COMPONENT CGAL_Qt6) if(CGAL_BRANCH_BUILD) install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/resources" COMPONENT CGAL_Qt6) install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/icons" COMPONENT CGAL_Qt6) From b8c5b1ca27aafa7e8ede1fee6aeb5bdf93942630 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 30 Nov 2023 12:49:42 +0100 Subject: [PATCH 249/341] A (last) verification step for all draw functions (nyf). --- BGL/include/CGAL/draw_face_graph.h | 30 ++++++++++--------- Point_set_3/include/CGAL/draw_point_set_3.h | 6 ++-- Polygon/include/CGAL/draw_polygon_2.h | 15 +++++----- .../include/CGAL/draw_polygon_with_holes_2.h | 23 +++++++++----- Surface_mesh/include/CGAL/draw_surface_mesh.h | 2 +- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index f7d95b45d35f..e4d2eecc957e 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -27,7 +27,7 @@ namespace draw_function_for_FG { template void compute_elements(const FG &fg, CGAL::Graphics_scene &graphics_scene, - const GSOptions &m_gs_options) + const GSOptions &gs_options) { using Point=typename boost::property_map_value::type; using Kernel = typename CGAL::Kernel_traits::Kernel; @@ -58,15 +58,17 @@ void compute_elements(const FG &fg, put(vnormals, v, n / i); } - if (m_gs_options.are_faces_enabled()) + if (gs_options.are_faces_enabled()) { for (auto fh : faces(fg)) { if (fh != boost::graph_traits::null_face() && // face exists - !m_gs_options.face_wireframe(fg, fh) && // face is not wireframe - m_gs_options.colored_face(fg, fh)) // and face is colored + gs_options.draw_face(fg, fh)) // face is drawn { - graphics_scene.face_begin(m_gs_options.face_color(fg, fh)); + if(gs_options.colored_face(fg, fh)) // face is colored + { graphics_scene.face_begin(gs_options.face_color(fg, fh)); } + else + { graphics_scene.face_begin(); } auto hd = halfedge(fh, fg); const auto first_hd = hd; do @@ -81,15 +83,15 @@ void compute_elements(const FG &fg, } } - if(m_gs_options.are_edges_enabled()) + if(gs_options.are_edges_enabled()) { for (auto e : edges(fg)) { - if(m_gs_options.colored_edge(fg, e)) // edge is colored + if(gs_options.colored_edge(fg, e)) // edge is colored { graphics_scene.add_segment(get(point_pmap, source(halfedge(e, fg), fg)), get(point_pmap, target(halfedge(e, fg), fg)), - m_gs_options.edge_color(fg, e)); + gs_options.edge_color(fg, e)); } else { @@ -99,14 +101,14 @@ void compute_elements(const FG &fg, } } - if(m_gs_options.are_vertices_enabled()) + if(gs_options.are_vertices_enabled()) { for (auto v : vertices(fg)) { - if(m_gs_options.colored_vertex(fg, v)) // vertex is colored + if(gs_options.colored_vertex(fg, v)) // vertex is colored { graphics_scene.add_point(get(point_pmap, v), - m_gs_options.vertex_color(fg, v)); + gs_options.vertex_color(fg, v)); } else { @@ -120,15 +122,15 @@ void compute_elements(const FG &fg, template void add_to_graphics_scene_for_fg(const FG &fg, - CGAL::Graphics_scene &graphics_scene, - const GSOptions &gs_options) + CGAL::Graphics_scene &graphics_scene, + const GSOptions &gs_options) { draw_function_for_FG::compute_elements(fg, graphics_scene, gs_options); } template void add_to_graphics_scene_for_fg(const FG &fg, - CGAL::Graphics_scene &graphics_scene) + CGAL::Graphics_scene &graphics_scene) { Graphics_scene_options::vertex_descriptor, diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index a40ad16aabff..422efde4aa22 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -70,8 +70,8 @@ void compute_elements(const PointSet& pointset, template void add_to_graphics_scene(const Point_set_3& apointset, - Graphics_scene& graphics_scene, - const GSOptions& gs_options) + Graphics_scene& graphics_scene, + const GSOptions& gs_options) { draw_function_for_PointSet::compute_elements(apointset, graphics_scene, @@ -80,7 +80,7 @@ void add_to_graphics_scene(const Point_set_3& apointset, template void add_to_graphics_scene(const Point_set_3& apointset, - Graphics_scene& graphics_scene) + Graphics_scene& graphics_scene) { CGAL::Graphics_scene_options, typename Point_set_3::const_iterator, diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 8af1ec1f1b42..b1f2209dbf5b 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -54,8 +54,6 @@ void compute_elements(const P2& p2, if (p2.is_empty()) return; - typename P2::Point_2 prev=p2.vertex(p2.size()-1); - if (gso.are_faces_enabled()) { if(gso.colored_face(p2, nullptr)) @@ -64,6 +62,7 @@ void compute_elements(const P2& p2, { graphics_scene.face_begin(); } } + typename P2::Vertex_const_iterator prev=p2.vertices_end(); --prev; for (typename P2::Vertex_const_iterator i=p2.vertices_begin(); i!=p2.vertices_end(); ++i) { @@ -77,18 +76,18 @@ void compute_elements(const P2& p2, } if(gso.are_edges_enabled() && - gso.draw_edge(p2, i)) + gso.draw_edge(p2, prev)) { // Add edge with previous point - if(gso.colored_edge(p2, i)) - { graphics_scene.add_segment(prev, *i, gso.edge_color(p2, i)); } + if(gso.colored_edge(p2, prev)) + { graphics_scene.add_segment(*prev, *i, gso.edge_color(p2, prev)); } else - { graphics_scene.add_segment(prev, *i); } + { graphics_scene.add_segment(*prev, *i); } } if(gso.are_faces_enabled()) { graphics_scene.add_point_in_face(*i); } // Add point in face - prev = *i; + prev=i; } if (gso.are_faces_enabled()) @@ -141,6 +140,8 @@ void draw(const CGAL_P2_TYPE &ap2, #endif // CGAL_USE_BASIC_VIEWER +#undef CGAL_P2_TYPE + } // End namespace CGAL #endif // CGAL_DRAW_POLYGON_2_H diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 02c06bc639d8..741524f418d0 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -68,19 +68,18 @@ void compute_one_loop_elements(const P2& ap2, { if(gs_options.are_vertices_enabled() && gs_options.draw_vertex(ap2, i)) - { // Add vertex - if(gs_options.colored_vertex(ap2, i)) + { // Add vertex + if(gs_options.colored_vertex(ap2, i)) { graphics_scene.add_point(*i, gs_options.vertex_color(ap2, i)); } else { graphics_scene.add_point(*i); } - } + } if(i!=aloop.vertices_begin() && - gs_options.are_edges_enabled() && - gs_options.draw_edge(ap2, i)) + gs_options.are_edges_enabled() && gs_options.draw_edge(ap2, prev)) { // Add segment with previous point - if(gs_options.colored_vertex(ap2, i)) - { graphics_scene.add_segment(*prev, *i, gs_options.edge_color(ap2, i)); } + if(gs_options.colored_edge(ap2, prev)) + { graphics_scene.add_segment(*prev, *i, gs_options.edge_color(ap2, prev)); } else { graphics_scene.add_segment(*prev, *i); } } @@ -94,7 +93,13 @@ void compute_one_loop_elements(const P2& ap2, // Add the last segment between the last point and the first one if(gs_options.are_edges_enabled() && gs_options.draw_edge(ap2, aloop.vertices_begin())) - { graphics_scene.add_segment(*prev, *(aloop.vertices_begin())); } + { + if(gs_options.colored_edge(ap2, prev)) + { graphics_scene.add_segment(*prev, *(aloop.vertices_begin()), + gs_options.edge_color(ap2, prev)); } + else + { graphics_scene.add_segment(*prev, *(aloop.vertices_begin())); } + } } template @@ -176,6 +181,8 @@ void draw(const CGAL_P2_WITH_HOLES_TYPE& ap2, #endif // CGAL_USE_BASIC_VIEWER +#undef CGAL_P2_WITH_HOLES_TYPE + } // End namespace CGAL #endif // CGAL_DRAW_POLYGON_WITH_HOLES_2_H diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 367a6cea0c81..69a7be45edf3 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -104,7 +104,7 @@ template void add_to_graphics_scene(const Surface_mesh& amesh, CGAL::Graphics_scene &graphics_scene) { add_to_graphics_scene_for_fg(amesh, graphics_scene, - Graphics_scene_options_surface_mesh(amesh)); } + Graphics_scene_options_surface_mesh(amesh)); } #ifdef CGAL_USE_BASIC_VIEWER From 2d256951cb9590bb12e1c44e1197a1009330e27c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 30 Nov 2023 16:21:08 +0100 Subject: [PATCH 250/341] Graphics_scene does not uses Qt --- Basic_viewer/include/CGAL/Graphics_scene.h | 14 +++++--------- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 3 ++- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index 1d1def2810b4..73a5fafe6377 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -14,7 +14,6 @@ #define CGAL_GRAPHICS_SCENE_H // TODO #include -#include #include #include @@ -270,18 +269,15 @@ class Graphics_scene } template - void add_text(const KPoint &kp, const QString &txt) + void add_text(const KPoint &kp, const std::string &txt) { Local_point p = get_local_point(kp); m_texts.push_back(std::make_tuple(p, txt)); } - template void add_text(const KPoint &kp, const char *txt) - { add_text(kp, QString(txt)); } - template - void add_text(const KPoint &kp, const std::string &txt) - { add_text(kp, txt.c_str()); } + void add_text(const KPoint &kp, const char *txt) + { add_text(kp, std::string(txt)); } bool empty() const { @@ -381,7 +377,7 @@ class Graphics_scene int m_texts_size() const { return m_texts.size(); } - const std::vector>& get_m_texts() const + const std::vector>& get_m_texts() const { return m_texts; } public: @@ -428,7 +424,7 @@ class Graphics_scene Buffer_for_vao m_buffer_for_mono_faces; Buffer_for_vao m_buffer_for_colored_faces; - std::vector> m_texts; + std::vector> m_texts; std::vector arrays[LAST_INDEX]; diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 245b335eb3e6..81325a2fa25b 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -598,7 +598,8 @@ class Basic_viewer : public CGAL::QGLViewer std::get<0>(m_texts_vec[i]).y(), std::get<0>(m_texts_vec[i]).z())); - drawText((int)screenPos[0], (int)screenPos[1], std::get<1>(m_texts_vec[i])); + drawText((int)screenPos[0], (int)screenPos[1], + QString(std::get<1>(m_texts_vec[i]).c_str())); } glEnable(GL_LIGHTING); } From c53e24a84f5cf684fc2bc81f0afb09da31f049af Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 30 Nov 2023 16:21:20 +0100 Subject: [PATCH 251/341] draw straight_skeleton_2 --- .../include/CGAL/draw_straight_skeleton_2.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h index e5efae9c2bee..8ff502ba5e3f 100644 --- a/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/draw_straight_skeleton_2.h @@ -88,12 +88,12 @@ void print_vertex_label(const SS2& ss2, const GSOptions& gs_options) { // TODO? an option different from draw_vertex to allow to show only some labels ?? - if (!gs_options.draw_vertex(ss2, vh)) - { return; } - - std::stringstream label; - label << "V" << vh->id() << std::ends; - graphics_scene.add_text(vh->point(), label.str()); + if (gs_options.draw_vertex(ss2, vh)) + { + std::stringstream label; + label << "V" << vh->id() << std::ends; + graphics_scene.add_text(vh->point(), label.str()); + } } template @@ -101,7 +101,7 @@ void compute_elements(const SS2& ss2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) { - if (!gs_options.are_edges_enabled()) + if (gs_options.are_edges_enabled()) { for (typename SS2::Halfedge_const_iterator it=ss2.halfedges_begin(); it != ss2.halfedges_end(); ++it) @@ -114,7 +114,7 @@ void compute_elements(const SS2& ss2, } } - if (!gs_options.are_vertices_enabled()) + if (gs_options.are_vertices_enabled()) { for (typename SS2::Vertex_const_iterator it=ss2.vertices_begin(); it!=ss2.vertices_end(); ++it) From 310ad8e40ccd86cbf125d07ab653be103e5d5c77 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 30 Nov 2023 16:40:12 +0100 Subject: [PATCH 252/341] remove old file --- .../Linear_cell_complex/basic_viewer.h | 1190 ----------------- 1 file changed, 1190 deletions(-) delete mode 100644 Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h diff --git a/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h b/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h deleted file mode 100644 index f01ab8208f26..000000000000 --- a/Linear_cell_complex/examples/Linear_cell_complex/basic_viewer.h +++ /dev/null @@ -1,1190 +0,0 @@ -// Copyright (c) 2011 CNRS and LIRIS' Establishments (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Guillaume Damiand - -#ifndef CGAL_BASIC_VIEWER_H -#define CGAL_BASIC_VIEWER_H - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define NB_VBO_BUFFERS 8 -#define NB_VAO_BUFFERS 4 - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Local_kernel; -typedef Local_kernel::Point_3 Local_point; -typedef Local_kernel::Vector_3 Local_vector; - -//Vertex source code -const char vertex_source_mono[] = - { - "#version 150 \n" - "in highp vec4 vertex;\n" - "in highp vec3 normal;\n" - - "uniform highp mat4 mvp_matrix;\n" - "uniform highp mat4 mv_matrix; \n" - - "out highp vec4 fP; \n" - "out highp vec3 fN; \n" - "void main(void)\n" - "{\n" - " fP = mv_matrix * vertex; \n" - " fN = mat3(mv_matrix)* normal; \n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -const char vertex_source_color[] = - { - "#version 150 \n" - "in highp vec4 vertex;\n" - "in highp vec3 normal;\n" - "in highp vec3 color;\n" - - "uniform highp mat4 mvp_matrix;\n" - "uniform highp mat4 mv_matrix; \n" - - "out highp vec4 fP; \n" - "out highp vec3 fN; \n" - "out highp vec4 fColor; \n" - "void main(void)\n" - "{\n" - " fP = mv_matrix * vertex; \n" - " fN = mat3(mv_matrix)* normal; \n" - " fColor = vec4(color, 1.0); \n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; - -//Vertex source code -const char fragment_source_mono[] = - { - "#version 150 \n" - "in highp vec4 fP; \n" - "in highp vec3 fN; \n" - "uniform highp vec4 color; \n" - "uniform highp vec4 light_pos; \n" - "uniform highp vec4 light_diff; \n" - "uniform highp vec4 light_spec; \n" - "uniform highp vec4 light_amb; \n" - "uniform float spec_power ; \n" - "out highp vec4 out_color; \n" - - "void main(void) { \n" - - " highp vec3 L = light_pos.xyz - fP.xyz; \n" - " highp vec3 V = -fP.xyz; \n" - - " highp vec3 N = normalize(fN); \n" - " L = normalize(L); \n" - " V = normalize(V); \n" - - " highp vec3 R = reflect(-L, N); \n" - " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * color; \n" - " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - - "out_color = light_amb*color + diffuse ; \n" - "} \n" - "\n" - }; - -const char fragment_source_color[] = - { - "#version 150 \n" - "in highp vec4 fP; \n" - "in highp vec3 fN; \n" - "in highp vec4 fColor; \n" - "uniform highp vec4 light_pos; \n" - "uniform highp vec4 light_diff; \n" - "uniform highp vec4 light_spec; \n" - "uniform highp vec4 light_amb; \n" - "uniform float spec_power ; \n" - "out highp vec4 out_color; \n" - - "void main(void) { \n" - - " highp vec3 L = light_pos.xyz - fP.xyz; \n" - " highp vec3 V = -fP.xyz; \n" - - " highp vec3 N = normalize(fN); \n" - " L = normalize(L); \n" - " V = normalize(V); \n" - - " highp vec3 R = reflect(-L, N); \n" - " highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; \n" - " highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n" - - "out_color = light_amb*fColor + diffuse ; \n" - "} \n" - "\n" - }; - -//Vertex source code -const char vertex_source_p_l[] = - { - "#version 150 \n" - "in highp vec4 vertex;\n" - "uniform highp mat4 mvp_matrix;\n" - "void main(void)\n" - "{\n" - " gl_Position = mvp_matrix * vertex;\n" - "}" - }; -//Vertex source code -const char fragment_source_p_l[] = - { - "#version 150 \n" - "uniform highp vec4 color; \n" - "out highp vec4 out_color; \n" - "void main(void) { \n" - "out_color = color; \n" - "} \n" - "\n" - }; - -namespace internal { - template - void newell_single_step_3(const Point& p, const Point& q, Vector& n) - { - // Compute normal of the face by using Newell's method: for each edge PQ - // Nx += (Py - Qy) * (Pz + Qz); - // Ny += (Pz - Qz) * (Px + Qx); - // Nz += (Px - Qx) * (Py + Qy); - n = Vector(n.x()+((p.y()-q.y())*(p.z()+q.z())), - n.y()+((p.z()-q.z())*(p.x()+q.x())), - n.z()+((p.x()-q.x())*(p.y()+q.y()))); - } -} // End namespace internal - -template -typename K::Vector_3 compute_normal_of_face(const std::vector& points) -{ - typename K::Vector_3 normal(CGAL::NULL_VECTOR); - unsigned int nb = 0; - for (std::size_t i=0; i0); - return (typename K::Construct_scaled_vector_3()(normal, 1.0/nb)); -} - -class Basic_viewer : public CGAL::QGLViewer, public QOpenGLFunctions -{ - struct Vertex_info - { - Local_vector v; - }; - - struct Face_info - { - bool exist_edge[3]; - bool is_external; - bool is_process; - }; - - typedef CGAL::Projection_traits_3 P_traits; - typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; - - typedef CGAL::Triangulation_face_base_with_info_2 Fb1; - - typedef CGAL::Constrained_triangulation_face_base_2 Fb; - typedef CGAL::Triangulation_data_structure_2 TDS; - typedef CGAL::Exact_predicates_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; - -public: - // Constructor/Destructor - Basic_viewer(const char* title="") : - CGAL::QGLViewer(CGAL::Qt::createOpenGLContext()), - m_draw_vertices(true), - m_draw_edges(true), - m_draw_faces(true), - m_flatShading(true), - m_use_mono_color(false), - m_inverse_normal(false), - m_empty(true), - m_size_points(7.), - m_size_edges(3.1), - m_vertices_mono_color(51, 51, 178), - m_edges_mono_color(51, 51, 148), - m_faces_mono_color(180, 125, 200), - m_ambient_color(0.6f, 0.5f, 0.5f, 0.5f), - m_are_buffers_initialized(false), - m_face_started(false) - { - if (title[0]==0) - setWindowTitle("CGAL Basic Viewer"); - else - setWindowTitle(title); - - resize(500, 450); - - if ( is_empty() ) - { - bb=Local_point(CGAL::ORIGIN).bbox(); - bb=bb + Local_point(1,1,1).bbox(); // To avoid a warning from Qglviewer - } - } - - ~Basic_viewer() - { - for (int i=0; i& point_vector) - { - point_vector.push_back(p.x()); - point_vector.push_back(p.y()); - point_vector.push_back(p.z()); - - if (is_empty()) - { bb=p.bbox(); m_empty=false; } - else - { bb=bb+p.bbox(); } - } - - void add_color(const CGAL::IO::Color& acolor, std::vector& color_vector) - { - color_vector.push_back((double)color_of_face.red()/(double)255); - color_vector.push_back((double)color_of_face.green()/(double)255); - color_vector.push_back((double)color_of_face.blue()/(double)255); - } - - void add_normal(const Local_vector& n, std::vector& normal_vector) - { - normal_vector.push_back(n.x()); - normal_vector.push_back(n.y()); - normal_vector.push_back(n.z()); - } - - void add_mono_point(const Local_point& p) - { add_point(p, arrays[POS_MONO_POINTS]); } - - void add_colored_point(const Local_point& p, const CGAL::IO::Color& acolor) - { - add_point(p, arrays[POS_COLORED_POINTS]); - add_color(acolor, arrays[COLOR_POINTS]); - } - - void add_mono_segment(const Local_point& p1, const Local_point& p2) - { - add_point(p1, arrays[POS_MONO_SEGMENTS]); - add_point(p2, arrays[POS_MONO_SEGMENTS]); - } - - void add_colored_segment(const Local_point& p1, const Local_point& p2, - const CGAL::IO::Color& acolor) - { - add_point(p1, arrays[POS_COLORED_SEGMENTS]); - add_point(p2, arrays[POS_COLORED_SEGMENTS]); - add_color(acolor, arrays[COLOR_SEGMENTS]); - } - - void face_begin() - { - if (m_face_started) - { - std::cerr<<"You cannot start a new face before to finish the previous one."<(points_of_face); - - if (points_of_face.size()==3) // Triangle: no need to triangulate - { - for (int i=0; i<3; ++i) - { - // The point - add_point(points_of_face[i], arrays[m_started_face_is_colored? - POS_COLORED_FACES: - POS_MONO_FACES]); - - // Its color - if (m_started_face_is_colored) - { add_color(color_of_face, arrays[COLOR_FACES]); } - - // Its flat normal - add_normal(normal, arrays[m_started_face_is_colored? - FLAT_NORMAL_COLORED_FACES: - FLAT_NORMAL_MONO_FACES]); - - // Its smoth normal (if given by the user) - if (vertex_normals_for_face.size()==3) - { // Here we have 3 vertex normals; we can use Gourod - add_normal(vertex_normals_for_face[i], arrays[m_started_face_is_colored? - SMOOTH_NORMAL_COLORED_FACES: - SMOOTH_NORMAL_MONO_FACES]); - } - else - { // Here user does not provide all vertex normals: we use face normal instead - // and thus we will not be able to use Gourod - add_normal(normal, arrays[m_started_face_is_colored? - SMOOTH_NORMAL_COLORED_FACES: - SMOOTH_NORMAL_MONO_FACES]); - } - } - } - // TODO CASE OF 4 POINTS ? PB HOW TO FIND (EASILY) THE TWO POINTS TO LINK ? - // else if (points_of_face.size()==4) - else - { // More than 3 points: we triangulate - try - { - P_traits cdt_traits(normal); - CDT cdt(cdt_traits); - - bool with_vertex_normal=(vertex_normals_for_face.size()==points_of_face.size()); - - // (1) We insert all the edges as constraint in the CDT. - typename CDT::Vertex_descriptor previous=NULL, first=NULL; - for (int i=0; iinfo().v=vertex_normals_for_face[i]; } - else - { vh->info().v=normal; } - - if(previous!=NULL && previous!=vh) - { cdt.insert_constraint(previous, vh); } - previous=vh; - } - - if (previous!=NULL && previous!=first) - cdt.insert_constraint(previous, first); - - // (2) We mark all external triangles - // (2.1) We initialize is_external and is_process values - for(typename CDT::All_faces_iterator fit = cdt.all_faces_begin(), - fitend = cdt.all_faces_end(); fit!=fitend; ++fit) - { - fit->info().is_external = true; - fit->info().is_process = false; - } - // (2.2) We check if the facet is external or internal - std::queue face_queue; - typename CDT::Face_descriptor face_internal = NULL; - if (cdt.infinite_vertex()->face()!=NULL) - face_queue.push(cdt.infinite_vertex()->face()); - while(! face_queue.empty() ) - { - typename CDT::Face_descriptor fh = face_queue.front(); - face_queue.pop(); - if(!fh->info().is_process) - { - fh->info().is_process = true; - for(int i=0; i<3; ++i) - { - if(!cdt.is_constrained(std::make_pair(fh, i))) - { - if (fh->neighbor(i)!=NULL) - face_queue.push(fh->neighbor(i)); - } - else if (face_internal==NULL) - { - face_internal = fh->neighbor(i); - } - } - } - } - - if ( face_internal!=NULL ) - face_queue.push(face_internal); - - while(! face_queue.empty() ) - { - typename CDT::Face_descriptor fh = face_queue.front(); - face_queue.pop(); - if(!fh->info().is_process) - { - fh->info().is_process = true; - fh->info().is_external = false; - for(int i=0; i<3; ++i) - { - if(!cdt.is_constrained(std::make_pair(fh, i))) - { - if (fh->neighbor(i)!=NULL) - face_queue.push(fh->neighbor(i)); - } - } - } - } - - // (3) Now we iterates on the internal faces to add the vertices to the - // positions and the normals to the appropriate vectors - for(typename CDT::Finite_faces_iterator ffit=cdt.finite_faces_begin(), - ffitend = cdt.finite_faces_end(); ffit!=ffitend; ++ffit) - { - if(!ffit->info().is_external) - { - for(int i=0; i<3; ++i) - { - // The point - add_point(ffit->vertex(i)->point(), arrays[m_started_face_is_colored? - POS_COLORED_FACES: - POS_MONO_FACES]); - - // Its color - if (m_started_face_is_colored) - { add_color(color_of_face, arrays[COLOR_FACES]); } - - // Its flat normal - add_normal(normal, arrays[m_started_face_is_colored? - FLAT_NORMAL_COLORED_FACES: - FLAT_NORMAL_MONO_FACES]); - - // Its smoth normal (if given by the user) - add_normal(ffit->vertex(i)->info().v, arrays[m_started_face_is_colored? - SMOOTH_NORMAL_COLORED_FACES: - SMOOTH_NORMAL_MONO_FACES]); - } - } - } - } - catch(...) - { // Triangulation crash: the face is not filled - std::cout<<"Catch: face not filled."<compileSourceCode(vertex_source_mono)) - { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(fragment_source_mono)) - { std::cerr<<"Compiling fragmentsource FAILED"<compileSourceCode(vertex_source_mono)) - { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(fragment_source_mono)) - { std::cerr<<"Compiling fragmentsource FAILED"<compileSourceCode(vertex_source_color)) - { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(fragment_source_color)) - { std::cerr<<"Compiling fragmentsource FAILED"<compileSourceCode(vertex_source_p_l)) - { std::cerr<<"Compiling vertex source FAILED"<compileSourceCode(fragment_source_p_l)) - { std::cerr<<"Compiling fragmentsource FAILED"<(arrays[POS_MONO_FACES].size()*sizeof(float))); - vertexLocation[vaon] = rendering_program_mono.attributeLocation("vertex"); - rendering_program_mono.bind(); - rendering_program_mono.enableAttributeArray(vertexLocation[vaon]); - rendering_program_mono.setAttributeBuffer(vertexLocation[vaon],GL_FLOAT,0,3); - rendering_program_mono.release(); - - buffers[bufn].release(); - ++bufn; - - // 3.1.2) normals of the mono faces - assert(bufn(arrays[FLAT_NORMAL_MONO_FACES].size()* - sizeof(float))); - } - else - { - buffers[bufn].allocate(arrays[SMOOTH_NORMAL_MONO_FACES].data(), - static_cast(arrays[SMOOTH_NORMAL_MONO_FACES].size()* - sizeof(float))); - } - normalsLocation = rendering_program_mono.attributeLocation("normal"); - rendering_program_mono.bind(); - rendering_program_mono.enableAttributeArray(normalsLocation); - rendering_program_mono.setAttributeBuffer(normalsLocation,GL_FLOAT,0,3); - rendering_program_mono.release(); - - buffers[bufn].release(); - ++bufn; - - vao[vaon].release(); - ++vaon; - - // 3.2) Color faces - assert(vaon(arrays[POS_COLORED_FACES].size()*sizeof(float))); - vertexLocation[vaon] = rendering_program_color.attributeLocation("vertex"); - rendering_program_color.bind(); - rendering_program_color.enableAttributeArray(vertexLocation[vaon]); - rendering_program_color.setAttributeBuffer(vertexLocation[vaon],GL_FLOAT,0,3); - rendering_program_color.release(); - - buffers[bufn].release(); - ++bufn; - - // 3.2.2) normals of the color faces - assert(bufn(arrays[FLAT_NORMAL_COLORED_FACES].size()* - sizeof(float))); - } - else - { - buffers[bufn].allocate(arrays[SMOOTH_NORMAL_COLORED_FACES].data(), - static_cast(arrays[SMOOTH_NORMAL_COLORED_FACES].size()* - sizeof(float))); - } - normalsLocation = rendering_program_color.attributeLocation("normal"); - rendering_program_color.bind(); - rendering_program_color.enableAttributeArray(normalsLocation); - rendering_program_color.setAttributeBuffer(normalsLocation,GL_FLOAT,0,3); - rendering_program_color.release(); - - buffers[bufn].release(); - ++bufn; - - // 3.2.3) colors of the faces - if (!m_use_mono_color) - { - assert(bufn(arrays[COLOR_FACES].size()*sizeof(float))); - colorsLocation = rendering_program_color.attributeLocation("color"); - rendering_program_color.bind(); - rendering_program_color.enableAttributeArray(colorsLocation); - rendering_program_color.setAttributeBuffer(colorsLocation,GL_FLOAT,0,3); - rendering_program_color.release(); - - buffers[bufn].release(); - ++bufn; - } - - vao[vaon].release(); - ++vaon; - - m_are_buffers_initialized = true; - } - - void attrib_buffers(CGAL::QGLViewer* viewer) - { - QMatrix4x4 mvpMatrix; - QMatrix4x4 mvMatrix; - double mat[16]; - viewer->camera()->getModelViewProjectionMatrix(mat); - for(int i=0; i < 16; i++) - { - mvpMatrix.data()[i] = (float)mat[i]; - } - viewer->camera()->getModelViewMatrix(mat); - for(int i=0; i < 16; i++) - { - mvMatrix.data()[i] = (float)mat[i]; - } - // define material - QVector4D diffuse( 0.9f, - 0.9f, - 0.9f, - 0.9f ); - - QVector4D specular( 0.0f, - 0.0f, - 0.0f, - 1.0f ); - - QVector4D position((bb.xmax()-bb.xmin())/2, (bb.ymax()-bb.ymin())/2,bb.zmax(), 0.0 ); - GLfloat shininess = 1.0f; - - rendering_program_mono.bind(); - mvpLocation[0] = rendering_program_mono.uniformLocation("mvp_matrix"); - mvLocation = rendering_program_mono.uniformLocation("mv_matrix"); - lightLocation[0] = rendering_program_mono.uniformLocation("light_pos"); - lightLocation[1] = rendering_program_mono.uniformLocation("light_diff"); - lightLocation[2] = rendering_program_mono.uniformLocation("light_spec"); - lightLocation[3] = rendering_program_mono.uniformLocation("light_amb"); - lightLocation[4] = rendering_program_mono.uniformLocation("spec_power"); - - rendering_program_mono.setUniformValue(lightLocation[0], position); - rendering_program_mono.setUniformValue(lightLocation[1], diffuse); - rendering_program_mono.setUniformValue(lightLocation[2], specular); - rendering_program_mono.setUniformValue(lightLocation[3], m_ambient_color); - rendering_program_mono.setUniformValue(lightLocation[4], shininess); - rendering_program_mono.setUniformValue(mvpLocation[0], mvpMatrix); - rendering_program_mono.setUniformValue(mvLocation, mvMatrix); - - colorLocation1 = rendering_program_mono.uniformLocation("color"); - rendering_program_mono.release(); - - rendering_program_color.bind(); - mvpLocation[0] = rendering_program_color.uniformLocation("mvp_matrix"); - mvLocation = rendering_program_color.uniformLocation("mv_matrix"); - lightLocation[0] = rendering_program_color.uniformLocation("light_pos"); - lightLocation[1] = rendering_program_color.uniformLocation("light_diff"); - lightLocation[2] = rendering_program_color.uniformLocation("light_spec"); - lightLocation[3] = rendering_program_color.uniformLocation("light_amb"); - lightLocation[4] = rendering_program_color.uniformLocation("spec_power"); - - rendering_program_color.setUniformValue(lightLocation[0], position); - rendering_program_color.setUniformValue(lightLocation[1], diffuse); - rendering_program_color.setUniformValue(lightLocation[2], specular); - rendering_program_color.setUniformValue(lightLocation[3], m_ambient_color); - rendering_program_color.setUniformValue(lightLocation[4], shininess); - rendering_program_color.setUniformValue(mvpLocation[0], mvpMatrix); - rendering_program_color.setUniformValue(mvLocation, mvMatrix); - - if (m_use_mono_color) - { colorLocation2 = rendering_program_color.uniformLocation("color"); } - rendering_program_color.release(); - - /* rendering_program_p_l_.bind(); - mvpLocation[1] = rendering_program_p_l.uniformLocation("mvp_matrix"); - colorLocation = rendering_program_p_l.uniformLocation("color"); - rendering_program.setUniformValue(mvpLocation[1], mvpMatrix); - rendering_program_p_l.release();*/ - } - - virtual void draw() - { - glEnable(GL_DEPTH_TEST); - if(!m_are_buffers_initialized) - initialize_buffers(); - - QColor color; - - if (m_draw_faces) - { - vao[0].bind(); - attrib_buffers(this); - rendering_program_mono.bind(); - color.setRgbF((double)m_faces_mono_color.red()/(double)255, - (double)m_faces_mono_color.green()/(double)255, - (double)m_faces_mono_color.blue()/(double)255); - rendering_program_mono.setUniformValue(colorLocation1,color); - glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_MONO_FACES].size()/3)); - rendering_program_mono.release(); - vao[0].release(); - - vao[1].bind(); - attrib_buffers(this); - rendering_program_color.bind(); - if (m_use_mono_color) - { - color.setRgbF((double)m_faces_mono_color.red()/(double)255, - (double)m_faces_mono_color.green()/(double)255, - (double)m_faces_mono_color.blue()/(double)255); - rendering_program_color.setUniformValue(colorLocation2,color); - } - glDrawArrays(GL_TRIANGLES, 0, static_cast(arrays[POS_COLORED_FACES].size()/3)); - rendering_program_color.release(); - vao[1].release(); - } - } - - virtual void init() - { - // Restore previous viewer state. - initializeOpenGLFunctions(); - - // Define 'Control+Q' as the new exit shortcut (default was 'Escape') - setShortcut(EXIT_VIEWER, Qt::CTRL+Qt::Key_Q); - - // Add custom key description (see keyPressEvent). - setKeyDescription(Qt::Key_E, "Toggles edges display"); - setKeyDescription(Qt::Key_F, "Toggles faces display"); - setKeyDescription(Qt::Key_G, "Switch between flat/Gouraud shading display"); - setKeyDescription(Qt::Key_M, "Toggles mono color for all faces"); - setKeyDescription(Qt::Key_N, "Inverse direction of normals"); - setKeyDescription(Qt::Key_V, "Toggles vertices display"); - setKeyDescription(Qt::Key_Plus, "Increase size of edges"); - setKeyDescription(Qt::Key_Minus, "Decrease size of edges"); - setKeyDescription(Qt::Key_Plus+Qt::ShiftModifier, "Increase size of vertices"); - setKeyDescription(Qt::Key_Minus+Qt::ShiftModifier, "Decrease size of vertices"); - setKeyDescription(Qt::Key_PageDown, "Increase light (all colors, use shift/alt/ctrl for one rgb component)"); - setKeyDescription(Qt::Key_PageUp, "Decrease light (all colors, use shift/alt/ctrl for one rgb component)"); - - // Light default parameters - ::glLineWidth(m_size_edges); - ::glEnable(GL_POLYGON_OFFSET_FILL); - ::glPolygonOffset(1.f,1.f); - ::glClearColor(1.0f,1.0f,1.0f,0.0f); - ::glDisable(GL_BLEND); - ::glEnable(GL_LINE_SMOOTH); - ::glDisable(GL_POLYGON_SMOOTH_HINT); - ::glBlendFunc(GL_ONE, GL_ZERO); - ::glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); - - compile_shaders(); - - this->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(bb.xmin(), - bb.ymin(), - bb.zmin()), - CGAL::qglviewer::Vec(bb.xmax(), - bb.ymax(), - bb.zmax())); - - this->showEntireScene(); - } - - void negate_all_normals() - { - for (unsigned int k=BEGIN_NORMAL; kmodifiers(); - - if ((e->key()==Qt::Key_E) && (modifiers==Qt::NoButton)) - { - m_draw_edges=!m_draw_edges; - displayMessage(QString("Draw edges=%1.").arg(m_draw_edges?"true":"false")); - updateGL(); - } - else if ((e->key()==Qt::Key_F) && (modifiers==Qt::NoButton)) - { - m_draw_faces=!m_draw_faces; - displayMessage(QString("Draw faces=%1.").arg(m_draw_faces?"true":"false")); - updateGL(); - } - else if ((e->key()==Qt::Key_G) && (modifiers==Qt::NoButton)) - { - m_flatShading=!m_flatShading; - if (m_flatShading) - displayMessage("Flat shading."); - else - displayMessage("Gouraud shading."); - compile_shaders(); - initialize_buffers(); - updateGL(); - } - else if ((e->key()==Qt::Key_M) && (modifiers==Qt::NoButton)) - { - m_use_mono_color=!m_use_mono_color; - displayMessage(QString("Mono color=%1.").arg(m_use_mono_color?"true":"false")); - compile_shaders(); - initialize_buffers(); - updateGL(); - } - else if ((e->key()==Qt::Key_N) && (modifiers==Qt::NoButton)) - { - m_inverse_normal=!m_inverse_normal; - negate_all_normals(); - compile_shaders(); - initialize_buffers(); - displayMessage(QString("Inverse normal=%1.").arg(m_inverse_normal?"true":"false")); - updateGL(); - } - else if ((e->key()==Qt::Key_V) && (modifiers==Qt::NoButton)) - { - m_draw_vertices=!m_draw_vertices; - displayMessage(QString("Draw vertices=%1.").arg(m_draw_vertices?"true":"false")); - updateGL(); - } - else if ((e->key()==Qt::Key_Plus) && (modifiers==Qt::KeypadModifier)) - { - m_size_edges+=.5; - displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); - updateGL(); - } - else if ((e->key()==Qt::Key_Minus) && (modifiers==Qt::KeypadModifier)) - { - if (m_size_edges>.5) m_size_edges-=.5; - displayMessage(QString("Size of edges=%1.").arg(m_size_edges)); - updateGL(); - } - else if ((e->key()==Qt::Key_Plus) && (modifiers==(Qt::ShiftModifier|Qt::KeypadModifier))) - { - m_size_points+=.5; - displayMessage(QString("Size of points=%1.").arg(m_size_points)); - updateGL(); - } - else if ((e->key()==Qt::Key_Minus) && (modifiers==(Qt::ShiftModifier|Qt::KeypadModifier))) - { - if (m_size_points>.5) m_size_points-=.5; - displayMessage(QString("Size of points=%1.").arg(m_size_points)); - updateGL(); - } - else if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) - { - m_ambient_color.setX(m_ambient_color.x()+.1); - if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); - m_ambient_color.setY(m_ambient_color.x()+.1); - if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); - m_ambient_color.setZ(m_ambient_color.x()+.1); - if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageDown) && (modifiers==Qt::NoButton)) - { - m_ambient_color.setX(m_ambient_color.x()-.1); - if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); - m_ambient_color.setY(m_ambient_color.y()-.1); - if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); - m_ambient_color.setZ(m_ambient_color.z()-.1); - if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::ShiftModifier)) - { - m_ambient_color.setX(m_ambient_color.x()+.1); - if (m_ambient_color.x()>1.) m_ambient_color.setX(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::AltModifier)) - { - m_ambient_color.setY(m_ambient_color.y()+.1); - if (m_ambient_color.y()>1.) m_ambient_color.setY(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::ControlModifier)) - { - m_ambient_color.setZ(m_ambient_color.z()+.1); - if (m_ambient_color.z()>1.) m_ambient_color.setZ(1.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageDown) && (modifiers==Qt::ShiftModifier)) - { - m_ambient_color.setX(m_ambient_color.x()-.1); - if (m_ambient_color.x()<0.) m_ambient_color.setX(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageDown) && (modifiers==Qt::AltModifier)) - { - m_ambient_color.setY(m_ambient_color.y()-.1); - if (m_ambient_color.y()<0.) m_ambient_color.setY(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else if ((e->key()==Qt::Key_PageDown) && (modifiers==Qt::ControlModifier)) - { - m_ambient_color.setZ(m_ambient_color.z()-.1); - if (m_ambient_color.z()<0.) m_ambient_color.setZ(0.); - displayMessage(QString("Light color=(%1 %2 %3)."). - arg(m_ambient_color.x()).arg(m_ambient_color.y()).arg(m_ambient_color.z())); - updateGL(); - } - else - CGAL::QGLViewer::keyPressEvent(e); - } - - virtual QString helpString() const - { - QString text("

C G A L B a s i c V i e w e r

"); - text += "Use the mouse to move the camera around the object. "; - text += "You can respectively revolve around, zoom and translate with " - "the three mouse buttons. "; - text += "Left and middle buttons pressed together rotate around the " - "camera view direction axis

"; - text += "Pressing Alt and one of the function keys " - "(F1..F12) defines a camera keyFrame. "; - text += "Simply press the function key again to restore it. " - "Several keyFrames define a "; - text += "camera path. Paths are saved when you quit the application " - "and restored at next start.

"; - text += "Press F to display the frame rate, A for the " - "world axis, "; - text += "Alt+Return for full screen mode and Control+S " - "to save a snapshot. "; - text += "See the Keyboard tab in this window for a complete " - "shortcut list.

"; - text += "Double clicks automates single click actions: A left button " - "double click aligns the closer axis with the camera (if close enough). "; - text += "A middle button double click fits the zoom of the camera and " - "the right button re-centers the scene.

"; - text += "A left button double click while holding right button pressed " - "defines the camera Revolve Around Point. "; - text += "See the Mouse tab and the documentation web pages for " - "details.

"; - text += "Press Escape to exit the viewer."; - return text; - } - -private: - bool m_draw_vertices; - bool m_draw_edges; - bool m_draw_faces; - bool m_flatShading; - bool m_use_mono_color; - bool m_inverse_normal; - bool m_empty; - - double m_size_points; - double m_size_edges; - - CGAL::IO::Color m_vertices_mono_color; - CGAL::IO::Color m_edges_mono_color; - CGAL::IO::Color m_faces_mono_color; - QVector4D m_ambient_color; - - bool m_are_buffers_initialized; - CGAL::Bbox_3 bb; - - //Shaders elements - int vertexLocation[NB_VAO_BUFFERS]; - int normalsLocation; - int mvpLocation[2]; - int mvLocation; - int colorLocation1; - int colorLocation2; - int lightLocation[5]; - - enum - { POS_MONO_POINTS=0, - POS_COLORED_POINTS, - POS_MONO_SEGMENTS, - POS_COLORED_SEGMENTS, - POS_MONO_FACES, - POS_COLORED_FACES, - BEGIN_NORMAL, - SMOOTH_NORMAL_MONO_FACES=BEGIN_NORMAL, - FLAT_NORMAL_MONO_FACES, - SMOOTH_NORMAL_COLORED_FACES, - FLAT_NORMAL_COLORED_FACES, - END_NORMAL, - COLOR_POINTS=END_NORMAL, - COLOR_SEGMENTS, - COLOR_FACES, - LAST_INDEX - }; - - std::vector arrays[LAST_INDEX]; - - QGLBuffer buffers[NB_VBO_BUFFERS]; - QOpenGLVertexArrayObject vao[NB_VAO_BUFFERS]; - int colorsLocation; - - QOpenGLShaderProgram rendering_program_mono; - QOpenGLShaderProgram rendering_program_color; - QOpenGLShaderProgram rendering_program_p_l_mono; - QOpenGLShaderProgram rendering_program_p_l_color; - - // Local variables, used when we started a new face. - bool m_face_started; - bool m_started_face_is_colored; - std::vector points_of_face; - std::vector vertex_normals_for_face; - CGAL::IO::Color color_of_face; -}; - -#endif // CGAL_BASIC_VIEWER_H From f70a2d30cd5ef9f47cf33c8209e73734dd795f45 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 1 Dec 2023 09:06:54 +0100 Subject: [PATCH 253/341] draw lcc --- .../include/CGAL/draw_linear_cell_complex.h | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index e9e98ecc6b7f..7a5ad6eb7aa8 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -64,8 +64,7 @@ void compute_face(const LCC& lcc, CGAL::Graphics_scene& graphics_scene, const GSOptionsLCC& gso) { - if (!gso.are_faces_enabled() || - !gso.draw_face(lcc, dh)) + if(!gso.are_faces_enabled() || !gso.draw_face(lcc, dh)) { return; } // We fill only closed faces. @@ -79,13 +78,9 @@ void compute_face(const LCC& lcc, while (cur!=dh); if (gso.colored_volume(lcc, voldh)) - { - graphics_scene.face_begin(gso.volume_color(lcc, voldh)); - } + { graphics_scene.face_begin(gso.volume_color(lcc, voldh)); } else if (gso.colored_face(lcc, dh)) - { - graphics_scene.face_begin(gso.face_color(lcc, dh)); - } + { graphics_scene.face_begin(gso.face_color(lcc, dh)); } else { graphics_scene.face_begin(); } @@ -108,8 +103,7 @@ void compute_edge(const LCC& lcc, CGAL::Graphics_scene& graphics_scene, const GSOptions& gso) { - if (!gso.are_edges_enabled() || - !gso.draw_edge(lcc, dh)) + if(!gso.are_edges_enabled() || !gso.draw_edge(lcc, dh)) { return; } const typename LCC::Point& p1=lcc.point(dh); @@ -263,11 +257,11 @@ void add_to_graphics_scene(const CGAL_LCC_TYPE& alcc, gso; gso.colored_volume = [](const CGAL_LCC_TYPE&, - typename CGAL_LCC_TYPE::Dart_const_handle) -> bool + typename CGAL_LCC_TYPE::Dart_const_handle) -> bool { return true; }; gso.volume_color = [] (const CGAL_LCC_TYPE& alcc, - typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color + typename CGAL_LCC_TYPE::Dart_const_handle dh) -> CGAL::IO::Color { CGAL::Random random((unsigned int)(alcc.darts().index(dh))); return get_random_color(random); From 2c3428335bae289ccfc6c7b5e4520d3e13e26aab Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 1 Dec 2023 09:53:27 +0100 Subject: [PATCH 254/341] draw smt --- .../Surface_mesh_topology/draw_facewidth.h | 2 - .../include/CGAL/draw_face_graph_with_paths.h | 61 +++++++++---------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index 0fe598482d0e..e277f7b91527 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -1,8 +1,6 @@ #ifndef DRAW_FACEWIDTH_H #define DRAW_FACEWIDTH_H -#include - #ifdef CGAL_USE_BASIC_VIEWER #include diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 375365eec38e..12d645ec1c78 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -184,32 +184,26 @@ template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - typename Get_map::type::size_type amark, CGAL::Graphics_scene& graphics_scene, - GSOptions& gso) + GSOptions& gso, + bool colored=false, + const CGAL::IO::Color& color=CGAL::IO::black()) { if(!gso.are_edges_enabled() || !gso.draw_edge(mesh, dh)) { return; } - typedef typename Get_map::type LCC; - typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typedef typename CGAL::Get_traits::Point Point; + typedef typename Get_map::type LCC; + typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; + typedef typename CGAL::Get_traits::Point Point; Point p1=get_point(mesh, dh); - Dart_const_descriptor d2 = lcc.other_extremity(dh); + Dart_const_descriptor d2=lcc.other_extremity(dh); if (d2!=LCC::null_descriptor) { - if (amark!=LCC::INVALID_MARK && - (lcc.is_marked(dh, amark) || lcc.is_marked(lcc.opposite2(dh), amark))) - { graphics_scene.add_segment(p1, get_point(mesh, d2), gso.color_of_marked_edges()); } + if(colored) + { graphics_scene.add_segment(p1, get_point(mesh, d2), color); } else - { - if(gso.colored_edge(mesh, dh)) - { graphics_scene.add_segment(p1, get_point(mesh, d2), - gso.edge_color(mesh, dh)); } - else - { graphics_scene.add_segment(p1, get_point(mesh, d2)); } - } + { graphics_scene.add_segment(p1, get_point(mesh, d2)); } } } @@ -217,21 +211,24 @@ template void compute_edge(const Mesh &mesh, const typename Get_map::storage_type& lcc, typename Get_map::type::Dart_const_descriptor dh, - const CGAL::IO::Color& color, CGAL::Graphics_scene& graphics_scene, - GSOptions& gso) + GSOptions& gso, + typename Get_map::type::size_type amark) { if(!gso.are_edges_enabled() || !gso.draw_edge(mesh, dh)) { return; } - typedef typename Get_map::type LCC; - typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typedef typename CGAL::Get_traits::Point Point; - - Point p1=get_point(mesh, dh); - Dart_const_descriptor d2=lcc.other_extremity(dh); - if (d2!=LCC::null_descriptor) - { graphics_scene.add_segment(p1, get_point(mesh, d2), color); } + if (amark!=Get_map::type::INVALID_MARK && + (lcc.is_marked(dh, amark) || lcc.is_marked(lcc.opposite2(dh), amark))) + { compute_edge(mesh, lcc, dh, graphics_scene, gso, true, gso.color_of_marked_edges()); } + else + { + if(gso.colored_edge(mesh, dh)) + { compute_edge(mesh, lcc, dh, graphics_scene, gso, true, + gso.edge_color(mesh, dh)); } + else + { compute_edge(mesh, lcc, dh, graphics_scene, gso, false); } + } } template @@ -271,7 +268,7 @@ void compute_path(const Mesh &mesh, { if (!lcc.is_marked( (*paths)[i].get_ith_dart(j), amark)) { - compute_edge(mesh, lcc, (*paths)[i].get_ith_dart(j), color, graphics_scene, gso); + compute_edge(mesh, lcc, (*paths)[i].get_ith_dart(j), graphics_scene, gso, true, color); lcc.template mark_cell<1>((*paths)[i].get_ith_dart(j), amark); } } @@ -324,7 +321,7 @@ void compute_elements(const Mesh &mesh, if ( !lcc.is_marked(it, markedges) ) { - compute_edge(mesh, lcc, it, amark, graphics_scene, gso); + compute_edge(mesh, lcc, it, graphics_scene, gso, amark); lcc.template mark_cell<1>(it, markedges); } @@ -347,8 +344,8 @@ void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gso, const std::vector>* paths, - typename Get_map::type::size_type amark=0) -//TODO typename Get_map::type::INVALID_MARK) + typename Get_map::type::size_type amark= + Get_map::type::INVALID_MARK) { draw_function_for_face_graph_with_paths::compute_elements(mesh, graphics_scene, gso, paths, amark); @@ -358,8 +355,8 @@ template void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const std::vector>* paths, - typename Get_map::type::size_type amark=0) - // TODO typename Get_map::type::INVALID_MARK) + typename Get_map::type::size_type amark= + Get_map::type::INVALID_MARK) { // Default graphics view options. Graphics_scene_options_face_graph_with_paths Date: Fri, 1 Dec 2023 10:00:03 +0100 Subject: [PATCH 255/341] draw t3 --- Triangulation_3/include/CGAL/draw_triangulation_3.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Triangulation_3/include/CGAL/draw_triangulation_3.h b/Triangulation_3/include/CGAL/draw_triangulation_3.h index 50044bd845b0..376b73b8c53b 100644 --- a/Triangulation_3/include/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/include/CGAL/draw_triangulation_3.h @@ -27,8 +27,8 @@ namespace draw_function_for_t3 template void compute_face(typename T3::Finite_facets_iterator fh, - const GSOptions& gs_options, - CGAL::Graphics_scene& graphics_scene, const T3 *t3) + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gs_options, const T3 *t3) { if(!gs_options.draw_face(*t3, fh)) { return; } @@ -62,7 +62,8 @@ void compute_edge(typename T3::Finite_edges_iterator eh, eh->first->vertex(eh->third)->point(), gs_options.edge_color(*t3, eh)); } - else { + else + { graphics_scene.add_segment(eh->first->vertex(eh->second)->point(), eh->first->vertex(eh->third)->point()); } @@ -93,14 +94,14 @@ void compute_elements(const T3* t3, { for (typename T3::Finite_facets_iterator it=t3->finite_facets_begin(); it!=t3->finite_facets_end(); ++it) - { compute_face(it, gs_options, graphics_scene, t3); } + { compute_face(it, graphics_scene, gs_options, t3); } } if (gs_options.are_edges_enabled()) { for (typename T3::Finite_edges_iterator it=t3->finite_edges_begin(); it!=t3->finite_edges_end(); ++it) - { compute_edge(it, graphics_scene,gs_options, t3); } + { compute_edge(it, graphics_scene, gs_options, t3); } } if (gs_options.are_vertices_enabled()) From c1dd38e5813d8977a7b99b51ea73237c4aba9de1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 1 Dec 2023 13:21:50 +0100 Subject: [PATCH 256/341] draw nef3 --- Nef_3/include/CGAL/draw_nef_3.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 833db0d0188d..99fe167ad623 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -223,8 +223,7 @@ void compute_elements(const Nef_Polyhedron &nef, typedef typename Nef_Polyhedron::SFace_const_handle SFace_const_handle; Volume_const_iterator c; - Nef_Visitor - V(nef, graphics_scene, gs_options); + Nef_Visitor V(nef, graphics_scene, gs_options); CGAL_forall_volumes(c, nef) { Shell_entry_const_iterator it; @@ -262,12 +261,12 @@ void add_to_graphics_scene(const CGAL_NEF3_TYPE &anef, typename CGAL_NEF3_TYPE::Halffacet_const_handle /*fh*/> gs_options; - gs_options.colored_face = [] (const CGAL_NEF3_TYPE&, - typename CGAL_NEF3_TYPE::Halffacet_const_handle) -> bool + gs_options.colored_face=[](const CGAL_NEF3_TYPE&, + typename CGAL_NEF3_TYPE::Halffacet_const_handle) -> bool { return true; }; - gs_options.face_color = [] (const CGAL_NEF3_TYPE&, - typename CGAL_NEF3_TYPE::Halffacet_const_handle fh) -> CGAL::IO::Color + gs_options.face_color=[](const CGAL_NEF3_TYPE&, + typename CGAL_NEF3_TYPE::Halffacet_const_handle fh) -> CGAL::IO::Color { if (fh==nullptr) // use to get the mono color { return CGAL::IO::Color(100, 125, 200); } @@ -304,6 +303,8 @@ void draw(const CGAL_NEF3_TYPE &anef, #endif // CGAL_USE_BASIC_VIEWER +#undef CGAL_NEF3_TYPE + } // End namespace CGAL #endif // DRAW_NEF_3_H From e3497d08e005c619e8c6ed7cb6c33e41ce5ad559 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 1 Dec 2023 13:58:47 +0100 Subject: [PATCH 257/341] draw ps2 --- .../include/CGAL/draw_polygon_set_2.h | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 2dea0e7b0415..a6dd820f5f43 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -94,8 +94,8 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, auto prev = p.vertices_begin(); auto it = prev; - if (gso.are_vertices_enabled() && - gso.draw_vertex(p, it)) + // First vertex + if (gso.are_vertices_enabled() && gso.draw_vertex(p, it)) { if(gso.colored_vertex(p, it)) { gs.add_point(*it, gso.vertex_color(p, it)); } @@ -106,10 +106,10 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, if (gso.are_faces_enabled()) { gs.add_point_in_face(*it); } + // Other vertices for (++it; it!=p.vertices_end(); ++it) { - if (gso.are_vertices_enabled() && - gso.draw_vertex(p, it)) + if (gso.are_vertices_enabled() && gso.draw_vertex(p, it)) { // Add point if(gso.colored_vertex(p, it)) { gs.add_point(*it, gso.vertex_color(p, it)); } @@ -117,8 +117,7 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, { gs.add_point(*it); } } - if (gso.are_edges_enabled() && - gso.draw_edge(p, prev)) + if (gso.are_edges_enabled() && gso.draw_edge(p, prev)) { // Add segment with previous point if(gso.colored_edge(p, prev)) { gs.add_segment(*prev, *it, gso.edge_color(p, prev)); } @@ -131,9 +130,9 @@ void compute_loop(const typename PS2::Polygon_2& p, bool hole, prev = it; } - if (gso.are_edges_enabled() && - gso.draw_edge(p, prev)) - { // Add the last segment between the last point and the first one + // Last segment (between last and first point) + if (gso.are_edges_enabled() && gso.draw_edge(p, prev)) + { if(gso.colored_edge(p, prev)) { gs.add_segment(*prev, *(p.vertices_begin()), gso.edge_color(p, prev)); } else @@ -154,15 +153,18 @@ void compute_elements(const PWH& pwh, using Pnt=typename PWH::Polygon_2::Point_2; const Pnt* point_in_face=nullptr; - if (pwh.outer_boundary().is_empty() && (gso.width()!=0 || gso.height()!=0)) + if (pwh.outer_boundary().is_empty()) { - typename PWH::Polygon_2 pgn; - pgn.push_back(Pnt(-gso.width(), -gso.height())); - pgn.push_back(Pnt(gso.width(), -gso.height())); - pgn.push_back(Pnt(gso.width(), gso.height())); - pgn.push_back(Pnt(-gso.width(), gso.height())); - draw_function_for_boolean_set_2::compute_loop(pgn, false, gs, gso); - point_in_face = &(pgn.vertex(pgn.size()-1)); + if(gso.width()!=0 && gso.height()!=0) + { + typename PWH::Polygon_2 pgn; + pgn.push_back(Pnt(-gso.width(), -gso.height())); + pgn.push_back(Pnt(gso.width(), -gso.height())); + pgn.push_back(Pnt(gso.width(), gso.height())); + pgn.push_back(Pnt(-gso.width(), gso.height())); + draw_function_for_boolean_set_2::compute_loop(pgn, false, gs, gso); + point_in_face = &(pgn.vertex(pgn.size()-1)); + } } else { @@ -174,12 +176,12 @@ void compute_elements(const PWH& pwh, for (auto it = pwh.holes_begin(); it != pwh.holes_end(); ++it) { draw_function_for_boolean_set_2::compute_loop(*it, true, gs, gso); - if (gso.are_faces_enabled()) + if (gso.are_faces_enabled() && point_in_face && point_in_face!=nullptr) { gs.add_point_in_face(*point_in_face); } } - if (gso.are_faces_enabled()) - { gs.face_end(); } + if (gso.are_faces_enabled()) + { gs.face_end(); } } } // End namespace draw_function_for_boolean_set_2 @@ -203,6 +205,9 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer m_ps(ps), gso(gs_options) { + gso.width(CGAL_BASIC_VIEWER_INIT_SIZE_X); + gso.height(CGAL_BASIC_VIEWER_INIT_SIZE_Y); + if (ps.is_empty()) return; // mimic the computation of Camera::pixelGLRatio() @@ -210,7 +215,7 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer CGAL::qglviewer::Vec minv(bbox.xmin(), bbox.ymin(), 0); CGAL::qglviewer::Vec maxv(bbox.xmax(), bbox.ymax(), 0); auto diameter = (maxv - minv).norm(); - m_pixel_ratio = diameter / m_height; + m_pixel_ratio = diameter / gso.height(); } /*! Intercept the resizing of the window. @@ -261,12 +266,6 @@ class Polygon_set_2_basic_viewer_qt : public Basic_viewer } private: - //! The window width in pixels. - int m_width = CGAL_BASIC_VIEWER_INIT_SIZE_X; - - //! The window height in pixels. - int m_height = CGAL_BASIC_VIEWER_INIT_SIZE_Y; - //! The ratio between pixel and opengl units (in world coordinate system). double m_pixel_ratio = 1; @@ -342,6 +341,8 @@ void draw(const CGAL_PS2_TYPE& ps, #endif // CGAL_USE_BASIC_VIEWER +#undef CGAL_PS2_TYPE + } // End namespace CGAL #endif // CGAL_DRAW_POLYGON_SET_2_H From 3aa6ad18b287e11ab914fd06a201464fa498a6a7 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 30 Nov 2023 14:35:49 +0100 Subject: [PATCH 258/341] Bug fix for 2D mode in basic viewer --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 81325a2fa25b..8f7869441132 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -1415,6 +1415,7 @@ class Basic_viewer : public CGAL::QGLViewer if (is_two_dimensional()) { displayMessage(QString("Viewer is in 2D mode.")); } else { displayMessage(QString("Viewer is in 3D mode.")); } + set_camera_mode(); update(); } } From 4684dc4f8e2687ac453b6aec1baa73849d6b47c0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 1 Dec 2023 18:01:58 +0100 Subject: [PATCH 259/341] T2 and CDT2 draw --- .../examples/Triangulation_2/CMakeLists.txt | 3 +- .../examples/Triangulation_2/constrained.cpp | 4 + .../Triangulation_2/polygon_triangulation.cpp | 4 +- ...gon_triangulation_graphics_scene_options.h | 46 ++-------- .../CGAL/draw_constrained_triangulation_2.h | 92 +++++++++++-------- .../include/CGAL/draw_triangulation_2.h | 14 +-- 6 files changed, 74 insertions(+), 89 deletions(-) diff --git a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt index 47374a859985..8f399fa86da8 100644 --- a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt +++ b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt @@ -16,8 +16,9 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(polygon_triangulation PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(constrained PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_triangulation_2 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(polygon_triangulation PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(star_conflict_zone PUBLIC CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: Several examples require Qt6 and will not be compiled.") diff --git a/Triangulation_2/examples/Triangulation_2/constrained.cpp b/Triangulation_2/examples/Triangulation_2/constrained.cpp index 9901ec05fd37..3ed1b19a880f 100644 --- a/Triangulation_2/examples/Triangulation_2/constrained.cpp +++ b/Triangulation_2/examples/Triangulation_2/constrained.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -27,5 +28,8 @@ main( ) ++count; std::cout << "The number of resulting constrained edges is "; std::cout << count << std::endl; + + CGAL::draw(cdt); + return 0; } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp b/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp index 82d17c9e88b4..698ff58b99ba 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation.cpp @@ -58,7 +58,7 @@ int main( ) assert(count > 0); assert(count < cdt.number_of_faces()); - CGAL::Polygon_triangulation_gs_options myfunctor(in_domain); - CGAL::draw(cdt, myfunctor); + Polygon_triangulation_gs_options gso(in_domain); + CGAL::draw(cdt, gso); return 0; } diff --git a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h index 02f467dcb58b..4768211fdfa6 100644 --- a/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h +++ b/Triangulation_2/examples/Triangulation_2/polygon_triangulation_graphics_scene_options.h @@ -12,42 +12,37 @@ #ifndef CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H #define CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H -#include #include #include -#include -#include - -namespace CGAL -{ template struct Polygon_triangulation_gs_options : - public CGAL::Graphics_scene_options { + using T2=typename PT::Triangulation; template Polygon_triangulation_gs_options(IPM ipm) { this->colored_face = - [](const PT&, const typename PT::Finite_faces_iterator) -> bool + [](const T2&, const typename PT::Finite_faces_iterator) -> bool { return true; }; this->face_color = - [](const PT&, const typename PT::Finite_faces_iterator fh) -> CGAL::IO::Color + [](const T2&, const typename PT::Finite_faces_iterator fh) -> CGAL::IO::Color { CGAL::Random random((unsigned int)(std::size_t)(&*fh)); return get_random_color(random); }; this->draw_face= - [ipm](const PT&, const typename PT::Finite_faces_iterator fh) -> bool + [ipm](const T2&, const typename PT::Finite_faces_iterator fh) -> bool { return get(ipm, fh); }; this->draw_edge= - [ipm](const PT& pt, const typename PT::Finite_edges_iterator eh) -> bool + [ipm](const T2& pt, const typename PT::Finite_edges_iterator eh) -> bool { typename PT::Face_handle fh1=eh->first; typename PT::Face_handle fh2=pt.mirror_edge(*eh).first; @@ -56,33 +51,4 @@ struct Polygon_triangulation_gs_options : } }; -#define CGAL_CT2_TYPE CGAL::Constrained_Delaunay_triangulation_2 - -template -void add_in_graphics_scene(const CGAL_CT2_TYPE& ct2, - CGAL::Graphics_scene& graphic_buffer, - const GSOptions& gs_options) -{ - draw_function_for_t2::compute_elements(ct2, graphic_buffer, gs_options); -} - -#ifdef CGAL_USE_BASIC_VIEWER - -// Specialization of draw function. -template -void draw(const CGAL_CT2_TYPE &ct2, const GSOptions &gs_options, - const char *title="Constrained Triangulation_2 Basic Viewer") -{ - CGAL::Graphics_scene buffer; - add_in_graphics_scene(ct2, buffer, gs_options); - draw_graphics_scene(buffer, title); -} - -#endif // CGAL_USE_BASIC_VIEWER - -#undef CGAL_CT2_TYPE - -}; // end namespace CGAL - #endif // CGAL_POLYGON_TRIANGULATION_GRAPHICS_SCENE_OPTIONS_H diff --git a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h index 6fc3d8f3bbe0..05d933f92e9b 100644 --- a/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_constrained_triangulation_2.h @@ -16,55 +16,73 @@ #include #include - -#ifdef CGAL_USE_BASIC_VIEWER - #include namespace CGAL { + +template +struct Graphics_scene_options_constrained_triangulation_2: + public CGAL::Graphics_scene_options +{ + using BASET2=typename CDT::Triangulation; + + Graphics_scene_options_constrained_triangulation_2(const CDT& cdt) + { + this->colored_edge = + [&cdt](const BASET2&, typename CDT::Finite_edges_iterator eh) -> bool + { return cdt.is_constrained(*eh); }; + + this->edge_color = + [&cdt](const BASET2&, typename CDT::Finite_edges_iterator eh) -> CGAL::IO::Color + { return cdt.is_constrained(*eh)? CGAL::IO::green() : CGAL::IO::black(); }; + }; + + template + Graphics_scene_options_constrained_triangulation_2(const CDT& cdt, InDomainPmap ipm) + { + this->colored_edge = + [&cdt](const BASET2&, typename CDT::Finite_edges_iterator eh) -> bool + { return cdt.is_constrained(*eh); }; + + this->edge_color = + [&cdt](const BASET2&, typename CDT::Finite_edges_iterator eh) -> CGAL::IO::Color + { return cdt.is_constrained(*eh)? CGAL::IO::green() : CGAL::IO::black(); }; + + this->colored_face = + [](const BASET2&, typename CDT::Finite_faces_iterator) -> bool + { return true; }; + + this->face_color = + [ipm](const BASET2&, typename CDT::Finite_faces_iterator fh) -> CGAL::IO::Color + { return get(ipm, fh)? CGAL::IO::blue() : CGAL::IO::white(); }; + }; +}; + // Specialization of draw function. #define CGAL_T2_TYPE CGAL::Constrained_triangulation_2 template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, InDomainPmap ipm, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { - using BASET2=CGAL::Triangulation_2; - - Graphics_scene_options - drawingFunctor; - - drawingFunctor.colored_edge = - [](const BASET2& t2, typename CGAL_T2_TYPE::Finite_edges_iterator eh) -> bool - { return static_cast(t2).is_constrained(*eh); }; - - drawingFunctor.edge_color = - [](const BASET2& t2, typename CGAL_T2_TYPE::Finite_edges_iterator eh) -> CGAL::IO::Color - { return static_cast(t2).is_constrained(*eh)? CGAL::IO::green() : CGAL::IO::black(); }; - - drawingFunctor.colored_face = - [](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator) -> bool - { return true; }; - - drawingFunctor.face_color = - [&ipm](const BASET2&, typename CGAL_T2_TYPE::Finite_faces_iterator fh) -> CGAL::IO::Color - { return get(ipm, fh)? CGAL::IO::yellow() : CGAL::IO::white(); }; - - add_to_graphics_scene(at2, graphics_scene, drawingFunctor); + Graphics_scene_options_constrained_triangulation_2 gso(at2, ipm); + draw_function_for_t2::compute_elements(at2, graphics_scene, gso); } template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { - internal::In_domain in_domain; - add_to_graphics_scene(at2, in_domain, graphics_scene); + Graphics_scene_options_constrained_triangulation_2 gso(at2); + draw_function_for_t2::compute_elements(at2, graphics_scene, gso); } +#ifdef CGAL_USE_BASIC_VIEWER + template void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, const char *title="Constrained Triangulation_2 Basic Viewer") @@ -74,19 +92,19 @@ void draw(const CGAL_T2_TYPE& at2, InDomainPmap ipm, draw_graphics_scene(buffer, title); } - template void draw(const CGAL_T2_TYPE& at2, const char *title="Constrained Triangulation_2 Basic Viewer") { - internal::In_domain in_domain; - draw(at2, in_domain, title); + CGAL::Graphics_scene buffer; + add_to_graphics_scene(at2, buffer); + draw_graphics_scene(buffer, title); } +#endif // CGAL_USE_BASIC_VIEWER + #undef CGAL_T2_TYPE } // End namespace CGAL -#endif // CGAL_USE_BASIC_VIEWER - #endif // CGAL_DRAW_CT2_H diff --git a/Triangulation_2/include/CGAL/draw_triangulation_2.h b/Triangulation_2/include/CGAL/draw_triangulation_2.h index 22141bf7d974..32a42879ae46 100644 --- a/Triangulation_2/include/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/include/CGAL/draw_triangulation_2.h @@ -77,13 +77,9 @@ void compute_vertex(const T2& t2, typename T2::Vertex_handle vh, { return; } if (gs_options.colored_vertex(t2, vh)) - { - graphics_scene.add_point(vh->point(), gs_options.vertex_color(t2, vh)); - } + { graphics_scene.add_point(vh->point(), gs_options.vertex_color(t2, vh)); } else - { - graphics_scene.add_point(vh->point()); - } + { graphics_scene.add_point(vh->point()); } } template @@ -117,7 +113,7 @@ void compute_elements(const T2& t2, #define CGAL_T2_TYPE CGAL::Triangulation_2 - template +template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, CGAL::Graphics_scene& graphics_scene, const GSOptions& gs_options) @@ -125,9 +121,9 @@ void add_to_graphics_scene(const CGAL_T2_TYPE& at2, draw_function_for_t2::compute_elements(at2, graphics_scene, gs_options); } - template +template void add_to_graphics_scene(const CGAL_T2_TYPE& at2, - CGAL::Graphics_scene& graphics_scene) + CGAL::Graphics_scene& graphics_scene) { Graphics_scene_options Date: Mon, 4 Dec 2023 08:19:46 +0100 Subject: [PATCH 260/341] draw p2t2 --- .../CGAL/draw_periodic_2_triangulation_2.h | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h index c3a7bafca673..048494256b32 100644 --- a/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/draw_periodic_2_triangulation_2.h @@ -32,35 +32,38 @@ struct Graphics_scene_options_periodic_2_triangulation_2 : public CGAL::Graphics_scene_options { Graphics_scene_options_periodic_2_triangulation_2(): - domain_color(CGAL::IO::Color(96, 104, 252)), + m_domain_color(CGAL::IO::Color(96, 104, 252)), m_draw_domain(true), - m_current_display_type(DS::STORED) + m_display_type(DS::STORED) {} - bool get_draw_domain() const + bool draw_domain() const { return m_draw_domain; } - void set_draw_domain(bool b) + void draw_domain(bool b) { m_draw_domain=b; } void toggle_draw_domain() { m_draw_domain=!m_draw_domain; } - typename DS::Iterator_type current_display_type() const - { return m_current_display_type; } + typename DS::Iterator_type display_type() const + { return m_display_type; } - void increase_current_display_type() + void increase_display_type() { - if(m_current_display_type==DS::UNIQUE_COVER_DOMAIN) - { m_current_display_type=DS::STORED; } + if(m_display_type==DS::UNIQUE_COVER_DOMAIN) + { m_display_type=DS::STORED; } else - { m_current_display_type=typename DS::Iterator_type(static_cast(m_current_display_type)+1); } + { m_display_type=typename DS::Iterator_type(static_cast(m_display_type)+1); } } -public: - CGAL::IO::Color domain_color; + const CGAL::IO::Color& domain_color() const + { return m_domain_color; } + void domain_color(const CGAL::IO::Color& c) + { m_domain_color=c; } protected: + CGAL::IO::Color m_domain_color; bool m_draw_domain; - typename DS::Iterator_type m_current_display_type; + typename DS::Iterator_type m_display_type; }; namespace draw_function_for_P2T2 @@ -145,10 +148,10 @@ void compute_domain(const P2T2& p2t2, Kernel::Point_2 p3(orig_domain.xmax(), orig_domain.ymin()); Kernel::Point_2 p4((orig_domain.max)()); - graphics_scene.add_segment(p1 + shift, p2 + shift, gs_options.domain_color); - graphics_scene.add_segment(p1 + shift, p3 + shift, gs_options.domain_color); - graphics_scene.add_segment(p2 + shift, p4 + shift, gs_options.domain_color); - graphics_scene.add_segment(p3 + shift, p4 + shift, gs_options.domain_color); + graphics_scene.add_segment(p1 + shift, p2 + shift, gs_options.domain_color()); + graphics_scene.add_segment(p1 + shift, p3 + shift, gs_options.domain_color()); + graphics_scene.add_segment(p2 + shift, p4 + shift, gs_options.domain_color()); + graphics_scene.add_segment(p3 + shift, p4 + shift, gs_options.domain_color()); } } } @@ -161,7 +164,7 @@ void compute_elements(const P2T2& p2t2, // Get the display type, iterate through periodic elements according // to the display type typedef typename P2T2::Iterator_type Iterator_type; - Iterator_type it_type = (Iterator_type)gs_options.current_display_type(); + Iterator_type it_type = (Iterator_type)gs_options.display_type(); // Iterate through vertices, edges and faces, add elements to buffer if(gs_options.are_vertices_enabled()) @@ -185,7 +188,7 @@ void compute_elements(const P2T2& p2t2, { compute_face(p2t2, it, graphics_scene, gs_options); } } - if(gs_options.get_draw_domain()) + if(gs_options.draw_domain()) { // Compute the (9-sheet covering space) domain of the periodic triangulation compute_domain(p2t2, graphics_scene, gs_options); @@ -222,44 +225,29 @@ void add_to_graphics_scene(const CGAL_P2T2_TYPE& p2t2, // Specialization of draw function template void draw(const CGAL_P2T2_TYPE& ap2t2, - const GSOptions& gs_options, + GSOptions& gs_options, const char* title="2D Periodic Triangulation Viewer") { - CGAL::Graphics_scene buffer; - add_to_graphics_scene(ap2t2, buffer, gs_options); - draw_graphics_scene(buffer); -} - -template -void draw(const CGAL_P2T2_TYPE& ap2t2, - const char* title="2D Periodic Triangulation Viewer") -{ - CGAL::Graphics_scene buffer; - CGAL::Graphics_scene_options_periodic_2_triangulation_2 - gs_options; - - add_to_graphics_scene(ap2t2, buffer, gs_options); - CGAL::Qt::QApplication_and_basic_viewer app(buffer, title); + CGAL::Graphics_scene gs; + add_to_graphics_scene(ap2t2, gs, gs_options); + CGAL::Qt::QApplication_and_basic_viewer app(gs, title); if(app) { // Here we define the std::function to capture key pressed. app.basic_viewer().on_key_pressed= - [&ap2t2, &buffer, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool + [&ap2t2, &gs, &gs_options] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - gs_options.increase_current_display_type(); + gs_options.increase_display_type(); basic_viewer->displayMessage - (QString("Display type=%1.").arg(gs_options.current_display_type()==0?"Stored": - (gs_options.current_display_type()==1?"Unique": - (gs_options.current_display_type()==2?"Stored cover": + (QString("Display type=%1.").arg(gs_options.display_type()==0?"Stored": + (gs_options.display_type()==1?"Unique": + (gs_options.display_type()==2?"Stored cover": "Unique cover")))); - buffer.clear(); - draw_function_for_P2T2::compute_elements(ap2t2, buffer, gs_options); + gs.clear(); + add_to_graphics_scene(ap2t2, gs, gs_options); basic_viewer->redraw(); } else @@ -278,6 +266,18 @@ void draw(const CGAL_P2T2_TYPE& ap2t2, } } +template +void draw(const CGAL_P2T2_TYPE& ap2t2, + const char* title="2D Periodic Triangulation Viewer") +{ + CGAL::Graphics_scene_options_periodic_2_triangulation_2 + gs_options; + draw(ap2t2, gs_options, title); +} + #endif // CGAL_USE_BASIC_VIEWER #undef CGAL_P2T2_TYPE From 91ecafd004127305a1553e7beab08d155c1818b0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 4 Dec 2023 08:40:28 +0100 Subject: [PATCH 261/341] draw voronoi 2 --- .../draw_voronoi_diagram_2.cpp | 18 ++-- .../include/CGAL/draw_voronoi_diagram_2.h | 88 +++++++++++-------- 2 files changed, 59 insertions(+), 47 deletions(-) diff --git a/Voronoi_diagram_2/examples/Voronoi_diagram_2/draw_voronoi_diagram_2.cpp b/Voronoi_diagram_2/examples/Voronoi_diagram_2/draw_voronoi_diagram_2.cpp index 2cd8f4a7ef3c..54c1e8c9b545 100644 --- a/Voronoi_diagram_2/examples/Voronoi_diagram_2/draw_voronoi_diagram_2.cpp +++ b/Voronoi_diagram_2/examples/Voronoi_diagram_2/draw_voronoi_diagram_2.cpp @@ -23,15 +23,15 @@ int main(int argc, char* argv[]) { VD vd; std::ifstream ifs((argc>1)?argv[1]:"data/data4.dt.cin"); - assert(ifs); - - Site_2 t; - while ( ifs >> t ) { vd.insert(t); } - ifs.close(); - - assert( vd.is_valid() ); - - CGAL::draw(vd); + if(ifs) + { + Site_2 t; + while ( ifs >> t ) { vd.insert(t); } + ifs.close(); + assert( vd.is_valid() ); + + CGAL::draw(vd); + } return EXIT_SUCCESS; } diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index 79c3501bf81e..afe34cd5855f 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -33,16 +33,30 @@ template -struct Graphics_scene_options_voronoi : +struct Graphics_scene_options_voronoi_2 : public CGAL::Graphics_scene_options { - Graphics_scene_options_voronoi() : m_draw_voronoi_vertices(true), - m_draw_dual_vertices(true), - dual_vertex_color(CGAL::IO::Color(50, 100, 180)), - ray_color(CGAL::IO::Color(100, 0, 0)), - bisector_color(CGAL::IO::Color(0, 100, 0)) + Graphics_scene_options_voronoi_2() : m_dual_vertex_color(50, 100, 180), + m_ray_color(100, 0, 0), + m_bisector_color(0, 100, 0), + m_draw_voronoi_vertices(true), + m_draw_dual_vertices(true) {} + const CGAL::IO::Color& dual_vertex_color() const + { return m_dual_vertex_color; } + const CGAL::IO::Color& ray_color() const + { return m_ray_color; } + const CGAL::IO::Color& bisector_color() const + { return m_bisector_color; } + + void dual_vertex_color(const CGAL::IO::Color& c) + { m_dual_vertex_color=c; } + void ray_color(const CGAL::IO::Color& c) + { m_ray_color=c; } + void bisector_color(const CGAL::IO::Color& c) + { m_bisector_color=c; } + void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } @@ -53,11 +67,10 @@ struct Graphics_scene_options_voronoi : bool are_dual_vertices_enabled() const { return m_draw_dual_vertices; } void toggle_draw_dual_vertices() { m_draw_dual_vertices=!m_draw_dual_vertices; } - CGAL::IO::Color dual_vertex_color; - CGAL::IO::Color ray_color; - CGAL::IO::Color bisector_color; - protected: + CGAL::IO::Color m_dual_vertex_color; + CGAL::IO::Color m_ray_color; + CGAL::IO::Color m_bisector_color; bool m_draw_voronoi_vertices; bool m_draw_dual_vertices; }; @@ -89,7 +102,7 @@ void compute_dual_vertex(const V2& /*v2*/, typename V2::Delaunay_graph::Finite_vertices_iterator vi, CGAL::Graphics_scene &graphics_scene, const GSOptions& gs_options) -{ graphics_scene.add_point(vi->point(), gs_options.dual_vertex_color); } +{ graphics_scene.add_point(vi->point(), gs_options.dual_vertex_color()); } template void add_segments_and_update_bounding_box(const V2& v2, @@ -102,14 +115,17 @@ void add_segments_and_update_bounding_box(const V2& v2, if (he->is_segment()) { - if(gs_options.colored_edge(v2, he)) - { - graphics_scene.add_segment(he->source()->point(), he->target()->point(), - gs_options.edge_color(v2, he)); - } - else + if(gs_options.draw_edge(v2, he)) { - graphics_scene.add_segment(he->source()->point(), he->target()->point()); + if(gs_options.colored_edge(v2, he)) + { + graphics_scene.add_segment(he->source()->point(), he->target()->point(), + gs_options.edge_color(v2, he)); + } + else + { + graphics_scene.add_segment(he->source()->point(), he->target()->point()); + } } } else @@ -240,14 +256,14 @@ void compute_rays_and_bisectors(const V2&, if (he->has_source()) { // add_ray_segment(he->source()->point(), get_second_point(he, graphics_scene.get_bounding_box())); - graphics_scene.add_ray(he->source()->point(), direction, gs_options.ray_color); + graphics_scene.add_ray(he->source()->point(), direction, gs_options.ray_color()); } } else if (he->is_bisector()) { Kernel::Point_2 pointOnLine((v1->point().x() + v2->point().x()) / 2, (v1->point().y() + v2->point().y()) / 2); - graphics_scene.add_line(pointOnLine, direction, gs_options.bisector_color); + graphics_scene.add_line(pointOnLine, direction, gs_options.bisector_color()); } } @@ -348,7 +364,7 @@ void add_to_graphics_scene(const CGAL_VORONOI_TYPE& v2, CGAL::Graphics_scene& graphics_scene) { // Default graphics view options. - CGAL::Graphics_scene_options_voronoi @@ -362,27 +378,11 @@ void add_to_graphics_scene(const CGAL_VORONOI_TYPE& v2, // Specialization of draw function. template void draw(const CGAL_VORONOI_TYPE& av2, - const GSOptions& gs_options, + GSOptions& gs_options, const char *title="2D Voronoi Diagram Basic Viewer") { CGAL::Graphics_scene buffer; add_to_graphics_scene(av2, buffer, gs_options); - draw_graphics_scene(buffer, title); -} - -template -void draw(const CGAL_VORONOI_TYPE& av2, - const char *title="2D Voronoi Diagram Basic Viewer") -{ - CGAL::Graphics_scene buffer; - - CGAL::Graphics_scene_options_voronoi - gs_options; - - add_to_graphics_scene(av2, buffer, gs_options); CGAL::Qt::QApplication_and_basic_viewer app(buffer, title); if(app) @@ -445,6 +445,18 @@ void draw(const CGAL_VORONOI_TYPE& av2, } } +template +void draw(const CGAL_VORONOI_TYPE& av2, + const char *title="2D Voronoi Diagram Basic Viewer") +{ + CGAL::Graphics_scene_options_voronoi_2 + gs_options; + draw(av2, gs_options, title); +} + #endif // CGAL_USE_BASIC_VIEWER #undef CGAL_VORONOI_TYPE From 046fa81d688fe461673500690e44ce719de143a8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 4 Dec 2023 16:59:46 +0100 Subject: [PATCH 262/341] draw arrangement --- .../Arrangement_on_surface_2/draw_arr.cpp | 29 +- .../include/CGAL/draw_arrangement_2.h | 1079 +++++++---------- 2 files changed, 457 insertions(+), 651 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp index 91da88edc68a..8cff8c50625f 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp @@ -100,13 +100,24 @@ int main() { << arr.number_of_faces() << std::endl; std::size_t id(0); - CGAL::draw(arr, [&] (Arrangement_2::Face_const_handle) -> CGAL::IO::Color { - float h = 360.0f * id++ / arr.number_of_faces(); - float s = 0.5; - float v = 0.5; - auto [r, g, b] = hsv_to_rgb(h, s, v); - return CGAL::IO::Color(r,g,b); - }, "hsv colors", true); - - return EXIT_SUCCESS; + + CGAL::Graphics_scene_options gso; + gso.colored_face=[](const Arrangement_2&, Arrangement_2::Face_const_handle) -> bool + { return true; }; + + gso.face_color=[&id](const Arrangement_2& arr, Arrangement_2::Face_const_handle) -> CGAL::IO::Color + { + float h = 360.0f * id++ / arr.number_of_faces(); + float s = 0.5; + float v = 0.5; + auto [r, g, b] = hsv_to_rgb(h, s, v); + return CGAL::IO::Color(r,g,b); + }; + + CGAL::draw(arr, gso, "hsv colors"); + + return EXIT_SUCCESS; } diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 9d3248073482..2c26b65a55cd 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -24,379 +24,344 @@ #include #include - -#ifdef CGAL_USE_BASIC_VIEWER +#include +#include +#include #include -#include #include #include #include namespace CGAL { -struct Default_color_generator { - /*! Obtain color - */ - template - CGAL::IO::Color operator()(HalfedgeHandle /* h */) { - static std::random_device rd; - static std::mt19937 rng(rd()); - static std::uniform_int_distribution uni(0, 255); - return CGAL::IO::Color(uni(rng), uni(rng), uni(rng)); - } -}; - -// Viewer class for`< Polygon_2 -template -class Aos_2_basic_viewer_qt : public Basic_viewer { - using Aos = ArrangementOnSurface_2; - using Color_generator = ColorGenerator; - using Base = Basic_viewer; - using Gt = typename Aos::Geometry_traits_2; - using Point = typename Aos::Point_2; - using X_monotone_curve = typename Aos::X_monotone_curve_2; - using Vertex_const_handle = typename Aos::Vertex_const_handle; - using Halfedge_const_handle = typename Aos::Halfedge_const_handle; - using Face_const_handle = typename Aos::Face_const_handle; - using Ccb_halfedge_const_circulator = - typename Aos::Ccb_halfedge_const_circulator; - -public: - /// Construct the viewer. - /// @param arr the arrangement to view - /// @param title the title of the window - Aos_2_basic_viewer_qt(QWidget* parent, const Aos& aos, - Color_generator color_generator, - const char* title = "2D Arrangement Basic Viewer", - bool draw_vertices = false) : - // First draw: vertices; edges, faces; multi-color; no inverse normal - Base(parent, m_graphics_scene, title, draw_vertices, true, true, false, false), - m_aos(aos), - m_color_generator(color_generator) +namespace draw_function_for_arrangement_2 +{ + template + class Draw_arr_tool { - // mimic the computation of Camera::pixelGLRatio() - auto bbox = bounding_box(); - CGAL::qglviewer::Vec minv(bbox.xmin(), bbox.ymin(), 0); - CGAL::qglviewer::Vec maxv(bbox.xmax(), bbox.ymax(), 0); - auto diameter = (maxv - minv).norm(); - m_pixel_ratio = diameter / m_height; - } + public: + using Halfedge_const_handle=typename Arr::Halfedge_const_handle; + using Vertex_const_handle=typename Arr::Vertex_const_handle; + using Face_const_handle=typename Arr::Face_const_handle; + using Ccb_halfedge_const_circulator=typename Arr::Ccb_halfedge_const_circulator; + using Inner_ccb_const_iterator=typename Arr::Inner_ccb_const_iterator; + using Outer_ccb_const_iterator=typename Arr::Outer_ccb_const_iterator; + using Gt=typename Arr::Geometry_traits_2; + using Point=typename Arr::Point_2; + using X_monotone_curve = typename Arr::X_monotone_curve_2; + + Draw_arr_tool(Arr& a_aos, CGAL::Graphics_scene& a_gs, const GSOptions& a_gso): + m_aos(a_aos), m_gs(a_gs), m_gso(a_gso) + {} + + /// Add a face. + void add_face(Face_const_handle face) + { + // std::cout << "add_face()\n"; + for (Inner_ccb_const_iterator it = face->inner_ccbs_begin(); + it != face->inner_ccbs_end(); ++it) + { add_ccb(*it); } + + for (Outer_ccb_const_iterator it = face->outer_ccbs_begin(); + it != face->outer_ccbs_end(); ++it) + { + add_ccb(*it); + draw_region(*it); + } + } - /*! Intercept the resizing of the window. - */ - virtual void resizeGL(int width, int height) { - CGAL::QGLViewer::resizeGL(width, height); - m_width = width; - m_height = height; - CGAL::qglviewer::Vec p; - auto ratio = camera()->pixelGLRatio(p); - if (ratio != m_pixel_ratio) { - m_pixel_ratio = ratio; - add_elements(); + /// Add a Connected Component of the Boundary. + void add_ccb(Ccb_halfedge_const_circulator circ) + { + // std::cout << "add_ccb()\n"; + auto curr = circ; + do { + auto new_face = curr->twin()->face(); + if (m_visited.find(new_face) != m_visited.end()) continue; + m_visited[new_face] = true; + add_face(new_face); + } while (++curr != circ); } - } - /*! Compute an approximation of the bounding box of a point. - * \param[in] p the (exact) point. - * Call this member function only if the geometry traits is equipped with - * the coordinate-approximation functionality of a point coordinate. - * This function must be inlined (e.g., a template) to enable the - * compiled-time dispatching in the function `bounding_box()`. - */ - template - CGAL::Bbox_2 approximate_bbox(const Point& p, const Approximate& approx) { - auto x = approx(p, 0); - auto y = approx(p, 1); - return CGAL::Bbox_2(x, y, x, y); - } + ///! Draw a region. + void draw_region(Ccb_halfedge_const_circulator circ) + { + // std::cout << "draw_region()\n"; + /* Check whether the traits has a member function called + * approximate_2_object() and if so check whether the return type, namely + * `Approximate_2` has an appropriate operator. + * + * C++20 supports concepts and `requires` expression; see, e.g., + * https://en.cppreference.com/w/cpp/language/constraints; thus, the first + * condition above can be elegantly verified as follows: + * constexpr bool has_approximate_2_object = + * requires(const Gt& traits) { traits.approximate_2_object(); }; + * + * C++17 has experimental constructs called is_detected and + * is_detected_v that can be used to achieve the same goal. + * + * For now we use C++14 features. + */ + if(m_gso.colored_face(m_aos, circ->face())) + { m_gs.face_begin(m_gso.face_color(m_aos, circ->face())); } + else + { m_gs.face_begin(); } - /*! Obtain the bounding box of a point. - * \param[in] p the point. - * We assume that if the coordinate-approximation functionality is not - * supported, the point supports the member function `bbox()`. - * This function must be inlined (e.g., a template) to enable the - * compiled-time dispatching in the function `bounding_box()`. - */ - template - CGAL::Bbox_2 exact_bbox(const Point& p) { return p.bbox(); } + const auto* traits = this->m_aos.geometry_traits(); + auto ext = find_smallest(circ, *traits); + auto curr = ext; - /*! Compile time dispatching - */ + do { + // Skip halfedges that are "antenas": + while (curr->face() == curr->twin()->face()) curr = curr->twin()->next(); + draw_region_impl1(curr, *traits, 0); + curr = curr->next(); + } while (curr != ext); + + m_gs.face_end(); + } + + /// Compile time dispatching #if 0 - template - void bounding_box_impl2(CGAL::Bbox_2& bbox, const Point& p, T const&, long) - { bbox += exact_bbox(p); } - - template - auto bounding_box_impl2(CGAL::Bbox_2& bbox, const Point& p, T const& approx, - int) -> decltype(approx.operator()(p), void()) - { bbox += approximate_bbox(p, approx); } - - template - void bounding_box_impl1(CGAL::Bbox_2& bbox, const Point& p, T const&, long) - { bbox += exact_bbox(p); } - - template - auto bounding_box_impl1(CGAL::Bbox_2& bbox, const Point& p, T const& traits, - int) -> - decltype(traits.approximate_2_object(), void()) { - using Approximate = typename Gt::Approximate_2; - bounding_box_impl2(bbox, p, traits.approximate_2_object(), 0); - } + template + void draw_region_impl2(Halfedge_const_handle curr, T const&, long) + { draw_exact_region(curr); } + + template + auto draw_region_impl2(Halfedge_const_handle curr, T const& approx, int) -> + decltype(approx.template operator()(X_monotone_curve{}, double{}, I{}, + bool{}), void()) + { draw_approximate_region(curr, approx); } + + template + void draw_region_impl1(Halfedge_const_handle curr, T const&, long) + { draw_exact_region(curr); } + + template + auto draw_region_impl1(Halfedge_const_handle curr, T const& traits, int) -> + decltype(traits.approximate_2_object(), void()) { + using Approximate = typename Gt::Approximate_2; + draw_region_impl2(curr, traits.approximate_2_object(), 0); + } #else - template - void bounding_box_impl1(CGAL::Bbox_2& bbox, const Point& p, T const& traits, - int) - { bbox += approximate_bbox(p, traits.approximate_2_object()); } + template + void draw_region_impl1(Halfedge_const_handle curr, T const& traits, int) + { draw_approximate_region(curr, traits.approximate_2_object()); } #endif - /*! Compute the bounding box. - */ - CGAL::Bbox_2 bounding_box() { - CGAL::Bbox_2 bbox; - const auto* traits = this->m_aos.geometry_traits(); - // At this point we assume that the arrangement is not open, and thus the - // bounding box is defined by the vertices. - for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) - bounding_box_impl1(bbox, it->point(), *traits, 0); - return bbox; - } - - /*! Add all faces. - */ - template - void add_faces(const Traits&) { - for (auto it = m_aos.unbounded_faces_begin(); - it != m_aos.unbounded_faces_end(); ++it) - add_face(it); - } - - /*! Add all faces. - */ - template - void - add_faces(Arr_geodesic_arc_on_sphere_traits_2 const&) - { add_face(m_aos.faces_begin()); } - - /*! Add all elements to be drawn. - */ - void add_elements() { - // std::cout << "add_elements()\n"; - // std::cout << "ratio: " << this->pixel_ratio() << std::endl; - m_graphics_scene.clear(); - m_visited.clear(); - - if (m_aos.is_empty()) return; - add_faces(*(this->m_aos.geometry_traits())); - - // Add edges that do not separate faces. - for (auto it = m_aos.edges_begin(); it != m_aos.edges_end(); ++it) - if (it->face() == it->twin()->face()) draw_curve(it->curve()); - - // Add all points - for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) - draw_point(it->point()); - - m_visited.clear(); - } - - /*/ Obtain the pixel ratio - */ - double pixel_ratio() const { return m_pixel_ratio; } - -protected: - template - Halfedge_const_handle - find_smallest(Ccb_halfedge_const_circulator circ, - Arr_geodesic_arc_on_sphere_traits_2 const&) - { return circ; } - - /*! Find the halfedge incident to the lexicographically smallest vertex - * along the CCB, such that there is no other halfedge underneath. - */ - template - Halfedge_const_handle find_smallest(Ccb_halfedge_const_circulator circ, - const Traits&) { - // std::cout << "find_smallest()\n"; - const auto* traits = this->m_aos.geometry_traits(); - auto cmp_xy = traits->compare_xy_2_object(); - auto cmp_y = traits->compare_y_at_x_right_2_object(); - - // Find the first halfedge directed from left to right - auto curr = circ; - do if (curr->direction() == CGAL::ARR_LEFT_TO_RIGHT) break; - while (++curr != circ); - Halfedge_const_handle ext = curr; - - // Find the halfedge incident to the lexicographically smallest vertex, - // such that there is no other halfedge underneath. - do { - // Discard edges not directed from left to right: - if (curr->direction() != CGAL::ARR_LEFT_TO_RIGHT) continue; - - - auto res = cmp_xy(curr->source()->point(), ext->source()->point()); - - // Discard the edges inciden to a point strictly larger than the point - // incident to the stored extreme halfedge: - if (res == LARGER) continue; - - // Store the edge inciden to a point strictly smaller: - if (res == SMALLER) { - ext = curr; - continue; + template + void draw_region_impl1 + (Halfedge_const_handle curr, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) + { + // std::cout << "draw_region_impl1()\n"; + auto approx = traits.approximate_2_object(); + using Kernel = Kernel_; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Ap = typename Traits::Approximate_point_2; + using Approx_point_3 = typename Ak::Point_3; + + std::vector polyline; + double error(0.01); + bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; + approx(curr->curve(), error, std::back_inserter(polyline), l2r); + if (polyline.empty()) return; + auto it = polyline.begin(); + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 prev(x/l, y/l, z/l); + for (++it; it != polyline.end(); ++it) { + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 next(x/l, y/l, z/l); + this->add_segment(prev, next); + prev = next; + // this->add_point_in_face(*prev); } + } - // The incident points are equal; compare the halfedges themselves: - if (cmp_y(curr->curve(), ext->curve(), curr->source()->point()) == - SMALLER) - ext = curr; - } while (++curr != circ); + /*! Draw a region using aproximate coordinates. + * Call this member function only if the geometry traits is equipped with + * the coordinate-approximation functionality of a curve. + * This function must be inlined (e.g., a template) to enable the + * compiled-time dispatching in the function `draw_region()`. + */ + template + void draw_approximate_region(Halfedge_const_handle curr, + const Approximate& approx) + { + // std::cout << "draw_approximate_region()\n"; + std::vector polyline; + double error(0.01); // TODO? (this->pixel_ratio()); + bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; + approx(curr->curve(), error, std::back_inserter(polyline), l2r); + if (polyline.empty()) return; + auto it = polyline.begin(); + auto prev = it++; + for (; it != polyline.end(); prev = it++) { + m_gs.add_segment(*prev, *it); + m_gs.add_point_in_face(*prev); + } + } - return ext; - } + /// Draw an exact curve. + template + void draw_exact_curve(const XMonotoneCurve& curve) + { + const auto* traits = this->m_aos.geometry_traits(); + auto ctr_min = traits->construct_min_vertex_2_object(); + auto ctr_max = traits->construct_max_vertex_2_object(); + this->add_segment(ctr_min(curve), ctr_max(curve)); + } - /*! Draw a region using aproximate coordinates. - * Call this member function only if the geometry traits is equipped with - * the coordinate-approximation functionality of a curve. - * This function must be inlined (e.g., a template) to enable the - * compiled-time dispatching in the function `draw_region()`. - */ - template - void draw_approximate_region(Halfedge_const_handle curr, - const Approximate& approx) { - // std::cout << "draw_approximate_region()\n"; - std::vector polyline; - double error(this->pixel_ratio()); - bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; - approx(curr->curve(), error, std::back_inserter(polyline), l2r); - if (polyline.empty()) return; - auto it = polyline.begin(); - auto prev = it++; - for (; it != polyline.end(); prev = it++) { - m_graphics_scene.add_segment(*prev, *it); - m_graphics_scene.add_point_in_face(*prev); + /// Draw an exact region. + void draw_exact_region(Halfedge_const_handle curr) + { + // this->add_point_in_face(curr->source()->point()); + draw_exact_curve(curr->curve()); } - } - /*! Draw an exact curve. - */ - template - void draw_exact_curve(const XMonotoneCurve& curve) { - const auto* traits = this->m_aos.geometry_traits(); - auto ctr_min = traits->construct_min_vertex_2_object(); - auto ctr_max = traits->construct_max_vertex_2_object(); - this->add_segment(ctr_min(curve), ctr_max(curve)); - } + /// Add all faces. + template + void add_faces(const Traits&) + { + for (auto it=m_aos.unbounded_faces_begin(); it!=m_aos.unbounded_faces_end(); ++it) + { add_face(it); } + } - /*! Draw an exact region. - */ - void draw_exact_region(Halfedge_const_handle curr) { - // this->add_point_in_face(curr->source()->point()); - draw_exact_curve(curr->curve()); - } + /// Add all faces. + template + void add_faces(Arr_geodesic_arc_on_sphere_traits_2 const&) + { add_face(m_aos.faces_begin()); } - /*! Compile time dispatching - */ + /// Compile time dispatching #if 0 - template - void draw_region_impl2(Halfedge_const_handle curr, T const&, long) - { draw_exact_region(curr); } - - template - auto draw_region_impl2(Halfedge_const_handle curr, T const& approx, int) -> - decltype(approx.template operator()(X_monotone_curve{}, double{}, I{}, - bool{}), void()) - { draw_approximate_region(curr, approx); } - - template - void draw_region_impl1(Halfedge_const_handle curr, T const&, long) - { draw_exact_region(curr); } - - template - auto draw_region_impl1(Halfedge_const_handle curr, T const& traits, int) -> - decltype(traits.approximate_2_object(), void()) { - using Approximate = typename Gt::Approximate_2; - draw_region_impl2(curr, traits.approximate_2_object(), 0); - } + template + void draw_point_impl2(const Point& p, T const&, long) { add_point(p); } + + template + auto draw_point_impl2(const Point& p, T const& approx, int) -> + decltype(approx.operator()(p), void()) + { add_point(approx(p)); } + + template + void draw_point_impl1(const Point& p, T const&, long) { add_point(p); } + + template + auto draw_point_impl1(const Point& p, T const& traits, int) -> + decltype(traits.approximate_2_object(), void()) { + using Approximate = typename Gt::Approximate_2; + draw_point_impl2(p, traits.approximate_2_object(), true); + } #else - template - void draw_region_impl1(Halfedge_const_handle curr, T const& traits, int) - { draw_approximate_region(curr, traits.approximate_2_object()); } + template + void draw_point_impl1(const Point& p, T const& traits, int) + { m_gs.add_point(traits.approximate_2_object()(p)); } #endif - template - void draw_region_impl1 - (Halfedge_const_handle curr, - Arr_geodesic_arc_on_sphere_traits_2 const& traits, - int) { - // std::cout << "draw_region_impl1()\n"; - auto approx = traits.approximate_2_object(); - using Kernel = Kernel_; - using Traits = Arr_geodesic_arc_on_sphere_traits_2; - using Ak = typename Traits::Approximate_kernel; - using Ap = typename Traits::Approximate_point_2; - using Approx_point_3 = typename Ak::Point_3; - - std::vector polyline; - double error(0.01); - bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; - approx(curr->curve(), error, std::back_inserter(polyline), l2r); - if (polyline.empty()) return; - auto it = polyline.begin(); - auto x = it->dx(); - auto y = it->dy(); - auto z = it->dz(); - auto l = std::sqrt(x*x + y*y + z*z); - Approx_point_3 prev(x/l, y/l, z/l); - for (++it; it != polyline.end(); ++it) { - auto x = it->dx(); - auto y = it->dy(); - auto z = it->dz(); + template + void draw_point_impl1 + (const Point& p, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) + { + auto approx = traits.approximate_2_object(); + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Approx_point_3 = typename Ak::Point_3; + auto ap = approx(p); + auto x = ap.dx(); + auto y = ap.dy(); + auto z = ap.dz(); auto l = std::sqrt(x*x + y*y + z*z); - Approx_point_3 next(x/l, y/l, z/l); - this->add_segment(prev, next); - prev = next; - // this->add_point_in_face(*prev); + Approx_point_3 p3(x/l, y/l, z/l); + add_point(p3); } - } - /*! Draw a region. - */ - void draw_region(Ccb_halfedge_const_circulator circ) { - // std::cout << "draw_region()\n"; - /* Check whether the traits has a member function called - * approximate_2_object() and if so check whether the return type, namely - * `Approximate_2` has an appropriate operator. - * - * C++20 supports concepts and `requires` expression; see, e.g., - * https://en.cppreference.com/w/cpp/language/constraints; thus, the first - * condition above can be elegantly verified as follows: - * constexpr bool has_approximate_2_object = - * requires(const Gt& traits) { traits.approximate_2_object(); }; - * - * C++17 has experimental constructs called is_detected and - * is_detected_v that can be used to achieve the same goal. - * - * For now we use C++14 features. + /// Draw a point. + void draw_point(const Point& p) + { + const auto* traits = m_aos.geometry_traits(); + draw_point_impl1(p, *traits, 0); + } + + template + Halfedge_const_handle + find_smallest(Ccb_halfedge_const_circulator circ, + Arr_geodesic_arc_on_sphere_traits_2 const&) + { return circ; } + + /*! Find the halfedge incident to the lexicographically smallest vertex + * along the CCB, such that there is no other halfedge underneath. */ - auto color = m_color_generator(circ->face()); - m_graphics_scene.face_begin(color); + template + Halfedge_const_handle find_smallest(Ccb_halfedge_const_circulator circ, + const Traits&) + { + // std::cout << "find_smallest()\n"; + const auto* traits = this->m_aos.geometry_traits(); + auto cmp_xy = traits->compare_xy_2_object(); + auto cmp_y = traits->compare_y_at_x_right_2_object(); + + // Find the first halfedge directed from left to right + auto curr = circ; + do if (curr->direction() == CGAL::ARR_LEFT_TO_RIGHT) break; + while (++curr != circ); + Halfedge_const_handle ext = curr; + + // Find the halfedge incident to the lexicographically smallest vertex, + // such that there is no other halfedge underneath. + do { + // Discard edges not directed from left to right: + if (curr->direction() != CGAL::ARR_LEFT_TO_RIGHT) continue; + + auto res = cmp_xy(curr->source()->point(), ext->source()->point()); + + // Discard the edges inciden to a point strictly larger than the point + // incident to the stored extreme halfedge: + if (res == LARGER) continue; + + // Store the edge inciden to a point strictly smaller: + if (res == SMALLER) { + ext = curr; + continue; + } + + // The incident points are equal; compare the halfedges themselves: + if (cmp_y(curr->curve(), ext->curve(), curr->source()->point()) == + SMALLER) + ext = curr; + } while (++curr != circ); + + return ext; + } - const auto* traits = this->m_aos.geometry_traits(); - auto ext = find_smallest(circ, *traits); - auto curr = ext; + /// Add all elements to be drawn. + void add_elements() + { + // std::cout << "add_elements()\n"; + // std::cout << "ratio: " << this->pixel_ratio() << std::endl; + m_visited.clear(); - do { - // Skip halfedges that are "antenas": - while (curr->face() == curr->twin()->face()) curr = curr->twin()->next(); - draw_region_impl1(curr, *traits, 0); - curr = curr->next(); - } while (curr != ext); + if (m_aos.is_empty()) return; + add_faces(*(this->m_aos.geometry_traits())); + + // Add edges that do not separate faces. + for (auto it = m_aos.edges_begin(); it != m_aos.edges_end(); ++it) + { if (it->face() == it->twin()->face()) draw_curve(it->curve()); } + + // Add all points + for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) + { draw_point(it->point()); } - m_graphics_scene.face_end(); + m_visited.clear(); } /*! Draw a curve using aproximate coordinates. @@ -409,348 +374,178 @@ class Aos_2_basic_viewer_qt : public Basic_viewer { void draw_approximate_curve(const XMonotoneCurve& curve, const Approximate& approx) { std::vector polyline; - double error(this->pixel_ratio()); + double error(0.01); // TODO? (this->pixel_ratio()); approx(curve, error, std::back_inserter(polyline)); if (polyline.empty()) return; auto it = polyline.begin(); auto prev = it++; - for (; it != polyline.end(); prev = it++) m_graphics_scene.add_segment(*prev, *it); + for (; it != polyline.end(); prev = it++) m_gs.add_segment(*prev, *it); } /*! Compile time dispatching */ #if 0 - template - void draw_curve_impl2(const X_monotone_curve& xcv, T const&, long) - { draw_exact_curve(xcv); } - - template - auto draw_curve_impl2(const X_monotone_curve& xcv, T const& approx, int) -> - decltype(approx.template operator()(X_monotone_curve{}, double{}, I{}, - bool{}), void()) - { draw_approximate_curve(xcv, approx); } - - template - void draw_curve_impl1(const X_monotone_curve& xcv, T const&, long) - { draw_exact_curve(xcv); } - - template - auto draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int) -> - decltype(traits.approximate_2_object(), void()) { - using Approximate = typename Gt::Approximate_2; - draw_curve_impl2(xcv, traits.approximate_2_object(), 0); - } + template + void draw_curve_impl2(const X_monotone_curve& xcv, T const&, long) + { draw_exact_curve(xcv); } + + template + auto draw_curve_impl2(const X_monotone_curve& xcv, T const& approx, int) -> + decltype(approx.template operator()(X_monotone_curve{}, double{}, I{}, + bool{}), void()) + { draw_approximate_curve(xcv, approx); } + + template + void draw_curve_impl1(const X_monotone_curve& xcv, T const&, long) + { draw_exact_curve(xcv); } + + template + auto draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int) -> + decltype(traits.approximate_2_object(), void()) { + using Approximate = typename Gt::Approximate_2; + draw_curve_impl2(xcv, traits.approximate_2_object(), 0); + } #else - template - void draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int) - { draw_approximate_curve(xcv, traits.approximate_2_object()); } + template + void draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int) + { draw_approximate_curve(xcv, traits.approximate_2_object()); } #endif - template - void draw_curve_impl1 - (const X_monotone_curve& xcv, - Arr_geodesic_arc_on_sphere_traits_2 const& traits, - int) { - auto approx = traits.approximate_2_object(); - using Kernel = Kernel_; - using Traits = Arr_geodesic_arc_on_sphere_traits_2; - using Ak = typename Traits::Approximate_kernel; - using Ap = typename Traits::Approximate_point_2; - using Approx_point_3 = typename Ak::Point_3; - std::vector apoints; - double error(0.01); - approx(xcv, error, std::back_inserter(apoints)); - auto it = apoints.begin(); - auto x = it->dx(); - auto y = it->dy(); - auto z = it->dz(); - auto l = std::sqrt(x*x + y*y + z*z); - Approx_point_3 prev(x/l, y/l, z/l); - for (++it; it != apoints.end(); ++it) { + template + void draw_curve_impl1 + (const X_monotone_curve& xcv, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) + { + auto approx = traits.approximate_2_object(); + using Kernel = Kernel_; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Ap = typename Traits::Approximate_point_2; + using Approx_point_3 = typename Ak::Point_3; + std::vector apoints; + double error(0.01); + approx(xcv, error, std::back_inserter(apoints)); + auto it = apoints.begin(); auto x = it->dx(); auto y = it->dy(); auto z = it->dz(); auto l = std::sqrt(x*x + y*y + z*z); - Approx_point_3 next(x/l, y/l, z/l); - this->add_segment(prev, next); - prev = next; + Approx_point_3 prev(x/l, y/l, z/l); + for (++it; it != apoints.end(); ++it) { + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 next(x/l, y/l, z/l); + this->add_segment(prev, next); + prev = next; + } } - } - /*! Draw a curve. - */ - template - void draw_curve(const XMonotoneCurve& curve) { - /* Check whether the traits has a member function called - * approximate_2_object() and if so check whether the return type, namely - * `Approximate_2` has an appropriate operator. - * - * C++20 supports concepts and `requires` expression; see, e.g., - * https://en.cppreference.com/w/cpp/language/constraints; thus, the first - * condition above can be elegantly verified as follows: - * constexpr bool has_approximate_2_object = - * requires(const Gt& traits) { traits.approximate_2_object(); }; - * - * C++17 has experimental constructs called is_detected and - * is_detected_v that can be used to achieve the same goal. - * - * For now we use C++14 features. - */ -#if 0 - if constexpr (std::experimental::is_detected_v) + /// Draw a curve. + template + void draw_curve(const XMonotoneCurve& curve) { - const auto* traits = this->m_aos.geometry_traits(); - auto approx = traits->approximate_2_object(); - draw_approximate_curve(curve, approx); - return; - } - draw_exact_curve(curve); -#else - const auto* traits = this->m_aos.geometry_traits(); - draw_curve_impl1(curve, *traits, 0); -#endif - } - - /*! Compile time dispatching - */ + /* Check whether the traits has a member function called + * approximate_2_object() and if so check whether the return type, namely + * `Approximate_2` has an appropriate operator. + * + * C++20 supports concepts and `requires` expression; see, e.g., + * https://en.cppreference.com/w/cpp/language/constraints; thus, the first + * condition above can be elegantly verified as follows: + * constexpr bool has_approximate_2_object = + * requires(const Gt& traits) { traits.approximate_2_object(); }; + * + * C++17 has experimental constructs called is_detected and + * is_detected_v that can be used to achieve the same goal. + * + * For now we use C++14 features. + */ #if 0 - template - void draw_point_impl2(const Point& p, T const&, long) { add_point(p); } - - template - auto draw_point_impl2(const Point& p, T const& approx, int) -> - decltype(approx.operator()(p), void()) - { add_point(approx(p)); } - - template - void draw_point_impl1(const Point& p, T const&, long) { add_point(p); } - - template - auto draw_point_impl1(const Point& p, T const& traits, int) -> - decltype(traits.approximate_2_object(), void()) { - using Approximate = typename Gt::Approximate_2; - draw_point_impl2(p, traits.approximate_2_object(), true); - } + if constexpr (std::experimental::is_detected_v) + { + const auto* traits = this->m_aos.geometry_traits(); + auto approx = traits->approximate_2_object(); + draw_approximate_curve(curve, approx); + return; + } + draw_exact_curve(curve); #else - template - void draw_point_impl1(const Point& p, T const& traits, int) - { m_graphics_scene.add_point(traits.approximate_2_object()(p)); } + const auto* traits = this->m_aos.geometry_traits(); + draw_curve_impl1(curve, *traits, 0); #endif - - template - void draw_point_impl1 - (const Point& p, - Arr_geodesic_arc_on_sphere_traits_2 const& traits, - int) { - auto approx = traits.approximate_2_object(); - using Traits = Arr_geodesic_arc_on_sphere_traits_2; - using Ak = typename Traits::Approximate_kernel; - using Approx_point_3 = typename Ak::Point_3; - auto ap = approx(p); - auto x = ap.dx(); - auto y = ap.dy(); - auto z = ap.dz(); - auto l = std::sqrt(x*x + y*y + z*z); - Approx_point_3 p3(x/l, y/l, z/l); - add_point(p3); - } - - /*! Draw a point. - */ - void draw_point(const Point& p) { - const auto* traits = m_aos.geometry_traits(); - draw_point_impl1(p, *traits, 0); - } - - /*! Add a Connected Component of the Boundary. - */ - void add_ccb(Ccb_halfedge_const_circulator circ) { - // std::cout << "add_ccb()\n"; - auto curr = circ; - do { - auto new_face = curr->twin()->face(); - if (m_visited.find(new_face) != m_visited.end()) continue; - m_visited[new_face] = true; - add_face(new_face); - } while (++curr != circ); - } - - /*! Add a face. - */ - void add_face(Face_const_handle face) { - // std::cout << "add_face()\n"; - using Inner_ccb_const_iterator = typename Aos::Inner_ccb_const_iterator; - using Outer_ccb_const_iterator = typename Aos::Outer_ccb_const_iterator; - - for (Inner_ccb_const_iterator it = face->inner_ccbs_begin(); - it != face->inner_ccbs_end(); ++it) - add_ccb(*it); - - for (Outer_ccb_const_iterator it = face->outer_ccbs_begin(); - it != face->outer_ccbs_end(); ++it) { - add_ccb(*it); - draw_region(*it); } - } - //! - virtual void keyPressEvent(QKeyEvent* e) { - // Test key pressed: - // const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - // if ((e->key()==Qt::Key_PageUp) && (modifiers==Qt::NoButton)) { ... } + protected: + Arr& m_aos; + CGAL::Graphics_scene& m_gs; + const GSOptions& m_gso; + std::unordered_map m_visited; + }; - // Call: * add_elements() if the model changed, followed by - // * redraw() if some viewing parameters changed that implies some - // modifications of the buffers - // (eg. type of normal, color/mono) - // * update() just to update the drawing +} // namespace draw_function_for_arrangement_2 - // Call the base method to process others/classicals key - Base::keyPressEvent(e); - } - -protected: - //! The window width in pixels. - int m_width = CGAL_BASIC_VIEWER_INIT_SIZE_X; - - //! The window height in pixels. - int m_height = CGAL_BASIC_VIEWER_INIT_SIZE_Y; - - //! The ratio between pixel and opengl units (in world coordinate system). - double m_pixel_ratio = 1; - - //! The arrangement to draw. - const Aos& m_aos; - - //! The color generator. - Color_generator m_color_generator; - - std::unordered_map m_visited; - CGAL::Graphics_scene m_graphics_scene; -}; - -//! Basic viewer of a 2D arrangement. -template -class Aos_2_viewer_qt : public Aos_2_basic_viewer_qt { -public: - using Aos = ArrangementOnSurface_2; - using Color_generator = ColorGenerator; - using Base = Aos_2_basic_viewer_qt; - using Point = typename Aos::Point_2; - using X_monotone_curve = typename Aos::X_monotone_curve_2; - using Halfedge_const_handle = typename Aos::Halfedge_const_handle; - using Face_const_handle = typename Aos::Face_const_handle; - using Ccb_halfedge_const_circulator = - typename Aos::Ccb_halfedge_const_circulator; - - /// Construct the viewer. - /// @param arr the arrangement to view - /// @param title the title of the window - Aos_2_viewer_qt(QWidget* parent, const Aos& aos, - Color_generator color_generator, - const char* title = "2D Arrangement on Surface Basic Viewer", - bool draw_vertices = false) : - Base(parent, aos, color_generator, title, draw_vertices) - {} -}; - -/*! Draw an arrangement on surface. - */ -template -void draw(const Arrangement_on_surface_2& aos, - const char* title = "2D Arrangement on Surface Basic Viewer", - bool draw_vertices = false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif +#define CGAL_ARR_TYPE CGAL::Arrangement_on_surface_2 - if (cgal_test_suite) return; - using Gt = GeometryTraits_2; - using Tt = TopologyTraits; - using Aos = CGAL::Arrangement_on_surface_2; - using Viewer = Aos_2_viewer_qt; - - CGAL::Qt::init_ogl_context(4,3); - - int argc = 1; - const char* argv[2] = {"t2_viewer", nullptr}; - QApplication app(argc, const_cast(argv)); - Default_color_generator color_generator; - Viewer mainwindow(app.activeWindow(), aos, color_generator, title, - draw_vertices); - mainwindow.add_elements(); - mainwindow.show(); - app.exec(); +template +void add_to_graphics_scene(const CGAL_ARR_TYPE& aos, + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso) +{ + draw_function_for_arrangement_2::Draw_arr_tool dar(aos, graphics_scene, gso); + dar.add_elements(); } -/*! Draw an arrangement. - */ -template -void draw(const Arrangement_2& arr, - const char* title = "2D Arrangement Basic Viewer", - bool draw_vertices = false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif +template +void add_to_graphics_scene(const CGAL_ARR_TYPE& aos, + CGAL::Graphics_scene& graphics_scene) +{ + CGAL::Graphics_scene_options + gso; + gso.colored_face=[](const CGAL_ARR_TYPE&, + typename CGAL_ARR_TYPE::Face_const_handle) -> bool + { return true; }; + + gso.face_color=[](const CGAL_ARR_TYPE&, + typename CGAL_ARR_TYPE::Face_const_handle fh) -> CGAL::IO::Color + { + CGAL::Random random((std::size_t)(&*fh)); + return get_random_color(random); + }; - if (cgal_test_suite) return; - using Gt = GeometryTraits_2; - using Arr = CGAL::Arrangement_2; - using Viewer = Aos_2_viewer_qt; - - CGAL::Qt::init_ogl_context(4,3); - - int argc = 1; - const char* argv[2] = {"t2_viewer", nullptr}; - QApplication app(argc, const_cast(argv)); - Default_color_generator color_generator; - Viewer mainwindow(app.activeWindow(), arr, color_generator, title, - draw_vertices); - mainwindow.add_elements(); - mainwindow.show(); - app.exec(); + add_to_graphics_scene(aos, graphics_scene, gso); } -/*! Draw an arrangement using a given color generator. - */ -template -void draw(const Arrangement_2& arr, - ColorGenerator color_generator, - const char* title = "2D Arrangement Basic Viewer", - bool draw_vertices = false) { -#if defined(CGAL_TEST_SUITE) - bool cgal_test_suite=true; -#else - bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); -#endif - - if (cgal_test_suite) return; - - using Color_generator = ColorGenerator; - using Gt = GeometryTraits_2; - using Arr = CGAL::Arrangement_2; - using Viewer = Aos_2_viewer_qt; +#ifdef CGAL_USE_BASIC_VIEWER - CGAL::Qt::init_ogl_context(4,3); +/// Draw an arrangement on surface. +template +void draw(const CGAL_ARR_TYPE& aos, const GSOptions& gso, + const char* title = "2D Arrangement on Surface Basic Viewer") +{ + CGAL::Graphics_scene graphics_scene; + add_to_graphics_scene(aos, graphics_scene, gso); + draw_graphics_scene(graphics_scene, title); - int argc = 1; - const char* argv[2] = {"t2_viewer", nullptr}; - QApplication app(argc, const_cast(argv)); - Viewer mainwindow(app.activeWindow(), arr, color_generator, title, - draw_vertices); - mainwindow.add_elements(); - mainwindow.show(); - app.exec(); } +template +void draw(const CGAL_ARR_TYPE& aos, + const char* title = "2D Arrangement on Surface Basic Viewer") +{ + CGAL::Graphics_scene graphics_scene; + add_to_graphics_scene(aos, graphics_scene); + draw_graphics_scene(graphics_scene, title); } -#endif +#endif // CGAL_USE_BASIC_VIEWER + +#undef CGAL_ARR_TYPE + +} // namespace CGAL + #endif From f8364752e01a282f3ab6212ed48bf78a65b730c8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 4 Dec 2023 18:05:40 +0100 Subject: [PATCH 263/341] draw arrangement: use gs_options --- .../include/CGAL/draw_arrangement_2.h | 117 ++++++++++++++---- 1 file changed, 91 insertions(+), 26 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 2c26b65a55cd..2298cdd5ef55 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -156,6 +156,9 @@ namespace draw_function_for_arrangement_2 Arr_geodesic_arc_on_sphere_traits_2 const& traits, int) { + if(!m_gso.draw_edge(m_aos, curr)) + { return; } + // std::cout << "draw_region_impl1()\n"; auto approx = traits.approximate_2_object(); using Kernel = Kernel_; @@ -181,9 +184,14 @@ namespace draw_function_for_arrangement_2 auto z = it->dz(); auto l = std::sqrt(x*x + y*y + z*z); Approx_point_3 next(x/l, y/l, z/l); - this->add_segment(prev, next); + + if(m_gso.colored_edge(m_aos, curr)) + { m_gs.add_segment(prev, next, m_gso.edge_color(m_aos, curr)); } + else + { m_gs.add_segment(prev, next); } + prev = next; - // this->add_point_in_face(*prev); + // m_gs.add_point_in_face(*prev); } } @@ -206,7 +214,13 @@ namespace draw_function_for_arrangement_2 auto it = polyline.begin(); auto prev = it++; for (; it != polyline.end(); prev = it++) { - m_gs.add_segment(*prev, *it); + if(m_gso.draw_edge(m_aos, curr)) + { + if(m_gso.colored_edge(m_aos, curr)) + { m_gs.add_segment(*prev, *it, m_gso.edge_color(m_aos, curr)); } + else + { m_gs.add_segment(*prev, *it); } + } m_gs.add_point_in_face(*prev); } } @@ -218,7 +232,7 @@ namespace draw_function_for_arrangement_2 const auto* traits = this->m_aos.geometry_traits(); auto ctr_min = traits->construct_min_vertex_2_object(); auto ctr_max = traits->construct_max_vertex_2_object(); - this->add_segment(ctr_min(curve), ctr_max(curve)); + m_gs.add_segment(ctr_min(curve), ctr_max(curve)); } /// Draw an exact region. @@ -244,15 +258,15 @@ namespace draw_function_for_arrangement_2 /// Compile time dispatching #if 0 template - void draw_point_impl2(const Point& p, T const&, long) { add_point(p); } + void draw_point_impl2(const Point& p, T const&, long) { m_gs.add_point(p); } template auto draw_point_impl2(const Point& p, T const& approx, int) -> decltype(approx.operator()(p), void()) - { add_point(approx(p)); } + { m_gs.add_point(approx(p)); } template - void draw_point_impl1(const Point& p, T const&, long) { add_point(p); } + void draw_point_impl1(const Point& p, T const&, long) { m_gs.add_point(p); } template auto draw_point_impl1(const Point& p, T const& traits, int) -> @@ -262,15 +276,23 @@ namespace draw_function_for_arrangement_2 } #else template - void draw_point_impl1(const Point& p, T const& traits, int) - { m_gs.add_point(traits.approximate_2_object()(p)); } + void draw_point_impl1(const Point& p, T const& traits, int, + bool colored, const CGAL::IO::Color& color) + { + if(colored) + { m_gs.add_point(traits.approximate_2_object()(p), color); } + else + { m_gs.add_point(traits.approximate_2_object()(p)); } + } #endif template void draw_point_impl1 (const Point& p, Arr_geodesic_arc_on_sphere_traits_2 const& traits, - int) + int, + bool colored, + const CGAL::IO::Color& color) { auto approx = traits.approximate_2_object(); using Traits = Arr_geodesic_arc_on_sphere_traits_2; @@ -282,14 +304,24 @@ namespace draw_function_for_arrangement_2 auto z = ap.dz(); auto l = std::sqrt(x*x + y*y + z*z); Approx_point_3 p3(x/l, y/l, z/l); - add_point(p3); + if(colored) + { m_gs.add_point(p3, color); } + else + { m_gs.add_point(p3); } } /// Draw a point. - void draw_point(const Point& p) + void draw_point(Vertex_const_handle vh) { const auto* traits = m_aos.geometry_traits(); - draw_point_impl1(p, *traits, 0); + if(m_gso.draw_vertex(m_aos, vh)) + { + if(m_gso.colored_vertex(m_aos, vh)) + { draw_point_impl1(vh->point(), *traits, 0, true, + m_gso.vertex_color(m_aos, vh)); } + else + { draw_point_impl1(vh->point(), *traits, 0, false, CGAL::IO::Color()); } // color will be unused + } } template @@ -351,15 +383,33 @@ namespace draw_function_for_arrangement_2 m_visited.clear(); if (m_aos.is_empty()) return; - add_faces(*(this->m_aos.geometry_traits())); + + if(m_gso.are_faces_enabled()) + { add_faces(*(this->m_aos.geometry_traits())); } // Add edges that do not separate faces. - for (auto it = m_aos.edges_begin(); it != m_aos.edges_end(); ++it) - { if (it->face() == it->twin()->face()) draw_curve(it->curve()); } + if(m_gso.are_edges_enabled()) + { + for (auto it = m_aos.edges_begin(); it != m_aos.edges_end(); ++it) + { if (it->face()==it->twin()->face()) + { + if(m_gso.draw_edge(m_aos, it)) + { + if(m_gso.colored_edge(m_aos, it)) + { draw_curve(it->curve(), true, m_gso.edge_color(m_aos, it)); } + else + { draw_curve(it->curve(), false, CGAL::IO::Color()); } + } + } + } + } // Add all points - for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) - { draw_point(it->point()); } + if(m_gso.are_vertices_enabled()) + { + for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) + { draw_point(it); } + } m_visited.clear(); } @@ -372,14 +422,23 @@ namespace draw_function_for_arrangement_2 */ template void draw_approximate_curve(const XMonotoneCurve& curve, - const Approximate& approx) { + const Approximate& approx, + bool colored, const CGAL::IO::Color& c) + { std::vector polyline; double error(0.01); // TODO? (this->pixel_ratio()); approx(curve, error, std::back_inserter(polyline)); if (polyline.empty()) return; auto it = polyline.begin(); auto prev = it++; - for (; it != polyline.end(); prev = it++) m_gs.add_segment(*prev, *it); + for (; it != polyline.end(); prev = it++) + { + if(colored) + { m_gs.add_segment(*prev, *it, c); } + else + { m_gs.add_segment(*prev, *it); } + } + } /*! Compile time dispatching @@ -407,15 +466,17 @@ namespace draw_function_for_arrangement_2 } #else template - void draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int) - { draw_approximate_curve(xcv, traits.approximate_2_object()); } + void draw_curve_impl1(const X_monotone_curve& xcv, T const& traits, int, + bool colored, const CGAL::IO::Color& c) + { draw_approximate_curve(xcv, traits.approximate_2_object(), colored, c); } #endif template void draw_curve_impl1 (const X_monotone_curve& xcv, Arr_geodesic_arc_on_sphere_traits_2 const& traits, - int) + int, + bool colored, const CGAL::IO::Color& c) { auto approx = traits.approximate_2_object(); using Kernel = Kernel_; @@ -438,14 +499,18 @@ namespace draw_function_for_arrangement_2 auto z = it->dz(); auto l = std::sqrt(x*x + y*y + z*z); Approx_point_3 next(x/l, y/l, z/l); - this->add_segment(prev, next); + if(colored) + { m_gs.add_segment(prev, next, c); } + else + { m_gs.add_segment(prev, next); } prev = next; } } /// Draw a curve. template - void draw_curve(const XMonotoneCurve& curve) + void draw_curve(const XMonotoneCurve& curve, + bool colored, const CGAL::IO::Color& c) { /* Check whether the traits has a member function called * approximate_2_object() and if so check whether the return type, namely @@ -473,7 +538,7 @@ namespace draw_function_for_arrangement_2 draw_exact_curve(curve); #else const auto* traits = this->m_aos.geometry_traits(); - draw_curve_impl1(curve, *traits, 0); + draw_curve_impl1(curve, *traits, 0, colored, c); #endif } From d97ff7beb6cb437181c0297e54559f1f669ff831 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 4 Dec 2023 18:25:56 +0100 Subject: [PATCH 264/341] remove duplicate doc --- .../include/CGAL/draw_polygon_set_2.h | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index a6dd820f5f43..2164082adba7 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -20,28 +20,6 @@ #include #include #include - -#ifdef DOXYGEN_RUNNING -namespace CGAL { - -/*! - * \ingroup PkgDrawPolygonSet2 - * - * opens a new window and draws `aps`, an instance of the `CGAL::Polygon_set_2` - * class. A call to this function is blocking, that is the program continues as - * soon as the user closes the window. This function requires `CGAL_Qt6`, and is - * only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with - * the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add - * the definition `CGAL_USE_BASIC_VIEWER`. - * \tparam PS an instance of the `CGAL::Polygon_set_2` class. - * \param aps the polygon set to draw. - */ -template -void draw(const PS& aps); - -} /* namespace CGAL */ -#endif - #include namespace CGAL { From d2f007d0df28d435cf1f2bce92e576851112e3c5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 10:35:07 +0100 Subject: [PATCH 265/341] doc draw t3 --- .../CGAL/draw_triangulation_3.h | 65 ++++++++++++++++++- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index 82d1caf91248..788623bda6e5 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -3,14 +3,73 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation3 -opens a new window and draws `at3`, a model of the `TriangulationDataStructure_3` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt6, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +\opens a new window and draws a 3D triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam T3 a model of the `TriangulationDataStructure_3` concept. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const Triangulation_3& at3, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param at3 the triangulation to draw. +\param gso the graphics scene options parameter. + +*/ +template +void draw(const T3& at3, const GSOptions& gso); + +/*! +\ingroup PkgDrawTriangulation3 + A shortcut to `draw(at3, Graphics_scene_options{})`. +*/ + template + void draw(const T3& at3); + +/*! +\ingroup PkgDrawTriangulation3 + +adds the vertices, edges and faces of `at3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const Triangulation_3& at3, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + \param at3 the triangulation to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +*/ +template +void add_to_graphics_scene(const T3& at3, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawTriangulation3 +A shortcut to `add_to_graphics_scene(at3, gs, Graphics_scene_options{})`. */ template -void draw(const T3& at3); +void add_to_graphics_scene(const T3& at3, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ From 5b7f499fc171c2a7f0f71e9cd62611920fd36b38 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 12:58:30 +0100 Subject: [PATCH 266/341] doc draw polygon --- Polygon/include/CGAL/draw_polygon_2.h | 68 +++++++++++++++++-- .../CGAL/draw_triangulation_2.h | 4 +- .../CGAL/draw_triangulation_3.h | 6 +- 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index b1f2209dbf5b..a248a9714049 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -29,15 +29,73 @@ namespace CGAL { /*! \ingroup PkgDrawPolygon2 -opens a new window and draws `ap`, an instance of the `CGAL::Polygon_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a 2D polygon. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam P an instance of the `CGAL::Polygon_2` class. -\param ap the polygon to draw. +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Polygon_2& p, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polygon to draw. +\param gso the graphics scene options parameter. */ -template -void draw(const P& ap); +template +void draw(const P& p, const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygon2 + +A shortcut to `draw(p, Graphics_scene_options{})`. +*/ + template + void draw(const P& p); + +/*! +\ingroup PkgDrawPolygon2 + +adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + void CGAL::add_to_graphics_scene(const Polygon_2& p, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the 2D polygon to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +*/ +template +void add_to_graphics_scene(const P& p, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygon2 + +A shortcut to `add_to_graphics_scene(p, gs, Graphics_scene_options{})`. +*/ +template +void add_to_graphics_scene(const P& p, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ #endif diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 042081f3dcff..12adeda043e5 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -14,7 +14,7 @@ The real declaration of this function template is: template - void CGAL::draw(const Triangulation_2& at2, const GSOptions& gso); + void CGAL::draw(const CGAL::Triangulation_2& at2, const GSOptions& gso); \cgalAdvancedEnd @@ -47,7 +47,7 @@ The real declaration of this function template is: template - void CGAL::add_to_graphics_scene(const Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); + void CGAL::add_to_graphics_scene(const CGAL::Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index 788623bda6e5..b243757699c1 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation3 -\opens a new window and draws a 3D triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. +opens a new window and draws a 3D triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. @@ -14,7 +14,7 @@ The real declaration of this function template is: template - void CGAL::draw(const Triangulation_3& at3, const GSOptions& gso); + void CGAL::draw(const CGAL::Triangulation_3& at3, const GSOptions& gso); \cgalAdvancedEnd @@ -46,7 +46,7 @@ The real declaration of this function template is: template - void CGAL::add_to_graphics_scene(const Triangulation_3& at3, CGAL::Graphics_scene& gs, const GSOptions& gso); + void CGAL::add_to_graphics_scene(const CGAL::Triangulation_3& at3, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd From df2b9ad1723e2b5da8278b1fd5772bd736e43f42 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 13:16:54 +0100 Subject: [PATCH 267/341] doc draw pwh --- Polygon/include/CGAL/draw_polygon_2.h | 4 +- .../include/CGAL/draw_polygon_with_holes_2.h | 80 ++++++++++++++++--- .../CGAL/draw_triangulation_2.h | 4 +- .../CGAL/draw_triangulation_3.h | 4 +- 4 files changed, 73 insertions(+), 19 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index a248a9714049..1e1618c5da06 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -56,7 +56,7 @@ void draw(const P& p, const GSOptions& gso); /*! \ingroup PkgDrawPolygon2 -A shortcut to `draw(p, Graphics_scene_options{})`. +A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. */ template void draw(const P& p); @@ -91,7 +91,7 @@ void add_to_graphics_scene(const P& p, /*! \ingroup PkgDrawPolygon2 -A shortcut to `add_to_graphics_scene(p, gs, Graphics_scene_options{})`. +A shortcut to `CGAL::add_to_graphics_scene(p, gs, Graphics_scene_options{})`. */ template void add_to_graphics_scene(const P& p, diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 741524f418d0..15112bdcb11a 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -27,21 +27,75 @@ namespace CGAL { /*! - * \ingroup PkgDrawPolygonWithHoles2 - * - * opens a new window and draws `aph`, an instance of the - * `CGAL::Polygon_with_holes_2` class. A call to this function is blocking, that - * is the program continues as soon as the user closes the window. This function - * requires `CGAL_Qt6`, and is only available if the macro - * `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target - * `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition - * `CGAL_USE_BASIC_VIEWER`. - * \tparam PH an instance of the `CGAL::Polygon_with_holes_2` class. - * \param aph the polygon with holes to draw. + \ingroup PkgDrawPolygonWithHoles2 + +opens a new window and draws a 2D polygon with holes. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Polygon_with_holes_2& ph, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ph the polygon with holes to draw. +\param gso the graphics scene options parameter. */ +template +void draw(const PH& ph, const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygonWithHoles2 + +A shortcut to `CGAL::draw(ph, Graphics_scene_options{})`. +*/ + template + void draw(const PH& ph); + +/*! +\ingroup PkgDrawPolygonWithHoles2 + +adds the vertices, edges and faces of `ph` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const Polygon_with_holes_2& ph, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ph the polygon with holes to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +*/ +template +void add_to_graphics_scene(const PH& ph, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygonWithHoles2 -template -void draw(const PH& aph); +A shortcut to `CGAL::add_to_graphics_scene(ph, gs, Graphics_scene_options{})`. +*/ +template +void add_to_graphics_scene(const PH& ph, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 12adeda043e5..a4733e4f0fd8 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -31,7 +31,7 @@ The real declaration of this function template is: /*! \ingroup PkgDrawTriangulation2 -A shortcut to `draw(at2, Graphics_scene_options{})`. +A shortcut to `CGAL::draw(at2, Graphics_scene_options{})`. */ template void draw(const T2& at2); @@ -66,7 +66,7 @@ void add_to_graphics_scene(const T2& at2, /*! \ingroup PkgDrawTriangulation2 -A shortcut to `add_to_graphics_scene(at2, gs, Graphics_scene_options{})`. +A shortcut to `CGAL::add_to_graphics_scene(at2, gs, Graphics_scene_options{})`. */ template void add_to_graphics_scene(const T2& at2, diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index b243757699c1..e6b8a684e26d 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -30,7 +30,7 @@ void draw(const T3& at3, const GSOptions& gso); /*! \ingroup PkgDrawTriangulation3 - A shortcut to `draw(at3, Graphics_scene_options{})`. + A shortcut to `CGAL::draw(at3, Graphics_scene_options{})`. */ template void draw(const T3& at3); @@ -65,7 +65,7 @@ void add_to_graphics_scene(const T3& at3, /*! \ingroup PkgDrawTriangulation3 -A shortcut to `add_to_graphics_scene(at3, gs, Graphics_scene_options{})`. +A shortcut to `CGAL::add_to_graphics_scene(at3, gs, Graphics_scene_options{})`. */ template void add_to_graphics_scene(const T3& at3, From 74c0894336824f5180a193a2e51e1f289110faf8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 13:19:35 +0100 Subject: [PATCH 268/341] doc draw polygon --- Polygon/include/CGAL/draw_polygon_2.h | 2 +- Polygon/include/CGAL/draw_polygon_with_holes_2.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 1e1618c5da06..3a18d3001ab6 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -72,7 +72,7 @@ The real declaration of this function template is: template - void CGAL::add_to_graphics_scene(const Polygon_2& p, CGAL::Graphics_scene& gs, const GSOptions& gso); + void CGAL::add_to_graphics_scene(const CGAL::Polygon_2& p, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 15112bdcb11a..0a3174b4e21d 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -72,7 +72,7 @@ The real declaration of this function template is: template - void CGAL::add_to_graphics_scene(const Polygon_with_holes_2& ph, CGAL::Graphics_scene& gs, const GSOptions& gso); + void CGAL::add_to_graphics_scene(const CGAL::Polygon_with_holes_2& ph, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd From 711a07dfe99e07ea891444877794b613a6c5fcfe Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 13:49:32 +0100 Subject: [PATCH 269/341] doc draw surface mesh and polyhedron --- .../doc/Polyhedron/CGAL/draw_polyhedron.h | 69 +++++++++++++++++-- Surface_mesh/include/CGAL/draw_surface_mesh.h | 67 ++++++++++++++++-- 2 files changed, 127 insertions(+), 9 deletions(-) diff --git a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h index 9ed56fe232c2..2529cb72d085 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h +++ b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h @@ -3,14 +3,73 @@ namespace CGAL { /*! \ingroup PkgDrawPolyhedron -opens a new window and draws `apoly`, an instance of the `CGAL::Polyhedron_3` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a polyhedron. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam POLY an instance of the `CGAL::Polyhedron_3` class. -\param apoly the polyhedron to draw. +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Polyhedron_3& p, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polyhedron to draw. +\param gso the graphics scene options parameter. +*/ +template +void draw(const P& p, const GSOptions& gso); + +/*! +\ingroup PkgDrawPolyhedron + +A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. +*/ + template + void draw(const P& p); + +/*! +\ingroup PkgDrawPolyhedron + +adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Polyhedron_3& p, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polyhedron to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +*/ +template +void add_to_graphics_scene(const P& p, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPolyhedron + +A shortcut to `CGAL::add_to_graphics_scene(p, gs, Graphics_scene_options{})`. */ -template -void draw(const POLY& apoly); +template +void add_to_graphics_scene(const P& p, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 69a7be45edf3..33ed8f7e66ee 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -18,14 +18,73 @@ /*! \ingroup PkgDrawSurfaceMesh -Open a new window and draw `asm`, an instance of the `CGAL::Surface_mesh` class. The function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a surface mesh. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam SM an instance of the `CGAL::Surface_mesh` class. -\param asm the surface mesh to draw. +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Surface_mesh& sm, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param sm the surface mesh to draw. +\param gso the graphics scene options parameter. +*/ +template +void draw(const SM& sm, const GSOptions& gso); + +/*! +\ingroup PkgDrawSurfaceMesh + +A shortcut to `CGAL::draw(sm, Graphics_scene_options{})`. +*/ + template + void draw(const SM& sm); + +/*! +\ingroup PkgDrawSurfaceMesh + +adds the vertices, edges and faces of `sm` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Surface_mesh& sm, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd + +\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param sm the surface mesh to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +*/ +template +void add_to_graphics_scene(const SM& sm, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawSurfaceMesh + +A shortcut to `CGAL::add_to_graphics_scene(sm, gs, Graphics_scene_options{})`. */ template -void draw(const SM& asm); +void add_to_graphics_scene(const SM& sm, + CGAL::Graphics_scene& gs); #else // DOXYGEN_RUNNING From 269f5829c237b338d320bcda87d78c0c01e99fc0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 13:51:45 +0100 Subject: [PATCH 270/341] try to move advanced --- .../doc/Polyhedron/CGAL/draw_polyhedron.h | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h index 2529cb72d085..d3c0a5e82bf8 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h +++ b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h @@ -8,6 +8,12 @@ opens a new window and draws a polyhedron. Parameters of the drawing are taken f A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polyhedron to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -18,11 +24,6 @@ The real declaration of this function template is: \cgalAdvancedEnd -\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param p the polyhedron to draw. -\param gso the graphics scene options parameter. */ template void draw(const P& p, const GSOptions& gso); @@ -40,6 +41,13 @@ A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polyhedron to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -49,13 +57,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Polyhedron_3& p, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param p the polyhedron to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const P& p, From 03ff679df455b753d758695f8de839f289eda065 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 14:10:25 +0100 Subject: [PATCH 271/341] doc draw: move advanced blocks --- Polygon/include/CGAL/draw_polygon_2.h | 26 +++++++++--------- .../include/CGAL/draw_polygon_with_holes_2.h | 26 +++++++++--------- .../doc/Polyhedron/CGAL/draw_polyhedron.h | 1 - Surface_mesh/include/CGAL/draw_surface_mesh.h | 26 +++++++++--------- .../CGAL/draw_triangulation_2.h | 27 +++++++++---------- .../CGAL/draw_triangulation_3.h | 27 +++++++++---------- 6 files changed, 65 insertions(+), 68 deletions(-) diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 3a18d3001ab6..e65b7583533f 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -34,6 +34,12 @@ opens a new window and draws a 2D polygon. Parameters of the drawing are taken f A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the polygon to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -43,12 +49,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Polygon_2& p, const GSOptions& gso); \cgalAdvancedEnd - -\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param p the polygon to draw. -\param gso the graphics scene options parameter. */ template void draw(const P& p, const GSOptions& gso); @@ -66,6 +66,13 @@ A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param p the 2D polygon to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -75,13 +82,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Polygon_2& p, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param p the 2D polygon to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const P& p, diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index 0a3174b4e21d..f2f313028ec7 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -34,6 +34,12 @@ opens a new window and draws a 2D polygon with holes. Parameters of the drawing A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ph the polygon with holes to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -43,12 +49,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Polygon_with_holes_2& ph, const GSOptions& gso); \cgalAdvancedEnd - -\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param ph the polygon with holes to draw. -\param gso the graphics scene options parameter. */ template void draw(const PH& ph, const GSOptions& gso); @@ -66,6 +66,13 @@ A shortcut to `CGAL::draw(ph, Graphics_scene_options{})`. adds the vertices, edges and faces of `ph` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ph the polygon with holes to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -75,13 +82,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Polygon_with_holes_2& ph, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param ph the polygon with holes to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const PH& ph, diff --git a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h index d3c0a5e82bf8..fd69b1e93715 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h +++ b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h @@ -23,7 +23,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Polyhedron_3& p, const GSOptions& gso); \cgalAdvancedEnd - */ template void draw(const P& p, const GSOptions& gso); diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 33ed8f7e66ee..da98cc05a82f 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -23,6 +23,12 @@ opens a new window and draws a surface mesh. Parameters of the drawing are taken A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param sm the surface mesh to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -32,12 +38,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Surface_mesh& sm, const GSOptions& gso); \cgalAdvancedEnd - -\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param sm the surface mesh to draw. -\param gso the graphics scene options parameter. */ template void draw(const SM& sm, const GSOptions& gso); @@ -55,6 +55,13 @@ A shortcut to `CGAL::draw(sm, Graphics_scene_options{})`. adds the vertices, edges and faces of `sm` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param sm the surface mesh to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -64,13 +71,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Surface_mesh& sm, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param sm the surface mesh to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const SM& sm, diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index a4733e4f0fd8..60813b35d86c 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -8,6 +8,12 @@ opens a new window and draws a triangulation. Parameters of the drawing are take A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param at2 the triangulation to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -17,13 +23,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Triangulation_2& at2, const GSOptions& gso); \cgalAdvancedEnd - -\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param at2 the triangulation to draw. -\param gso the graphics scene options parameter. - */ template void draw(const T2& at2, const GSOptions& gso); @@ -41,6 +40,13 @@ A shortcut to `CGAL::draw(at2, Graphics_scene_options{})`. adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param at2 the triangulation to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -50,13 +56,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param at2 the triangulation to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const T2& at2, diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index e6b8a684e26d..b85fff6ee252 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -8,6 +8,12 @@ opens a new window and draws a 3D triangulation. Parameters of the drawing are t A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param at3 the triangulation to draw. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -17,13 +23,6 @@ The real declaration of this function template is: void CGAL::draw(const CGAL::Triangulation_3& at3, const GSOptions& gso); \cgalAdvancedEnd - -\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param at3 the triangulation to draw. -\param gso the graphics scene options parameter. - */ template void draw(const T3& at3, const GSOptions& gso); @@ -40,6 +39,13 @@ void draw(const T3& at3, const GSOptions& gso); adds the vertices, edges and faces of `at3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param at3 the triangulation to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + \cgalAdvancedBegin The real declaration of this function template is: @@ -49,13 +55,6 @@ The real declaration of this function template is: void CGAL::add_to_graphics_scene(const CGAL::Triangulation_3& at3, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd - -\tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. - -\param at3 the triangulation to draw. -\param gs the graphic scene to fill. -\param gso the graphics scene options parameter. */ template void add_to_graphics_scene(const T3& at3, From 029ab430a32ea84924980fbb48c9aceed24bd882 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 14:58:28 +0100 Subject: [PATCH 272/341] doc draw nef3 --- Nef_3/doc/Nef_3/CGAL/draw_nef_3.h | 70 +++++++++++++++++-- .../CGAL/draw_triangulation_2.h | 4 +- .../Triangulation_2/PackageDescription.txt | 4 +- 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h index d61f502cc4f0..fc5b4b7ea8f6 100644 --- a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h +++ b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h @@ -3,14 +3,72 @@ namespace CGAL { /*! \ingroup PkgDrawNef3 -Open a new window and draws `anef3`, the `Nef_polyhedron_3`. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a nef polyhedron. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam Nef3 a model of the `Nef_polyhedron_3` concept. -\param anef3 the nef polyhedron to draw. +\tparam NP3 which must be an instanciation of a `CGAL::Nef_polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param np3 the nef polyhedron to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Nef_polyhedron_3& np3, const GSOptions& gso); + +\cgalAdvancedEnd +*/ + template + void draw(const NP3& np3, const GSOptions& gso); + +/*! +\ingroup PkgDrawNef3 + +A shortcut to `CGAL::draw(np3, Graphics_scene_options{})`. +*/ + template + void draw(const NP3& np3); + +/*! +\ingroup PkgDrawNef3 + +adds the vertices, edges and faces of `np3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam NP3 which must be an instanciation of a `CGAL::Nef_polyhedron_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param np3 the nef polyhedron to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Nef_polyhedron_3& np3, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void add_to_graphics_scene(const NP3& np3, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawNef3 + +A shortcut to `CGAL::add_to_graphics_scene(np3, gs, Graphics_scene_options{})`. */ -template -void draw(const Nef3& anef3); +template +void add_to_graphics_scene(const NP3& np3, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 60813b35d86c..7300d0d92fbf 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -20,7 +20,7 @@ The real declaration of this function template is: template - void CGAL::draw(const CGAL::Triangulation_2& at2, const GSOptions& gso); + void CGAL::draw(const CGAL::Triangulation_2& at2, const GSOptions& gso); \cgalAdvancedEnd */ @@ -53,7 +53,7 @@ The real declaration of this function template is: template - void CGAL::add_to_graphics_scene(const CGAL::Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); + void CGAL::add_to_graphics_scene(const CGAL::Triangulation_2& at2, CGAL::Graphics_scene& gs, const GSOptions& gso); \cgalAdvancedEnd */ diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index 596f2ae4a425..f84ffe376bac 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -20,9 +20,7 @@ /// \ingroup PkgTriangulation2Ref /*! - \code - #include - \endcode +\cgalInclude{CGAL/draw_constrained_triangulation_2.h} */ /// \defgroup PkgDrawConstrainedTriangulation2 Draw a Constrained Triangulation 2 /// \ingroup PkgTriangulation2Ref From 3d8037d7f620dd0be564a041c886248037c4a1e7 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 5 Dec 2023 15:11:49 +0100 Subject: [PATCH 273/341] doc draw lcc --- .../CGAL/draw_linear_cell_complex.h | 69 +++++++++++++++---- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 9dbad5c9a698..c4046126c800 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -3,34 +3,73 @@ namespace CGAL { /*! \ingroup PkgDrawLinearCellComplex -opens a new window and draws `alcc`, a model of the `LinearCellComplex` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a linear cell complex. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam LCC a model of the `LinearCellComplex` concept. -\tparam GSOptions a class having the same methods than `Graphics_scene_options`: `Graphics_scene_options` by default. -\param alcc the linear cell complex to draw. -\param gs_options graphics scene options. +\tparam LCC which must be an instanciation of a `CGAL::Linear_cell_complex_for_combinatorial_map<...>` or `CGAL::Linear_cell_complex_for_generalized_map<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param lcc the linear cell complex to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + template + + void CGAL::draw(const CGAL::Linear_cell_complex_base& lcc, const GSOptions& gso); + +\cgalAdvancedEnd */ template - void draw(const LCC& alcc, const GSOptions& gs_options=GSOptions()); + void draw(const LCC& lcc, const GSOptions& gso); + +/*! +\ingroup PkgDrawLinearCellComplex + +A shortcut to `CGAL::draw(lcc, Graphics_scene_options{})`. +*/ + template + void draw(const LCC& lcc); /*! \ingroup PkgDrawLinearCellComplex -Add in the given graphics scene the elements of alcc. +adds the vertices, edges and faces of `lcc` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). -\tparam LCC a model of the `LinearCellComplex` concept. -\tparam GSOptions a class having the same methods than `Graphics_scene_options`: `Graphics_scene_options` by default. +\tparam LCC which must be an instanciation of a `CGAL::Linear_cell_complex_for_combinatorial_map<...>` or `CGAL::Linear_cell_complex_for_generalized_map<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. -\param alcc the linear cell complex to draw. -\param graphics_scene the graphics scene. -\param gs_options graphics scene options. +\param lcc the linear cell complex to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Linear_cell_complex_base& lcc, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd */ - template - void add_to_graphics_scene(const LCC& alcc, CGAL::Graphics_scene& graphics_scene, - const GSOptions& gs_options=GSOptions()); +template +void add_to_graphics_scene(const LCC& lcc, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawLinearCellComplex + +A shortcut to `CGAL::add_to_graphics_scene(lcc, gs, Graphics_scene_options{})`. +*/ +template +void add_to_graphics_scene(const LCC& lcc, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ From bfcb44bd8ce84ed8e7c08a5fc4105a09c3dfe08c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 6 Dec 2023 16:23:49 +0100 Subject: [PATCH 274/341] doc: draw point set 3 and constrained triangulation 2 --- Point_set_3/include/CGAL/draw_point_set_3.h | 67 +++++++++++++++++-- .../CGAL/draw_constrained_triangulation_2.h | 53 +++++++-------- 2 files changed, 88 insertions(+), 32 deletions(-) diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index 422efde4aa22..a6799ed7fb78 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -26,14 +26,73 @@ namespace CGAL { /*! \ingroup PkgDrawPointSet3D -opens a new window and draws `aps`, an instance of the `CGAL::Point_set_3` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +opens a new window and draws a point set. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam PS an instance of the `CGAL::Point_set_3` class. -\param aps the point set to draw. +\tparam PS which must be an instanciation of a `CGAL::Point_set_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ps the point set to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Point_set_3& ps, const GSOptions& gso); + +\cgalAdvancedEnd +*/ + template + void draw(const PS& ps, const GSOptions& gso); + +/*! +\ingroup PkgDrawPointSet3D + +A shortcut to `CGAL::draw(ps, Graphics_scene_options{})`. +*/ + template + void draw(const PS& ps); + +/*! +\ingroup PkgDrawPointSet3D + +adds the vertices, edges and faces of `ps` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam PS which must be an instanciation of a `CGAL::Point_set_3<...>`. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param ps the point set to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Point_set_3& ps, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void add_to_graphics_scene(const PS& ps, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPointSet3D + +A shortcut to `CGAL::add_to_graphics_scene(ps, gs, Graphics_scene_options{})`. */ template -void draw(const PS& aps); +void add_to_graphics_scene(const PS& ps, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ #endif diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h index 2ef649265112..0c83594cc18e 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -1,43 +1,40 @@ namespace CGAL { -/*! + /*! \ingroup PkgDrawConstrainedTriangulation2 -opens a new window and draws a triangulation. If the triangulation -has constraints they are drawn. If the face type has a member -function `bool is_in_domain()` the faces inside and outside of the -domain are drawn in different colors. - -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with -`CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws a constrained triangulation. If the triangulation has constraints they are drawn. The faces inside and outside of the domain, based on the property map, are drawn in different colors. Parameters of the drawing are taken from the optional graphics scene options parameter. -\tparam T2 a triangulation class derived from `Triangulation_2` or `Constrained_triangulation_2` -\param at2 the triangulation to draw. +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -*/ -template -void draw(const T2& at2, TODO); +\tparam CT2 which must be an instanciation of a `CGAL::Constrained_triangulation_2<...>`. +\tparam InDomainPMap a class model of `ReadablePropertyMap` with `CT2::Face_handle` as key type and `bool` as value type. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. - /*! -\ingroup PkgDrawConstrainedTriangulation2 +\param ct2 the constrained triangulation to draw. +\param ipm the property map defining the faces which are in the domain. +\param gso the graphics scene options parameter. -opens a new window and draws a constrained triangulation. If the triangulation -has constraints they are drawn. The faces inside and outside of the -domain, based on the property map, are drawn in different colors. +\cgalAdvancedBegin +The real declaration of this function template is: -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. + + template -\tparam CT2 a triangulation class derived from `Constrained_triangulation_2` -\tparam InDomainPMap a class model of `ReadablePropertyMap` with -`CT::Face_handle` as key type and `bool` as value type. + void CGAL::draw(const CGAL::Constrained_triangulation_2& ct2, InDomainPMap ipm, const GSOptions& gso); + +\cgalAdvancedEnd +*/ + template + void draw(const CT2& act2, InDomainPMap ipm, const GSOptions& gso); -\param act2 the constrained triangulation to draw. -\param ipm the property map defining the faces which are in the domain. +/*! +\ingroup PkgDrawConstrainedTriangulation2 +A shortcut to `CGAL::draw(at2, ipm, Graphics_scene_options{})`. */ - template - void draw(const CT2& act2, InDomainPMap ipm); + template + void draw(const T2& at2, InDomainPMap ipm); } /* namespace CGAL */ From b34fb266a4bf3305971b11aa0238c6939eae164e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 6 Dec 2023 16:37:48 +0100 Subject: [PATCH 275/341] fix doc draw ct2 --- .../CGAL/draw_constrained_triangulation_2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h index 0c83594cc18e..5cd72edd15a6 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -27,14 +27,14 @@ The real declaration of this function template is: \cgalAdvancedEnd */ template - void draw(const CT2& act2, InDomainPMap ipm, const GSOptions& gso); + void draw(const CT2& ct2, InDomainPMap ipm, const GSOptions& gso); /*! \ingroup PkgDrawConstrainedTriangulation2 -A shortcut to `CGAL::draw(at2, ipm, Graphics_scene_options{})`. +A shortcut to `CGAL::draw(ct2, ipm, Graphics_scene_options{})`. */ - template - void draw(const T2& at2, InDomainPMap ipm); + template + void draw(const CT2& ct2, InDomainPMap ipm); } /* namespace CGAL */ From 4d02be9db3c7e2cd9d5949143c6336d08ff5b935 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 6 Dec 2023 17:00:20 +0100 Subject: [PATCH 276/341] doc: draw ct2 --- .../CGAL/draw_constrained_triangulation_2.h | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h index 5cd72edd15a6..d714a6c59610 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_constrained_triangulation_2.h @@ -3,38 +3,54 @@ namespace CGAL { /*! \ingroup PkgDrawConstrainedTriangulation2 -opens a new window and draws a constrained triangulation. If the triangulation has constraints they are drawn. The faces inside and outside of the domain, based on the property map, are drawn in different colors. Parameters of the drawing are taken from the optional graphics scene options parameter. +opens a new window and draws a constrained triangulation. If the triangulation has constraints they are drawn. The faces inside and outside of the domain, based on the property map, are drawn in different colors. A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam CT2 which must be an instanciation of a `CGAL::Constrained_triangulation_2<...>`. \tparam InDomainPMap a class model of `ReadablePropertyMap` with `CT2::Face_handle` as key type and `bool` as value type. -\tparam GSOptions a model of `GraphicsSceneOptions` concept. \param ct2 the constrained triangulation to draw. \param ipm the property map defining the faces which are in the domain. -\param gso the graphics scene options parameter. \cgalAdvancedBegin The real declaration of this function template is: - template + template - void CGAL::draw(const CGAL::Constrained_triangulation_2& ct2, InDomainPMap ipm, const GSOptions& gso); + void CGAL::draw(const CGAL::Constrained_triangulation_2& ct2, InDomainPMap ipm); \cgalAdvancedEnd */ - template - void draw(const CT2& ct2, InDomainPMap ipm, const GSOptions& gso); + template + void draw(const CT2& ct2, InDomainPMap ipm); /*! \ingroup PkgDrawConstrainedTriangulation2 -A shortcut to `CGAL::draw(ct2, ipm, Graphics_scene_options{})`. +adds the vertices, edges and faces of `ct2` into the given graphic scene `gs`. If the triangulation has constraints they are drawn. The faces inside and outside of the domain, based on the property map, are drawn in different colors. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam CT2 which must be an instanciation of a `CGAL::Constrained_triangulation_2<...>`. +\tparam InDomainPMap a class model of `ReadablePropertyMap` with `CT2::Face_handle` as key type and `bool` as value type. + +\param ct2 the constrained triangulation to draw. +\param ipm the property map defining the faces which are in the domain. +\param gs the graphic scene to fill. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Constrained_triangulation_2& ct2, InDomainPMap ipm, CGAL::Graphics_scene& gs); + +\cgalAdvancedEnd */ - template - void draw(const CT2& ct2, InDomainPMap ipm); +template +void add_to_graphics_scene(const CT2& ct2, InDomainPMap ipm, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ From bd04b2a68db62f938b407211db54a0aaa4f195f8 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 6 Dec 2023 17:01:34 +0100 Subject: [PATCH 277/341] Remove space in doc --- .../doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h | 2 +- Nef_3/doc/Nef_3/CGAL/draw_nef_3.h | 2 +- Point_set_3/include/CGAL/draw_point_set_3.h | 2 +- Polygon/include/CGAL/draw_polygon_2.h | 2 +- Polygon/include/CGAL/draw_polygon_with_holes_2.h | 2 +- Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h | 2 +- Surface_mesh/include/CGAL/draw_surface_mesh.h | 2 +- Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h | 2 +- Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index c4046126c800..6dc9b021133e 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -38,7 +38,7 @@ A shortcut to `CGAL::draw(lcc, Graphics_scene_options{})`. /*! \ingroup PkgDrawLinearCellComplex -adds the vertices, edges and faces of `lcc` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `lcc` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam LCC which must be an instanciation of a `CGAL::Linear_cell_complex_for_combinatorial_map<...>` or `CGAL::Linear_cell_complex_for_generalized_map<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h index fc5b4b7ea8f6..1d2528d60792 100644 --- a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h +++ b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h @@ -38,7 +38,7 @@ A shortcut to `CGAL::draw(np3, Graphics_scene_options{})`. /*! \ingroup PkgDrawNef3 -adds the vertices, edges and faces of `np3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `np3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam NP3 which must be an instanciation of a `CGAL::Nef_polyhedron_3<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Point_set_3/include/CGAL/draw_point_set_3.h b/Point_set_3/include/CGAL/draw_point_set_3.h index a6799ed7fb78..6a8f671296da 100644 --- a/Point_set_3/include/CGAL/draw_point_set_3.h +++ b/Point_set_3/include/CGAL/draw_point_set_3.h @@ -61,7 +61,7 @@ A shortcut to `CGAL::draw(ps, Graphics_scene_options{})`. /*! \ingroup PkgDrawPointSet3D -adds the vertices, edges and faces of `ps` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `ps` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam PS which must be an instanciation of a `CGAL::Point_set_3<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index e65b7583533f..24acaaa7535e 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -64,7 +64,7 @@ A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. /*! \ingroup PkgDrawPolygon2 -adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam P which must be an instanciation of a `CGAL::Polygon_2<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index f2f313028ec7..3be337aa1573 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -64,7 +64,7 @@ A shortcut to `CGAL::draw(ph, Graphics_scene_options{})`. /*! \ingroup PkgDrawPolygonWithHoles2 -adds the vertices, edges and faces of `ph` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `ph` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam PH which must be an instanciation of a `CGAL::Polygon_with_holes_2<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h index fd69b1e93715..6d30faa65620 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h +++ b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h @@ -38,7 +38,7 @@ A shortcut to `CGAL::draw(p, Graphics_scene_options{})`. /*! \ingroup PkgDrawPolyhedron -adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `p` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam P which must be an instanciation of a `CGAL::Polyhedron_3<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index da98cc05a82f..776aa5097b21 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -53,7 +53,7 @@ A shortcut to `CGAL::draw(sm, Graphics_scene_options{})`. /*! \ingroup PkgDrawSurfaceMesh -adds the vertices, edges and faces of `sm` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `sm` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam SM which must be an instanciation of a `CGAL::Surface_mesh<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 7300d0d92fbf..a7567db9b0a8 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -38,7 +38,7 @@ A shortcut to `CGAL::draw(at2, Graphics_scene_options{})`. /*! \ingroup PkgDrawTriangulation2 -adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `at2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam T2 which must be an instanciation of a `CGAL::Triangulation_2<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index b85fff6ee252..5c8c0d041c15 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -37,7 +37,7 @@ void draw(const T3& at3, const GSOptions& gso); /*! \ingroup PkgDrawTriangulation3 -adds the vertices, edges and faces of `at3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso` . Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). +adds the vertices, edges and faces of `at3` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). \tparam T3 which must be an instanciation of a `CGAL::Triangulation_3<...>`. \tparam GSOptions a model of `GraphicsSceneOptions` concept. From ac1fcdec135318c98ada5a85abaff0406e227300 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 7 Dec 2023 08:11:27 +0100 Subject: [PATCH 278/341] Doc basic viewer --- .../doc/Basic_viewer/CGAL/Qt/Basic_viewer.h | 8 ++- .../doc/Basic_viewer/PackageDescription.txt | 58 ++++++++++--------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index 34c72f8c70a0..2ed9bec56be3 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -5,7 +5,7 @@ namespace CGAL { /*! \ingroup PkgBasicViewerClasses -The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements are added through the scene. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +The class `Basic_viewer` is a Qt widget based on `QGLViewer` that allows to visualize 3D elements: points, segments, triangles, rays and lines. This class stores a reference to a `Graphics_scene`. Elements are added through the scene. This class requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. CGAL::QGLViewer is our internal fork of QGLViewer class which is A versatile 3D OpenGL viewer based on QOpenGLWidget. */ @@ -142,7 +142,9 @@ class Basic_viewer : public CGAL::QGLViewer /*! \ingroup PkgBasicViewerClasses -The class `QApplication_and_basic_viewer` regroups a `Basic_viewer` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer` to define their own behavior. This class requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +The class `QApplication_and_basic_viewer` regroups a `Basic_viewer` and Qt `QApplication`. The `QApplication` is created in the constructor, but started by the `run()` method. This allows for example users to modify the `on_key_pressed` method of the `Basic_viewer` to define their own behavior. + +This class requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. */ class QApplication_and_basic_viewer @@ -165,7 +167,7 @@ class QApplication_and_basic_viewer /*! \ingroup PkgBasicViewerClasses - opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition CGAL_USE_BASIC_VIEWER. + opens a new window and draws the given `Graphics_scene` (which must have been filled before). `title` will be the title of the window. A call to this method is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition CGAL_USE_BASIC_VIEWER. */ void draw_graphics_scene(const Graphics_scene& graphic_scene, const char *title="CGAL Basic Viewer") diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index d85d6ab1927e..4e505a4b6a28 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -40,36 +40,38 @@ \cgalCRPSubsection{Draw for Different Packages} -- `Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink -- `Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::draw() \endlink -- `Nef_polyhedron_3` \link PkgDrawNef3 CGAL::draw() \endlink -- `Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink -- `Point_set_3` \link PkgDrawPointSet3D CGAL::draw() \endlink -- `Polygon_2` \link PkgDrawPolygon2 CGAL::draw() \endlink -- `Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::draw() \endlink -- `Polygon_with_holes_2` \link PkgDrawPolygonWithHoles2 CGAL::draw() \endlink -- `Polyhedron_3` \link PkgDrawPolyhedron CGAL::draw() \endlink -- `Surface_mesh` \link PkgDrawSurfaceMesh CGAL::draw() \endlink -- `Surface_mesh_topology` \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink -- `Triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink -- `Triangulation_3` \link PkgDrawTriangulation3 CGAL::draw() \endlink -- `Voronoi_diagram_2` \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink +- `CGAL::Arrangement_2` \link PkgArrangementOnSurface2Draw CGAL::draw() \endlink +- `CGAL::Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink +- `CGAL::Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- `CGAL::Nef_polyhedron_3` \link PkgDrawNef3 CGAL::draw() \endlink +- `CGAL::Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- `CGAL::Point_set_3` \link PkgDrawPointSet3D CGAL::draw() \endlink +- `CGAL::Polygon_2` \link PkgDrawPolygon2 CGAL::draw() \endlink +- `CGAL::Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::draw() \endlink +- `CGAL::Polygon_with_holes_2` \link PkgDrawPolygonWithHoles2 CGAL::draw() \endlink +- `CGAL::Polyhedron_3` \link PkgDrawPolyhedron CGAL::draw() \endlink +- `CGAL::Surface_mesh` \link PkgDrawSurfaceMesh CGAL::draw() \endlink +- `CGAL::Surface_mesh_topology` \link PkgDrawFaceGraphWithPaths CGAL::draw() \endlink +- `CGAL::Triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink +- `CGAL::Triangulation_3` \link PkgDrawTriangulation3 CGAL::draw() \endlink +- `CGAL::Voronoi_diagram_2` \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink \cgalCRPSubsection{Fill Graphics Scene for Different Packages} -- Constrained_triangulation_2 \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink -- Linear_cell_complex \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink -- Nef_polyhedron_3 \link PkgDrawNef3 CGAL::add_to_graphics_scene() \endlink -- Periodic_2_Triangulation_2 \link PkgDrawPeriodic2Triangulation2 CGAL::add_to_graphics_scene() \endlink -- Point_set_3 \link PkgDrawPointSet3D CGAL::add_to_graphics_scene() \endlink -- Polygon_2 \link PkgDrawPolygon2 CGAL::add_to_graphics_scene() \endlink -- Polygon_set_2 \link PkgDrawPolygonSet2 CGAL::add_to_graphics_scene() \endlink -- Polygon_with_holes_2 \link PkgDrawPolygonWithHoles2 CGAL::add_to_graphics_scene() \endlink -- Polyhedron_3 \link PkgDrawPolyhedron CGAL::add_to_graphics_scene() \endlink -- Surface_mesh \link PkgDrawSurfaceMesh CGAL::add_to_graphics_scene() \endlink -- Surface_mesh_topology \link PkgDrawFaceGraphWithPaths CGAL::add_to_graphics_scene() \endlink -- Triangulation_2 \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink -- Triangulation_3 \link PkgDrawTriangulation3 CGAL::add_to_graphics_scene() \endlink -- Voronoi_diagram_2 \link PkgDrawVoronoiDiagram2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Arrangement_2` \link PkgArrangementOnSurface2Draw CGAL::add_to_graphics_scene() \endlink +- `CGAL::Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink +- `CGAL::Nef_polyhedron_3` \link PkgDrawNef3 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Point_set_3` \link PkgDrawPointSet3D CGAL::add_to_graphics_scene() \endlink +- `CGAL::Polygon_2` \link PkgDrawPolygon2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Polygon_with_holes_2` \link PkgDrawPolygonWithHoles2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Polyhedron_3` \link PkgDrawPolyhedron CGAL::add_to_graphics_scene() \endlink +- `CGAL::Surface_mesh` \link PkgDrawSurfaceMesh CGAL::add_to_graphics_scene() \endlink +- `CGAL::Surface_mesh_topology` \link PkgDrawFaceGraphWithPaths CGAL::add_to_graphics_scene() \endlink +- `CGAL::Triangulation_2` \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Triangulation_3` \link PkgDrawTriangulation3 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Voronoi_diagram_2` \link PkgDrawVoronoiDiagram2 CGAL::add_to_graphics_scene() \endlink */ From 3f3a21a949732ef18914597f7d4866a854ba5a4a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 7 Dec 2023 13:55:42 +0100 Subject: [PATCH 279/341] Doc draw face with graph (NYF: todo add links) --- .../CGAL/draw_face_graph_with_paths.h | 88 +++++++++++++++++-- .../include/CGAL/draw_face_graph_with_paths.h | 83 +++++++++++------ 2 files changed, 138 insertions(+), 33 deletions(-) diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h index df9bde13a6f3..75c2b5378e8d 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h @@ -3,28 +3,100 @@ namespace CGAL { /*! \ingroup PkgDrawFaceGraphWithPaths -opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. +opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. + \tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept. +\tparam GSOptions a model of `GraphicsSceneOptionsFaceGraphWithPaths` concept. + \param amesh the mesh to draw. \param apaths the paths to draw, which should lie on `amesh`. +\param gso the graphics scene options parameter. +*/ +template +void draw(const Mesh& amesh, + const std::vector >& apaths, + const GSOptions& gso); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +A shortcut to `CGAL::draw(mesh, paths, Graphics_scene_options_face_graph_with_paths{})`. */ template void draw(const Mesh& amesh, - const std::vector >& apaths); + const std::vector >& apaths); /*! \ingroup PkgDrawFaceGraphWithPaths -opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. +Same function than draw() but taking the paths from a list instead from an std::vector. +*/ +template +void draw(const Mesh& amesh, + std::initializer_list > apaths, + const GSOptions& gso); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +Same function than draw() but taking the paths from a list instead from as std::vector. +*/ +template +void draw(const Mesh& amesh, + std::initializer_list > apaths); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +adds the vertices, edges and faces of `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`, into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + \tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept. +\tparam GSOptions a model of `GraphicsSceneOptionsFaceGraphWithPaths` concept. + \param amesh the mesh to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. \param apaths the paths to draw, which should lie on `amesh`. */ -template -void draw(const Mesh& amesh, - std::initializer_list >& apaths); +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso, + const std::vector>& paths); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +A shortcut to `CGAL::add_to_graphics_scene(mesh, graphics_scene, Graphics_scene_options_face_graph_with_paths{}, paths)`. +*/ +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + const std::vector>& paths); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. +*/ +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso, + std::initializer_list > apaths); + +/*! +\ingroup PkgDrawFaceGraphWithPaths + +Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. +*/ +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + std::initializer_list > apaths); } /* namespace CGAL */ diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 12d645ec1c78..cea1c61faae8 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -254,22 +254,22 @@ void compute_path(const Mesh &mesh, const typename Get_map::storage_type& lcc, CGAL::Graphics_scene &graphics_scene, const GSOptions &gso, - const std::vector>* paths, + const std::vector>& paths, std::size_t i, typename Get_map::type::size_type amark) { - if ((*paths)[i].is_empty() || !gso.draw_path(i)) + if (paths[i].is_empty() || !gso.draw_path(i)) { return; } CGAL::IO::Color color=gso.color_of_path(i); - graphics_scene.add_point(get_point(mesh, (*paths)[i].get_ith_dart(0)), color); - for (std::size_t j=0; j<(*paths)[i].length(); ++j) + graphics_scene.add_point(get_point(mesh, paths[i].get_ith_dart(0)), color); + for (std::size_t j=0; j((*paths)[i].get_ith_dart(j), amark); + compute_edge(mesh, lcc, paths[i].get_ith_dart(j), graphics_scene, gso, true, color); + lcc.template mark_cell<1>(paths[i].get_ith_dart(j), amark); } } } @@ -278,7 +278,7 @@ template void compute_elements(const Mesh &mesh, CGAL::Graphics_scene &graphics_scene, const GSOptions &gso, - const std::vector>* paths, + const std::vector>& paths, typename Get_map::type::size_type mark) { typedef typename Get_map::type LCC; @@ -291,7 +291,7 @@ void compute_elements(const Mesh &mesh, typename Get_map::storage_type lcc(mesh); typename LCC::size_type oriented_mark = lcc.get_new_mark(); - std::size_t current_path = paths->size(); + std::size_t current_path = paths.size(); typename LCC::size_type amark=mark==(std::numeric_limits::max)()? LCC::INVALID_MARK:mark; // If !=INVALID_MARK, show darts marked with this mark @@ -301,12 +301,12 @@ void compute_elements(const Mesh &mesh, typename LCC::size_type markedges = lcc.get_new_mark(); typename LCC::size_type markvertices = lcc.get_new_mark(); - if (current_path==paths->size()) + if (current_path==paths.size()) { - for (std::size_t i=0; isize(); ++i) + for (std::size_t i=0; isize()+1) + else if (current_path!=paths.size()+1) { compute_path(mesh, lcc, graphics_scene, gso, paths, current_path, markedges); } for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(), @@ -343,7 +343,7 @@ template void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, const GSOptions& gso, - const std::vector>* paths, + const std::vector>& paths, typename Get_map::type::size_type amark= Get_map::type::INVALID_MARK) { @@ -354,7 +354,7 @@ void add_to_graphics_scene(const Mesh& mesh, template void add_to_graphics_scene(const Mesh& mesh, CGAL::Graphics_scene& graphics_scene, - const std::vector>* paths, + const std::vector>& paths, typename Get_map::type::size_type amark= Get_map::type::INVALID_MARK) { @@ -368,31 +368,66 @@ void add_to_graphics_scene(const Mesh& mesh, add_to_graphics_scene(mesh, graphics_scene, gso, paths, amark); } +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + const GSOptions& gso, + std::initializer_list> l, + typename Get_map::type::size_type amark= + Get_map::type::INVALID_MARK) +{ + std::vector> paths=l; + add_to_graphics_scene(mesh, graphics_scene, gso, paths, amark); +} + +template +void add_to_graphics_scene(const Mesh& mesh, + CGAL::Graphics_scene& graphics_scene, + std::initializer_list> l, + typename Get_map::type::size_type amark= + Get_map::type::INVALID_MARK) +{ + std::vector> paths=l; + add_to_graphics_scene(mesh, graphics_scene, paths, amark); +} + #ifdef CGAL_USE_BASIC_VIEWER -template +template void draw(const Mesh& mesh, const std::vector >& paths, + const GSOptions& gso, const char* title="Mesh Viewer With Path", typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)()) { - CGAL::Graphics_scene buffer; - add_to_graphics_scene(mesh, buffer, &paths, amark); - draw_graphics_scene(buffer, title); + CGAL::Graphics_scene graphics_scene; + add_to_graphics_scene(mesh, graphics_scene, paths, gso, amark); + draw_graphics_scene(graphics_scene, title); } -template +template void draw(const Mesh& mesh, const std::vector >& paths, + const char* title="Mesh Viewer With Path", + typename Get_map::type::size_type amark= + (std::numeric_limits::type::size_type>::max)()) +{ + CGAL::Graphics_scene graphics_scene; + add_to_graphics_scene(mesh, graphics_scene, paths, amark); + draw_graphics_scene(graphics_scene, title); +} + +template +void draw(const Mesh& mesh, + std::initializer_list> l, const GSOptions& gso, const char* title="Mesh Viewer With Path", typename Get_map::type::size_type amark= (std::numeric_limits::type::size_type>::max)()) { - CGAL::Graphics_scene buffer; - add_to_graphics_scene(mesh, buffer, gso, &paths, amark); - draw_graphics_scene(buffer, title); + std::vector> paths=l; + draw(mesh, paths, gso, title, amark); } template @@ -403,9 +438,7 @@ void draw(const Mesh& mesh, (std::numeric_limits::type::size_type>::max)()) { std::vector> paths=l; - CGAL::Graphics_scene buffer; - add_to_graphics_scene(mesh, buffer, &paths, amark); - draw_graphics_scene(buffer, title); + draw(mesh, paths, title, amark); } #endif // CGAL_USE_BASIC_VIEWER From 973fb082d53d3a610cf96e25c5e89170e202cb24 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 7 Dec 2023 17:21:54 +0100 Subject: [PATCH 280/341] doc draw arrangement; fix to doc face graph with path --- .../CGAL/draw_arrangement_2.h | 44 ++++++++++++++++--- .../CGAL/draw_face_graph_with_paths.h | 24 +++++----- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h index 51507311b8d4..9ba97a1c5297 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h @@ -26,11 +26,11 @@ namespace CGAL { /*! \ingroup PkgArrangementOnSurface2Draw * * opens a new window and draws `arr`, an instance of the `CGAL::Arrangement_2` - * class template. A call to this function is blocking; that is, the program - * continues only after the user closes the window. This function requires - * `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is - * defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link - * with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. + * class template. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. + * * \tparam GeometryTraits_2 a geometry traits type, a model of a 2D arrangement * traits concept. At this point it must be an instance of either @@ -44,9 +44,39 @@ namespace CGAL { * \sa `ArrangementDcel` * \sa `ArrangementTraits_2` */ +template +void draw(const Arrangement_2& arr, const GSOptions& gso); + +/*! \ingroup PkgArrangementOnSurface2Draw + + A shortcut to `CGAL::draw(arr, Graphics_scene_options{})`. + */ +template +void draw(const Arrangement_2& arr); + +/*! \ingroup PkgArrangementOnSurface2Draw + +adds the vertices, edges and faces of `arr` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam GeometryTraits_2 a geometry traits type, a model of a 2D arrangement traits concept. At this point it must be an instance of either `CGAL::Arr_segment_traits_2` or `CGAL::Arr_conic_traits_2`. +\tparam Dcel the \dcel type, a model of the `ArrangementDcel` concept. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param arr the 2D arrangement to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + */ +template +void add_to_graphics_scene(const Arrangement_2& arr, + CGAL::Graphics_scene& gs, const GSOptions& gso); + +/*! \ingroup PkgArrangementOnSurface2Draw + + A shortcut to `CGAL::add_to_graphics_scene(arr, gs, Graphics_scene_options{})`. + */ template -void draw(const Arrangement_2& arr, - const char* title = "2D Arrangement Basic Viewer"); +void add_to_graphics_scene(const Arrangement_2& arr, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h index 75c2b5378e8d..9a088f236f57 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h @@ -23,7 +23,7 @@ void draw(const Mesh& amesh, /*! \ingroup PkgDrawFaceGraphWithPaths -A shortcut to `CGAL::draw(mesh, paths, Graphics_scene_options_face_graph_with_paths{})`. +A shortcut to `CGAL::draw(amesh, apaths, Graphics_scene_options_face_graph_with_paths{})`. */ template void draw(const Mesh& amesh, @@ -62,20 +62,20 @@ adds the vertices, edges and faces of `amesh`, either a 2D linear cell complex o \param apaths the paths to draw, which should lie on `amesh`. */ template -void add_to_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, +void add_to_graphics_scene(const Mesh& amesh, + CGAL::Graphics_scene& gs, const GSOptions& gso, - const std::vector>& paths); + const std::vector>& apaths); /*! \ingroup PkgDrawFaceGraphWithPaths -A shortcut to `CGAL::add_to_graphics_scene(mesh, graphics_scene, Graphics_scene_options_face_graph_with_paths{}, paths)`. +A shortcut to `CGAL::add_to_graphics_scene(amesh, gs, Graphics_scene_options_face_graph_with_paths{}, apaths)`. */ template -void add_to_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, - const std::vector>& paths); +void add_to_graphics_scene(const Mesh& amesh, + CGAL::Graphics_scene& gs, + const std::vector>& apaths); /*! \ingroup PkgDrawFaceGraphWithPaths @@ -83,8 +83,8 @@ void add_to_graphics_scene(const Mesh& mesh, Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. */ template -void add_to_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, +void add_to_graphics_scene(const Mesh& amesh, + CGAL::Graphics_scene& gs, const GSOptions& gso, std::initializer_list > apaths); @@ -94,8 +94,8 @@ void add_to_graphics_scene(const Mesh& mesh, Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. */ template -void add_to_graphics_scene(const Mesh& mesh, - CGAL::Graphics_scene& graphics_scene, +void add_to_graphics_scene(const Mesh& amesh, + CGAL::Graphics_scene& gs, std::initializer_list > apaths); } /* namespace CGAL */ From 2bd80f65711324cd723cc2fb1dd23cd1cc200414 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 7 Dec 2023 17:35:48 +0100 Subject: [PATCH 281/341] doc draw arrangement --- .../CGAL/draw_arrangement_2.h | 31 +++++++++---------- Basic_viewer/doc/Basic_viewer/dependencies | 1 + 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h index 9ba97a1c5297..cf7782447aa4 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h @@ -24,33 +24,30 @@ namespace CGAL { /*! \ingroup PkgArrangementOnSurface2Draw - * - * opens a new window and draws `arr`, an instance of the `CGAL::Arrangement_2` - * class template. Parameters of the drawing are taken from the optional graphics scene options parameter. + + opens a new window and draws `arr`, an instance of the `CGAL::Arrangement_2` class template. Parameters of the drawing are taken from the optional graphics scene options parameter. A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. - * - * \tparam GeometryTraits_2 a geometry traits type, a model of a 2D arrangement - * traits concept. At this point it must be an instance of either - * `CGAL::Arr_segment_traits_2` or `CGAL::Arr_conic_traits_2`. - * - * \tparam Dcel the \dcel type, a model of the `ArrangementDcel` concept. - * - * \param arr the 2D arrangement to draw. - * \param title the window title. - * - * \sa `ArrangementDcel` - * \sa `ArrangementTraits_2` - */ + +\tparam GeometryTraits_2 a geometry traits type, a model of a 2D arrangement traits concept. At this point it must be an instance of either `CGAL::Arr_segment_traits_2` or `CGAL::Arr_conic_traits_2`. +\tparam Dcel the \dcel type, a model of the `ArrangementDcel` concept. +\tparam GSOptions a model of `GraphicsSceneOptions` concept. + +\param arr the 2D arrangement to draw. +\param gso the graphics scene options parameter. + +\sa `ArrangementDcel` +\sa `ArrangementTraits_2` +*/ template void draw(const Arrangement_2& arr, const GSOptions& gso); /*! \ingroup PkgArrangementOnSurface2Draw A shortcut to `CGAL::draw(arr, Graphics_scene_options{})`. - */ +*/ template void draw(const Arrangement_2& arr); diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index 3db1960593c5..296159a45e74 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -12,3 +12,4 @@ Triangulation_2 Triangulation_3 Voronoi_diagram_2 Kernel_23 +Arrangement_on_surface_2 From f3c5f5329665b1c4a5eea4c8fe7b4a1f952dc0be Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 7 Dec 2023 17:49:19 +0100 Subject: [PATCH 282/341] doc add link --- .../CGAL/draw_face_graph_with_paths.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h index 9a088f236f57..b09424dbecd8 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h @@ -32,7 +32,7 @@ void draw(const Mesh& amesh, /*! \ingroup PkgDrawFaceGraphWithPaths -Same function than draw() but taking the paths from a list instead from an std::vector. +Same function than draw() but taking the paths from a list instead from an std::vector. */ template void draw(const Mesh& amesh, @@ -42,7 +42,7 @@ void draw(const Mesh& amesh, /*! \ingroup PkgDrawFaceGraphWithPaths -Same function than draw() but taking the paths from a list instead from as std::vector. +A shortcut to `CGAL::draw(amesh, apaths, Graphics_scene_options_face_graph_with_paths{})`. */ template void draw(const Mesh& amesh, @@ -80,7 +80,7 @@ void add_to_graphics_scene(const Mesh& amesh, /*! \ingroup PkgDrawFaceGraphWithPaths -Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. +Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. */ template void add_to_graphics_scene(const Mesh& amesh, @@ -91,7 +91,7 @@ void add_to_graphics_scene(const Mesh& amesh, /*! \ingroup PkgDrawFaceGraphWithPaths -Same function than add_to_graphics_scene() but taking the paths from a list instead from an std::vector. +A shortcut to `CGAL::add_to_graphics_scene(amesh, gs, Graphics_scene_options_face_graph_with_paths{}, apaths)`. */ template void add_to_graphics_scene(const Mesh& amesh, From 769f6153667a7dcc86ba59dc0baad6c362f51f45 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 8 Dec 2023 13:45:48 +0100 Subject: [PATCH 283/341] doc: draw p2t2 --- .../CGAL/draw_periodic_2_triangulation_2.h | 95 ++++++++++++++++++- ...phicsSceneOptionsPeriodic2Triangulation2.h | 37 ++++++++ 2 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h index cbad54f1f7aa..c0d06a67e332 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h @@ -3,14 +3,99 @@ namespace CGAL { /*! \ingroup PkgDrawPeriodic2Triangulation2 -opens a new window and draws `ap2t2`, the `Periodic_2_Triangulation_2`. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +The class `Graphics_scene_options_periodic_2_triangulation_2` defines data and methods used to tune the way that the cells of a `Periodic_2_triangulation_2` are considered for drawing or to be added into a graphics scene. + +This class is a model of `GraphicsSceneOptionsPeriodic2Triangulation2`. + +\tparam DS a `CGAL::Periodic_2_triangulation_2`. +\tparam VertexDescriptor a descriptor of vertices of `DS`. +\tparam EdgeDescriptor a descriptor of edges of `DS`. +\tparam FaceDescriptor a descriptor of faces of `DS`. + +\cgalModels{GraphicsSceneOptionsPeriodic2Triangulation2} +*/ + +template +struct Graphics_scene_options_periodic_2_triangulation_2: public CGAL::Graphics_scene_options +{ +public: + typedef VertexDescriptor vertex_descriptor; + typedef EdgeDescriptor edge_descriptor; + typedef FaceDescriptor face_descriptor; +}; + +/*! +\ingroup PkgDrawPeriodic2Triangulation2 + +opens a new window and draws a periodic 2D triangulation. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam P2T2 a model of the `Periodic_2TriangulationTraits_2` concept. -\param ap2t2 the 2D periodic trinagulation to draw. +\tparam P2T2 which must be an instanciation of a `CGAL::Periodic_2_triangulation_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsPeriodic2Triangulation2` concept. + +\param p2t2 the periodic triangulation to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Periodic_2_triangulation_2& p2t2, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void draw(const P2T2& p2t2, const GSOptions& gso); + +/*! +\ingroup PkgDrawPeriodic2Triangulation2 + +A shortcut to `CGAL::draw(p2t2, Graphics_scene_options_periodic_2_triangulation_2{})`. +*/ +template +void draw(const P2T2& p2t2); + +/*! +\ingroup PkgDrawPeriodic2Triangulation2 + +adds the vertices, edges and faces of `p2t2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam P2T2 which must be an instanciation of a `CGAL::Periodic_2_triangulation_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsPeriodic2Triangulation2` concept. + +\param p2t2 the periodic triangulation to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Periodic_2_triangulation_2& p2t2, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void add_to_graphics_scene(const P2T2& p2t2, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPeriodic2Triangulation2 + +A shortcut to `CGAL::add_to_graphics_scene(p2t2, gs, Graphics_scene_options_periodic_2_triangulation_2{})`. */ template -void draw(const P2T2& ap2t2); +void add_to_graphics_scene(const P2T2& p2t2, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h new file mode 100644 index 000000000000..565d8e1b913a --- /dev/null +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h @@ -0,0 +1,37 @@ +/*! +\ingroup PkgPeriodic2Triangulation2Concepts + +The concept `GraphicsSceneOptionsPeriodic2Triangulation2` defines data and methods used to tune the way that the cells of a `Periodic_2_triangulation_2` are considered for drawing or to be added into a graphics scene. + +\cgalRefines{GraphicsSceneOptions} + +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Graphics_scene_options_periodic_2_triangulation_2 `CGAL::Graphics_scene_options_periodic_2_triangulation_2`\endlink} +\cgalHasModelsEnd + +*/ +class GraphicsSceneOptionsPeriodic2Triangulation2 +{ +public: + /// returns `true` if the domain of the Periodic_2_triangulation_2 must be ignored, `false` otherwise. + /// Returns `false` by default. + bool draw_domain() const; + + /// sets the draw domain value to `b`. + void draw_domain(bool b); + + /// toggles the draw domain value. + void toggle_draw_domain(); + + /// returns the type of the display (STORED, UNIQUE, STORED_COVER_DOMAIN or UNIQUE_COVER_DOMAIN). + typename DS::Iterator_type display_type() const; + + /// set the display type to the next type (in the ordered circular list STORED, UNIQUE, STORED_COVER_DOMAIN, UNIQUE_COVER_DOMAIN). + void increase_display_type(); + + /// returns the color used to draw the domain. + const CGAL::IO::Color& domain_color() const; + + /// sets the color used to draw the domain to `c`. + void domain_color(const CGAL::IO::Color& c) +}; From 489317b6f2b0f0760d94f44e708b50bfe686bf63 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 8 Dec 2023 14:38:45 +0100 Subject: [PATCH 284/341] doc: draw p2t2 and voronoi2 --- .../CGAL/draw_periodic_2_triangulation_2.h | 7 +- ...phicsSceneOptionsPeriodic2Triangulation2.h | 2 +- .../PackageDescription.txt | 4 +- .../CGAL/draw_voronoi_diagram_2.h | 94 +++++++++++++++++-- .../GraphicsSceneOptionsVoronoiDiagram2.h | 46 +++++++++ .../Voronoi_diagram_2/PackageDescription.txt | 3 +- .../include/CGAL/draw_voronoi_diagram_2.h | 28 ++---- 7 files changed, 149 insertions(+), 35 deletions(-) create mode 100644 Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/GraphicsSceneOptionsVoronoiDiagram2.h diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h index c0d06a67e332..fafd9a4f5f19 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/draw_periodic_2_triangulation_2.h @@ -20,12 +20,7 @@ template struct Graphics_scene_options_periodic_2_triangulation_2: public CGAL::Graphics_scene_options -{ -public: - typedef VertexDescriptor vertex_descriptor; - typedef EdgeDescriptor edge_descriptor; - typedef FaceDescriptor face_descriptor; -}; +{}; /*! \ingroup PkgDrawPeriodic2Triangulation2 diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h index 565d8e1b913a..54b84e2d75a2 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/GraphicsSceneOptionsPeriodic2Triangulation2.h @@ -13,7 +13,7 @@ The concept `GraphicsSceneOptionsPeriodic2Triangulation2` defines data and metho class GraphicsSceneOptionsPeriodic2Triangulation2 { public: - /// returns `true` if the domain of the Periodic_2_triangulation_2 must be ignored, `false` otherwise. + /// returns `true` if the domain of the Periodic_2_triangulation_2 must be drawn, `false` otherwise. /// Returns `false` by default. bool draw_domain() const; diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt index 00c17ceec127..3c527f6fdd2c 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt @@ -110,7 +110,9 @@ of the concept `Periodic_2Offset_2`. - `CGAL::Periodic_2_triangulation_2::Locate_type` \cgalCRPSection{Draw 2D Periodic Triangulation} - - \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- `GraphicsSceneOptionsPeriodic2Triangulation2` +- `CGAL::Graphics_scene_options_periodic_2_triangulation_2` */ diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h index 530bcaf5dda2..8298b7b1a52f 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h @@ -3,16 +3,94 @@ namespace CGAL { /*! \ingroup PkgDrawVoronoiDiagram2 -opens a new window and draws `av2`, the `Voronoi_diagram_2` constructed from a Delaunay Graph which is a model of `DelaunayGraph_2` concept. -The class `Voronoi_diagram_2` provides an adaptor to view a triangulated Delaunay graph as their dual subdivision, the -Voronoi diagram. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +The class `Graphics_scene_options_voronoi_diagram_2` defines data and methods used to tune the way that the cells of a `Voronoi_diagram_2` are considered for drawing or to be added into a graphics scene. + +This class is a model of `GraphicsSceneOptionsVoronoiDiagram2`. + +\tparam DS a `CGAL::Voronoi_diagram_2`. +\tparam VertexDescriptor a descriptor of vertices of `DS`. +\tparam EdgeDescriptor a descriptor of edges of `DS`. +\tparam FaceDescriptor a descriptor of faces of `DS`. + +\cgalModels{GraphicsSceneOptionsVoronoiDiagram2} +*/ + +template +struct Graphics_scene_options_voronoi_diagram_2: public CGAL::Graphics_scene_options +{}; + +/*! +\ingroup PkgDrawVoronoiDiagram2 + +opens a new window and draws a 2D voronoi diagram. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam V2 a model of the `AdaptationTraits_2` concept. -\param av2 the voronoi diagram to draw. +\tparam VD2 which must be an instanciation of a `CGAL::Voronoi_diagram_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsVoronoiDiagram2` concept. + +\param vd2 the voronoi diagram to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Voronoi_diagram_2& vd2, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void draw(const VD2& vd2, const GSOptions& gso); + +/*! +\ingroup PkgDrawVoronoiDiagram2 + +A shortcut to `CGAL::draw(vd2, Graphics_scene_options_voronoi_diagram_2{})`. +*/ +template +void draw(const VD2& vd2); + +/*! +\ingroup PkgDrawVoronoiDiagram2 + +adds the vertices, edges and faces of `vd2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam VD2 which must be an instanciation of a `CGAL::Voronoi_diagram_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsVoronoiDiagram2` concept. + +\param vd2 the voronoi diagram to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Voronoi_diagram_2& vd2, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void add_to_graphics_scene(const VD2& vd2, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawVoronoiDiagram2 + +A shortcut to `CGAL::add_to_graphics_scene(vd2, gs, Graphics_scene_options_voronoi_diagram_2{})`. */ -template -void draw(const V2& av2); +template +void add_to_graphics_scene(const VD2& vd2, + CGAL::Graphics_scene& gs); } /* namespace CGAL */ diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/GraphicsSceneOptionsVoronoiDiagram2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/GraphicsSceneOptionsVoronoiDiagram2.h new file mode 100644 index 000000000000..42c8baee9723 --- /dev/null +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/GraphicsSceneOptionsVoronoiDiagram2.h @@ -0,0 +1,46 @@ +/*! +\ingroup PkgVoronoiDiagram2Concepts + +The concept `GraphicsSceneOptionsVoronoiDiagram2` defines data and methods used to tune the way that the cells of a `Voronoi_diagram_2` are considered for drawing or to be added into a graphics scene. + +\cgalRefines{GraphicsSceneOptions} + +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Graphics_scene_options_voronoi_diagram_2 `CGAL::Graphics_scene_options_voronoi_diagram_2`\endlink} +\cgalHasModelsEnd + +*/ +class GraphicsSceneOptionsVoronoiDiagram2 +{ +public: + /// returns the color of the dual vertices. + const CGAL::IO::Color& dual_vertex_color() const; + /// sets the color of dual vertices to `c`. + void dual_vertex_color(const CGAL::IO::Color& c); + + /// returns the color of rays. + const CGAL::IO::Color& ray_color() const; + /// sets the color of rays to `c`. + void ray_color(const CGAL::IO::Color& c); + + /// returns the color of the bisectors. + const CGAL::IO::Color& bisector_color() const; + /// sets the color of bisectors to `c`. + void bisector_color(const CGAL::IO::Color& c); + + /// returns `true` if the voronoi vertices must be drawn, `false` otherwise. + /// Returns `false` by default. + bool draw_voronoi_vertices() const; + /// sets the draw of voronoi vertices to `b`. + void draw_voronoi_vertices(bool b); + /// toggles the draw voronoi vertices value. + void toggle_draw_voronoi_vertices(); + + /// returns `true` if the dual vertices must be drawn, `false` otherwise. + /// Returns `false` by default. + bool draw_dual_vertices() const; + /// sets the draw of dual vertices to `b`. + void draw_dual_vertices(); + /// toggles the draw dual vertices value. + void toggle_draw_dual_vertices(); +}; diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt index b109a0213d91..58edde2ec5ab 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt @@ -90,6 +90,7 @@ performing this adaptation. \cgalCRPSection{Draw Voronoi Diagram} - \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink - +- `GraphicsSceneOptionsVoronoiDiagram2` +- `CGAL::Graphics_scene_options_voronoi_2` */ diff --git a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h index afe34cd5855f..534d5aa47c38 100644 --- a/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/draw_voronoi_diagram_2.h @@ -57,14 +57,12 @@ struct Graphics_scene_options_voronoi_2 : void bisector_color(const CGAL::IO::Color& c) { m_bisector_color=c; } - void disable_voronoi_vertices() { m_draw_voronoi_vertices=false; } - void enable_voronoi_vertices() { m_draw_voronoi_vertices=true; } - bool are_voronoi_vertices_enabled() const { return m_draw_voronoi_vertices; } + void draw_voronoi_vertices(bool b) { m_draw_voronoi_vertices=b; } + bool draw_voronoi_vertices() const { return m_draw_voronoi_vertices; } void toggle_draw_voronoi_vertices() { m_draw_voronoi_vertices=!m_draw_voronoi_vertices; } - void disable_dual_vertices() { m_draw_dual_vertices=false; } - void enable_dual_vertices() { m_draw_dual_vertices=true; } - bool are_dual_vertices_enabled() const { return m_draw_dual_vertices; } + void draw_dual_vertices(bool b) { m_draw_dual_vertices=b; } + bool draw_dual_vertices() const { return m_draw_dual_vertices; } void toggle_draw_dual_vertices() { m_draw_dual_vertices=!m_draw_dual_vertices; } protected: @@ -310,7 +308,7 @@ void compute_elements(const V2& v2, if(gs_options.are_vertices_enabled()) { // Draw the voronoi vertices - if (gs_options.are_voronoi_vertices_enabled()) + if (gs_options.draw_voronoi_vertices()) { for (typename V2::Vertex_iterator it=v2.vertices_begin(); it!=v2.vertices_end(); ++it) @@ -318,7 +316,7 @@ void compute_elements(const V2& v2, } // Draw the dual vertices - if (gs_options.are_dual_vertices_enabled()) + if (gs_options.draw_dual_vertices()) { for (typename V2::Delaunay_graph::Finite_vertices_iterator it=v2.dual().finite_vertices_begin(); @@ -402,13 +400,10 @@ void draw(const CGAL_VORONOI_TYPE& av2, } else if ((e->key() == ::Qt::Key_V) && (modifiers == ::Qt::ShiftModifier)) { - if(gs_options.are_voronoi_vertices_enabled()) - { gs_options.disable_voronoi_vertices(); } - else { gs_options.enable_voronoi_vertices(); } - + gs_options.toggle_draw_voronoi_vertices(); basic_viewer->displayMessage (QString("Voronoi vertices=%1."). - arg(gs_options.are_voronoi_vertices_enabled()?"true":"false")); + arg(gs_options.draw_voronoi_vertices()?"true":"false")); buffer.clear(); draw_function_for_v2::compute_elements(av2, buffer, gs_options); @@ -416,12 +411,9 @@ void draw(const CGAL_VORONOI_TYPE& av2, } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) { - if(gs_options.are_dual_vertices_enabled()) - { gs_options.disable_dual_vertices(); } - else { gs_options.enable_dual_vertices(); } - + gs_options.toggle_draw_dual_vertices(); basic_viewer->displayMessage(QString("Dual vertices=%1."). - arg(gs_options.are_dual_vertices_enabled()?"true":"false")); + arg(gs_options.draw_dual_vertices()?"true":"false")); buffer.clear(); draw_function_for_v2::compute_elements(av2, buffer, gs_options); From 62b8460b0f073951b870352f9296731642371b1d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 8 Dec 2023 14:53:46 +0100 Subject: [PATCH 285/341] doc draw boolean set op 2 --- .../CGAL/draw_polygon_set_2.h | 91 ++++++++++++++++++- .../GraphicsSceneOptionsPolygonSet2.h | 38 ++++++++ .../PackageDescription.txt | 4 +- 3 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GraphicsSceneOptionsPolygonSet2.h diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h index 5728fe8b86c6..32b2cecdb634 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h @@ -3,13 +3,94 @@ namespace CGAL { /*! \ingroup PkgDrawPolygonSet2 -opens a new window and draws `aps`, an instance of the `CGAL::Polygon_set_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +The class `Graphics_scene_options_polygon_set_2` defines data and methods used to tune the way that the cells of a `Polygon_set_2` are considered for drawing or to be added into a graphics scene. + +This class is a model of `GraphicsSceneOptionsPolygonSet2`. + +\tparam DS a `CGAL::Polygon_set_2`. +\tparam VertexDescriptor a descriptor of vertices of `DS`. +\tparam EdgeDescriptor a descriptor of edges of `DS`. +\tparam FaceDescriptor a descriptor of faces of `DS`. + +\cgalModels{GraphicsSceneOptionsPolygonSet2} +*/ + +template +struct Graphics_scene_options_polygon_set_2: public CGAL::Graphics_scene_options +{}; + +/*! +\ingroup PkgDrawPolygonSet2 + +opens a new window and draws a 2D polygon set. Parameters of the drawing are taken from the optional graphics scene options parameter. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. -\tparam PS an instance of the `CGAL::Polygon_set_2` class. -\param aps the polygon set to draw. +\tparam PS2 which must be an instanciation of a `CGAL::Polygon_set_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsPolygonSet2` concept. + +\param ps2 the polygon set to draw. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::draw(const CGAL::Polygon_set_2& ps2, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void draw(const PS2& ps2, const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygonSet2 + +A shortcut to `CGAL::draw(ps2, Graphics_scene_options_polygon_set_2{})`. +*/ +template +void draw(const PS2& ps2); + +/*! +\ingroup PkgDrawPolygonSet2 + +adds the vertices, edges and faces of `ps2` into the given graphic scene `gs`. Parameters of the cells are taken from the optional graphics scene options parameter `gso`. Note that `gs` is not cleared before being filled (to enable to draw several data structures in the same basic viewer). + +\tparam PS2 which must be an instanciation of a `CGAL::Polygon_set_2<...>`. +\tparam GSOptions a model of `GraphicsSceneOptionsPolygonSet2` concept. + +\param ps2 the polygon set to draw. +\param gs the graphic scene to fill. +\param gso the graphics scene options parameter. + +\cgalAdvancedBegin +The real declaration of this function template is: + + + template + + void CGAL::add_to_graphics_scene(const CGAL::Polygon_set_2& ps2, CGAL::Graphics_scene& gs, const GSOptions& gso); + +\cgalAdvancedEnd +*/ +template +void add_to_graphics_scene(const PS2& ps2, + CGAL::Graphics_scene& gs, + const GSOptions& gso); + +/*! +\ingroup PkgDrawPolygonSet2 + +A shortcut to `CGAL::add_to_graphics_scene(ps2, gs, Graphics_scene_options_polygon_set_2{})`. */ -template -void draw(const PS& aps); +template +void add_to_graphics_scene(const PS2& ps2, + CGAL::Graphics_scene& gs); } /* end namespace CGAL */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GraphicsSceneOptionsPolygonSet2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GraphicsSceneOptionsPolygonSet2.h new file mode 100644 index 000000000000..458b9baa2834 --- /dev/null +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GraphicsSceneOptionsPolygonSet2.h @@ -0,0 +1,38 @@ +/*! +\ingroup PkgBooleanSetOperations2Concepts + +The concept `GraphicsSceneOptionsPolygonSet2` defines data and methods used to tune the way that the cells of a `Polygon_set_2` are considered for drawing or to be added into a graphics scene. + +\cgalRefines{GraphicsSceneOptions} + +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Graphics_scene_options_polygon_set_2 `CGAL::Graphics_scene_options_polygon_set_2`\endlink} +\cgalHasModelsEnd + +*/ +class GraphicsSceneOptionsPolygonSet2 +{ +public: + /// returns the color of the unbounded face. + const CGAL::IO::Color& unbounded_face_color() const; + /// sets the color of the unbounded face to `c`. + void unbounded_face_color(const CGAL::IO::Color& c); + + /// returns `true` if the unbounded face must be drawn, `false` otherwise. + /// Returns `false` by default. + bool draw_unbounded() const; + /// sets the draw of unbounded face to `b`. + void draw_unbounded(bool b); + /// toggles the draw unbounded face value. + void toggle_draw_unbounded(); + + /// returns the height of the box used to draw the unbounded face. + int height() const; + /// returns the width of the box used to draw the unbounded face. + int width() const; + + /// sets the height of the box used to draw the unbounded face to `i`. + void height(int i); + /// sets the width of the box used to draw the unbounded face to `i`. + void width(int i); +}; diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt index f67e57f7e1a9..a562dd4e48a7 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt @@ -69,6 +69,8 @@ containment predicates. - \link boolean_connect_holes `CGAL::connect_holes()` \endlink \cgalCRPSection{Draw a Polygon_set_2} -- \link PkgDrawPolygonSet2 CGAL::draw() \endlink +- \link PkgDrawPolygonSet2 CGAL::draw() \endlink +- `GraphicsSceneOptionsPolygonSet2` +- `CGAL::Graphics_scene_options_polygon_set_2` */ From dcac571d9986acb1bcd2838244f7d2fd90938bf6 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 14 Dec 2023 08:23:16 +0100 Subject: [PATCH 286/341] Remove a warning --- Basic_viewer/include/CGAL/Graphics_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/include/CGAL/Graphics_scene.h b/Basic_viewer/include/CGAL/Graphics_scene.h index 73a5fafe6377..155a471b217d 100644 --- a/Basic_viewer/include/CGAL/Graphics_scene.h +++ b/Basic_viewer/include/CGAL/Graphics_scene.h @@ -374,7 +374,7 @@ class Graphics_scene void m_texts_clear() { m_texts.clear(); } - int m_texts_size() const + std::size_t m_texts_size() const { return m_texts.size(); } const std::vector>& get_m_texts() const From d7720073e2ac04972ae9c56785c29d8f219de13d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 14 Dec 2023 08:24:09 +0100 Subject: [PATCH 287/341] Remove a wrong const --- Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 2164082adba7..ab197fe02ff0 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -38,7 +38,7 @@ struct Graphics_scene_options_polygon_set_2 : bool draw_unbounded() const { return m_draw_unbounded; } - void draw_unbounded(bool b) const + void draw_unbounded(bool b) { m_draw_unbounded=b; } void toggle_draw_unbounded() { m_draw_unbounded=!m_draw_unbounded; } From b7ed4f249e5f2192fa7832eb9e57a3f58212b40c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 14 Dec 2023 08:26:55 +0100 Subject: [PATCH 288/341] protect min and max --- .../examples/Basic_viewer/draw_surface_mesh_height.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index d1ef948609eb..46399cbb4bdb 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -26,8 +26,8 @@ struct Colored_faces_given_height: { m_min_z=sm.point(vi).z(); m_max_z=m_min_z; first=false; } else { - m_min_z=std::min(m_min_z, sm.point(vi).z()); - m_max_z=std::max(m_max_z, sm.point(vi).z()); + m_min_z=(std::min)(m_min_z, sm.point(vi).z()); + m_max_z=(std::max)(m_max_z, sm.point(vi).z()); } } } From 8710dbe861beebc5edeb711ca7936c2bdd61f642 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 14 Dec 2023 08:32:32 +0100 Subject: [PATCH 289/341] example requires qt --- .../examples/Basic_viewer/draw_surface_mesh_small_faces.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 555363d72711..3275b40981c3 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -102,6 +102,9 @@ int main(int argc, char* argv[]) CGAL::Graphics_scene buffer; add_to_graphics_scene(sm, buffer, gsosm); + +#ifdef CGAL_USE_BASIC_VIEWER + CGAL::Qt::QApplication_and_basic_viewer app(buffer, "Small faces"); if(app) { @@ -147,6 +150,8 @@ int main(int argc, char* argv[]) app.run(); } +#endif + sm.remove_property_map(faces_size); return EXIT_SUCCESS; From d13b856c20bd2b738cd8e80705ae076aff1c84ff Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 14 Dec 2023 08:33:58 +0100 Subject: [PATCH 290/341] example requires qt --- Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index e1680f30eccc..f1fead0a1ded 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -6,7 +6,10 @@ #include #include #include + +#ifdef CGAL_USE_BASIC_VIEWER #include +#endif #include #include @@ -52,6 +55,7 @@ int main(void) CGAL::add_to_graphics_scene(output_mesh, scene2); /// (2) Qt code that create windows, add them in a layout, and create app. +#ifdef CGAL_USE_BASIC_VIEWER #if defined(CGAL_TEST_SUITE) bool cgal_test_suite=true; @@ -81,6 +85,7 @@ int main(void) mainWindow->show(); app.exec(); +#endif return EXIT_SUCCESS; } From 0fdd175ef076ca88de4757b4533c7bc59dd9dd82 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 09:46:36 +0100 Subject: [PATCH 291/341] use strncpy instead of strcpy --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 8f7869441132..2a5748b5c6f2 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -15,6 +15,7 @@ #define CGAL_BASIC_VIEWER_H // TODO #include +#include #include #include #include @@ -1550,7 +1551,7 @@ class QApplication_and_basic_viewer m_argc(1) { m_argv[0]=new char[strlen(title)+1]; - strcpy(m_argv[0], title); + strncpy(m_argv[0], title, strlen(title)); m_argv[1]=nullptr; #if defined(CGAL_TEST_SUITE) From a31128516b38db74cc06582a77b192cc438cfa45 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 09:51:02 +0100 Subject: [PATCH 292/341] remove warning --- .../Basic_viewer/draw_surface_mesh_height.cpp | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index 46399cbb4bdb..78645874547b 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -16,19 +16,18 @@ struct Colored_faces_given_height: { Colored_faces_given_height(const Mesh& sm) { + if(sm.is_empty()) return; + double m_min_z, m_max_z; - if(!sm.is_empty()) + bool first=true; + for(typename Mesh::Vertex_index vi: sm.vertices()) { - bool first=true; - for(typename Mesh::Vertex_index vi: sm.vertices()) + if(first) + { m_min_z=sm.point(vi).z(); m_max_z=m_min_z; first=false; } + else { - if(first) - { m_min_z=sm.point(vi).z(); m_max_z=m_min_z; first=false; } - else - { - m_min_z=(std::min)(m_min_z, sm.point(vi).z()); - m_max_z=(std::max)(m_max_z, sm.point(vi).z()); - } + m_min_z=(std::min)(m_min_z, sm.point(vi).z()); + m_max_z=(std::max)(m_max_z, sm.point(vi).z()); } } @@ -37,7 +36,7 @@ struct Colored_faces_given_height: this->face_color=[m_min_z, m_max_z] (const Mesh& sm, typename Mesh::Face_index fi)->CGAL::IO::Color { - double res; + double res=0.; std::size_t n=0; for(typename Mesh::Vertex_index vi: vertices_around_face(sm.halfedge(fi), sm)) { From 3e16be00d32d23be412dcb6c9dc0b432628b3104 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 09:55:58 +0100 Subject: [PATCH 293/341] remove warning --- Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index 78645874547b..b7b5be585973 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -44,7 +44,7 @@ struct Colored_faces_given_height: ++n; } // Random color depending on the "height" of the facet - CGAL::Random random(30*((res/n)-m_min_z)/(m_max_z-m_min_z)); + CGAL::Random random(static_cast(30*((res/n)-m_min_z)/(m_max_z-m_min_z))); return CGAL::get_random_color(random); }; } From 01e333caae457d6a382700c6ea95a7f3f6cf15a4 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 10:07:52 +0100 Subject: [PATCH 294/341] add missing include and function when basic viewer is disable --- .../examples/Basic_viewer/draw_mesh_and_points.cpp | 1 + Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 665b006feea2..0b3fd2285a9b 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 2a5748b5c6f2..9fd22f61c344 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -1644,6 +1644,13 @@ namespace CGAL std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Tue, 26 Dec 2023 10:08:15 +0100 Subject: [PATCH 295/341] warning in draw nef3 --- Nef_3/include/CGAL/draw_nef_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nef_3/include/CGAL/draw_nef_3.h b/Nef_3/include/CGAL/draw_nef_3.h index 99fe167ad623..aac531bcd5d4 100644 --- a/Nef_3/include/CGAL/draw_nef_3.h +++ b/Nef_3/include/CGAL/draw_nef_3.h @@ -98,9 +98,9 @@ class Nef_Visitor { CGAL::Graphics_scene& _graphics_scene, const GSOptions&_gs_options) : n_faces(0), n_edges(0), - nef(_nef), graphics_scene(_graphics_scene), - gs_options(_gs_options) + gs_options(_gs_options), + nef(_nef) {} void visit(Vertex_const_handle vh) From 1b281f9b650b2a1f674d007f32601b817954e6f7 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 10:12:33 +0100 Subject: [PATCH 296/341] warning in surface mesh topology --- .../include/CGAL/draw_face_graph_with_paths.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index cea1c61faae8..79ba01fedd09 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -284,22 +284,17 @@ void compute_elements(const Mesh &mesh, typedef typename Get_map::type LCC; typedef typename LCC::size_type size_type; - typedef typename CGAL::Get_traits::Kernel Kernel; - typedef typename CGAL::Get_traits::Point Point; - typedef typename CGAL::Get_traits::Vector Vector; - typedef typename LCC::Dart_const_descriptor Dart_const_descriptor; - typename Get_map::storage_type lcc(mesh); - typename LCC::size_type oriented_mark = lcc.get_new_mark(); + size_type oriented_mark = lcc.get_new_mark(); std::size_t current_path = paths.size(); typename LCC::size_type amark=mark==(std::numeric_limits::max)()? LCC::INVALID_MARK:mark; // If !=INVALID_MARK, show darts marked with this mark lcc.orient(oriented_mark); - typename LCC::size_type markfaces = lcc.get_new_mark(); - typename LCC::size_type markedges = lcc.get_new_mark(); - typename LCC::size_type markvertices = lcc.get_new_mark(); + size_type markfaces = lcc.get_new_mark(); + size_type markedges = lcc.get_new_mark(); + size_type markvertices = lcc.get_new_mark(); if (current_path==paths.size()) { From 26096e9365286cfc257188f5fb00cb4f699d99ab Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Dec 2023 10:46:03 +0100 Subject: [PATCH 297/341] missing include --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 9fd22f61c344..203ddf86dc96 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef CGAL_USE_BASIC_VIEWER @@ -50,7 +51,6 @@ #include #include -#include #include #include #include @@ -1646,7 +1646,7 @@ namespace CGAL inline void draw_graphics_scene(const Graphics_scene&, - const char *="CGAL Basic Viewer") + const char* ="CGAL Basic Viewer") { std::cerr<<"Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined."< Date: Tue, 26 Dec 2023 10:51:38 +0100 Subject: [PATCH 298/341] SMT draw: Cannot use directly initializer list with variadic template. --- .../examples/Surface_mesh_topology/edgewidth_lcc.cpp | 6 +++++- .../Surface_mesh_topology/edgewidth_surface_mesh.cpp | 6 +++++- .../examples/Surface_mesh_topology/facewidth.cpp | 2 ++ .../examples/Surface_mesh_topology/open_path_homotopy.cpp | 5 ++++- .../Surface_mesh_topology/path_homotopy_double_torus.cpp | 5 ++++- .../examples/Surface_mesh_topology/path_homotopy_torus.cpp | 5 ++++- .../path_homotopy_with_sm_and_polyhedron.cpp | 5 ++++- .../Surface_mesh_topology/path_simplicity_double_torus.cpp | 5 ++++- .../path_simplicity_double_torus_2.cpp | 5 ++++- .../shortest_noncontractible_cycle.cpp | 6 +++++- .../shortest_noncontractible_cycle_2.cpp | 6 +++++- 11 files changed, 46 insertions(+), 10 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_lcc.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_lcc.cpp index 5f6692f4f837..8e492372e9c3 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_lcc.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_lcc.cpp @@ -48,7 +48,11 @@ int main(int argc, char* argv[]) std::cout<<"Cycle 1 (pink): "; display_cycle_info(lcc, cycle1); std::cout<<"Cycle 2 (green): "; display_cycle_info(lcc, cycle2); - if (draw) { CGAL::draw(lcc, {cycle1, cycle2}); } + if (draw) + { + auto cycles={cycle1, cycle2}; + CGAL::draw(lcc, cycles); + } return EXIT_SUCCESS; } diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_surface_mesh.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_surface_mesh.cpp index a6ec92e76a78..5fb35c3c0704 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_surface_mesh.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/edgewidth_surface_mesh.cpp @@ -51,7 +51,11 @@ int main(int argc, char* argv[]) std::cout<<"Cycle 1 (pink): "; display_cycle_info(sm, cycle1); std::cout<<"Cycle 2 (green): "; display_cycle_info(sm, cycle2); - if (draw) { CGAL::draw(sm, {cycle1, cycle2}); } + if (draw) + { + auto cycles={cycle1, cycle2}; + CGAL::draw(sm, cycles); + } return EXIT_SUCCESS; } diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp index 43f4b2d6a99d..e35579bd8ee4 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp @@ -35,7 +35,9 @@ int main(int argc, char* argv[]) { std::cout<<" Number of faces: "< Date: Wed, 27 Dec 2023 08:55:39 +0100 Subject: [PATCH 299/341] remove a windows warning about strncpy --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 203ddf86dc96..575b9fcfae3f 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -1550,9 +1550,11 @@ class QApplication_and_basic_viewer m_basic_viewer(nullptr), m_argc(1) { +#define _CRT_SECURE_NO_WARNINGS m_argv[0]=new char[strlen(title)+1]; strncpy(m_argv[0], title, strlen(title)); m_argv[1]=nullptr; +#undef _CRT_SECURE_NO_WARNINGS #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; From e3249bd90884e8a60e5b6110f2e0881fdd2e2bf3 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Wed, 27 Dec 2023 13:58:36 +0100 Subject: [PATCH 300/341] fix warning --- Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 2298cdd5ef55..5911752813af 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -578,7 +578,7 @@ void add_to_graphics_scene(const CGAL_ARR_TYPE& aos, gso.face_color=[](const CGAL_ARR_TYPE&, typename CGAL_ARR_TYPE::Face_const_handle fh) -> CGAL::IO::Color { - CGAL::Random random((std::size_t)(&*fh)); + CGAL::Random random((unsigned int)(&*fh)); return get_random_color(random); }; From efb946a4f539b76b3485d6e730d30d75b6627077 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Dec 2023 16:26:13 +0100 Subject: [PATCH 301/341] warnings --- .../examples/Surface_mesh_topology/facewidth.cpp | 5 ++--- .../Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp index e35579bd8ee4..1ac14f92fdaa 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/facewidth.cpp @@ -14,8 +14,6 @@ int main(int argc, char* argv[]) { std::cout<<"Program facewidth_on_unweighted_map started."<=3 && std::string(argv[2])=="-draw") + { draw_facewidth(lcc, cycle); } #endif } diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp index 5dc8900de231..441d41bd45c8 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/unsew_edgewidth_repeatedly.cpp @@ -53,7 +53,7 @@ struct Draw_functor: public CGAL::Graphics_scene_optionsedge_color=[](const LCC_3&, typename LCC_3::Dart_const_handle)->CGAL::IO::Color { return CGAL::IO::Color(0, 0, 255); }; - this->colored_face=[this](const LCC_3&, typename LCC_3::Dart_const_handle)->bool + this->colored_face=[](const LCC_3&, typename LCC_3::Dart_const_handle)->bool { return true; }; this->face_color=[](const LCC_3&, typename LCC_3::Dart_const_handle)->CGAL::IO::Color { return CGAL::IO::Color(211, 211, 211); }; From 7b483d41280f97cac8bd6a39917a95226a9f779a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Dec 2023 17:57:00 +0100 Subject: [PATCH 302/341] warning in draw lcc --- .../include/CGAL/draw_linear_cell_complex.h | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 7a5ad6eb7aa8..9034d419963c 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -138,6 +138,26 @@ void compute_vertex(const LCC& lcc, { graphics_scene.add_point(lcc.point(dh)); } } +template +struct Test_opposite_draw_lcc +{ + template + static bool run(const LCC& lcc, const GSOptions& gso, + typename LCC::Dart_const_descriptor dh) + { return (!lcc.template is_free<3>(dh) && + !gso.volume_wireframe(lcc, lcc.template opposite<3>(dh))); } +}; + +template +struct Test_opposite_draw_lcc +{ + template + static bool run(const LCC&, const GSOptions&, + typename LCC::Dart_const_descriptor) + { return true; } +}; + + template void compute_elements(const LCC& lcc, CGAL::Graphics_scene& graphics_scene, @@ -168,8 +188,7 @@ void compute_elements(const LCC& lcc, gso.draw_face(lcc, itv)) { if ((!gso.volume_wireframe(lcc, itv) || - (!lcc.template is_free<3>(itv) && - !gso.volume_wireframe(lcc, lcc.template opposite<3>(itv)))) && + Test_opposite_draw_lcc::run(lcc, gso, itv)) && !gso.face_wireframe(lcc, itv)) { compute_face(lcc, itv, it, graphics_scene, gso); } for(typename LCC::template Dart_of_cell_basic_range<2>::const_iterator From ca296d548a82855192dfa42f01bc8bd1891c300e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 08:46:59 +0100 Subject: [PATCH 303/341] the cast must be into std::size_t --- Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 5911752813af..2298cdd5ef55 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -578,7 +578,7 @@ void add_to_graphics_scene(const CGAL_ARR_TYPE& aos, gso.face_color=[](const CGAL_ARR_TYPE&, typename CGAL_ARR_TYPE::Face_const_handle fh) -> CGAL::IO::Color { - CGAL::Random random((unsigned int)(&*fh)); + CGAL::Random random((std::size_t)(&*fh)); return get_random_color(random); }; From 089f0535e2afadda279776c7ea898f6110c75a0e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 08:47:22 +0100 Subject: [PATCH 304/341] disable warning must eb defined before includes --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index 575b9fcfae3f..b1959a295824 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -14,6 +14,8 @@ #ifndef CGAL_BASIC_VIEWER_H #define CGAL_BASIC_VIEWER_H +#define _CRT_SECURE_NO_WARNINGS + // TODO #include #include #include @@ -1550,11 +1552,9 @@ class QApplication_and_basic_viewer m_basic_viewer(nullptr), m_argc(1) { -#define _CRT_SECURE_NO_WARNINGS m_argv[0]=new char[strlen(title)+1]; strncpy(m_argv[0], title, strlen(title)); m_argv[1]=nullptr; -#undef _CRT_SECURE_NO_WARNINGS #if defined(CGAL_TEST_SUITE) bool cgal_test_suite = true; @@ -1657,4 +1657,6 @@ namespace CGAL #endif // CGAL_USE_BASIC_VIEWER +#undef _CRT_SECURE_NO_WARNINGS + #endif // CGAL_BASIC_VIEWER_H From 217d4c0ec20bc6e07fb01dc79e5a9d954a3c2134 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 09:01:02 +0100 Subject: [PATCH 305/341] do not use strncpy --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index b1959a295824..dafa07e8a27b 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -14,8 +14,6 @@ #ifndef CGAL_BASIC_VIEWER_H #define CGAL_BASIC_VIEWER_H -#define _CRT_SECURE_NO_WARNINGS - // TODO #include #include #include @@ -1553,7 +1551,7 @@ class QApplication_and_basic_viewer m_argc(1) { m_argv[0]=new char[strlen(title)+1]; - strncpy(m_argv[0], title, strlen(title)); + memcpy(m_argv[0], title, strlen(title)+1); m_argv[1]=nullptr; #if defined(CGAL_TEST_SUITE) @@ -1657,6 +1655,4 @@ namespace CGAL #endif // CGAL_USE_BASIC_VIEWER -#undef _CRT_SECURE_NO_WARNINGS - #endif // CGAL_BASIC_VIEWER_H From 768164464a30418c7c191a99eeff18078ccf16f3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 09:01:11 +0100 Subject: [PATCH 306/341] warning --- Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index b7b5be585973..e81063b85dad 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -18,7 +18,7 @@ struct Colored_faces_given_height: { if(sm.is_empty()) return; - double m_min_z, m_max_z; + double m_min_z=0., m_max_z=0.; bool first=true; for(typename Mesh::Vertex_index vi: sm.vertices()) { From d3bbe0dd70b7021a52e8aeb5aafbaf862191fa20 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 09:04:12 +0100 Subject: [PATCH 307/341] cast in two steps --- Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index 2298cdd5ef55..3d49d1dd0d24 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -578,7 +578,7 @@ void add_to_graphics_scene(const CGAL_ARR_TYPE& aos, gso.face_color=[](const CGAL_ARR_TYPE&, typename CGAL_ARR_TYPE::Face_const_handle fh) -> CGAL::IO::Color { - CGAL::Random random((std::size_t)(&*fh)); + CGAL::Random random((unsigned int)(std::size_t)(&*fh)); return get_random_color(random); }; From 38b03d20164c50fcc6a86abadc544fc6fd174edb Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Dec 2023 09:38:18 +0100 Subject: [PATCH 308/341] warning draw smt --- .../examples/Surface_mesh_topology/draw_facewidth.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h index e277f7b91527..5883d7d32d77 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/draw_facewidth.h @@ -22,7 +22,7 @@ struct Facewidth_graphics_scene_options: this->vertex_color=[](const ALCC&, typename ALCC::Dart_const_handle)->CGAL::IO::Color { return CGAL::IO::Color(0, 255, 0); }; - this->colored_face=[this](const ALCC&, typename ALCC::Dart_const_handle)->bool + this->colored_face=[](const ALCC&, typename ALCC::Dart_const_handle)->bool { return true; }; this->face_color=[this](const ALCC& alcc, typename ALCC::Dart_const_handle dh)->CGAL::IO::Color { return alcc.is_marked(dh, m_face_mark)?CGAL::IO::Color(255, 0, 0) From 77643b6a2c0b1462a1167b327dab29481568d8de Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 8 Jan 2024 13:05:50 +0100 Subject: [PATCH 309/341] remove a sentence (no need to replace it) The following sentence about concepts explains all. --- Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h index 21bff4b2a649..ac2fa1dc3ed6 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Graphics_scene_options.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Graphics_scene_options` is used to tune the way that the cells of a given data structure of \cgal are considered. The different `std::function` can be modified to change for example the behavior of the drawing. -`VolumeDescriptor` can be `void` for data structures that do not represent volumes. In such a case, all methods about volumes do not exist. +`VolumeDescriptor` can be `void` for data structures that do not represent volumes. This class is a model of `GraphicsSceneOptions` when `VolumeDescriptor` is `void`, or a model of `GraphicsSceneOptionsWithVolumes` otherwise (`VolumeDescriptor` non `void`). From 1e189930b6811493f5867183597aa11d3d974224 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Mon, 8 Jan 2024 13:43:14 +0100 Subject: [PATCH 310/341] solve a todo --- BGL/include/CGAL/draw_face_graph.h | 1 - 1 file changed, 1 deletion(-) diff --git a/BGL/include/CGAL/draw_face_graph.h b/BGL/include/CGAL/draw_face_graph.h index e4d2eecc957e..11c1da1d6188 100644 --- a/BGL/include/CGAL/draw_face_graph.h +++ b/BGL/include/CGAL/draw_face_graph.h @@ -148,7 +148,6 @@ void add_to_graphics_scene_for_fg(const FG &fg, if (fh==boost::graph_traits::null_face()) { return CGAL::IO::Color(100, 125, 200); } - // TODO (?) use a seed given fh (cannot directly cast because FG is either a polyhedron or a surface mesh) return get_random_color(CGAL::get_default_random()); }; From ca895e66fa10354ccf6e0a9cdf97f0a1166725c4 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Fri, 19 Jan 2024 21:11:31 +0200 Subject: [PATCH 311/341] Basic Viewer Initial commit. --- .../doc/Basic_viewer/Basic_viewer.txt | 75 +++++++++++++++---- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 0ec0627a8106..eabc07211f59 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -8,50 +8,97 @@ namespace CGAL { \author Guillaume Damiand, Mostafa Ashraf \cgalAutoToc -\section Basic_viewerDoc +\section Basic_Viewer -\subsection Basic_viewerDoc_1 Direct Draw +\subsection Introduction -draw(XXX) +The Basic_viewer class appears to serve as a foundation for a 3D graphics viewer in the context of the CGAL (Computational Geometry Algorithms Library) and Qt (a C++ GUI toolkit). The goal of Basic_viewer is to provide a flexible and interactive environment for visualizing geometric data and interacting with 3D scenes. The Functionality of the Basic_viewer is to renders various geometric elements such as(points, segments, rays, lines, faces, edges, etc.) and supports user interaction through keyboard inputs. -\subsection Basic_viewerDoc_2 Customize the drawing +The goal of Basic_viewer is allowing to view all CGAL data structures, such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more). -Graphics_scene_options +\subsubsection Some key goals and features of Basic_viewer include: + +
    +
  1. Versatile Rendering: + +The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. +Different rendering modes, including mono and colored representations, are available for these elements. + +
  2. Camera Control: + +The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. +Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. + +
  3. User Interaction: + +Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. +Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. + +
  4. Clipping Plane: + +The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. +The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). + +
  5. Shader Support: + +Shaders are compiled to enhance the rendering capabilities of the viewer, potentially providing advanced shading and visual effects. -\subsection Basic_viewerDoc_3 Graphic Scene +
  6. Flexibility and Configurability: -\subsection Basic_viewerDoc_4 Basic viewer Qt +The viewer is designed to be flexible, allowing users to configure various rendering parameters and interact with the scene based on their needs. +The code includes functions for setting up the initial state of the viewer, initializing OpenGL settings, and handling key events. -\subsection Basic_viewerDoc_5 Application and basic viewer +
+Based on class QApplication_and_basic_viewer you can develop your own demo. -\section Basic_viewerExamples Examples +\subsection Basic_viewerUsage -\subsection Basic_viewerExamples_simple_draw Basic draw +\subsubsection Basic_viewerDoc_1 Direct Draw + +draw(XXX) [WIP] + +\subsubsection Basic_viewerDoc_2 Customize the drawing + +[WIP] + +\subsection Basic_viewerExamples Examples that use Basic_viewer + +\subsubsection Basic_viewerExamples_simple_draw Basic draw \cgalExample{Surface_mesh/draw_surface_mesh.cpp} -\subsection Basic_viewerExamples_custom_color Change Face Colors +\subsubsection Basic_viewerExamples_custom_color Change Face Colors \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} -\subsection Basic_viewerExamples_two_ds Draw two different CGAL data-structures in a same viewer +\subsubsection Basic_viewerExamples_two_ds Draw two different CGAL data-structures in a same viewer \cgalExample{Basic_viewer/draw_mesh_and_points.cpp} -\subsection Basic_viewerExamples_interact Interaction with the viewer +\subsubsection Basic_viewerExamples_interact Interaction with the viewer \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -\subsection Basic_viewerExamples_several_window Draw several basic viewers +\subsubsection Basic_viewerExamples_several_window Draw several basic viewers \cgalExample{Basic_viewer/draw_several_windows.cpp} +\section Graphic_Scene + +Graphics_scene_options +[WIP] + +\section secsoftwaredesign Software Design + +class diagram [WIP] + + */ } /* namespace CGAL */ From 346bc633ca79d67b3608e2e5b09fd34dcca92348 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sun, 4 Feb 2024 20:55:34 +0200 Subject: [PATCH 312/341] figs for drawing LCC example. From ca9faa4bfcb564ec1d4639627a745d6a7f9815e2 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Sun, 4 Feb 2024 20:57:16 +0200 Subject: [PATCH 313/341] new for basic viewer, WIP graphic scene and class diagram. --- .../doc/Basic_viewer/Basic_viewer.txt | 93 ++++++++++++++++--- 1 file changed, 81 insertions(+), 12 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index eabc07211f59..591881d1bedb 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -52,15 +52,31 @@ The code includes functions for setting up the initial state of the viewer, init Based on class QApplication_and_basic_viewer you can develop your own demo. -\subsection Basic_viewerUsage +\subsection Basic_viewerUsage Basic Viewer Class Draw virtual function -\subsubsection Basic_viewerDoc_1 Direct Draw +The draw function is a virtual function in the Basic_viewer class responsible for rendering 3D elements such as points, segments, triangles, rays, lines, and faces. It utilizes OpenGL for rendering and incorporates several customization options for drawing styles and colors. Below is an overview of key functionalities: -draw(XXX) [WIP] +
    +
  1. Initialization: The function starts by enabling depth testing and initializing matrices for the clipping plane. -\subsubsection Basic_viewerDoc_2 Customize the drawing +
  2. Vertex Rendering: Renders vertices (points) based on specified rendering modes and colors. Supports both mono and colored points. -[WIP] +
  3. Edge Rendering: Renders edges (segments) with specified rendering modes and colors. Supports both mono and colored edges. + +
  4. Ray Rendering: Renders rays with specified rendering modes and colors. Supports both mono and colored rays. + +
  5. Line Rendering: Renders lines with specified rendering modes and colors. Supports both mono and colored lines. + +
  6. Face Rendering: Renders faces (triangles) with specified rendering modes and colors. Supports both mono and colored faces. Implements transparency for specific rendering modes. + +
  7. Clipping Plane Rendering: Renders the clipping plane when applicable. + +
  8. Text Rendering: Renders text on the screen at specified positions. + +
  9. Coordinate System Transformation: Applies transformations to bring drawings into the frame coordinate system. This includes multiplying matrices and scaling down drawings. + +
  10. Additional Rendering Considerations: Handles Z-fighting by offsetting polygons and includes adjustments for two-dimensional rendering. +
\subsection Basic_viewerExamples Examples that use Basic_viewer @@ -68,37 +84,90 @@ draw(XXX) [WIP] \cgalExample{Surface_mesh/draw_surface_mesh.cpp} - \subsubsection Basic_viewerExamples_custom_color Change Face Colors \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} - \subsubsection Basic_viewerExamples_two_ds Draw two different CGAL data-structures in a same viewer \cgalExample{Basic_viewer/draw_mesh_and_points.cpp} - \subsubsection Basic_viewerExamples_interact Interaction with the viewer \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} - \subsubsection Basic_viewerExamples_several_window Draw several basic viewers \cgalExample{Basic_viewer/draw_several_windows.cpp} - \section Graphic_Scene - -Graphics_scene_options [WIP] +\subsection GraphicSceneContinue Graphics_scene_options +The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various elements such as vertices, edges, faces, and volumes in a graphical representation of a combinatorial data structure (DS). The classes are template classes, allowing them to work with different combinatorial data structures (DS) in 2D and 3D. +\subsubsection GraphicSceneOptionsCont Here are some key responsibilities of the Graphics_scene_options class: +
    +
  1. Drawing Control: It determines whether to draw vertices, edges, faces, and volumes in the graphics scene through the use of drawing functors (draw_vertex, draw_edge, draw_face, draw_volume). +
  2. Coloring Control: It allows users to customize the coloring of vertices, edges, faces, and volumes. Users can specify whether coloring is enabled (colored_vertex, colored_edge, colored_face, colored_volume) and, if so, provide functions (vertex_color, edge_color, face_color, volume_color) to determine the color for each element. +
  3. Wireframe Control: For faces and volumes, it provides options to draw a wireframe representation (face_wireframe, volume_wireframe), allowing users to choose whether to display a wireframe overlay. +
  4. Visibility Control: Users can enable or disable the visibility of vertices, edges, faces, and volumes independently using functions like disable_vertices, enable_vertices, are_vertices_enabled, and similar functions for other components. +
  5. Template Flexibility: The class is templated to support different types of combinatorial data structures (DS) in 2D and 3D. This template flexibility allows users to use the class with various geometric structures. +
  6. Default Settings: It provides reasonable default settings for the various options, ensuring that users can get started with a sensible configuration without needing to customize every parameter. +
+ \section secsoftwaredesign Software Design class diagram [WIP] +\section DrawFunction Global Draw Function + +The draw function is a template function that facilitates drawing an almost mentioned data structures such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more) in a graphics scene. It has two specialization, one for using graphics scene options and another without graphics scene options. + +The draw function can be used in default way or in custom way with a graphics scene options + +``` +// Specialization of draw function for a LCC, with a drawing graphics scene options. +template class Map, + class Refs, class Storage_, + class GSOptions> +void draw(const CGAL_LCC_TYPE& alcc, const GSOptions& gso, + const char *title="LCC Basic Viewer") +{ + CGAL::Graphics_scene buffer; + add_to_graphics_scene(alcc, buffer, gso); + draw_graphics_scene(buffer, title); +} + +// Specialization of draw function for a LCC, without a graphics scene options. +template class Map, + class Refs, class Storage_> +void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") +{ + CGAL::Graphics_scene buffer; + add_to_graphics_scene(alcc, buffer); + draw_graphics_scene(buffer, title); +} + +``` +As shown above in code snippt the add_to_graphics_scene function fill LCC in the given graphic buffer with or without options, and then we pass graphic buffer to draw_graphics_scene function which is designed to display or render the contents of a Graphics_scene object. + +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_with_faces.png} +example of drawing LCC for CMap with faces +\cgalFigureEnd + +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_without_edges.png} +example of drawing LCC for CMap without edges +\cgalFigureEnd + +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_without_faces.png} +example of drawing LCC for CMap without faces +\cgalFigureEnd */ } /* namespace CGAL */ + From 369fab8a3eabbbfbb22d64ffec3279f70e76d40d Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Feb 2024 14:11:12 +0200 Subject: [PATCH 314/341] added Graphic_Scene section --- .../doc/Basic_viewer/Basic_viewer.txt | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 591881d1bedb..c7a2630bde40 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -101,18 +101,97 @@ The draw function is a virtual function in the Basic_viewer class responsible fo \cgalExample{Basic_viewer/draw_several_windows.cpp} \section Graphic_Scene -[WIP] + +The Graphics_scene class appears to be a container class responsible for managing CGAL data structures and handling buffers for various geometric elements, such as points, segments, rays, lines, and faces by fill data in given graphic buffer. + +\subsection GraphicSceneClass key components and functionality of this class: +
    + +
  1. Buffer Management: + +
      +
    1. The class manages buffers for different geometric elements, including mono and colored versions of points, segments, rays, lines, and faces. +
    2. Buffers are stored in the arrays array, which holds vectors of BufferType (defaulted to float), and each buffer is initialized in the constructor. +
    + +
  2. Bounding Box: +
      +
    1. The class maintains a bounding box (m_bounding_box) that encompasses all the geometric elements in the scene. +
    2. The bounding box can be initiated and updated based on the elements added to the scene. +
    + +
  3. Adding Geometric Elements: +
      +
    1. The class provides template member functions (add_point, add_segment, add_ray, etc.) for adding various geometric elements to the corresponding buffers. +
    2. It supports both mono and colored versions of these elements, allowing for the addition of color information. +
    + +
  4. Face Handling: +
      +
    1. The class supports the creation of faces by providing methods such as face_begin, add_point_in_face, and face_end. +
    2. Faces can be either mono or colored, and they are constructed by adding points to the corresponding face buffers. +
    + +
  5. Normal Handling: +
      +
    1. Normals for faces are handled separately for smooth and flat shading, and they are part of the normal buffers. +
    + +
  6. Text Handling: +
      +
    1. The class maintains a vector of text elements (m_texts), where each text element is associated with a 3D point in the scene. +
    2. Text elements can be added using the add_text member function. +
    + +
  7. Utility Functions: +
      +
    1. The class provides utility functions such as checking if a face has started (a_face_started), clearing all buffers (clear), and determining if the scene is empty. +
    + +
  8. Coordinate System Information: +
      +
    1. The class contains functions to check if the data structure lies on a particular plane (XY, XZ, or YZ), providing information about the coordinate system. +
    + +
  9. Local Coordinate Transformations: +
      +
    1. There are template functions (get_local_point and get_local_vector) for transforming CGAL points and vectors into a local coordinate system (Local_kernel). +
    + +
  10. Size and Dimensionality: +
      +
    1. Functions like get_size_of_index and number_of_elements provide information about the size and dimensionality of buffers. +
    + +
  11. Miscellaneous: +
      +
    1. The class allows for reversing all normals in the scene using the reverse_all_normals function. +
    2. The empty function checks whether the scene is empty. +
    3. Functions like has_zero_x, has_zero_y, and has_zero_z check if any element in the scene has a zero value in a specific coordinate. +
    + +
+ +This class provides a comprehensive interface for managing and manipulating geometric data in a 3D scene, facilitating the rendering and interaction of complex scenes in a graphics application. + \subsection GraphicSceneContinue Graphics_scene_options The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various elements such as vertices, edges, faces, and volumes in a graphical representation of a combinatorial data structure (DS). The classes are template classes, allowing them to work with different combinatorial data structures (DS) in 2D and 3D. \subsubsection GraphicSceneOptionsCont Here are some key responsibilities of the Graphics_scene_options class:
    +
  1. Drawing Control: It determines whether to draw vertices, edges, faces, and volumes in the graphics scene through the use of drawing functors (draw_vertex, draw_edge, draw_face, draw_volume). +
  2. Coloring Control: It allows users to customize the coloring of vertices, edges, faces, and volumes. Users can specify whether coloring is enabled (colored_vertex, colored_edge, colored_face, colored_volume) and, if so, provide functions (vertex_color, edge_color, face_color, volume_color) to determine the color for each element. +
  3. Wireframe Control: For faces and volumes, it provides options to draw a wireframe representation (face_wireframe, volume_wireframe), allowing users to choose whether to display a wireframe overlay. +
  4. Visibility Control: Users can enable or disable the visibility of vertices, edges, faces, and volumes independently using functions like disable_vertices, enable_vertices, are_vertices_enabled, and similar functions for other components. +
  5. Template Flexibility: The class is templated to support different types of combinatorial data structures (DS) in 2D and 3D. This template flexibility allows users to use the class with various geometric structures. +
  6. Default Settings: It provides reasonable default settings for the various options, ensuring that users can get started with a sensible configuration without needing to customize every parameter. +
\section secsoftwaredesign Software Design From 44e5d7f7abedb5797ce67e6789542bb875c66751 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Feb 2024 14:24:12 +0200 Subject: [PATCH 315/341] fixed errors of build doc logs. --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index c7a2630bde40..036592b50e31 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -194,7 +194,7 @@ The Graphics_scene_options class is responsible for providing a set of options a -\section secsoftwaredesign Software Design +\section SoftwareDesignClassDiagam Software Design class diagram [WIP] @@ -234,15 +234,15 @@ void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") ``` As shown above in code snippt the add_to_graphics_scene function fill LCC in the given graphic buffer with or without options, and then we pass graphic buffer to draw_graphics_scene function which is designed to display or render the contents of a Graphics_scene object. -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_with_faces.png} +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex1,lcc_cmap_with_faces.png} example of drawing LCC for CMap with faces \cgalFigureEnd -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_without_edges.png} +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex2,lcc_cmap_without_edges.png} example of drawing LCC for CMap without edges \cgalFigureEnd -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map,lcc_cmap_without_faces.png} +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex3,lcc_cmap_without_faces.png} example of drawing LCC for CMap without faces \cgalFigureEnd From f91a498908742dce633f3460a12aa34ee1a6c0f2 Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Feb 2024 18:03:42 +0200 Subject: [PATCH 316/341] Basic_viewer UML class diagram. From 27081859ac341a681a4844d80ffcf958fec5458e Mon Sep 17 00:00:00 2001 From: Mostafa-ashraf19 Date: Mon, 5 Feb 2024 18:08:48 +0200 Subject: [PATCH 317/341] Basic_viewer package UML class diagram. --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 036592b50e31..c01454aa36a4 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -196,7 +196,11 @@ The Graphics_scene_options class is responsible for providing a set of options a \section SoftwareDesignClassDiagam Software Design -class diagram [WIP] +The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes of the package. + +\cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} +UML diagram of the main classes of the package. +\cgalFigureEnd \section DrawFunction Global Draw Function From ce2bb371386f4ef297edc69889376b195fcf2b94 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 6 Feb 2024 15:31:35 +0100 Subject: [PATCH 318/341] change order --- .../doc/Basic_viewer/Basic_viewer.txt | 194 +++++++----------- 1 file changed, 75 insertions(+), 119 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index c01454aa36a4..8013632b1dd8 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -8,102 +8,122 @@ namespace CGAL { \author Guillaume Damiand, Mostafa Ashraf \cgalAutoToc -\section Basic_Viewer +\section Introduction -\subsection Introduction - -The Basic_viewer class appears to serve as a foundation for a 3D graphics viewer in the context of the CGAL (Computational Geometry Algorithms Library) and Qt (a C++ GUI toolkit). The goal of Basic_viewer is to provide a flexible and interactive environment for visualizing geometric data and interacting with 3D scenes. The Functionality of the Basic_viewer is to renders various geometric elements such as(points, segments, rays, lines, faces, edges, etc.) and supports user interaction through keyboard inputs. +The basic viewer package appears to serve as a foundation for a 3D graphics viewer in the context of the CGAL (Computational Geometry Algorithms Library) and Qt (a C++ GUI toolkit). The goal of this package is to provide a flexible and interactive environment for visualizing geometric data and interacting with 3D scenes. The functionality of the package is to renders various geometric elements such as(points, segments, rays, lines, faces, edges, etc.) and supports user interaction through keyboard inputs. The goal of Basic_viewer is allowing to view all CGAL data structures, such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more). -\subsubsection Some key goals and features of Basic_viewer include: +There are mainly: two global functions for each CGAL package `CGAL::draw` and `CGAL::add_to_graphics_scene`; four classes `CGAL::Graphics_scene`, `CGAL::Graphics_scene_option`, `CGAL::Qt::Basic_viewer` and `CGAL::Qt::QApplication_and_basic_viewer`. -
    -
  1. Versatile Rendering: +\section SoftwareDesignClassDiagam Software Design -The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. -Different rendering modes, including mono and colored representations, are available for these elements. +The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes of the package. -
  2. Camera Control: +\cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} +UML diagram of the main classes of the package. +\cgalFigureEnd -The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. -Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. +TODO links the classes with the different sections where they will be explained -
  3. User Interaction: +\section Basic Usage: global `CGAL::draw` functions -Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. -Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. +A first simple solution provide to draw the different data structures of CGAL is the use of global draw functions. +The draw function is a template function that facilitates drawing an almost mentioned data structures such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more) -
  4. Clipping Plane: +``` +#include +#include + +using LCC=CGAL::Linear_cell_complex_for_combinatorial_map<3>; +using Point=LCC::Point; + +LCC lcc; +lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), + Point(5,5,0), Point(0,5,0), + Point(0,5,4), Point(0,0,4), + Point(5,0,4), Point(5,5,4)); +CGAL::draw(lcc); +``` -The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. -The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). -
  5. Shader Support: +\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex1,lcc_cmap_with_faces.png} +example of drawing LCC for CMap with faces +\cgalFigureEnd -Shaders are compiled to enhance the rendering capabilities of the viewer, potentially providing advanced shading and visual effects. +More advanced example -
  6. Flexibility and Configurability: +\cgalExample{Surface_mesh/draw_surface_mesh.cpp} -The viewer is designed to be flexible, allowing users to configure various rendering parameters and interact with the scene based on their needs. -The code includes functions for setting up the initial state of the viewer, initializing OpenGL settings, and handling key events. +\subsection GraphicSceneContinue Tune the drawing thanks to `CGAL::Graphics_scene_options` -
+There is one specialization of each draw function that takes a graphics scene options as parameter, allowing to tune the drawing. -Based on class QApplication_and_basic_viewer you can develop your own demo. +The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various elements such as vertices, edges, faces, and volumes in a graphical representation of a combinatorial data structure (DS). The classes are template classes, allowing them to work with different combinatorial data structures (DS) in 2D and 3D. +\subsubsection GraphicSceneOptionsCont Here are some key responsibilities of the Graphics_scene_options class: +
    -\subsection Basic_viewerUsage Basic Viewer Class Draw virtual function +
  1. Drawing Control: It determines whether to draw vertices, edges, faces, and volumes in the graphics scene through the use of drawing functors (draw_vertex, draw_edge, draw_face, draw_volume). -The draw function is a virtual function in the Basic_viewer class responsible for rendering 3D elements such as points, segments, triangles, rays, lines, and faces. It utilizes OpenGL for rendering and incorporates several customization options for drawing styles and colors. Below is an overview of key functionalities: +
  2. Coloring Control: It allows users to customize the coloring of vertices, edges, faces, and volumes. Users can specify whether coloring is enabled (colored_vertex, colored_edge, colored_face, colored_volume) and, if so, provide functions (vertex_color, edge_color, face_color, volume_color) to determine the color for each element. -
      -
    1. Initialization: The function starts by enabling depth testing and initializing matrices for the clipping plane. +
    2. Wireframe Control: For faces and volumes, it provides options to draw a wireframe representation (face_wireframe, volume_wireframe), allowing users to choose whether to display a wireframe overlay. -
    3. Vertex Rendering: Renders vertices (points) based on specified rendering modes and colors. Supports both mono and colored points. +
    4. Visibility Control: Users can enable or disable the visibility of vertices, edges, faces, and volumes independently using functions like disable_vertices, enable_vertices, are_vertices_enabled, and similar functions for other components. -
    5. Edge Rendering: Renders edges (segments) with specified rendering modes and colors. Supports both mono and colored edges. +
    6. Template Flexibility: The class is templated to support different types of combinatorial data structures (DS) in 2D and 3D. This template flexibility allows users to use the class with various geometric structures. -
    7. Ray Rendering: Renders rays with specified rendering modes and colors. Supports both mono and colored rays. +
    8. Default Settings: It provides reasonable default settings for the various options, ensuring that users can get started with a sensible configuration without needing to customize every parameter. -
    9. Line Rendering: Renders lines with specified rendering modes and colors. Supports both mono and colored lines. +
    -
  3. Face Rendering: Renders faces (triangles) with specified rendering modes and colors. Supports both mono and colored faces. Implements transparency for specific rendering modes. +\cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} -
  4. Clipping Plane Rendering: Renders the clipping plane when applicable. +\subsection Some key goals and features of the Qt viewer include: -
  5. Text Rendering: Renders text on the screen at specified positions. +TODO explain the main key options -
  6. Coordinate System Transformation: Applies transformations to bring drawings into the frame coordinate system. This includes multiplying matrices and scaling down drawings. +
      +
    1. Versatile Rendering: -
    2. Additional Rendering Considerations: Handles Z-fighting by offsetting polygons and includes adjustments for two-dimensional rendering. -
    +The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. +Different rendering modes, including mono and colored representations, are available for these elements. -\subsection Basic_viewerExamples Examples that use Basic_viewer +
  7. Camera Control: -\subsubsection Basic_viewerExamples_simple_draw Basic draw +The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. +Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. -\cgalExample{Surface_mesh/draw_surface_mesh.cpp} +
  8. User Interaction: -\subsubsection Basic_viewerExamples_custom_color Change Face Colors +Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. +Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. -\cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} +
  9. Clipping Plane: -\subsubsection Basic_viewerExamples_two_ds Draw two different CGAL data-structures in a same viewer +The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. +The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). -\cgalExample{Basic_viewer/draw_mesh_and_points.cpp} +
  10. Shader Support: -\subsubsection Basic_viewerExamples_interact Interaction with the viewer +Shaders are compiled to enhance the rendering capabilities of the viewer, potentially providing advanced shading and visual effects. -\cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} +
  11. Flexibility and Configurability: -\subsubsection Basic_viewerExamples_several_window Draw several basic viewers +The viewer is designed to be flexible, allowing users to configure various rendering parameters and interact with the scene based on their needs. +The code includes functions for setting up the initial state of the viewer, initializing OpenGL settings, and handling key events. -\cgalExample{Basic_viewer/draw_several_windows.cpp} +
\section Graphic_Scene The Graphics_scene class appears to be a container class responsible for managing CGAL data structures and handling buffers for various geometric elements, such as points, segments, rays, lines, and faces by fill data in given graphic buffer. +Draw two different CGAL data-structures in a same viewer + +\cgalExample{Basic_viewer/draw_mesh_and_points.cpp} + + \subsection GraphicSceneClass key components and functionality of this class:
    @@ -175,80 +195,16 @@ The Graphics_scene class appears to be a container class responsible for managin This class provides a comprehensive interface for managing and manipulating geometric data in a 3D scene, facilitating the rendering and interaction of complex scenes in a graphics application. -\subsection GraphicSceneContinue Graphics_scene_options -The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various elements such as vertices, edges, faces, and volumes in a graphical representation of a combinatorial data structure (DS). The classes are template classes, allowing them to work with different combinatorial data structures (DS) in 2D and 3D. -\subsubsection GraphicSceneOptionsCont Here are some key responsibilities of the Graphics_scene_options class: -
      - -
    1. Drawing Control: It determines whether to draw vertices, edges, faces, and volumes in the graphics scene through the use of drawing functors (draw_vertex, draw_edge, draw_face, draw_volume). - -
    2. Coloring Control: It allows users to customize the coloring of vertices, edges, faces, and volumes. Users can specify whether coloring is enabled (colored_vertex, colored_edge, colored_face, colored_volume) and, if so, provide functions (vertex_color, edge_color, face_color, volume_color) to determine the color for each element. - -
    3. Wireframe Control: For faces and volumes, it provides options to draw a wireframe representation (face_wireframe, volume_wireframe), allowing users to choose whether to display a wireframe overlay. - -
    4. Visibility Control: Users can enable or disable the visibility of vertices, edges, faces, and volumes independently using functions like disable_vertices, enable_vertices, are_vertices_enabled, and similar functions for other components. +\section Use the Qt widget CGAL::Qt::Basic_viewer -
    5. Template Flexibility: The class is templated to support different types of combinatorial data structures (DS) in 2D and 3D. This template flexibility allows users to use the class with various geometric structures. - -
    6. Default Settings: It provides reasonable default settings for the various options, ensuring that users can get started with a sensible configuration without needing to customize every parameter. - -
    - -\section SoftwareDesignClassDiagam Software Design - -The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes of the package. - -\cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} -UML diagram of the main classes of the package. -\cgalFigureEnd - -\section DrawFunction Global Draw Function - -The draw function is a template function that facilitates drawing an almost mentioned data structures such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more) in a graphics scene. It has two specialization, one for using graphics scene options and another without graphics scene options. - -The draw function can be used in default way or in custom way with a graphics scene options - -``` -// Specialization of draw function for a LCC, with a drawing graphics scene options. -template class Map, - class Refs, class Storage_, - class GSOptions> -void draw(const CGAL_LCC_TYPE& alcc, const GSOptions& gso, - const char *title="LCC Basic Viewer") -{ - CGAL::Graphics_scene buffer; - add_to_graphics_scene(alcc, buffer, gso); - draw_graphics_scene(buffer, title); -} - -// Specialization of draw function for a LCC, without a graphics scene options. -template class Map, - class Refs, class Storage_> -void draw(const CGAL_LCC_TYPE& alcc, const char *title="LCC Basic Viewer") -{ - CGAL::Graphics_scene buffer; - add_to_graphics_scene(alcc, buffer); - draw_graphics_scene(buffer, title); -} +\cgalExample{Basic_viewer/draw_several_windows.cpp} -``` -As shown above in code snippt the add_to_graphics_scene function fill LCC in the given graphic buffer with or without options, and then we pass graphic buffer to draw_graphics_scene function which is designed to display or render the contents of a Graphics_scene object. +\section Add some small interactions with the viewer -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex1,lcc_cmap_with_faces.png} -example of drawing LCC for CMap with faces -\cgalFigureEnd +\cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex2,lcc_cmap_without_edges.png} -example of drawing LCC for CMap without edges -\cgalFigureEnd +\subsubsection Basic_viewerExamples_several_window Draw several basic viewers -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex3,lcc_cmap_without_faces.png} -example of drawing LCC for CMap without faces -\cgalFigureEnd */ From f35858694afecc333d6beabc7e849dd9addc12dd Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 6 Feb 2024 15:39:35 +0100 Subject: [PATCH 319/341] bugfix doc --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 8013632b1dd8..b673b49fbbc5 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -203,9 +203,6 @@ This class provides a comprehensive interface for managing and manipulating geom \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -\subsubsection Basic_viewerExamples_several_window Draw several basic viewers - - */ } /* namespace CGAL */ From 736c182b42f3fe70c87043b1c1a93990dc0fcf6d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Mar 2024 17:14:06 +0100 Subject: [PATCH 320/341] Basic viewer user manual --- .../doc/Basic_viewer/Basic_viewer.txt | 70 ++++++++++--------- .../examples/Basic_viewer/CMakeLists.txt | 8 ++- .../examples/Basic_viewer/draw_lcc.cpp | 17 +++++ .../Basic_viewer/draw_surface_mesh_vcolor.cpp | 51 ++++++++++++++ 4 files changed, 112 insertions(+), 34 deletions(-) create mode 100644 Basic_viewer/examples/Basic_viewer/draw_lcc.cpp create mode 100644 Basic_viewer/examples/Basic_viewer/draw_surface_mesh_vcolor.cpp diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index b673b49fbbc5..03aa3150a6ba 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -10,11 +10,15 @@ namespace CGAL { \section Introduction -The basic viewer package appears to serve as a foundation for a 3D graphics viewer in the context of the CGAL (Computational Geometry Algorithms Library) and Qt (a C++ GUI toolkit). The goal of this package is to provide a flexible and interactive environment for visualizing geometric data and interacting with 3D scenes. The functionality of the package is to renders various geometric elements such as(points, segments, rays, lines, faces, edges, etc.) and supports user interaction through keyboard inputs. +The basic viewer package appears to serve as a foundation to provide a small interactive visualization tools of all CGAL data structures, such as Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more. The functionality of the package is to renders various geometric elements such as points, segments, rays, lines, faces, etc. -The goal of Basic_viewer is allowing to view all CGAL data structures, such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more). +The most basic usage of the basic viewer is the use of the global `CGAL::draw` function. There is one draw function for each package CGAL. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any... -There are mainly: two global functions for each CGAL package `CGAL::draw` and `CGAL::add_to_graphics_scene`; four classes `CGAL::Graphics_scene`, `CGAL::Graphics_scene_option`, `CGAL::Qt::Basic_viewer` and `CGAL::Qt::QApplication_and_basic_viewer`. +The drawing can be tuned using a `CGAL::Graphics_scene_option` allowing to change the color of some cells or hide some cells. + +More complex usage can be achieved by using the `CGAL::Graphics_scene` class. Several representation of different CGAL data structures can be added in a same `CGAL::Graphics_scene` allowing to visualize different models in a same window. Like for the draw function, the drawing parameters can be tune thanks to the `CGAL::Graphics_scene_option`. + +Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on Qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Basic_viewer`. \section SoftwareDesignClassDiagam Software Design @@ -28,54 +32,56 @@ TODO links the classes with the different sections where they will be explained \section Basic Usage: global `CGAL::draw` functions -A first simple solution provide to draw the different data structures of CGAL is the use of global draw functions. -The draw function is a template function that facilitates drawing an almost mentioned data structures such as (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more) +A first simple solution provide to draw the different data structures of CGAL is the use of global `CGAL::draw` functions. This function is templated by the type of the data structure to draw. The following example shows a basic use of this function. -``` -#include -#include +\cgalExample{Basic_viewer/draw_lcc.cpp} -using LCC=CGAL::Linear_cell_complex_for_combinatorial_map<3>; -using Point=LCC::Point; +This example creates a 3D linear cell complex, fill it by creating an hexahedron, and draw it using the basic viewer. The result of the viewing is shown in the following figure. -LCC lcc; -lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), - Point(5,5,0), Point(0,5,0), - Point(0,5,4), Point(0,0,4), - Point(5,0,4), Point(5,5,4)); -CGAL::draw(lcc); -``` +\cgalFigureBegin{basic_viewer_ex1,lcc_draw.png} +Example of drawing of a 3D LCC. +\cgalFigureEnd +Users can interact with the viewer using some specific keys or mouse interactions. You can press 'h' key to visualize an help showing all the different shortcuts and mouse interactions. The main functionalities of the viewer are: -\cgalFigureBegin{linear_cell_complex_for_combinatorial_map_ex1,lcc_cmap_with_faces.png} -example of drawing LCC for CMap with faces -\cgalFigureEnd +
  1. Versatile Rendering: -More advanced example +The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. +Different rendering modes, including mono and colored representations, are available for these elements. + +
  2. Camera Control: + +The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. +Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. + +
  3. User Interaction: + +Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. +Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. + +
  4. Clipping Plane: + +The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. +The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). -\cgalExample{Surface_mesh/draw_surface_mesh.cpp} \subsection GraphicSceneContinue Tune the drawing thanks to `CGAL::Graphics_scene_options` There is one specialization of each draw function that takes a graphics scene options as parameter, allowing to tune the drawing. -The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various elements such as vertices, edges, faces, and volumes in a graphical representation of a combinatorial data structure (DS). The classes are template classes, allowing them to work with different combinatorial data structures (DS) in 2D and 3D. -\subsubsection GraphicSceneOptionsCont Here are some key responsibilities of the Graphics_scene_options class: -
      +The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. -
    1. Drawing Control: It determines whether to draw vertices, edges, faces, and volumes in the graphics scene through the use of drawing functors (draw_vertex, draw_edge, draw_face, draw_volume). +The following example shows how to use a graphics scene options to tune the drawing of a surface mesh. In this example, we define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. -
    2. Coloring Control: It allows users to customize the coloring of vertices, edges, faces, and volumes. Users can specify whether coloring is enabled (colored_vertex, colored_edge, colored_face, colored_volume) and, if so, provide functions (vertex_color, edge_color, face_color, volume_color) to determine the color for each element. +\cgalFigureBegin{basic_viewer_ex2,draw_surface_mesh_vcolor.png} +Example of tuned drawing of a 3D surface mesh where some vertex colors are changed. +\cgalFigureEnd -
    3. Wireframe Control: For faces and volumes, it provides options to draw a wireframe representation (face_wireframe, volume_wireframe), allowing users to choose whether to display a wireframe overlay. -
    4. Visibility Control: Users can enable or disable the visibility of vertices, edges, faces, and volumes independently using functions like disable_vertices, enable_vertices, are_vertices_enabled, and similar functions for other components. -
    5. Template Flexibility: The class is templated to support different types of combinatorial data structures (DS) in 2D and 3D. This template flexibility allows users to use the class with various geometric structures. +ICICICI -
    6. Default Settings: It provides reasonable default settings for the various options, ensuring that users can get started with a sensible configuration without needing to customize every parameter. -
    \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index 6b3bdddd1969..c1b97ddd9e75 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -14,17 +14,21 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Eigen3 3.1.0) include(CGAL_Eigen3_support) +create_single_source_cgal_program("draw_lcc.cpp") create_single_source_cgal_program("draw_mesh_and_points.cpp") create_single_source_cgal_program("draw_several_windows.cpp") -create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") create_single_source_cgal_program("draw_surface_mesh_height.cpp") +create_single_source_cgal_program("draw_surface_mesh_small_faces.cpp") +create_single_source_cgal_program("draw_surface_mesh_vcolor.cpp") if(CGAL_Qt6_FOUND) #link it with the required CGAL libraries + target_link_libraries(draw_lcc PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_several_windows PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_surface_mesh_height PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_vcolor PUBLIC CGAL::CGAL_Basic_viewer) endif() if(TARGET CGAL::Eigen3_support) diff --git a/Basic_viewer/examples/Basic_viewer/draw_lcc.cpp b/Basic_viewer/examples/Basic_viewer/draw_lcc.cpp new file mode 100644 index 000000000000..019db26519a1 --- /dev/null +++ b/Basic_viewer/examples/Basic_viewer/draw_lcc.cpp @@ -0,0 +1,17 @@ +#include +#include + +using LCC=CGAL::Linear_cell_complex_for_combinatorial_map<3>; +using Point=LCC::Point; + +int main() +{ + LCC lcc; + lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), + Point(5,5,0), Point(0,5,0), + Point(0,5,4), Point(0,0,4), + Point(5,0,4), Point(5,5,4)); + CGAL::draw(lcc); + + return EXIT_SUCCESS; +} diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_vcolor.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_vcolor.cpp new file mode 100644 index 000000000000..209d73bd71a8 --- /dev/null +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_vcolor.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include + +using Kernel=CGAL::Simple_cartesian; +using Point=Kernel::Point_3; +using Mesh=CGAL::Surface_mesh; + +// Inherit from CGAL::Graphics_scene_options to get all the default values. +struct My_graphics_scene_options: + public CGAL::Graphics_scene_options::vertex_descriptor, + typename boost::graph_traits::edge_descriptor, + typename boost::graph_traits::face_descriptor> +{ + // All vertices are colored. + bool colored_vertex(const Mesh&, + typename boost::graph_traits::vertex_descriptor) const + { return true; } + + // Change the color of vertices randomly. + CGAL::IO::Color vertex_color(const Mesh&, + typename boost::graph_traits::vertex_descriptor) const + { + static bool v_green=true; + v_green=!v_green; + if(v_green) // 1 vertex out of two green (randomly) + { return CGAL::IO::Color(0,220,0); } + else // the others are blue + { return CGAL::IO::Color(0,0,220); } + } +}; + + +int main(int argc, char* argv[]) +{ + const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); + + Mesh sm; + if(!CGAL::IO::read_polygon_mesh(filename, sm)) + { + std::cerr << "Invalid input file: " << filename << std::endl; + return EXIT_FAILURE; + } + + // Draw the mesh using the new graphics scene option. + CGAL::draw(sm, My_graphics_scene_options()); + return EXIT_SUCCESS; +} From cc19f2b3ee57b41b9b1341e9e2439ca6af4b7920 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 26 Mar 2024 17:26:25 +0100 Subject: [PATCH 321/341] =?UTF-8?q?add=20examples=20=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/Basic_viewer/Basic_viewer.txt | 19 ++++++++++--------- Basic_viewer/doc/Basic_viewer/examples.txt | 5 +++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 03aa3150a6ba..15c04986dc50 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -44,26 +44,27 @@ Example of drawing of a 3D LCC. Users can interact with the viewer using some specific keys or mouse interactions. You can press 'h' key to visualize an help showing all the different shortcuts and mouse interactions. The main functionalities of the viewer are: -
  5. Versatile Rendering: +
      +
    • Versatile Rendering: The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. -Different rendering modes, including mono and colored representations, are available for these elements. +Different rendering modes, including mono and colored representations, are available for these elements.
    • -
    • Camera Control: +
    • Camera Control: The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. -Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. +Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene.
    • -
    • User Interaction: +
    • User Interaction: Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. -Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. +Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color.
    • -
    • Clipping Plane: +
    • Clipping Plane: The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. -The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). - +The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.).
    • +
    \subsection GraphicSceneContinue Tune the drawing thanks to `CGAL::Graphics_scene_options` diff --git a/Basic_viewer/doc/Basic_viewer/examples.txt b/Basic_viewer/doc/Basic_viewer/examples.txt index 0a13e1c0f6fd..2e18952fcb4f 100644 --- a/Basic_viewer/doc/Basic_viewer/examples.txt +++ b/Basic_viewer/doc/Basic_viewer/examples.txt @@ -1,7 +1,8 @@ /*! -\example Surface_mesh/draw_surface_mesh.cpp +\example Basic_viewer/draw_lcc.cpp \example Basic_viewer/draw_mesh_and_points.cpp \example Basic_viewer/draw_several_windows.cpp -\example Basic_viewer/draw_surface_mesh_height.cpp \example Basic_viewer/draw_surface_mesh_small_faces.cpp +\example Basic_viewer/draw_surface_mesh_height.cpp +\example Basic_viewer/draw_surface_mesh_vcolor.cpp */ From 102f1595e83b042ce762c1a326e10577476ffb5b Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Mar 2024 11:36:23 +0100 Subject: [PATCH 322/341] basic viewer user manual --- .../doc/Basic_viewer/Basic_viewer.txt | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 15c04986dc50..67b0eb4b967e 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -74,53 +74,46 @@ The Graphics_scene_options class is responsible for providing a set of options a The following example shows how to use a graphics scene options to tune the drawing of a surface mesh. In this example, we define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. +\cgalExample{Basic_viewer/draw_surface_mesh_vcolor.cpp} + +The result of this example can be shown in \cgalFigureRef{basic_viewer_ex2}. + \cgalFigureBegin{basic_viewer_ex2,draw_surface_mesh_vcolor.png} Example of tuned drawing of a 3D surface mesh where some vertex colors are changed. \cgalFigureEnd +The drawing options can depend on the cells. We illustrate this possibility of the following example which compute a color for each face depending on its height. -ICICICI +\cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} +The result of this example can be shown in \cgalFigureRef{basic_viewer_ex3} where we can see that all faces in a same height share the same color. +\cgalFigureBegin{basic_viewer_ex3,draw_surface_height.png} +Example of mesh drawing with a color for each face computed thanks to its height. +\cgalFigureEnd -\cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} -\subsection Some key goals and features of the Qt viewer include: -TODO explain the main key options -
      -
    1. Versatile Rendering: -The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. -Different rendering modes, including mono and colored representations, are available for these elements. -
    2. Camera Control: -The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. -Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene. -
    3. User Interaction: -Users can interact with the viewer through keyboard inputs, enabling them to control rendering options, toggle the display of elements, and adjust visual parameters. -Key presses are mapped to specific actions, such as toggling the clipping plane, changing rendering modes, adjusting the size of elements, and modifying ambient light color. -
    4. Clipping Plane: -The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. -The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.). -
    5. Shader Support: -Shaders are compiled to enhance the rendering capabilities of the viewer, potentially providing advanced shading and visual effects. -
    6. Flexibility and Configurability: -The viewer is designed to be flexible, allowing users to configure various rendering parameters and interact with the scene based on their needs. -The code includes functions for setting up the initial state of the viewer, initializing OpenGL settings, and handling key events. -
    + + + + +ICICICI + \section Graphic_Scene From 785f301cda3b3a8d1f238c0eb0300f15837b1aca Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Mar 2024 12:12:47 +0100 Subject: [PATCH 323/341] basic viewer user manual --- .../doc/Basic_viewer/Basic_viewer.txt | 22 ++++++++++--------- .../Basic_viewer/draw_mesh_and_points.cpp | 10 ++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 67b0eb4b967e..202a6be8d29c 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -93,18 +93,30 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex3} wher Example of mesh drawing with a color for each face computed thanks to its height. \cgalFigureEnd +\section Graphic_Scene +It is possible to do more advanced visualisations by using the class `CGAL::Graphics_scene`. Its goal is to be a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements (points, segments, rays, lines, text), possibly with colors. Things are a little bit different for faces. You should call `face_begin` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face` as many times as necessary, then call `face_end` to finish the face. Note that the given polygonal face is internally triangulated. +This class also stores the normal of the faces (computed automatically), and possibly the normal of the vertices that should be given by the users. +Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene` that fill the scene using all the geometric elements of the given CGAL data structure. Like for the draw functions, there is one `add_to_graphics_scene` for each CGAL data structure (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2). +A `Graphics_scene` can be drawn using the basic viewer thanks to the `CGAL::draw_graphics_scene` function. +The following example illustrates this possibility by showing in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene` can use an optional Graphics_scene_options as parameter allowing to tune the drawing of the given data structure. In the example, we use this possibility to change the color of all vertices of the point set. +\cgalExample{Basic_viewer/draw_mesh_and_points.cpp} +The result of this example can be shown in \cgalFigureRef{basic_viewer_ex4} where we can see in green the original points of the point cloud, supperposed with the polyhedron surface reconstructed by the poisson surface reconstruction method. +\cgalFigureBegin{basic_viewer_ex4,draw_mesh_and_points.png} +Example of drawing of a point cloud and a polyhedron in a same viewer. +\cgalFigureEnd +ICICICI @@ -112,16 +124,6 @@ Example of mesh drawing with a color for each face computed thanks to its height -ICICICI - - -\section Graphic_Scene - -The Graphics_scene class appears to be a container class responsible for managing CGAL data structures and handling buffers for various geometric elements, such as points, segments, rays, lines, and faces by fill data in given graphic buffer. - -Draw two different CGAL data-structures in a same viewer - -\cgalExample{Basic_viewer/draw_mesh_and_points.cpp} \subsection GraphicSceneClass key components and functionality of this class: diff --git a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp index 0b3fd2285a9b..e104f016447a 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_mesh_and_points.cpp @@ -10,11 +10,11 @@ #include #include -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; -typedef std::pair Pwn; -typedef CGAL::Polyhedron_3 Polyhedron; +using Kernel=CGAL::Exact_predicates_inexact_constructions_kernel; +using Point=Kernel::Point_3; +using Vector=Kernel::Vector_3; +using Pwn=std::pair; +using Polyhedron=CGAL::Polyhedron_3; using PS3=CGAL::Point_set_3; struct Graphics_scene_options_green_points: From 3804cf6371ce81d2630d913f0ed07dc9e677e2e5 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Mar 2024 15:07:23 +0100 Subject: [PATCH 324/341] basic viewer example --- .../examples/Basic_viewer/draw_several_windows.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp index f1fead0a1ded..2ac2ff2d66d0 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_several_windows.cpp @@ -14,16 +14,16 @@ #include #include -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef Kernel::Point_3 Point; -typedef Kernel::Vector_3 Vector; -typedef std::pair Pwn; -typedef CGAL::Polyhedron_3 Polyhedron; +using Kernel=CGAL::Exact_predicates_inexact_constructions_kernel; +using Point=Kernel::Point_3; +using Vector=Kernel::Vector_3; +using Pwn=std::pair; +using Polyhedron=CGAL::Polyhedron_3; using PS3=CGAL::Point_set_3; int main(void) { - /// (1) Some CGAL code that create data structure and fill Graphics_scene. + /// (1) Some CGAL code that create data structures and fill two Graphics_scene. std::vector points; if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points), From f904090248cefdde67edde61f6670052aafd58b6 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Mar 2024 18:08:04 +0100 Subject: [PATCH 325/341] basic viewer user manual --- .../doc/Basic_viewer/Basic_viewer.txt | 119 +++++------------- 1 file changed, 34 insertions(+), 85 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 202a6be8d29c..7b482c0a8019 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -8,7 +8,8 @@ namespace CGAL { \author Guillaume Damiand, Mostafa Ashraf \cgalAutoToc -\section Introduction + +\section BV_Intro Introduction The basic viewer package appears to serve as a foundation to provide a small interactive visualization tools of all CGAL data structures, such as Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more. The functionality of the package is to renders various geometric elements such as points, segments, rays, lines, faces, etc. @@ -18,19 +19,21 @@ The drawing can be tuned using a `CGAL::Graphics_scene_option` allowing to chang More complex usage can be achieved by using the `CGAL::Graphics_scene` class. Several representation of different CGAL data structures can be added in a same `CGAL::Graphics_scene` allowing to visualize different models in a same window. Like for the draw function, the drawing parameters can be tune thanks to the `CGAL::Graphics_scene_option`. -Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on Qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Basic_viewer`. +Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on Qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. -\section SoftwareDesignClassDiagam Software Design + +\section BV_SoftwareDesign Software Design -The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes of the package. +The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes and functions of the package. \cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} -UML diagram of the main classes of the package. +UML diagram of the classes and functions of the package. \cgalFigureEnd TODO links the classes with the different sections where they will be explained -\section Basic Usage: global `CGAL::draw` functions + +\section BV_BasicUsage Basic Usage: global CGAL::draw functions A first simple solution provide to draw the different data structures of CGAL is the use of global `CGAL::draw` functions. This function is templated by the type of the data structure to draw. The following example shows a basic use of this function. @@ -66,7 +69,7 @@ The viewer includes support for a clipping plane, allowing users to selectively The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.).
  6. -\subsection GraphicSceneContinue Tune the drawing thanks to `CGAL::Graphics_scene_options` +\subsection BV_GraphicSceneOptions Tune the drawing thanks to CGAL::Graphics_scene_options There is one specialization of each draw function that takes a graphics scene options as parameter, allowing to tune the drawing. @@ -82,7 +85,6 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex2}. Example of tuned drawing of a 3D surface mesh where some vertex colors are changed. \cgalFigureEnd - The drawing options can depend on the cells. We illustrate this possibility of the following example which compute a color for each face depending on its height. \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} @@ -93,7 +95,8 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex3} wher Example of mesh drawing with a color for each face computed thanks to its height. \cgalFigureEnd -\section Graphic_Scene + +\section BV_GraphicsScene CGAL::Graphics_Scene It is possible to do more advanced visualisations by using the class `CGAL::Graphics_scene`. Its goal is to be a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements (points, segments, rays, lines, text), possibly with colors. Things are a little bit different for faces. You should call `face_begin` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face` as many times as necessary, then call `face_end` to finish the face. Note that the given polygonal face is internally triangulated. @@ -113,97 +116,43 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex4} wher Example of drawing of a point cloud and a polyhedron in a same viewer. \cgalFigureEnd + +\section BV_BasicViewer Use the Qt widget CGAL::Qt::Basic_viewer +The class `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` and mainly stores a Graphics_scene and allows to visualize it and interact with the scene. Since this class is a Qt widget, it can be used into more complex Qt code to create more advanced demos. +In the following example, we illustrate this possibility by creating two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed the poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. These basic viewer can be added into a same Qt layout allowing to visualize the two scenes side by side. -ICICICI - - - - - - - - - -\subsection GraphicSceneClass key components and functionality of this class: -
      - -
    1. Buffer Management: - -
        -
      1. The class manages buffers for different geometric elements, including mono and colored versions of points, segments, rays, lines, and faces. -
      2. Buffers are stored in the arrays array, which holds vectors of BufferType (defaulted to float), and each buffer is initialized in the constructor. -
      - -
    2. Bounding Box: -
        -
      1. The class maintains a bounding box (m_bounding_box) that encompasses all the geometric elements in the scene. -
      2. The bounding box can be initiated and updated based on the elements added to the scene. -
      - -
    3. Adding Geometric Elements: -
        -
      1. The class provides template member functions (add_point, add_segment, add_ray, etc.) for adding various geometric elements to the corresponding buffers. -
      2. It supports both mono and colored versions of these elements, allowing for the addition of color information. -
      - -
    4. Face Handling: -
        -
      1. The class supports the creation of faces by providing methods such as face_begin, add_point_in_face, and face_end. -
      2. Faces can be either mono or colored, and they are constructed by adding points to the corresponding face buffers. -
      - -
    5. Normal Handling: -
        -
      1. Normals for faces are handled separately for smooth and flat shading, and they are part of the normal buffers. -
      - -
    6. Text Handling: -
        -
      1. The class maintains a vector of text elements (m_texts), where each text element is associated with a 3D point in the scene. -
      2. Text elements can be added using the add_text member function. -
      +\cgalExample{Basic_viewer/draw_several_windows.cpp} -
    7. Utility Functions: -
        -
      1. The class provides utility functions such as checking if a face has started (a_face_started), clearing all buffers (clear), and determining if the scene is empty. -
      +The result of this example is shown in \cgalFigureRef{basic_viewer_ex5}, showing the two Basic_viewer side by side. -
    8. Coordinate System Information: -
        -
      1. The class contains functions to check if the data structure lies on a particular plane (XY, XZ, or YZ), providing information about the coordinate system. -
      +\cgalFigureBegin{basic_viewer_ex5,draw_several_windows.png} +Example of drawing of two Basic_viewer side by side. +\cgalFigureEnd -
    9. Local Coordinate Transformations: -
        -
      1. There are template functions (get_local_point and get_local_vector) for transforming CGAL points and vectors into a local coordinate system (Local_kernel). -
      -
    10. Size and Dimensionality: -
        -
      1. Functions like get_size_of_index and number_of_elements provide information about the size and dimensionality of buffers. -
      + +\section BV_Interactions Add some interactions with the viewer -
    11. Miscellaneous: -
        -
      1. The class allows for reversing all normals in the scene using the reverse_all_normals function. -
      2. The empty function checks whether the scene is empty. -
      3. Functions like has_zero_x, has_zero_y, and has_zero_z check if any element in the scene has a zero value in a specific coordinate. -
      +In all the previous examples, the models are only drawn once and there is no interaction with the visualization and the users that allow to update the drawing. -
    +It is possible to define such interactions thanks to the class `CGAL::Qt::QApplication_and_basic_viewer`. In this class, you can define your own function that is called automatically by the viewer when an user press a key. This can allow to change some parameters and update the drawing accordingly. -This class provides a comprehensive interface for managing and manipulating geometric data in a 3D scene, facilitating the rendering and interaction of complex scenes in a graphics application. +We illustrate this possibility in the following example that show a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threashold can be updated by users, pressing key I to increase it and D to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threashold changes, the graphics scene are recomputed to take into account the modification of the size threashold. +\cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -\section Use the Qt widget CGAL::Qt::Basic_viewer +The result of this example is shown in \cgalFigureRef{basic_viewer_ex6}, showing to the left the initial drawing of the 3D model, and to the right the same model after having changed the size threashold. -\cgalExample{Basic_viewer/draw_several_windows.cpp} +\cgalFigureBegin{basic_viewer_ex6,draw_surface_mesh_small_faces.png} +Two examples of drawing of a mesh with small faces in red. Left: With the initial threashold. Right: After having increased the threashold. +\cgalFigureEnd -\section Add some small interactions with the viewer + +\section BV_Design Design and Implementation History -\cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} +This package was started by Mostafa Ashraf during his 2022 GSOC project. Guillaume Damiand redeveloped almost entirely the package, examples and wrote the manual. */ From 1f04bad68e65e6ffdc39d943b755603097b01305 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 27 Mar 2024 21:22:03 +0100 Subject: [PATCH 326/341] Basic viewer user manual --- .../doc/Basic_viewer/Basic_viewer.txt | 32 +++++++++---------- .../doc/Basic_viewer/CGAL/Qt/Basic_viewer.h | 2 +- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 7b482c0a8019..d14313c787f7 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -11,7 +11,7 @@ namespace CGAL { \section BV_Intro Introduction -The basic viewer package appears to serve as a foundation to provide a small interactive visualization tools of all CGAL data structures, such as Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2, and more. The functionality of the package is to renders various geometric elements such as points, segments, rays, lines, faces, etc. +The basic viewer package appears to serve as a foundation to provide a small interactive visualization tools of all CGAL data structures, such as `Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. The functionality of the package is to renders various geometric elements such as points, segments, rays, lines, faces, etc. The most basic usage of the basic viewer is the use of the global `CGAL::draw` function. There is one draw function for each package CGAL. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any... @@ -24,14 +24,12 @@ Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that in \section BV_SoftwareDesign Software Design -The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the different classes and functions of the package. +The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the main different classes and functions of this package. \cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} -UML diagram of the classes and functions of the package. +UML diagram of the classes and functions of the package (only partial representation). \cgalFigureEnd -TODO links the classes with the different sections where they will be explained - \section BV_BasicUsage Basic Usage: global CGAL::draw functions @@ -55,8 +53,8 @@ Different rendering modes, including mono and colored representations, are avail
  7. Camera Control: -The viewer allows users to switch between 2D and 3D viewing modes, adjusting the camera accordingly. -Camera settings, such as orthographic or perspective projection, can be configured based on the dimensionality of the scene.
  8. +The viewer allows users to move the camera, switch between 2D and 3D viewing modes, adjusting the camera accordingly. +Camera settings, such as orthographic or perspective projection, can be configured based on the dimension of the scene.
  9. User Interaction: @@ -73,7 +71,7 @@ The clipping plane can be toggled on and off, and its rendering style can be mod There is one specialization of each draw function that takes a graphics scene options as parameter, allowing to tune the drawing. -The Graphics_scene_options class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. +The `Graphics_scene_options` class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. The following example shows how to use a graphics scene options to tune the drawing of a surface mesh. In this example, we define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. @@ -98,19 +96,19 @@ Example of mesh drawing with a color for each face computed thanks to its height \section BV_GraphicsScene CGAL::Graphics_Scene -It is possible to do more advanced visualisations by using the class `CGAL::Graphics_scene`. Its goal is to be a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements (points, segments, rays, lines, text), possibly with colors. Things are a little bit different for faces. You should call `face_begin` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face` as many times as necessary, then call `face_end` to finish the face. Note that the given polygonal face is internally triangulated. +It is possible to do more advanced visualizations by using the class `CGAL::Graphics_scene`. Its goal is to be a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements (points, segments, rays, lines, text), possibly with colors. Things are a little bit different for faces. You should call `face_begin` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face` as many times as necessary, then call `face_end` to finish the face. Note that the given polygonal face is internally triangulated. This class also stores the normal of the faces (computed automatically), and possibly the normal of the vertices that should be given by the users. -Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene` that fill the scene using all the geometric elements of the given CGAL data structure. Like for the draw functions, there is one `add_to_graphics_scene` for each CGAL data structure (Arrangement_on_surface_2, Boolean_set_operations_2, Linear_cell_complex, Nef_3, Periodic_2_triangulation_2, Point_set_3, Polygon, Polyhedron, Straight_skeleton_2, Surface_mesh, Triangulation_2, Triangulation_3, Voronoi_diagram_2). +Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene` that fill the scene using all the geometric elements of the given CGAL data structure. Like for the draw functions, there is one `add_to_graphics_scene` for each CGAL data structure (`Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`). A `Graphics_scene` can be drawn using the basic viewer thanks to the `CGAL::draw_graphics_scene` function. -The following example illustrates this possibility by showing in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene` can use an optional Graphics_scene_options as parameter allowing to tune the drawing of the given data structure. In the example, we use this possibility to change the color of all vertices of the point set. +The following example illustrates this possibility by showing in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene` can use an optional `Graphics_scene_options` as parameter allowing to tune the drawing of the given data structure. In the example, we use this possibility to change the color of all vertices of the point set. \cgalExample{Basic_viewer/draw_mesh_and_points.cpp} -The result of this example can be shown in \cgalFigureRef{basic_viewer_ex4} where we can see in green the original points of the point cloud, supperposed with the polyhedron surface reconstructed by the poisson surface reconstruction method. +The result of this example can be shown in \cgalFigureRef{basic_viewer_ex4} where we can see in green the original points of the point cloud, superposed with the polyhedron surface reconstructed by the Poisson surface reconstruction method. \cgalFigureBegin{basic_viewer_ex4,draw_mesh_and_points.png} Example of drawing of a point cloud and a polyhedron in a same viewer. @@ -119,9 +117,9 @@ Example of drawing of a point cloud and a polyhedron in a same viewer. \section BV_BasicViewer Use the Qt widget CGAL::Qt::Basic_viewer -The class `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` and mainly stores a Graphics_scene and allows to visualize it and interact with the scene. Since this class is a Qt widget, it can be used into more complex Qt code to create more advanced demos. +The class `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` and mainly stores a `Graphics_scene` and allows to visualize it and interact with the scene. Since this class is a Qt widget, it can be used into more complex Qt code to create more advanced demos. -In the following example, we illustrate this possibility by creating two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed the poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. These basic viewer can be added into a same Qt layout allowing to visualize the two scenes side by side. +In the following example, we illustrate this possibility by creating two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed the Poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. These basic viewer can be added into a same Qt layout allowing to visualize the two scenes side by side. \cgalExample{Basic_viewer/draw_several_windows.cpp} @@ -139,14 +137,14 @@ In all the previous examples, the models are only drawn once and there is no int It is possible to define such interactions thanks to the class `CGAL::Qt::QApplication_and_basic_viewer`. In this class, you can define your own function that is called automatically by the viewer when an user press a key. This can allow to change some parameters and update the drawing accordingly. -We illustrate this possibility in the following example that show a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threashold can be updated by users, pressing key I to increase it and D to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threashold changes, the graphics scene are recomputed to take into account the modification of the size threashold. +We illustrate this possibility in the following example that show a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threshold can be updated by users, pressing key I to increase it and D to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threshold changes, the graphics scene are recomputed to take into account the modification of the size threshold. \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} -The result of this example is shown in \cgalFigureRef{basic_viewer_ex6}, showing to the left the initial drawing of the 3D model, and to the right the same model after having changed the size threashold. +The result of this example is shown in \cgalFigureRef{basic_viewer_ex6}, showing to the left the initial drawing of the 3D model, and to the right the same model after having changed the size threshold. \cgalFigureBegin{basic_viewer_ex6,draw_surface_mesh_small_faces.png} -Two examples of drawing of a mesh with small faces in red. Left: With the initial threashold. Right: After having increased the threashold. +Two examples of drawing of a mesh with small faces in red. Left: With the initial threshold. Right: After having increased the threshold. \cgalFigureEnd diff --git a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h index 2ed9bec56be3..6ff91f29739d 100644 --- a/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/doc/Basic_viewer/CGAL/Qt/Basic_viewer.h @@ -151,7 +151,7 @@ class QApplication_and_basic_viewer { public: /// Constructor given a `Graphics_scene` and possibly a title. - QApplication_and_basic_viewer(const CGAL::Graphics_scene& buffer, + QApplication_and_basic_viewer(const CGAL::Graphics_scene& gs, const char* title="CGAL Basic Viewer"); /// runs the `QApplication`, i.e., open the Qt window. A call to this method is blocking, that is the program continues as soon as the user closes the window. From 031c833855116a54a2c5344e5caa3e13805ffbd5 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 28 Mar 2024 14:02:10 +0100 Subject: [PATCH 327/341] First pass on User Manual --- .../doc/Basic_viewer/Basic_viewer.txt | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index d14313c787f7..22eb03e9c160 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -11,45 +11,45 @@ namespace CGAL { \section BV_Intro Introduction -The basic viewer package appears to serve as a foundation to provide a small interactive visualization tools of all CGAL data structures, such as `Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. The functionality of the package is to renders various geometric elements such as points, segments, rays, lines, faces, etc. +The basic viewer package provides interactive visualization for most \cgal data structures, such as `Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. The functionality of the package is to render various geometric elements such as points, segments, rays, lines, faces, etc. -The most basic usage of the basic viewer is the use of the global `CGAL::draw` function. There is one draw function for each package CGAL. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any... +The most basic usage of the basic viewer is the use of the global `CGAL::draw()` function. There is one draw function for each \cgal package. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any... -The drawing can be tuned using a `CGAL::Graphics_scene_option` allowing to change the color of some cells or hide some cells. +The drawing can be tuned using `CGAL::Graphics_scene_options`, for example to change the color of some cells or hide some cells. -More complex usage can be achieved by using the `CGAL::Graphics_scene` class. Several representation of different CGAL data structures can be added in a same `CGAL::Graphics_scene` allowing to visualize different models in a same window. Like for the draw function, the drawing parameters can be tune thanks to the `CGAL::Graphics_scene_option`. +More complex usage can be achieved by using the `CGAL::Graphics_scene` class. Several representations of different \cgal data structures can be added in a same `CGAL::Graphics_scene` allowing to visualize different models in a same window. Like for the draw function, the drawing parameters can be tuned thanks to the `CGAL::Graphics_scene_options`. Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on Qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. \section BV_SoftwareDesign Software Design -The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the main different classes and functions of this package. +The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the main classes and functions of this package. \cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} UML diagram of the classes and functions of the package (only partial representation). \cgalFigureEnd -\section BV_BasicUsage Basic Usage: global CGAL::draw functions +\section BV_BasicUsage Basic Usage: Global CGAL::draw Functions -A first simple solution provide to draw the different data structures of CGAL is the use of global `CGAL::draw` functions. This function is templated by the type of the data structure to draw. The following example shows a basic use of this function. +A first simple solution provided to draw the different data structures of \cgal is the global function `CGAL::draw()` function. This function is templated by the type of the data structure to draw. The following example shows how it can be used. \cgalExample{Basic_viewer/draw_lcc.cpp} -This example creates a 3D linear cell complex, fill it by creating an hexahedron, and draw it using the basic viewer. The result of the viewing is shown in the following figure. +This example creates a 3D linear cell complex of a hexahedron, and draws it. The result is shown in the following figure. \cgalFigureBegin{basic_viewer_ex1,lcc_draw.png} Example of drawing of a 3D LCC. \cgalFigureEnd -Users can interact with the viewer using some specific keys or mouse interactions. You can press 'h' key to visualize an help showing all the different shortcuts and mouse interactions. The main functionalities of the viewer are: +Users can interact with the viewer using some specific keys or mouse interactions. Pressing key 'h' makes pop up a help window showing the different shortcuts and mouse interactions. The main functionalities of the viewer are:
    • Versatile Rendering: The viewer supports the rendering of various geometric elements, such as points, edges, faces, rays, and lines. -Different rendering modes, including mono and colored representations, are available for these elements.
    • +Different rendering modes, including mono and colored representation, are available for these elements.
    • Camera Control: @@ -63,17 +63,17 @@ Key presses are mapped to specific actions, such as toggling the clipping plane,
    • Clipping Plane: -The viewer includes support for a clipping plane, allowing users to selectively render parts of the scene. +The viewer includes support for a clipping plane, enableing users to selectively render parts of the scene. The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.).
    -\subsection BV_GraphicSceneOptions Tune the drawing thanks to CGAL::Graphics_scene_options +\subsection BV_GraphicSceneOptions Tune the drawing thanks to Graphics Scene Options -There is one specialization of each draw function that takes a graphics scene options as parameter, allowing to tune the drawing. +There is one specialization of each draw function that takes graphics scene options as parameter, allowing to tune the drawing. The `Graphics_scene_options` class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. -The following example shows how to use a graphics scene options to tune the drawing of a surface mesh. In this example, we define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. +The following example shows how to use graphics scene options to tune the drawing of a surface mesh. We define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. \cgalExample{Basic_viewer/draw_surface_mesh_vcolor.cpp} @@ -83,61 +83,61 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex2}. Example of tuned drawing of a 3D surface mesh where some vertex colors are changed. \cgalFigureEnd -The drawing options can depend on the cells. We illustrate this possibility of the following example which compute a color for each face depending on its height. +The drawing options can depend on the cells. Inthe following example the color of each face depends on its height. \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} -The result of this example can be shown in \cgalFigureRef{basic_viewer_ex3} where we can see that all faces in a same height share the same color. +The result of this example is shown in \cgalFigureRef{basic_viewer_ex3}. \cgalFigureBegin{basic_viewer_ex3,draw_surface_height.png} -Example of mesh drawing with a color for each face computed thanks to its height. +Example of mesh drawing with a color for each face computed depending on its height. \cgalFigureEnd -\section BV_GraphicsScene CGAL::Graphics_Scene +\section BV_GraphicsScene The Graphics Scene -It is possible to do more advanced visualizations by using the class `CGAL::Graphics_scene`. Its goal is to be a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements (points, segments, rays, lines, text), possibly with colors. Things are a little bit different for faces. You should call `face_begin` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face` as many times as necessary, then call `face_end` to finish the face. Note that the given polygonal face is internally triangulated. +It is possible to do more advanced visualizations by using the class `CGAL::Graphics_scene`. It is a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements, possibly with individual colors. Things are a little bit different for faces. You must call `face_begin()` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face()`, and call `face_end()` to finish the face. Note that the given polygonal face is internally triangulated. This class also stores the normal of the faces (computed automatically), and possibly the normal of the vertices that should be given by the users. -Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene` that fill the scene using all the geometric elements of the given CGAL data structure. Like for the draw functions, there is one `add_to_graphics_scene` for each CGAL data structure (`Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`). +Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene()` that fills the scene using all the geometric elements of the given \cgal data structure. Like for the draw functions, there is an overload of `add_to_graphics_scene()` for each \cgal data structure (`Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`). -A `Graphics_scene` can be drawn using the basic viewer thanks to the `CGAL::draw_graphics_scene` function. +A `Graphics_scene` can be drawn using the basic viewer thanks to the `CGAL::draw_graphics_scene()` function. -The following example illustrates this possibility by showing in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene` can use an optional `Graphics_scene_options` as parameter allowing to tune the drawing of the given data structure. In the example, we use this possibility to change the color of all vertices of the point set. +The following example shows in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene()` can use an optional `Graphics_scene_options` as parameter allowing to tune the drawing of the given data structure. In the example, we change the color of all vertices of the point set. \cgalExample{Basic_viewer/draw_mesh_and_points.cpp} -The result of this example can be shown in \cgalFigureRef{basic_viewer_ex4} where we can see in green the original points of the point cloud, superposed with the polyhedron surface reconstructed by the Poisson surface reconstruction method. +The result of this example is shown in \cgalFigureRef{basic_viewer_ex4} where we can see in green the original points of the point cloud, superposed with the polyhedron surface reconstructed by the Poisson surface reconstruction method. \cgalFigureBegin{basic_viewer_ex4,draw_mesh_and_points.png} Example of drawing of a point cloud and a polyhedron in a same viewer. \cgalFigureEnd -\section BV_BasicViewer Use the Qt widget CGAL::Qt::Basic_viewer +\section BV_BasicViewer The Basic Viewer Class The class `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` and mainly stores a `Graphics_scene` and allows to visualize it and interact with the scene. Since this class is a Qt widget, it can be used into more complex Qt code to create more advanced demos. -In the following example, we illustrate this possibility by creating two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed the Poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. These basic viewer can be added into a same Qt layout allowing to visualize the two scenes side by side. +In the following example, we create two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed by the Poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. The two basic viewers are added into a same Qt layout allowing to visualize the two scenes side by side. \cgalExample{Basic_viewer/draw_several_windows.cpp} -The result of this example is shown in \cgalFigureRef{basic_viewer_ex5}, showing the two Basic_viewer side by side. +The result of this example is shown in \cgalFigureRef{basic_viewer_ex5). \cgalFigureBegin{basic_viewer_ex5,draw_several_windows.png} -Example of drawing of two Basic_viewer side by side. +Example of drawing of two `Basic_viewer` side by side. \cgalFigureEnd -\section BV_Interactions Add some interactions with the viewer +\section BV_Interactions Adding Interaction -In all the previous examples, the models are only drawn once and there is no interaction with the visualization and the users that allow to update the drawing. +In the previous examples, the models are only drawn once and there is no interaction with the user to update the drawing. -It is possible to define such interactions thanks to the class `CGAL::Qt::QApplication_and_basic_viewer`. In this class, you can define your own function that is called automatically by the viewer when an user press a key. This can allow to change some parameters and update the drawing accordingly. +It is possible to define such interactions thanks to the class `CGAL::Qt::QApplication_and_basic_viewer`. In this class, you can define your own function that is called automatically by the viewer when a user presses a key. This can be used to change some parameters and update the drawing accordingly. -We illustrate this possibility in the following example that show a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threshold can be updated by users, pressing key I to increase it and D to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threshold changes, the graphics scene are recomputed to take into account the modification of the size threshold. +We illustrate this possibility in the following example that shows a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threshold can be updated by the user, pressing key 'I' to increase it and 'D' to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threshold changes, the graphics scene are recomputed to take into account the modification of the size threshold. \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} @@ -150,9 +150,8 @@ Two examples of drawing of a mesh with small faces in red. Left: With the \section BV_Design Design and Implementation History -This package was started by Mostafa Ashraf during his 2022 GSOC project. Guillaume Damiand redeveloped almost entirely the package, examples and wrote the manual. +This package was started by Mostafa Ashraf during his 2022 GSoC project. Guillaume Damiand redeveloped almost entirely the package, examples and wrote the manual. */ } /* namespace CGAL */ - From 344ea7c9d59ffb05478addceef319c38bd353f0a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 14:12:55 +0100 Subject: [PATCH 328/341] typo in manual --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 22eb03e9c160..4dadaea10477 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -123,7 +123,7 @@ In the following example, we create two graphics scenes, one filled by a point c \cgalExample{Basic_viewer/draw_several_windows.cpp} -The result of this example is shown in \cgalFigureRef{basic_viewer_ex5). +The result of this example is shown in \cgalFigureRef{basic_viewer_ex5}. \cgalFigureBegin{basic_viewer_ex5,draw_several_windows.png} Example of drawing of two `Basic_viewer` side by side. From c19e64fa97840fed078e45a1f554bae9dac0135c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 28 Mar 2024 15:18:11 +0100 Subject: [PATCH 329/341] Second pass --- .../doc/Basic_viewer/Basic_viewer.txt | 44 +++++++++---------- .../doc/Basic_viewer/PackageDescription.txt | 6 ++- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 4dadaea10477..bad2f92a673a 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -11,15 +11,15 @@ namespace CGAL { \section BV_Intro Introduction -The basic viewer package provides interactive visualization for most \cgal data structures, such as `Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. The functionality of the package is to render various geometric elements such as points, segments, rays, lines, faces, etc. +The basic viewer package provides interactive visualization for most \cgal packages, such as \ref PkgArrangementOnSurface2Ref "2D Arrangements", `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. -The most basic usage of the basic viewer is the use of the global `CGAL::draw()` function. There is one draw function for each \cgal package. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any... +The most simple use case of the basic viewer is the call of the global `draw()` function. There is one draw function for each \cgal package. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any, etc. -The drawing can be tuned using `CGAL::Graphics_scene_options`, for example to change the color of some cells or hide some cells. +The drawing can be tuned using `Graphics_scene_options`, for example to change the color of some cells or hide some cells. -More complex usage can be achieved by using the `CGAL::Graphics_scene` class. Several representations of different \cgal data structures can be added in a same `CGAL::Graphics_scene` allowing to visualize different models in a same window. Like for the draw function, the drawing parameters can be tuned thanks to the `CGAL::Graphics_scene_options`. +More complex usage can be achieved by using the `Graphics_scene` class. Different \cgal data structures can be added in a same `Graphics_scene` allowing to visualize them simultaneously in a same window. Like for the draw function, the drawing parameters can be tuned thanks to the `Graphics_scene_options`. -Two classes are based on Qt. (1) `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on Qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. +Two classes are based on \qt. (1) `CGAL::Qt::Basic_viewer` is a \qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on \qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. \section BV_SoftwareDesign Software Design @@ -31,9 +31,9 @@ UML diagram of the classes and functions of the package (only partial representa \cgalFigureEnd -\section BV_BasicUsage Basic Usage: Global CGAL::draw Functions +\section BV_BasicUsage Basic Usage: The Global Draw Functions -A first simple solution provided to draw the different data structures of \cgal is the global function `CGAL::draw()` function. This function is templated by the type of the data structure to draw. The following example shows how it can be used. +A first simple solution provided to draw the different data structures of \cgal is the global `draw()` function. This function is templated by the type of the data structure to draw. The following example shows how it can be used. \cgalExample{Basic_viewer/draw_lcc.cpp} @@ -63,17 +63,17 @@ Key presses are mapped to specific actions, such as toggling the clipping plane,
  10. Clipping Plane: -The viewer includes support for a clipping plane, enableing users to selectively render parts of the scene. +The viewer includes support for a clipping plane, enabling users to selectively render parts of the scene. The clipping plane can be toggled on and off, and its rendering style can be modified (solid, wireframe, etc.).
  11. -\subsection BV_GraphicSceneOptions Tune the drawing thanks to Graphics Scene Options +\subsection BV_GraphicSceneOptions Tuning with Graphics Scene Options -There is one specialization of each draw function that takes graphics scene options as parameter, allowing to tune the drawing. +There is one specialization of each draw function that takes graphics scene options as additional parameter, allowing to tune the drawing. -The `Graphics_scene_options` class is responsible for providing a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. +The `Graphics_scene_options` class provides a set of options and customization parameters for rendering geometric structures in a graphics scene. Its main purpose is to allow users to control the visual appearance of various cells such as vertices, edges, faces, and volumes in a graphical representation of a given data structure. -The following example shows how to use graphics scene options to tune the drawing of a surface mesh. We define our own class `My_graphics_scene_options` that inherits from `CGAL::Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. +The following example shows how to use graphics scene options to tune the drawing of a surface mesh. We define our own class `My_graphics_scene_options` that inherits from `Graphics_scene_options` to get all the default parameters. In this class, we only override the two methods `colored_vertex` and `vertex_color` to draw all vertices in color, and chose randomly green or blue colors for one out of two vertices. \cgalExample{Basic_viewer/draw_surface_mesh_vcolor.cpp} @@ -83,7 +83,7 @@ The result of this example can be shown in \cgalFigureRef{basic_viewer_ex2}. Example of tuned drawing of a 3D surface mesh where some vertex colors are changed. \cgalFigureEnd -The drawing options can depend on the cells. Inthe following example the color of each face depends on its height. +The drawing options can depend on the cells. In the following example the color of each face depends on its height. \cgalExample{Basic_viewer/draw_surface_mesh_height.cpp} @@ -96,15 +96,15 @@ Example of mesh drawing with a color for each face computed depending on its hei \section BV_GraphicsScene The Graphics Scene -It is possible to do more advanced visualizations by using the class `CGAL::Graphics_scene`. It is a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements, possibly with individual colors. Things are a little bit different for faces. You must call `face_begin()` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face()`, and call `face_end()` to finish the face. Note that the given polygonal face is internally triangulated. +It is possible to do more advanced visualizations by using the class `Graphics_scene`. It is a container class for various geometric elements, such as points, segments, rays, lines, faces and texts. It provides several methods to add elements, possibly with individual colors. Things are a little bit different for faces. You must call `face_begin()` to start a new face (possibly with a color), add all the points in the face by using `add_point_in_face()`, and call `face_end()` to finish the face. Note that the given polygonal face is internally triangulated. -This class also stores the normal of the faces (computed automatically), and possibly the normal of the vertices that should be given by the users. +This class also stores the normal of the faces (computed automatically), and possibly the normal of the vertices that can be provided by the users. -Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `CGAL::add_to_graphics_scene()` that fills the scene using all the geometric elements of the given \cgal data structure. Like for the draw functions, there is an overload of `add_to_graphics_scene()` for each \cgal data structure (`Arrangement_on_surface_2`, `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`). +Users can either fill directly a `Graphics_scene` using these methods, or by using a global function `add_to_graphics_scene()` that fills the scene using all the geometric elements of a given \cgal data structure. Like for the draw functions, there is an overload of `add_to_graphics_scene()` for each \cgal package. -A `Graphics_scene` can be drawn using the basic viewer thanks to the `CGAL::draw_graphics_scene()` function. +A `Graphics_scene` can be drawn using the basic viewer thanks to the `draw_graphics_scene()` function. -The following example shows in a same viewer both a `CGAL::Point_set_3` and a `CGAL::Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene()` can use an optional `Graphics_scene_options` as parameter allowing to tune the drawing of the given data structure. In the example, we change the color of all vertices of the point set. +The following example shows in a same viewer both a `Point_set_3` and a `Polyhedron_3`. Note that, like the draw functions, each `add_to_graphics_scene()` can use an optional `Graphics_scene_options` as parameter allowing to tune the drawing of the given data structure. In the example, we change the color of all vertices of the point set. \cgalExample{Basic_viewer/draw_mesh_and_points.cpp} @@ -117,9 +117,9 @@ Example of drawing of a point cloud and a polyhedron in a same viewer. \section BV_BasicViewer The Basic Viewer Class -The class `CGAL::Qt::Basic_viewer` is a Qt widget that inherits from `QGLViewer` and mainly stores a `Graphics_scene` and allows to visualize it and interact with the scene. Since this class is a Qt widget, it can be used into more complex Qt code to create more advanced demos. +The class `CGAL::Qt::Basic_viewer` is a \qt widget that inherits from `QGLViewer` and mainly stores a `Graphics_scene` and allows to visualize it and interact with the scene. Since this class is a \qt widget, it can be used into more complex \qt code to create more advanced demos. -In the following example, we create two graphics scenes, one filled by a point cloud, a second one filled by the polyhedral surface reconstructed by the Poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. The two basic viewers are added into a same Qt layout allowing to visualize the two scenes side by side. +In the following example, we create two graphics scenes, one filled with a point cloud, a second one filled with the polyhedral surface reconstructed by the Poisson surface reconstruction method. Then, we create two basic viewers associated with these two scenes. The two basic viewers are added into a \qt layout allowing to visualize the two scenes side by side. \cgalExample{Basic_viewer/draw_several_windows.cpp} @@ -137,7 +137,7 @@ In the previous examples, the models are only drawn once and there is no interac It is possible to define such interactions thanks to the class `CGAL::Qt::QApplication_and_basic_viewer`. In this class, you can define your own function that is called automatically by the viewer when a user presses a key. This can be used to change some parameters and update the drawing accordingly. -We illustrate this possibility in the following example that shows a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is smaller than a certain threshold. This threshold can be updated by the user, pressing key 'I' to increase it and 'D' to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threshold changes, the graphics scene are recomputed to take into account the modification of the size threshold. +We illustrate this possibility in the following example that shows a surface mesh, while coloring the small faces in red. To do so, we use our own graphics scene options than change the color of a face depending on its size. A face is considered small if its size is below a certain threshold. This threshold can be updated by the user, pressing key 'I' to increase it and 'D' to decrease it. This is done in the key pressed function defined in the `QApplication_and_basic_viewer`. When the threshold changes, the graphics scene is recomputed to take the modification of the size threshold into account. \cgalExample{Basic_viewer/draw_surface_mesh_small_faces.cpp} @@ -150,7 +150,7 @@ Two examples of drawing of a mesh with small faces in red. Left: With the \section BV_Design Design and Implementation History -This package was started by Mostafa Ashraf during his 2022 GSoC project. Guillaume Damiand redeveloped almost entirely the package, examples and wrote the manual. +This package was started by Mostafa Ashraf during his 2022 GSoC project. Guillaume Damiand, who mentored the project, reworked large parts of the package, wrote examples and the manual. */ diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 4e505a4b6a28..3cc9aa7fd40f 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -12,7 +12,11 @@ \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin \cgalPkgAuthor{Guillaume Damiand} -\cgalPkgDesc{This package provides a basic viewer class TODO.} +\cgalPkgDesc{This package provides interactive visualization for most \cgal packages. +First, the function `draw()` is provided for each data structure. +Several data structures can be added to a same graphics scene and visualized simultaneously. +Rendering can be controlled (color, point size, etc.). +Finally a \qt widget is provided that can be integrated in the GUI of a user application.} \cgalPkgManuals{Chapter_Basic_viewer,PkgBasicViewerRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin From 41ebe968dfde50e907e2b766dd5bed3bf7929857 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 15:52:24 +0100 Subject: [PATCH 330/341] change draw height color examples --- Basic_viewer/examples/Basic_viewer/CMakeLists.txt | 2 ++ .../Basic_viewer/draw_surface_mesh_height.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index c1b97ddd9e75..f758661d6bb7 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -29,6 +29,8 @@ if(CGAL_Qt6_FOUND) target_link_libraries(draw_surface_mesh_height PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_surface_mesh_vcolor PUBLIC CGAL::CGAL_Basic_viewer) +else() + message("CGAL_Qt6 not configured: examples that require Qt will not be compiled.") endif() if(TARGET CGAL::Eigen3_support) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp index e81063b85dad..719ac3254edc 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_height.cpp @@ -18,33 +18,33 @@ struct Colored_faces_given_height: { if(sm.is_empty()) return; - double m_min_z=0., m_max_z=0.; + double m_min_y=0., m_max_y=0.; bool first=true; for(typename Mesh::Vertex_index vi: sm.vertices()) { if(first) - { m_min_z=sm.point(vi).z(); m_max_z=m_min_z; first=false; } + { m_min_y=sm.point(vi).y(); m_max_y=m_min_y; first=false; } else { - m_min_z=(std::min)(m_min_z, sm.point(vi).z()); - m_max_z=(std::max)(m_max_z, sm.point(vi).z()); + m_min_y=(std::min)(m_min_y, sm.point(vi).y()); + m_max_y=(std::max)(m_max_y, sm.point(vi).y()); } } this->colored_face=[](const Mesh &, typename Mesh::Face_index)->bool { return true; }; - this->face_color=[m_min_z, m_max_z] + this->face_color=[m_min_y, m_max_y] (const Mesh& sm, typename Mesh::Face_index fi)->CGAL::IO::Color { double res=0.; std::size_t n=0; for(typename Mesh::Vertex_index vi: vertices_around_face(sm.halfedge(fi), sm)) { - res+=sm.point(vi).z(); + res+=sm.point(vi).y(); ++n; } // Random color depending on the "height" of the facet - CGAL::Random random(static_cast(30*((res/n)-m_min_z)/(m_max_z-m_min_z))); + CGAL::Random random(static_cast(30*((res/n)-m_min_y)/(m_max_y-m_min_y))); return CGAL::get_random_color(random); }; } From eb03647cb17c468ec18e5dd59a5e4a33cbbc9380 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 16:45:02 +0100 Subject: [PATCH 331/341] Rename variable for graphics scene --- .../draw_surface_mesh_small_faces.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp index 3275b40981c3..396f3a9a8149 100644 --- a/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp +++ b/Basic_viewer/examples/Basic_viewer/draw_surface_mesh_small_faces.cpp @@ -99,17 +99,17 @@ int main(int argc, char* argv[]) { faces_size[fd]=CGAL::Polygon_mesh_processing::face_area(fd, sm); } Graphics_scene_options_small_faces gsosm(sm); - CGAL::Graphics_scene buffer; + CGAL::Graphics_scene gs; - add_to_graphics_scene(sm, buffer, gsosm); + add_to_graphics_scene(sm, gs, gsosm); #ifdef CGAL_USE_BASIC_VIEWER - CGAL::Qt::QApplication_and_basic_viewer app(buffer, "Small faces"); + CGAL::Qt::QApplication_and_basic_viewer app(gs, "Small faces"); if(app) { app.basic_viewer().on_key_pressed= - [&sm, &gsosm, &buffer] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool + [&sm, &gsosm, &gs] (QKeyEvent* e, CGAL::Qt::Basic_viewer* basic_viewer) -> bool { const ::Qt::KeyboardModifiers modifiers = e->modifiers(); if ((e->key() == ::Qt::Key_I) && (modifiers == ::Qt::NoButton)) @@ -119,8 +119,8 @@ int main(int argc, char* argv[]) basic_viewer->displayMessage (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); - buffer.clear(); - add_to_graphics_scene(sm, buffer, gsosm); + gs.clear(); + add_to_graphics_scene(sm, gs, gsosm); basic_viewer->redraw(); } else if ((e->key() == ::Qt::Key_D) && (modifiers == ::Qt::NoButton)) @@ -130,8 +130,8 @@ int main(int argc, char* argv[]) basic_viewer->displayMessage (QString("Small faces threshold=%1.").arg(gsosm.m_threshold)); - buffer.clear(); - add_to_graphics_scene(sm, buffer, gsosm); + gs.clear(); + add_to_graphics_scene(sm, gs, gsosm); basic_viewer->redraw(); } else From 4d1a4b039449f5512f7f652069de3261bf995e94 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 16:45:21 +0100 Subject: [PATCH 332/341] Basic viewer user manual: several fixes --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 16 +++++++++++++++- .../doc/Basic_viewer/PackageDescription.txt | 10 ++++++---- Basic_viewer/doc/Basic_viewer/dependencies | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index bad2f92a673a..87896219fda3 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -11,7 +11,21 @@ namespace CGAL { \section BV_Intro Introduction -The basic viewer package provides interactive visualization for most \cgal packages, such as \ref PkgArrangementOnSurface2Ref "2D Arrangements", `Boolean_set_operations_2`, `Linear_cell_complex`, `Nef_3`, `Periodic_2_triangulation_2`, `Point_set_3`, `Polygon`, `Polyhedron`, `Straight_skeleton_2`, `Surface_mesh`, `Triangulation_2`, `Triangulation_3`, `Voronoi_diagram_2`, and more. +The basic viewer package provides interactive visualization for most \cgal packages, such as +\ref PkgArrangementOnSurface2Ref "2D Arrangements", +\ref PkgBooleanSetOperations2Ref "2D Boolean Set", +\ref PkgLinearCellComplexRef "Linear cell complex", +\ref PkgNef3Ref "3D Nef", +\ref PkgPeriodic2Triangulation2Ref "2D Periodic Triangulations", +\ref PkgPointSet3Ref "3D Point Set", +\ref PkgPolygon2Ref "2D Polygon", +\ref PkgPolyhedronRef "3D Polyhedral Surface", +\ref PkgStraightSkeleton2Ref "2D Straight Skeleton", +\ref PkgSurface_mesh "Surface Mesh", +\ref PkgTriangulation2Ref "2D Triangulation", +\ref PkgTriangulation3Ref "3D Triangulation", +\ref PkgVoronoiDiagram2Ref "2D Voronoi Diagram", +and more. The most simple use case of the basic viewer is the call of the global `draw()` function. There is one draw function for each \cgal package. Such a call opens a new interactive window showing the given model and allowing to navigate in the scene, show or hide some specific cells, show the interior of the model if any, etc. diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 3cc9aa7fd40f..7891cc174474 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -46,9 +46,10 @@ Finally a \qt widget is provided that can be integrated in the GUI of a user app - `CGAL::Arrangement_2` \link PkgArrangementOnSurface2Draw CGAL::draw() \endlink - `CGAL::Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::draw() \endlink -- `CGAL::Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- `CGAL::Linear_cell_complex_for_combinatorial_map` \link PkgDrawLinearCellComplex CGAL::draw() \endlink +- `CGAL::Linear_cell_complex_for_generalized_map` \link PkgDrawLinearCellComplex CGAL::draw() \endlink - `CGAL::Nef_polyhedron_3` \link PkgDrawNef3 CGAL::draw() \endlink -- `CGAL::Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink +- `CGAL::Periodic_2_triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::draw() \endlink - `CGAL::Point_set_3` \link PkgDrawPointSet3D CGAL::draw() \endlink - `CGAL::Polygon_2` \link PkgDrawPolygon2 CGAL::draw() \endlink - `CGAL::Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::draw() \endlink @@ -64,9 +65,10 @@ Finally a \qt widget is provided that can be integrated in the GUI of a user app - `CGAL::Arrangement_2` \link PkgArrangementOnSurface2Draw CGAL::add_to_graphics_scene() \endlink - `CGAL::Constrained_triangulation_2` \link PkgDrawTriangulation2 CGAL::add_to_graphics_scene() \endlink -- `CGAL::Linear_cell_complex` \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink +- `CGAL::Linear_cell_complex_for_combinatorial_map` \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink +- `CGAL::Linear_cell_complex_for_generalized_map` \link PkgDrawLinearCellComplex CGAL::add_to_graphics_scene() \endlink - `CGAL::Nef_polyhedron_3` \link PkgDrawNef3 CGAL::add_to_graphics_scene() \endlink -- `CGAL::Periodic_2_Triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::add_to_graphics_scene() \endlink +- `CGAL::Periodic_2_triangulation_2` \link PkgDrawPeriodic2Triangulation2 CGAL::add_to_graphics_scene() \endlink - `CGAL::Point_set_3` \link PkgDrawPointSet3D CGAL::add_to_graphics_scene() \endlink - `CGAL::Polygon_2` \link PkgDrawPolygon2 CGAL::add_to_graphics_scene() \endlink - `CGAL::Polygon_set_2` \link PkgDrawPolygonSet2 CGAL::add_to_graphics_scene() \endlink diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index 296159a45e74..c684a90bb27f 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -6,6 +6,7 @@ Periodic_2_triangulation_2 Point_set_3 Polygon Polyhedron +Straight_skeleton_2 Surface_mesh Surface_mesh_topology Triangulation_2 From ff4a201b2aaae5561559d80b4b02f2aaba0c24fe Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 16:49:29 +0100 Subject: [PATCH 333/341] bibtex --- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 7891cc174474..07d666823950 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -11,7 +11,7 @@ \cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin -\cgalPkgAuthor{Guillaume Damiand} +\cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} \cgalPkgDesc{This package provides interactive visualization for most \cgal packages. First, the function `draw()` is provided for each data structure. Several data structures can be added to a same graphics scene and visualized simultaneously. @@ -21,7 +21,7 @@ Finally a \qt widget is provided that can be integrated in the GUI of a user app \cgalPkgSummaryEnd \cgalPkgShortInfoBegin \cgalPkgSince{6.0} -\cgalPkgBib{cgal:XXX} +\cgalPkgBib{cgal:d-bv-24} \cgalPkgLicense{\ref licensesLGPL "LGPL"} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd From 70d398b6927461a34e1bd8d9dcd6b60b376e289e Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 17:41:43 +0100 Subject: [PATCH 334/341] add examples of drawing of polygon with holes --- Polygon/examples/Polygon/CMakeLists.txt | 1 + .../Polygon/draw_polygon_with_holes_2.cpp | 46 +++++++++++++++++++ .../CGAL/draw_multipolygon_with_holes_2.h | 32 +++++++------ 3 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 Polygon/examples/Polygon/draw_polygon_with_holes_2.cpp diff --git a/Polygon/examples/Polygon/CMakeLists.txt b/Polygon/examples/Polygon/CMakeLists.txt index 1d559bbe210d..d70f0d7df184 100644 --- a/Polygon/examples/Polygon/CMakeLists.txt +++ b/Polygon/examples/Polygon/CMakeLists.txt @@ -18,5 +18,6 @@ endforeach() if(CGAL_Qt6_FOUND) target_link_libraries(draw_polygon PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_polygon_with_holes PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polygon_with_holes_2 PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_multipolygon_with_holes PUBLIC CGAL::CGAL_Basic_viewer) endif() diff --git a/Polygon/examples/Polygon/draw_polygon_with_holes_2.cpp b/Polygon/examples/Polygon/draw_polygon_with_holes_2.cpp new file mode 100644 index 000000000000..3306655a135f --- /dev/null +++ b/Polygon/examples/Polygon/draw_polygon_with_holes_2.cpp @@ -0,0 +1,46 @@ +/*! \file draw_polygon_with_holes_2.cpp + */ + +#include +#include +#include +#include + +using K=CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_2=K::Point_2; +using Polygon_2=CGAL::Polygon_2; +using Polygon_with_holes_2=CGAL::Polygon_with_holes_2; + +Polygon_2 triangle(double x, double y) +{ // Create a triangle (x, y) + Polygon_2 P; + P.push_back(Point_2(x, y)); + P.push_back(Point_2(x+0.5, y+1)); + P.push_back(Point_2(x+1, y)); + return P; +} + +Polygon_2 rectangle(double l) +{ // Create a rectangle with given side length. + Polygon_2 P; + P.push_back(Point_2(0, 0)); + P.push_back(Point_2(l, 0)); + P.push_back(Point_2(l, l)); + P.push_back(Point_2(0, l)); + return P; +} + +int main() +{ + // Create a large rectangle A, with 3 triangle holes + Polygon_with_holes_2 A(rectangle(4)); + Polygon_2 H1(triangle(1, 1)); + Polygon_2 H2(triangle(2, 1)); + Polygon_2 H3(triangle(1.5, 2)); + A.add_hole(H1); + A.add_hole(H2); + A.add_hole(H3); + CGAL::draw(A); + + return 0; +} diff --git a/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h b/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h index 909b4b29da82..1584845f19f1 100644 --- a/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h @@ -18,7 +18,7 @@ #ifndef CGAL_DRAW_MULTIPOLYGON_WITH_HOLES_2_H #define CGAL_DRAW_MULTIPOLYGON_WITH_HOLES_2_H -#include +#include #ifdef DOXYGEN_RUNNING namespace CGAL { @@ -53,8 +53,8 @@ namespace CGAL { // Viewer class for Multipolygon_with_holes_2 template -class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { - using Base = Basic_viewer_qt; +class Mpwh_2_basic_viewer_qt : public Qt::Basic_viewer { + using Base = Qt::Basic_viewer; using Mpwh = Multipolygon; using Pwh = typename Mpwh::Polygon_with_holes_2; using Pgn = typename Mpwh::Polygon_2; @@ -67,7 +67,7 @@ class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { /// @param title the title of the window Mpwh_2_basic_viewer_qt(QWidget* parent, const Mpwh& mpwh, const char* title = "Basic Multipolygon_with_holes_2 Viewer") : - Base(parent, title, true, true, true, false, false), + Base(parent, gs, title, true, true, true, false, false), m_mpwh(mpwh) { if (mpwh.number_of_polygons_with_holes() == 0) return; @@ -109,11 +109,11 @@ class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { /*! Compute the elements of a multipolygon with holes. */ void add_elements() { - clear(); + gs.clear(); for (auto const& p: m_mpwh.polygons_with_holes()) { CGAL::IO::Color c(rand()%255,rand()%255,rand()%255); - face_begin(c); + gs.face_begin(c); const Pnt* point_in_face; const auto& outer_boundary = p.outer_boundary(); @@ -122,10 +122,10 @@ class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { for (auto it = p.holes_begin(); it != p.holes_end(); ++it) { compute_loop(*it, true); - add_point_in_face(*point_in_face); + gs.add_point_in_face(*point_in_face); } - face_end(); + gs.face_end(); } } @@ -133,21 +133,21 @@ class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { /*! Compute the face */ void compute_loop(const Pgn& p, bool hole) { - if (hole) add_point_in_face(p.vertex(p.size()-1)); + if (hole) gs.add_point_in_face(p.vertex(p.size()-1)); auto prev = p.vertices_begin(); auto it = prev; - add_point(*it); - add_point_in_face(*it); + gs.add_point(*it); + gs.add_point_in_face(*it); for (++it; it != p.vertices_end(); ++it) { - add_segment(*prev, *it); // add segment with previous point - add_point(*it); - add_point_in_face(*it); // add point in face + gs.add_segment(*prev, *it); // add segment with previous point + gs.add_point(*it); + gs.add_point_in_face(*it); // add point in face prev = it; } // Add the last segment between the last point and the first one - add_segment(*prev, *(p.vertices_begin())); + gs.add_segment(*prev, *(p.vertices_begin())); } virtual void keyPressEvent(QKeyEvent* e) { @@ -166,6 +166,8 @@ class Mpwh_2_basic_viewer_qt : public Basic_viewer_qt { } private: + Graphics_scene gs; + //! The window width in pixels. int m_width = CGAL_BASIC_VIEWER_INIT_SIZE_X; From 6cf73a65a9bfbe531dc350e3038e5e0d7cadacfb Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 28 Mar 2024 18:24:22 +0100 Subject: [PATCH 335/341] minor changes --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 8 +++++--- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 87896219fda3..799855f1d813 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -33,14 +33,16 @@ The drawing can be tuned using `Graphics_scene_options`, for example to change t More complex usage can be achieved by using the `Graphics_scene` class. Different \cgal data structures can be added in a same `Graphics_scene` allowing to visualize them simultaneously in a same window. Like for the draw function, the drawing parameters can be tuned thanks to the `Graphics_scene_options`. -Two classes are based on \qt. (1) `CGAL::Qt::Basic_viewer` is a \qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on \qt that eases the creation of OpenGL 3D viewers). (2) `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. +Two classes are based on \qt. + - `CGAL::Qt::Basic_viewer` is a \qt widget that inherits from `QGLViewer` (libQGLViewer is an open source C++ library based on \qt that eases the creation of OpenGL 3D viewers). + - `CGAL::Qt::QApplication_and_basic_viewer` which regroups a `Qt::QApplication` and a `CGAL::Qt::Basic_viewer`. \section BV_SoftwareDesign Software Design -The diagram in \cgalFigureRef{fig_basic_viewer_diagramme_class} shows the main classes and functions of this package. +The diagram in \cgalFigureRef{fig_basic_viewer_diagram_class} shows the main classes and functions of this package. -\cgalFigureBegin{fig_basic_viewer_diagramme_class,basic_viewer_diagramme_class.svg} +\cgalFigureBegin{fig_basic_viewer_diagram_class,basic_viewer_diagramme_class.svg} UML diagram of the classes and functions of the package (only partial representation). \cgalFigureEnd diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index 07d666823950..aa919ce3e389 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -21,7 +21,7 @@ Finally a \qt widget is provided that can be integrated in the GUI of a user app \cgalPkgSummaryEnd \cgalPkgShortInfoBegin \cgalPkgSince{6.0} -\cgalPkgBib{cgal:d-bv-24} +\cgalPkgBib{cgal:d-bv} \cgalPkgLicense{\ref licensesLGPL "LGPL"} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd From 57aa719fbe30c856232c0fd53724ac1a42d43fe3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 18:43:26 +0100 Subject: [PATCH 336/341] do not use white as random color --- Polygon/include/CGAL/draw_multipolygon_with_holes_2.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h b/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h index 1584845f19f1..8950956786eb 100644 --- a/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_multipolygon_with_holes_2.h @@ -112,8 +112,7 @@ class Mpwh_2_basic_viewer_qt : public Qt::Basic_viewer { gs.clear(); for (auto const& p: m_mpwh.polygons_with_holes()) { - CGAL::IO::Color c(rand()%255,rand()%255,rand()%255); - gs.face_begin(c); + gs.face_begin(get_random_color(get_default_random())); const Pnt* point_in_face; const auto& outer_boundary = p.outer_boundary(); From da217566d0e77cf68beb593ea8a7151840cf5004 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 18:43:56 +0100 Subject: [PATCH 337/341] Update triangulation method in buffer for vao to deal with some nested polygonal faces --- Basic_viewer/include/CGAL/Buffer_for_vao.h | 98 ++++++++++------------ 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/Basic_viewer/include/CGAL/Buffer_for_vao.h b/Basic_viewer/include/CGAL/Buffer_for_vao.h index 3ed3515273a3..d7c9619619ad 100644 --- a/Basic_viewer/include/CGAL/Buffer_for_vao.h +++ b/Basic_viewer/include/CGAL/Buffer_for_vao.h @@ -125,6 +125,35 @@ namespace internal static const typename Local_kernel::Ray_2& get_local_ray(const typename Local_kernel::Ray_2& r) { return r; } }; + + template + void mark_domains(CDT& tri, + typename CDT::Face_handle start, int index, + std::queue& border) + { + if (start->info().m_nesting_level!=-1) return; + std::queue queue; + queue.push(start); + while (!queue.empty()) + { + auto fh=queue.front(); + queue.pop(); + if (fh->info().m_nesting_level==-1) + { + fh->info().m_nesting_level=index; + for (int i = 0; i < 3; i++) + { + typename CDT::Edge e(fh,i); + auto n = fh->neighbor(i); + if (n->info().m_nesting_level==-1) + { + if (tri.is_constrained(e)) { border.push(e); } + else { queue.push(n); } + } + } + } + } + } } // End namespace internal //------------------------------------------------------------------------------ @@ -738,62 +767,20 @@ class Buffer_for_vao { cdt.insert_constraint(previous, first); } } - // (2) We mark all external triangles - // (2.1) We initialize is_external and is_process values + // (2.1) We initialize nesting_level for(typename CDT::All_faces_iterator fit = cdt.all_faces_begin(), fitend = cdt.all_faces_end(); fit!=fitend; ++fit) - { - fit->info().is_external = true; - fit->info().is_process = false; - } - // (2.2) We check if the facet is external or internal - std::queue face_queue, faces_internal; - if (cdt.infinite_vertex()->face()!=nullptr) - { - typename CDT::Face_circulator - incident_faces(cdt.infinite_vertex()), end_incident_faces(incident_faces); - do - { face_queue.push(incident_faces); } - while(++incident_faces!=end_incident_faces); - } - // std::cout<<"# faces PUSHED "<info().is_process) - { - fh->info().is_process=true; - for(int i=0; i<3; ++i) - { - if(!cdt.is_constrained(std::make_pair(fh, i))) - { - if (fh->neighbor(i)!=nullptr) - { face_queue.push(fh->neighbor(i)); } - } - else - { faces_internal.push(fh->neighbor(i)); } - } - } - } + { fit->info().m_nesting_level=-1; } - while(!faces_internal.empty()) + std::queue border; + internal::mark_domains(cdt, cdt.infinite_face(), 0, border); + while(!border.empty()) { - typename CDT::Face_handle fh=faces_internal.front(); - faces_internal.pop(); - if(!fh->info().is_process) - { - fh->info().is_process = true; - fh->info().is_external = false; - for(unsigned int i=0; i<3; ++i) - { - if(!cdt.is_constrained(std::make_pair(fh, i))) - { - if (fh->neighbor(i)!=nullptr) - { faces_internal.push(fh->neighbor(i)); } - } - } - } + auto e=border.front(); + border.pop(); + auto n=e.first->neighbor(e.second); + if (n->info().m_nesting_level==-1) + { internal::mark_domains(cdt, n, e.first->info().m_nesting_level+1, border); } } // (3) Now we iterates on the internal faces to add the vertices @@ -801,7 +788,7 @@ class Buffer_for_vao for(typename CDT::Finite_faces_iterator ffit=cdt.finite_faces_begin(), ffitend = cdt.finite_faces_end(); ffit!=ffitend; ++ffit) { - if(!ffit->info().is_external) + if(ffit->info().in_domain()) { for(unsigned int i=0; i<3; ++i) { @@ -883,9 +870,8 @@ class Buffer_for_vao struct Face_info { - bool exist_edge[3]; - bool is_external; - bool is_process; + int m_nesting_level=-1; + bool in_domain() { return m_nesting_level%2==1; } }; typedef CGAL::Projection_traits_3 P_traits; From 8869ab3b8fb897b9ea9a845e7f2e4574682b36a1 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 19:31:57 +0100 Subject: [PATCH 338/341] dependencies for core --- Basic_viewer/package_info/Basic_viewer/dependencies | 1 + .../package_info/Periodic_2_triangulation_2/dependencies | 1 + Point_set_3/package_info/Point_set_3/dependencies | 1 + Polygon/package_info/Polygon/dependencies | 1 + Polyhedron/package_info/Polyhedron/dependencies | 1 + Surface_mesh/package_info/Surface_mesh/dependencies | 1 + Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies | 1 + 7 files changed, 7 insertions(+) diff --git a/Basic_viewer/package_info/Basic_viewer/dependencies b/Basic_viewer/package_info/Basic_viewer/dependencies index ea5d80f6165c..8533556ba081 100644 --- a/Basic_viewer/package_info/Basic_viewer/dependencies +++ b/Basic_viewer/package_info/Basic_viewer/dependencies @@ -26,3 +26,4 @@ Spatial_sorting Stream_support TDS_2 Triangulation_2 +CGAL_Core diff --git a/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies b/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies index 3681bf5ae04b..fa072ac62995 100644 --- a/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies +++ b/Periodic_2_triangulation_2/package_info/Periodic_2_triangulation_2/dependencies @@ -27,3 +27,4 @@ Spatial_sorting Stream_support TDS_2 Triangulation_2 +CGAL_Core diff --git a/Point_set_3/package_info/Point_set_3/dependencies b/Point_set_3/package_info/Point_set_3/dependencies index fec9cf39bc0b..5b0eb897d7ef 100644 --- a/Point_set_3/package_info/Point_set_3/dependencies +++ b/Point_set_3/package_info/Point_set_3/dependencies @@ -29,3 +29,4 @@ Stream_support Surface_mesh TDS_2 Triangulation_2 +CGAL_Core diff --git a/Polygon/package_info/Polygon/dependencies b/Polygon/package_info/Polygon/dependencies index ea5d80f6165c..8533556ba081 100644 --- a/Polygon/package_info/Polygon/dependencies +++ b/Polygon/package_info/Polygon/dependencies @@ -26,3 +26,4 @@ Spatial_sorting Stream_support TDS_2 Triangulation_2 +CGAL_Core diff --git a/Polyhedron/package_info/Polyhedron/dependencies b/Polyhedron/package_info/Polyhedron/dependencies index 64c00615ce37..7ab360cb4710 100644 --- a/Polyhedron/package_info/Polyhedron/dependencies +++ b/Polyhedron/package_info/Polyhedron/dependencies @@ -29,3 +29,4 @@ Spatial_sorting Stream_support TDS_2 Triangulation_2 +CGAL_Core diff --git a/Surface_mesh/package_info/Surface_mesh/dependencies b/Surface_mesh/package_info/Surface_mesh/dependencies index 5b83e82360eb..1e1a85b5e663 100644 --- a/Surface_mesh/package_info/Surface_mesh/dependencies +++ b/Surface_mesh/package_info/Surface_mesh/dependencies @@ -27,3 +27,4 @@ Stream_support Surface_mesh TDS_2 Triangulation_2 +CGAL_Core diff --git a/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies b/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies index d2c77619e206..b92af4a0b3ba 100644 --- a/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies +++ b/Voronoi_diagram_2/package_info/Voronoi_diagram_2/dependencies @@ -28,3 +28,4 @@ Stream_support TDS_2 Triangulation_2 Voronoi_diagram_2 +CGAL_Core From 7f6505c193ceac14c13eba4709157101c5be9eaf Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Mar 2024 19:39:37 +0100 Subject: [PATCH 339/341] update changes --- Installation/CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 906bd670cf89..f0fb08b6cb70 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -10,7 +10,8 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. -- The demos as well as the `draw()` functions using the `Basic_viewer` are based on Qt6 +- The demos as well as the `Basic_viewer` are based on Qt6. +- The `Basic_viewer` is improved and documented. - **Breaking change**: The usage of `boost::shared_ptr` has been replaced by `std::shared_ptr`. Packages affected are 2D Straight Line Skeleton and Shape Detection. - **Breaking change**: The usage of `boost::optional` has been replaced by `std::optional`. Packages affected are 2D Straight Line Skeleton, 3D Fast Intersection and Distance Computation (AABB Tree), and the Kernel intersection. - **Breaking change**: The usage of `boost::variant` has been replaced by `std::variant`. Packages affected are 2D Arrangements, and the Kernel intersection. From 8fe576c4509afe04f713f50e7b3f0f38f44bfaeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 4 Apr 2024 13:20:55 +0200 Subject: [PATCH 340/341] use and --- Basic_viewer/doc/Basic_viewer/Basic_viewer.txt | 2 +- Basic_viewer/doc/Basic_viewer/PackageDescription.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt index 799855f1d813..970ddbd5f5f5 100644 --- a/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt +++ b/Basic_viewer/doc/Basic_viewer/Basic_viewer.txt @@ -5,7 +5,7 @@ namespace CGAL { \anchor Chapter_Basic_viewer \anchor ChapterBasicViewer -\author Guillaume Damiand, Mostafa Ashraf +\author Guillaume Damiand and Mostafa Ashraf \cgalAutoToc diff --git a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt index aa919ce3e389..d90a773fed56 100644 --- a/Basic_viewer/doc/Basic_viewer/PackageDescription.txt +++ b/Basic_viewer/doc/Basic_viewer/PackageDescription.txt @@ -11,7 +11,7 @@ \cgalPkgDescriptionBegin{Basic Viewer,PkgBasicViewer} \cgalPkgPicture{basic_viewer_logo.png} \cgalPkgSummaryBegin -\cgalPkgAuthor{Guillaume Damiand, Mostafa Ashraf} +\cgalPkgAuthor{Guillaume Damiand and Mostafa Ashraf} \cgalPkgDesc{This package provides interactive visualization for most \cgal packages. First, the function `draw()` is provided for each data structure. Several data structures can be added to a same graphics scene and visualized simultaneously. From cb8e88075d83656d1a3c30db4e05aabd87054ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 4 Apr 2024 14:26:23 +0200 Subject: [PATCH 341/341] delete allocated objects --- Basic_viewer/include/CGAL/Qt/Basic_viewer.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h index dafa07e8a27b..20ef729341d1 100644 --- a/Basic_viewer/include/CGAL/Qt/Basic_viewer.h +++ b/Basic_viewer/include/CGAL/Qt/Basic_viewer.h @@ -167,6 +167,14 @@ class Basic_viewer : public CGAL::QGLViewer for (unsigned int i=0; i