mirror of https://github.com/CGAL/cgal
Add affine transformation of polygon soups + update transf when item updates
This commit is contained in:
parent
d5c31fb2d1
commit
2914c6f79b
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <iostream>
|
||||
|
||||
struct Scene_polygon_soup_item_priv;
|
||||
|
||||
struct Polygon_soup
|
||||
{
|
||||
typedef EPICK::Point_3 Point_3;
|
||||
|
|
|
|||
Loading…
Reference in New Issue