mirror of https://github.com/CGAL/cgal
clipping_box_plugin
This commit is contained in:
parent
56e58b8f99
commit
bfce2fb06e
|
|
@ -1,6 +1,7 @@
|
||||||
#include <QtCore/qglobal.h>
|
#include <QtCore/qglobal.h>
|
||||||
|
|
||||||
#include <CGAL/Three/Scene_item.h>
|
#include <CGAL/Three/Scene_item.h>
|
||||||
|
#include <CGAL/Three/Three.h>
|
||||||
#include <CGAL/Three/Scene_interface.h>
|
#include <CGAL/Three/Scene_interface.h>
|
||||||
#include "Scene_edit_box_item.h"
|
#include "Scene_edit_box_item.h"
|
||||||
#include <CGAL/Three/Viewer_interface.h>
|
#include <CGAL/Three/Viewer_interface.h>
|
||||||
|
|
@ -52,6 +53,11 @@ public Q_SLOTS:
|
||||||
void enableAction();
|
void enableAction();
|
||||||
void clipbox();
|
void clipbox();
|
||||||
void clip(bool);
|
void clip(bool);
|
||||||
|
void connectNewViewer(QObject* o)
|
||||||
|
{
|
||||||
|
if(item)
|
||||||
|
o->installEventFilter(item);
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
QAction* actionClipbox;
|
QAction* actionClipbox;
|
||||||
ClipWidget* dock_widget;
|
ClipWidget* dock_widget;
|
||||||
|
|
@ -72,6 +78,8 @@ void Clipping_box_plugin::init(QMainWindow* mainWindow, CGAL::Three::Scene_inter
|
||||||
connect(dock_widget->pushButton, SIGNAL(toggled(bool)),
|
connect(dock_widget->pushButton, SIGNAL(toggled(bool)),
|
||||||
this, SLOT(clip(bool)));
|
this, SLOT(clip(bool)));
|
||||||
item = NULL;
|
item = NULL;
|
||||||
|
connect(mw, SIGNAL(newViewerCreated(QObject*)),
|
||||||
|
this, SLOT(connectNewViewer(QObject*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clipping_box_plugin::clipbox()
|
void Clipping_box_plugin::clipbox()
|
||||||
|
|
@ -96,8 +104,8 @@ dock_widget->show();
|
||||||
});
|
});
|
||||||
item->setName("Clipping box");
|
item->setName("Clipping box");
|
||||||
item->setRenderingMode(FlatPlusEdges);
|
item->setRenderingMode(FlatPlusEdges);
|
||||||
CGAL::QGLViewer* viewer = *CGAL::QGLViewer::QGLViewerPool().begin();
|
Q_FOREACH(CGAL::QGLViewer* viewer, CGAL::QGLViewer::QGLViewerPool())
|
||||||
viewer->installEventFilter(item);
|
viewer->installEventFilter(item);
|
||||||
scene->addItem(item);
|
scene->addItem(item);
|
||||||
actionClipbox->setEnabled(false);
|
actionClipbox->setEnabled(false);
|
||||||
|
|
||||||
|
|
@ -113,53 +121,58 @@ void Clipping_box_plugin::clip(bool b)
|
||||||
{
|
{
|
||||||
typedef CGAL::Epick Kernel;
|
typedef CGAL::Epick Kernel;
|
||||||
typedef CGAL::Polyhedron_3<Kernel> Mesh;
|
typedef CGAL::Polyhedron_3<Kernel> Mesh;
|
||||||
Viewer_interface* viewer = static_cast<Viewer_interface*>(*CGAL::QGLViewer::QGLViewerPool().begin());
|
|
||||||
if(b)
|
Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool())
|
||||||
{
|
{
|
||||||
if(!item)
|
CGAL::Three::Viewer_interface* viewer =
|
||||||
|
qobject_cast<CGAL::Three::Viewer_interface*>(v);
|
||||||
|
if(b)
|
||||||
{
|
{
|
||||||
dock_widget->hide();
|
if(!item)
|
||||||
return;
|
{
|
||||||
|
dock_widget->hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Mesh m;
|
||||||
|
Kernel::Point_3 points[8];
|
||||||
|
for(int i=0; i<8; ++i)
|
||||||
|
{
|
||||||
|
points[i] = Kernel::Point_3(item->point(i,0),item->point(i,1), item->point(i,2));
|
||||||
|
}
|
||||||
|
CGAL::make_hexahedron(
|
||||||
|
points[0],
|
||||||
|
points[3],
|
||||||
|
points[2],
|
||||||
|
points[1],
|
||||||
|
points[5],
|
||||||
|
points[4],
|
||||||
|
points[7],
|
||||||
|
points[6],
|
||||||
|
m);
|
||||||
|
QVector4D planes[6];
|
||||||
|
int fid=0;
|
||||||
|
BOOST_FOREACH(Mesh::Facet_iterator f, faces(m))
|
||||||
|
{
|
||||||
|
Kernel::Vector_3 normal = CGAL::Polygon_mesh_processing::compute_face_normal(f,m);
|
||||||
|
double norm = normal.squared_length()*normal.squared_length();
|
||||||
|
Kernel::Plane_3 plane(f->halfedge()->vertex()->point(), 1.1*normal/norm);
|
||||||
|
planes[fid++] = QVector4D(plane.a(),
|
||||||
|
plane.b(),
|
||||||
|
plane.c(),
|
||||||
|
plane.d());
|
||||||
|
}
|
||||||
|
viewer->enableClippingBox(planes);
|
||||||
}
|
}
|
||||||
Mesh m;
|
else
|
||||||
Kernel::Point_3 points[8];
|
|
||||||
for(int i=0; i<8; ++i)
|
|
||||||
{
|
{
|
||||||
points[i] = Kernel::Point_3(item->point(i,0),item->point(i,1), item->point(i,2));
|
viewer->disableClippingBox();
|
||||||
|
if(!item)
|
||||||
|
{
|
||||||
|
dock_widget->hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CGAL::make_hexahedron(
|
viewer->update();
|
||||||
points[0],
|
|
||||||
points[3],
|
|
||||||
points[2],
|
|
||||||
points[1],
|
|
||||||
points[5],
|
|
||||||
points[4],
|
|
||||||
points[7],
|
|
||||||
points[6],
|
|
||||||
m);
|
|
||||||
QVector4D planes[6];
|
|
||||||
int fid=0;
|
|
||||||
BOOST_FOREACH(Mesh::Facet_iterator f, faces(m))
|
|
||||||
{
|
|
||||||
Kernel::Vector_3 normal = CGAL::Polygon_mesh_processing::compute_face_normal(f,m);
|
|
||||||
double norm = normal.squared_length()*normal.squared_length();
|
|
||||||
Kernel::Plane_3 plane(f->halfedge()->vertex()->point(), 1.1*normal/norm);
|
|
||||||
planes[fid++] = QVector4D(plane.a(),
|
|
||||||
plane.b(),
|
|
||||||
plane.c(),
|
|
||||||
plane.d());
|
|
||||||
}
|
|
||||||
viewer->enableClippingBox(planes);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
viewer->disableClippingBox();
|
|
||||||
if(!item)
|
|
||||||
{
|
|
||||||
dock_widget->hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
viewer->update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "Clipping_box_plugin.moc"
|
#include "Clipping_box_plugin.moc"
|
||||||
|
|
|
||||||
|
|
@ -317,8 +317,8 @@ void Scene_edit_box_item::drawSpheres(Viewer_interface *viewer, const QMatrix4x4
|
||||||
Tc* tc = getTriangleContainer(Priv::Spheres);
|
Tc* tc = getTriangleContainer(Priv::Spheres);
|
||||||
tc->setFrameMatrix(f_matrix);
|
tc->setFrameMatrix(f_matrix);
|
||||||
tc->setMvMatrix(mv_mat);
|
tc->setMvMatrix(mv_mat);
|
||||||
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->bind();
|
tc->getVao(viewer)->bind();
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->program->setAttributeValue("radius",radius);
|
tc->getVao(viewer)->program->setAttributeValue("radius",radius);
|
||||||
tc->getVao(viewer)->release();
|
tc->getVao(viewer)->release();
|
||||||
tc->setColor(QColor(Qt::red));
|
tc->setColor(QColor(Qt::red));
|
||||||
|
|
@ -375,9 +375,7 @@ void Scene_edit_box_item::drawEdges(Viewer_interface* viewer) const
|
||||||
ec->setViewport(vp);
|
ec->setViewport(vp);
|
||||||
ec->setWidth(6.0f);
|
ec->setWidth(6.0f);
|
||||||
}
|
}
|
||||||
ec->getVao(viewer)->bind();
|
ec->setClipping(false);
|
||||||
ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
ec->getVao(viewer)->release();
|
|
||||||
ec->setFrameMatrix(f_matrix);
|
ec->setFrameMatrix(f_matrix);
|
||||||
ec->setColor(QColor(Qt::black));
|
ec->setColor(QColor(Qt::black));
|
||||||
ec->draw(viewer, true);
|
ec->draw(viewer, true);
|
||||||
|
|
@ -906,9 +904,7 @@ void Scene_edit_box_item_priv::draw_picking(Viewer_interface* viewer)
|
||||||
{
|
{
|
||||||
Tc* tc = item->getTriangleContainer(P_Faces);
|
Tc* tc = item->getTriangleContainer(P_Faces);
|
||||||
tc->setFrameMatrix(f_matrix);
|
tc->setFrameMatrix(f_matrix);
|
||||||
tc->getVao(viewer)->bind();
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->release();
|
|
||||||
tc->draw(viewer, false);
|
tc->draw(viewer, false);
|
||||||
}
|
}
|
||||||
double radius =std::sqrt(
|
double radius =std::sqrt(
|
||||||
|
|
@ -917,8 +913,8 @@ void Scene_edit_box_item_priv::draw_picking(Viewer_interface* viewer)
|
||||||
(item->point(6,2) - item->point(0,2)) * (item->point(6,2) - item->point(0,2))) *0.02 ;
|
(item->point(6,2) - item->point(0,2)) * (item->point(6,2) - item->point(0,2))) *0.02 ;
|
||||||
Tc* tc = item->getTriangleContainer(P_Spheres);
|
Tc* tc = item->getTriangleContainer(P_Spheres);
|
||||||
tc->setFrameMatrix(f_matrix);
|
tc->setFrameMatrix(f_matrix);
|
||||||
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->bind();
|
tc->getVao(viewer)->bind();
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->program->setAttributeValue("radius", (float)radius);
|
tc->getVao(viewer)->program->setAttributeValue("radius", (float)radius);
|
||||||
tc->getVao(viewer)->release();
|
tc->getVao(viewer)->release();
|
||||||
tc->draw(viewer, false);
|
tc->draw(viewer, false);
|
||||||
|
|
@ -932,9 +928,7 @@ void Scene_edit_box_item_priv::draw_picking(Viewer_interface* viewer)
|
||||||
ec->setWidth(6.0f);
|
ec->setWidth(6.0f);
|
||||||
}
|
}
|
||||||
ec->setFrameMatrix(f_matrix);
|
ec->setFrameMatrix(f_matrix);
|
||||||
ec->getVao(viewer)->bind();
|
ec->setClipping(false);
|
||||||
ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
ec->getVao(viewer)->release();
|
|
||||||
ec->draw(viewer, false);
|
ec->draw(viewer, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1117,9 +1111,9 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const
|
||||||
(point(6,0) - point(0,0)) * (point(6,0) - point(0,0)) +
|
(point(6,0) - point(0,0)) * (point(6,0) - point(0,0)) +
|
||||||
(point(6,1) - point(0,1)) * (point(6,1) - point(0,1)) +
|
(point(6,1) - point(0,1)) * (point(6,1) - point(0,1)) +
|
||||||
(point(6,2) - point(0,2)) * (point(6,2) - point(0,2))) *0.02 ;
|
(point(6,2) - point(0,2)) * (point(6,2) - point(0,2))) *0.02 ;
|
||||||
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->bind();
|
tc->getVao(viewer)->bind();
|
||||||
tc->getVao(viewer)->program->setUniformValue("radius", (float)radius);
|
tc->getVao(viewer)->program->setUniformValue("radius", (float)radius);
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->release();
|
tc->getVao(viewer)->release();
|
||||||
tc->draw(viewer, true);
|
tc->draw(viewer, true);
|
||||||
}
|
}
|
||||||
|
|
@ -1132,9 +1126,7 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const
|
||||||
ec->setViewport(vp);
|
ec->setViewport(vp);
|
||||||
ec->setWidth(6.0f);
|
ec->setWidth(6.0f);
|
||||||
}
|
}
|
||||||
ec->getVao(viewer)->bind();
|
ec->setClipping(false);
|
||||||
ec->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
ec->getVao(viewer)->release();
|
|
||||||
ec->setFrameMatrix(f_matrix);
|
ec->setFrameMatrix(f_matrix);
|
||||||
ec->setColor(QColor(Qt::yellow));
|
ec->setColor(QColor(Qt::yellow));
|
||||||
ec->draw(viewer, true);
|
ec->draw(viewer, true);
|
||||||
|
|
@ -1149,9 +1141,7 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const
|
||||||
Tc* tc = getTriangleContainer(Priv::S_Faces);
|
Tc* tc = getTriangleContainer(Priv::S_Faces);
|
||||||
tc->setMvMatrix(mv_mat);
|
tc->setMvMatrix(mv_mat);
|
||||||
tc->setFrameMatrix(f_matrix);
|
tc->setFrameMatrix(f_matrix);
|
||||||
tc->getVao(viewer)->bind();
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->release();
|
|
||||||
|
|
||||||
tc->setColor(QColor(Qt::yellow));
|
tc->setColor(QColor(Qt::yellow));
|
||||||
tc->setAlpha(0.5);
|
tc->setAlpha(0.5);
|
||||||
|
|
@ -1194,9 +1184,7 @@ void Scene_edit_box_item::drawTransparent(CGAL::Three::Viewer_interface*viewer)c
|
||||||
Tc* tc = getTriangleContainer(Priv::Faces);
|
Tc* tc = getTriangleContainer(Priv::Faces);
|
||||||
tc->setMvMatrix(mv_mat);
|
tc->setMvMatrix(mv_mat);
|
||||||
tc->setFrameMatrix(f_matrix);
|
tc->setFrameMatrix(f_matrix);
|
||||||
tc->getVao(viewer)->bind();
|
tc->setClipping(false);
|
||||||
tc->getVao(viewer)->program->setUniformValue("is_clipbox_on", false);
|
|
||||||
tc->getVao(viewer)->release();
|
|
||||||
tc->setColor(QColor(128,128,128,128));
|
tc->setColor(QColor(128,128,128,128));
|
||||||
tc->setAlpha(0.5);
|
tc->setAlpha(0.5);
|
||||||
tc->draw(viewer, true);
|
tc->draw(viewer, true);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ struct D
|
||||||
program_id(program),
|
program_id(program),
|
||||||
indexed(indexed),
|
indexed(indexed),
|
||||||
is_selected(false),
|
is_selected(false),
|
||||||
|
clipping(true),
|
||||||
flat_size(0),
|
flat_size(0),
|
||||||
idx_size(0),
|
idx_size(0),
|
||||||
tuple_size(3),
|
tuple_size(3),
|
||||||
|
|
@ -26,6 +27,7 @@ struct D
|
||||||
QMap<CGAL::Three::Viewer_interface*, bool> is_init;
|
QMap<CGAL::Three::Viewer_interface*, bool> is_init;
|
||||||
QMap<CGAL::Three::Viewer_interface*, bool> is_gl_init;
|
QMap<CGAL::Three::Viewer_interface*, bool> is_gl_init;
|
||||||
bool is_selected;
|
bool is_selected;
|
||||||
|
bool clipping;
|
||||||
std::size_t flat_size;
|
std::size_t flat_size;
|
||||||
std::size_t center_size;
|
std::size_t center_size;
|
||||||
std::size_t idx_size;
|
std::size_t idx_size;
|
||||||
|
|
@ -58,6 +60,9 @@ void Primitive_container::bindUniformValues(CGAL::Three::Viewer_interface* viewe
|
||||||
viewer->getShaderProgram(d->program_id)->setUniformValue("is_selected", true);
|
viewer->getShaderProgram(d->program_id)->setUniformValue("is_selected", true);
|
||||||
else
|
else
|
||||||
viewer->getShaderProgram(d->program_id)->setUniformValue("is_selected", false);
|
viewer->getShaderProgram(d->program_id)->setUniformValue("is_selected", false);
|
||||||
|
//override clipping if necessary
|
||||||
|
if(!d->clipping)
|
||||||
|
viewer->getShaderProgram(d->program_id)->setUniformValue("is_clipbox_on", false);
|
||||||
viewer->getShaderProgram(d->program_id)->release();
|
viewer->getShaderProgram(d->program_id)->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -264,3 +269,13 @@ QSize Primitive_container::getTextureSize() const
|
||||||
{
|
{
|
||||||
return QSize(d->texture->Width, d->texture->Height);
|
return QSize(d->texture->Width, d->texture->Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Primitive_container::getClipping() const
|
||||||
|
{
|
||||||
|
return d->clipping;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Primitive_container::setClipping(bool b)
|
||||||
|
{
|
||||||
|
d->clipping = b;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,9 @@ public:
|
||||||
void setOffset(std::size_t id, int offset);
|
void setOffset(std::size_t id, int offset);
|
||||||
//!setter for the tuple size: the number of coordinates of one vertex.
|
//!setter for the tuple size: the number of coordinates of one vertex.
|
||||||
void setTupleSize(int ts);
|
void setTupleSize(int ts);
|
||||||
|
//!setter for the clipping. If `b` is `false`, then the clipping box will have no effect.
|
||||||
|
void setClipping(bool b);
|
||||||
|
|
||||||
//!@}
|
//!@}
|
||||||
|
|
||||||
//!
|
//!
|
||||||
|
|
@ -220,6 +223,8 @@ public:
|
||||||
GLuint getTextureId() const;
|
GLuint getTextureId() const;
|
||||||
//! getter for the size of the texture.
|
//! getter for the size of the texture.
|
||||||
QSize getTextureSize() const;
|
QSize getTextureSize() const;
|
||||||
|
//! getter for the clipping. Default is `true`.
|
||||||
|
bool getClipping() const;
|
||||||
|
|
||||||
//!
|
//!
|
||||||
//!Use this to specify if the container `Vbo`s are filled for `viewer`.
|
//!Use this to specify if the container `Vbo`s are filled for `viewer`.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue