From 7d4f5a3b2bcc787d7bfcc8833cd3e5b4bbec7fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 26 May 2023 18:14:09 +0200 Subject: [PATCH] Add transformed polygon soup items --- ...cene_aff_transformed_polygon_soup_item.cpp | 111 ++++++++++++++++ .../Scene_aff_transformed_polygon_soup_item.h | 118 ++++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp create mode 100644 Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.h diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp new file mode 100644 index 00000000000..4aa45a823fc --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp @@ -0,0 +1,111 @@ +#include "Scene_aff_transformed_polygon_soup_item.h" + +#include +#include +#include + +#include + +using namespace CGAL::Three; + +Scene_aff_transformed_polygon_soup_item:: +Scene_aff_transformed_polygon_soup_item(Scene_polygon_soup_item* ps_item, + const CGAL::qglviewer::Vec& pos) + : Scene_aff_transformed_item(pos) +{ + d = new Scene_aff_transformed_polygon_soup_item_priv(ps_item, pos); + setEdgeContainer(0, new Edge_container(Viewer_interface::PROGRAM_NO_SELECTION, false)); + compute_bbox(); + invalidateOpenGLBuffers(); + + connect(ps_item, &Scene_polygon_soup_item::itemChanged , + this, &Scene_aff_transformed_polygon_soup_item::updateCache); +} + +Scene_aff_transformed_polygon_soup_item:: +~Scene_aff_transformed_polygon_soup_item() +{ + delete d; +} + +void +Scene_aff_transformed_polygon_soup_item:: +updateCache() +{ + compute_bbox(); + invalidateOpenGLBuffers(); +} + +QString +Scene_aff_transformed_polygon_soup_item:: +toolTip() const +{ + return QObject::tr("

Affine transformation of %1

" + "

Keep Ctrl pressed and use the arcball to define an affine transformation.
" + "Press S to apply the affine transformation to a copy of %1.

") + .arg(d->ps_item->name()); +} + +void +Scene_aff_transformed_polygon_soup_item:: +invalidateOpenGLBuffers() +{ + setBuffersFilled(false); + getEdgeContainer(0)->reset_vbos(ALL); +} + +void +Scene_aff_transformed_polygon_soup_item:: +initializeBuffers(Viewer_interface *v) const +{ + getEdgeContainer(0)->initializeBuffers(v); + getEdgeContainer(0)->setFlatDataSize(d->nb_lines); + d->positions_lines.clear(); + d->positions_lines.shrink_to_fit(); +} + +void +Scene_aff_transformed_polygon_soup_item:: +compute_bbox() const +{ + setBbox(d->ps_item->bbox()); +} + +void +Scene_aff_transformed_polygon_soup_item:: +computeElements() const +{ + d->compute_elements(); + + getEdgeContainer(0)->allocate(Edge_container::Vertices, + d->positions_lines.data(), + static_cast(d->positions_lines.size()*sizeof(float))); + d->nb_lines = d->positions_lines.size(); + + setBuffersFilled(true); +} + +void +Scene_aff_transformed_polygon_soup_item:: +drawEdges(CGAL::Three::Viewer_interface* viewer) const +{ + if(!isInit(viewer)) + initGL(viewer); + + if(getBuffersFilled() && !getBuffersInit(viewer)) + { + initializeBuffers(viewer); + setBuffersInit(viewer, true); + } + + if(!getBuffersFilled()) + { + computeElements(); + initializeBuffers(viewer); + } + + Edge_container* ec = getEdgeContainer(0); + ec->setColor(this->color()); + ec->setFrameMatrix(this->getFMatrix()); + ec->draw(viewer, true); +} \ No newline at end of file diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.h b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.h new file mode 100644 index 00000000000..f4442ffb6dd --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_polygon_soup_item.h @@ -0,0 +1,118 @@ +#ifndef SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_H +#define SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_H + +#if defined( scene_aff_transformed_item_EXPORTS) +# define SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_EXPORT Q_DECL_EXPORT +#else +# define SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_EXPORT Q_DECL_IMPORT +#endif + +#include "Kernel_type.h" +#include "Scene_polygon_soup_item.h" +#include "Scene_aff_transformed_item.h" + +#include +#include +#include +#include + +#include +#include + +#include + +#include + +using namespace CGAL::Three; + +struct Scene_aff_transformed_polygon_soup_item_priv +{ + using Point = Kernel::Point_3; + + Scene_polygon_soup_item* ps_item; + mutable std::vector positions_lines; + mutable std::size_t nb_lines; + + CGAL::qglviewer::Vec center_; + +public: + Scene_aff_transformed_polygon_soup_item_priv(Scene_polygon_soup_item* ps_item, + const CGAL::qglviewer::Vec& pos) + : ps_item(ps_item), + center_(pos) + { + nb_lines = 0; + } + + ~Scene_aff_transformed_polygon_soup_item_priv() { } + + void compute_elements() const + { + if(!ps_item) + return; + + QApplication::setOverrideCursor(Qt::WaitCursor); + + const auto& points = ps_item->points(); + const auto& polygons = ps_item->polygons(); + + for(std::size_t i=0; ips_item; } + const CGAL::qglviewer::Vec& center() const Q_DECL_OVERRIDE { return d->center_; } + + CGAL::Three::Scene_item* clone() const Q_DECL_OVERRIDE { return nullptr; } + QString name() const Q_DECL_OVERRIDE { return tr("%1_transformed").arg(d->ps_item->name()); } + QString toolTip() const Q_DECL_OVERRIDE; + + void updateCache(); + + bool isEmpty() const Q_DECL_OVERRIDE { return (d->nb_lines == 0); } + + virtual bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE { return m == Wireframe ; } + virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE; + void initializeBuffers(CGAL::Three::Viewer_interface*) const Q_DECL_OVERRIDE; + + void compute_bbox() const Q_DECL_OVERRIDE; + void computeElements() const Q_DECL_OVERRIDE; + void drawEdges(CGAL::Three::Viewer_interface*) const Q_DECL_OVERRIDE; +}; + +#endif // SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_H