Add transformed polygon soup items

This commit is contained in:
Mael Rouxel-Labbé 2023-05-26 18:14:09 +02:00
parent 3ee53a44be
commit 7d4f5a3b2b
2 changed files with 229 additions and 0 deletions

View File

@ -0,0 +1,111 @@
#include "Scene_aff_transformed_polygon_soup_item.h"
#include <CGAL/Three/Viewer_interface.h>
#include <CGAL/Three/Three.h>
#include <CGAL/Three/Edge_container.h>
#include <QApplication>
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("<p>Affine transformation of <b>%1</b></p>"
"<p>Keep <b>Ctrl</b> pressed and use the arcball to define an affine transformation.<br />"
"Press <b>S</b> to apply the affine transformation to a copy of <b>%1</b>.</p>")
.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<int>(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);
}

View File

@ -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 <CGAL/Three/Scene_interface.h>
#include <CGAL/Three/Scene_item.h>
#include <CGAL/Three/Scene_item_rendering_helper.h>
#include <CGAL/Three/Three.h>
#include <CGAL/Qt/manipulatedFrame.h>
#include <CGAL/Qt/qglviewer.h>
#include <CGAL/Polygon_mesh_processing/bbox.h>
#include <vector>
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<float> 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; i<polygons.size(); ++i)
{
const std::size_t size = polygons[i].size();
for(std::size_t j=0; j<size; ++j)
{
const std::size_t& i0 = polygons[i][j];
const std::size_t& i1 = polygons[i][(j+1 < size) ? j+1: 0];
const Point& a = points[i0];
const Point& b = points[i1];
positions_lines.push_back(a.x() - center_.x);
positions_lines.push_back(a.y() - center_.y);
positions_lines.push_back(a.z() - center_.z);
positions_lines.push_back(b.x() - center_.x);
positions_lines.push_back(b.y() - center_.y);
positions_lines.push_back(b.z() - center_.z);
}
}
QApplication::restoreOverrideCursor();
}
};
class SCENE_AFF_TRANSFORMED_POLYGON_SOUP_ITEM_EXPORT Scene_aff_transformed_polygon_soup_item
: public Scene_aff_transformed_item
{
Q_OBJECT
protected:
friend Scene_aff_transformed_polygon_soup_item_priv;
Scene_aff_transformed_polygon_soup_item_priv* d;
public:
Scene_aff_transformed_polygon_soup_item(Scene_polygon_soup_item* item,
const CGAL::qglviewer::Vec& pos);
~Scene_aff_transformed_polygon_soup_item();
Scene_polygon_soup_item* item() { return d->ps_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