Add affine transformation of polygon soups + update transf when item updates

This commit is contained in:
Mael Rouxel-Labbé 2023-05-26 18:01:50 +02:00
parent d5c31fb2d1
commit 2914c6f79b
9 changed files with 100 additions and 22 deletions

View File

@ -270,12 +270,16 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND)
target_link_libraries(scene_tetrahedra_item PUBLIC scene_c3t3_item)
add_item(scene_aff_transformed_item Plugins/PCA/Scene_aff_transformed_item.cpp)
add_item(scene_aff_transformed_surface_mesh_item Plugins/PCA/Scene_aff_transformed_surface_mesh_item.cpp)
target_link_libraries(scene_aff_transformed_surface_mesh_item PUBLIC scene_surface_mesh_item
scene_aff_transformed_item)
add_item(scene_aff_transformed_point_set_item Plugins/PCA/Scene_aff_transformed_point_set_item.cpp)
target_link_libraries(scene_aff_transformed_point_set_item PUBLIC scene_points_with_normal_item
scene_aff_transformed_item)
add_item(scene_aff_transformed_polygon_soup_item Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp)
target_link_libraries(scene_aff_transformed_polygon_soup_item PUBLIC scene_polygon_soup_item
scene_aff_transformed_item)
add_item(scene_aff_transformed_surface_mesh_item Plugins/PCA/Scene_aff_transformed_surface_mesh_item.cpp)
target_link_libraries(scene_aff_transformed_surface_mesh_item PUBLIC scene_surface_mesh_item
scene_aff_transformed_item)
add_item(scene_edit_box_item Plugins/PCA/Scene_edit_box_item.cpp)

View File

@ -1,11 +1,13 @@
#include "ui_Transformation_widget.h"
#include "ui_MeshOnGrid_dialog.h"
#include "Scene_aff_transformed_surface_mesh_item.h"
#include "Scene_aff_transformed_point_set_item.h"
#include "Scene_aff_transformed_item.h"
#include "Scene_surface_mesh_item.h"
#include "Scene_aff_transformed_point_set_item.h"
#include "Scene_aff_transformed_polygon_soup_item.h"
#include "Scene_aff_transformed_surface_mesh_item.h"
#include "Scene_points_with_normal_item.h"
#include "Scene_polygon_soup_item.h"
#include "Scene_surface_mesh_item.h"
#include <CGAL/Three/Polyhedron_demo_plugin_helper.h>
#include <CGAL/Three/Point_container.h>
@ -55,7 +57,7 @@ class Polyhedron_demo_affine_transform_plugin
Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface)
Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0")
enum class Item_type { UNKNOWN, POINT_SET, POLYGON_MESH };
enum class Item_type { UNKNOWN, POINT_SET, POLYGON_SOUP, POLYGON_MESH };
using Generic_scene_aff_transformed_item = Scene_aff_transformed_item; // just for clarity
private:
@ -96,8 +98,9 @@ public:
if(a == actionGenerateItemGrid)
return qobject_cast<Scene_surface_mesh_item*>(scene->item(scene->mainSelectionIndex()));
return qobject_cast<Scene_surface_mesh_item*>(scene->item(scene->mainSelectionIndex()))
|| qobject_cast<Scene_points_with_normal_item*>(scene->item(scene->mainSelectionIndex()));
return qobject_cast<Scene_points_with_normal_item*>(scene->item(scene->mainSelectionIndex()))
|| qobject_cast<Scene_polygon_soup_item*>(scene->item(scene->mainSelectionIndex()))
|| qobject_cast<Scene_surface_mesh_item*>(scene->item(scene->mainSelectionIndex()));
}
void init(QMainWindow* _mw,
@ -157,6 +160,7 @@ public:
void start(SceneItem*);
void endPointSet(const QMatrix4x4& transform_matrix);
void endPolygonSoup(const QMatrix4x4& transform_matrix);
void endPolygonMesh(const QMatrix4x4& transform_matrix);
void end();
@ -586,6 +590,13 @@ transformItem()
return start<Scene_aff_transformed_point_set_item>(pts_item);
}
Scene_polygon_soup_item* ps_item = qobject_cast<Scene_polygon_soup_item*>(item);
if(ps_item)
{
aff_transformed_item_type = Item_type::POLYGON_SOUP;
return start<Scene_aff_transformed_polygon_soup_item>(ps_item);
}
Scene_surface_mesh_item* sm_item = qobject_cast<Scene_surface_mesh_item*>(item);
if(sm_item)
{
@ -606,12 +617,42 @@ endPointSet(const QMatrix4x4& transform_matrix)
for(Point_set::Index idx : *new_ps)
{
QVector3D vec = transform_matrix * QVector3D(new_ps->point(idx).x() - c.x,
new_ps->point(idx).y() - c.y,
new_ps->point(idx).z() - c.z);
new_ps->point(idx).y() - c.y,
new_ps->point(idx).z() - c.z);
new_ps->point(idx) = Kernel::Point_3(vec.x(), vec.y(), vec.z());
}
new_item->setName(aff_transformed_item->name());
Q_EMIT new_item->itemChanged();
scene->replaceItem(scene->item_id(aff_transformed_item), new_item, true /*emit about to be destroyed*/);
delete aff_transformed_item;
aff_transformed_item = nullptr;
}
void
Polyhedron_demo_affine_transform_plugin::
endPolygonSoup(const QMatrix4x4& transform_matrix)
{
Scene_aff_transformed_polygon_soup_item* aff_transformed_ps_item = static_cast<Scene_aff_transformed_polygon_soup_item*>(aff_transformed_item);
Scene_polygon_soup_item* new_item = new Scene_polygon_soup_item();
const auto& old_points = aff_transformed_ps_item->item()->points();
auto new_points = old_points;
CGAL::qglviewer::Vec c = aff_transformed_item->center();
for(Point_3& p : new_points)
{
QVector3D vec = transform_matrix * QVector3D(p.x() - c.x,
p.y() - c.y,
p.z() - c.z);
p = Kernel::Point_3(vec.x(), vec.y(), vec.z());
}
new_item->load(new_points, aff_transformed_ps_item->item()->polygons());
new_item->setName(aff_transformed_item->name());
new_item->invalidateOpenGLBuffers();
Q_EMIT new_item->itemChanged();
scene->replaceItem(scene->item_id(aff_transformed_item), new_item, true /*emit about to be destroyed*/);
delete aff_transformed_item;
@ -630,8 +671,8 @@ endPolygonMesh(const QMatrix4x4& transform_matrix)
auto transformation = [&c, &transform_matrix](const Kernel::Point_3& p) -> Kernel::Point_3
{
QVector3D vec = transform_matrix * QVector3D(p.x() - c.x,
p.y() - c.y,
p.z() - c.z);
p.y() - c.y,
p.z() - c.z);
return { vec.x(), vec.y(), vec.z() };
};
@ -672,6 +713,9 @@ end()
case Item_type::POINT_SET:
endPointSet(transform_matrix);
break;
case Item_type::POLYGON_SOUP:
endPolygonSoup(transform_matrix);
break;
case Item_type::POLYGON_MESH:
endPolygonMesh(transform_matrix);
break;

View File

@ -11,8 +11,9 @@ polyhedron_demo_plugin(affine_transform_plugin Affine_transform_plugin
target_link_libraries(affine_transform_plugin PUBLIC scene_surface_mesh_item
scene_points_with_normal_item
scene_aff_transformed_item
scene_aff_transformed_surface_mesh_item
scene_aff_transformed_point_set_item)
scene_aff_transformed_point_set_item
scene_aff_transformed_polygon_soup_item
scene_aff_transformed_surface_mesh_item)
polyhedron_demo_plugin(edit_box_plugin Edit_box_plugin)
target_link_libraries(edit_box_plugin PUBLIC scene_edit_box_item

View File

@ -19,6 +19,9 @@ Scene_aff_transformed_point_set_item(Scene_points_with_normal_item* pts_item,
setPointContainer(0, new Point_container(Viewer_interface::PROGRAM_NO_SELECTION, false));
compute_bbox();
invalidateOpenGLBuffers();
connect(pts_item, &Scene_points_with_normal_item::itemChanged ,
this, &Scene_aff_transformed_point_set_item::updateCache);
}
Scene_aff_transformed_point_set_item::
@ -27,6 +30,14 @@ Scene_aff_transformed_point_set_item::
delete d;
}
void
Scene_aff_transformed_point_set_item::
updateCache()
{
compute_bbox();
invalidateOpenGLBuffers();
}
QString
Scene_aff_transformed_point_set_item::
toolTip() const

View File

@ -31,7 +31,7 @@ struct Scene_aff_transformed_point_set_item_priv
CGAL::qglviewer::Vec center_;
Scene_aff_transformed_point_set_item_priv(Scene_points_with_normal_item *pts_item,
const CGAL::qglviewer::Vec& pos)
const CGAL::qglviewer::Vec& pos)
: pts_item(pts_item),
center_(pos)
{
@ -57,6 +57,8 @@ struct Scene_aff_transformed_point_set_item_priv
class SCENE_AFF_TRANSFORMED_POINT_SET_ITEM_EXPORT Scene_aff_transformed_point_set_item
: public Scene_aff_transformed_item
{
Q_OBJECT
using Point_set = Point_set_3<Kernel>;
protected:
@ -65,7 +67,7 @@ protected:
public:
Scene_aff_transformed_point_set_item(Scene_points_with_normal_item *pts_item,
const CGAL::qglviewer::Vec& pos);
const CGAL::qglviewer::Vec& pos);
~Scene_aff_transformed_point_set_item();
@ -78,6 +80,8 @@ public:
bool isEmpty() const Q_DECL_OVERRIDE { return (d->nb_points == 0); }
void updateCache();
virtual bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE { return m == Points ; }
virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE;

View File

@ -9,14 +9,17 @@
using namespace CGAL::Three;
Scene_aff_transformed_surface_mesh_item::
Scene_aff_transformed_surface_mesh_item(Scene_surface_mesh_item* item,
Scene_aff_transformed_surface_mesh_item(Scene_surface_mesh_item* sm_item,
const CGAL::qglviewer::Vec& pos)
: Scene_aff_transformed_item(pos)
{
d = new Scene_aff_transformed_surface_mesh_item_priv(item, pos);
d = new Scene_aff_transformed_surface_mesh_item_priv(sm_item, pos);
setEdgeContainer(0, new Edge_container(Viewer_interface::PROGRAM_NO_SELECTION, false));
compute_bbox();
invalidateOpenGLBuffers();
connect(sm_item, &Scene_surface_mesh_item::itemChanged ,
this, &Scene_aff_transformed_surface_mesh_item::updateCache);
}
Scene_aff_transformed_surface_mesh_item::
@ -25,6 +28,14 @@ Scene_aff_transformed_surface_mesh_item::
delete d;
}
void
Scene_aff_transformed_surface_mesh_item::
updateCache()
{
compute_bbox();
invalidateOpenGLBuffers();
}
QString
Scene_aff_transformed_surface_mesh_item::
toolTip() const

View File

@ -37,7 +37,7 @@ struct Scene_aff_transformed_surface_mesh_item_priv
public:
Scene_aff_transformed_surface_mesh_item_priv(Scene_surface_mesh_item* sm_item,
const CGAL::qglviewer::Vec& pos)
const CGAL::qglviewer::Vec& pos)
: sm_item(sm_item),
center_(pos)
{
@ -86,7 +86,7 @@ protected:
public:
Scene_aff_transformed_surface_mesh_item(Scene_surface_mesh_item* item,
const CGAL::qglviewer::Vec& pos);
const CGAL::qglviewer::Vec& pos);
~Scene_aff_transformed_surface_mesh_item();
@ -99,6 +99,8 @@ public:
bool isEmpty() const Q_DECL_OVERRIDE { return (d->nb_lines == 0); }
void updateCache();
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;

View File

@ -9,6 +9,7 @@
#include <iostream>
struct Scene_polygon_soup_item_priv;
struct Polygon_soup
{
typedef EPICK::Point_3 Point_3;