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)
|
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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue