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) 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_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) 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 target_link_libraries(scene_aff_transformed_point_set_item PUBLIC scene_points_with_normal_item
scene_aff_transformed_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) 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_Transformation_widget.h"
#include "ui_MeshOnGrid_dialog.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_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_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/Polyhedron_demo_plugin_helper.h>
#include <CGAL/Three/Point_container.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_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface)
Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") 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 using Generic_scene_aff_transformed_item = Scene_aff_transformed_item; // just for clarity
private: private:
@ -96,8 +98,9 @@ public:
if(a == actionGenerateItemGrid) 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()));
return qobject_cast<Scene_surface_mesh_item*>(scene->item(scene->mainSelectionIndex())) return qobject_cast<Scene_points_with_normal_item*>(scene->item(scene->mainSelectionIndex()))
|| 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, void init(QMainWindow* _mw,
@ -157,6 +160,7 @@ public:
void start(SceneItem*); void start(SceneItem*);
void endPointSet(const QMatrix4x4& transform_matrix); void endPointSet(const QMatrix4x4& transform_matrix);
void endPolygonSoup(const QMatrix4x4& transform_matrix);
void endPolygonMesh(const QMatrix4x4& transform_matrix); void endPolygonMesh(const QMatrix4x4& transform_matrix);
void end(); void end();
@ -586,6 +590,13 @@ transformItem()
return start<Scene_aff_transformed_point_set_item>(pts_item); 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); Scene_surface_mesh_item* sm_item = qobject_cast<Scene_surface_mesh_item*>(item);
if(sm_item) if(sm_item)
{ {
@ -612,6 +623,36 @@ endPointSet(const QMatrix4x4& transform_matrix)
} }
new_item->setName(aff_transformed_item->name()); 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*/); scene->replaceItem(scene->item_id(aff_transformed_item), new_item, true /*emit about to be destroyed*/);
delete aff_transformed_item; delete aff_transformed_item;
@ -672,6 +713,9 @@ end()
case Item_type::POINT_SET: case Item_type::POINT_SET:
endPointSet(transform_matrix); endPointSet(transform_matrix);
break; break;
case Item_type::POLYGON_SOUP:
endPolygonSoup(transform_matrix);
break;
case Item_type::POLYGON_MESH: case Item_type::POLYGON_MESH:
endPolygonMesh(transform_matrix); endPolygonMesh(transform_matrix);
break; 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 target_link_libraries(affine_transform_plugin PUBLIC scene_surface_mesh_item
scene_points_with_normal_item scene_points_with_normal_item
scene_aff_transformed_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) polyhedron_demo_plugin(edit_box_plugin Edit_box_plugin)
target_link_libraries(edit_box_plugin PUBLIC scene_edit_box_item 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)); setPointContainer(0, new Point_container(Viewer_interface::PROGRAM_NO_SELECTION, false));
compute_bbox(); compute_bbox();
invalidateOpenGLBuffers(); invalidateOpenGLBuffers();
connect(pts_item, &Scene_points_with_normal_item::itemChanged ,
this, &Scene_aff_transformed_point_set_item::updateCache);
} }
Scene_aff_transformed_point_set_item:: Scene_aff_transformed_point_set_item::
@ -27,6 +30,14 @@ Scene_aff_transformed_point_set_item::
delete d; delete d;
} }
void
Scene_aff_transformed_point_set_item::
updateCache()
{
compute_bbox();
invalidateOpenGLBuffers();
}
QString QString
Scene_aff_transformed_point_set_item:: Scene_aff_transformed_point_set_item::
toolTip() const toolTip() const

View File

@ -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 class SCENE_AFF_TRANSFORMED_POINT_SET_ITEM_EXPORT Scene_aff_transformed_point_set_item
: public Scene_aff_transformed_item : public Scene_aff_transformed_item
{ {
Q_OBJECT
using Point_set = Point_set_3<Kernel>; using Point_set = Point_set_3<Kernel>;
protected: protected:
@ -78,6 +80,8 @@ public:
bool isEmpty() const Q_DECL_OVERRIDE { return (d->nb_points == 0); } 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 bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE { return m == Points ; }
virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE; virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE;

View File

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

View File

@ -99,6 +99,8 @@ public:
bool isEmpty() const Q_DECL_OVERRIDE { return (d->nb_lines == 0); } 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 bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE { return m == Wireframe ; }
virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE; virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE;
void initializeBuffers(CGAL::Three::Viewer_interface*) const Q_DECL_OVERRIDE; void initializeBuffers(CGAL::Three::Viewer_interface*) const Q_DECL_OVERRIDE;

View File

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