Add offset support for the Cut_plugin

This commit is contained in:
Maxime Gimeno 2016-11-10 09:38:18 +01:00
parent faf7c4ae3f
commit 1face074bf
4 changed files with 44 additions and 33 deletions

View File

@ -31,6 +31,7 @@ template<typename Primitive, typename Node>
struct AABB_drawing_traits struct AABB_drawing_traits
{ {
std::vector<float> *v_edges; std::vector<float> *v_edges;
double offset[3];
typedef CGAL::Bbox_3 Bbox; typedef CGAL::Bbox_3 Bbox;
bool go_further() { return true; } bool go_further() { return true; }
@ -83,13 +84,13 @@ struct AABB_drawing_traits
void gl_draw_edge(double px, double py, double pz, void gl_draw_edge(double px, double py, double pz,
double qx, double qy, double qz) double qx, double qy, double qz)
{ {
v_edges->push_back((float)px); v_edges->push_back((float)px+offset[0]);
v_edges->push_back((float)py); v_edges->push_back((float)py+offset[1]);
v_edges->push_back((float)pz); v_edges->push_back((float)pz+offset[2]);
v_edges->push_back((float)qx); v_edges->push_back((float)qx+offset[0]);
v_edges->push_back((float)qy); v_edges->push_back((float)qy+offset[1]);
v_edges->push_back((float)qz); v_edges->push_back((float)qz+offset[2]);
} }
}; // AABB_drawing_traits }; // AABB_drawing_traits

View File

@ -863,7 +863,7 @@ void MainWindow::updateViewerBBox()
qglviewer::Vec offset(0,0,0); qglviewer::Vec offset(0,0,0);
for(int i=0; i<3; ++i) for(int i=0; i<3; ++i)
{ {
if(log2(bbox.min(i)) > 13.0 ) // if(log2(bbox.min(i)) > 13.0 )
offset[i] = -bbox.min(i); offset[i] = -bbox.min(i);
} }
viewer->setOffset(offset); viewer->setOffset(offset);

View File

@ -98,8 +98,9 @@ public:
FT x = -diag/fd + FT(i)/FT(grid_size) * dx; FT x = -diag/fd + FT(i)/FT(grid_size) * dx;
{ {
FT y = -diag/fd + FT(j)/FT(grid_size) * dy; FT y = -diag/fd + FT(j)/FT(grid_size) * dy;
const qglviewer::Vec v_offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
Point query = transfo( Point(x,y,z) ); Simple_kernel::Vector_3 offset(v_offset.x, v_offset.y, v_offset.z);
Point query = transfo( Point(x,y,z))-offset;
FT min = DBL_MAX; FT min = DBL_MAX;
Q_FOREACH(Tree *tree, trees->values()) Q_FOREACH(Tree *tree, trees->values())
@ -284,11 +285,14 @@ private:
void computeElements() const void computeElements() const
{ {
const qglviewer::Vec offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
positions_lines.clear(); positions_lines.clear();
CGAL::AABB_drawing_traits<Facet_primitive, CGAL::AABB_node<Facet_traits> > traits; CGAL::AABB_drawing_traits<Facet_primitive, CGAL::AABB_node<Facet_traits> > traits;
traits.v_edges = &positions_lines; traits.v_edges = &positions_lines;
for(int i=0; i<3; ++i)
traits.offset[i] = offset[i];
tree.traversal(0, traits); tree.traversal(0, traits);
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
@ -403,14 +407,16 @@ private:
} }
void computeElements() const void computeElements() const
{ {
const qglviewer::Vec v_offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
Simple_kernel::Vector_3 offset(v_offset.x, v_offset.y, v_offset.z);
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
positions_lines.clear(); positions_lines.clear();
for(size_t i = 0, end = edges.size(); for(size_t i = 0, end = edges.size();
i < end; ++i) i < end; ++i)
{ {
const Simple_kernel::Point_3& a = edges[i].source(); const Simple_kernel::Point_3& a = edges[i].source()+offset;
const Simple_kernel::Point_3& b = edges[i].target(); const Simple_kernel::Point_3& b = edges[i].target()+offset;
positions_lines.push_back(a.x()); positions_lines.push_back(a.y()); positions_lines.push_back(a.z()); positions_lines.push_back(a.x()); positions_lines.push_back(a.y()); positions_lines.push_back(a.z());
positions_lines.push_back(b.x()); positions_lines.push_back(b.y()); positions_lines.push_back(b.z()); positions_lines.push_back(b.x()); positions_lines.push_back(b.y()); positions_lines.push_back(b.z());
} }
@ -1329,7 +1335,8 @@ void Polyhedron_demo_cut_plugin::computeIntersection()
scene->addItem(edges_item); scene->addItem(edges_item);
} }
const qglviewer::Vec& pos = plane_item->manipulatedFrame()->position(); const qglviewer::Vec offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
const qglviewer::Vec& pos = plane_item->manipulatedFrame()->position() - offset;
const qglviewer::Vec& n = const qglviewer::Vec& n =
plane_item->manipulatedFrame()->inverseTransformOf(qglviewer::Vec(0.f, 0.f, 1.f)); plane_item->manipulatedFrame()->inverseTransformOf(qglviewer::Vec(0.f, 0.f, 1.f));
Simple_kernel::Plane_3 plane(n[0], n[1], n[2], - n * pos); Simple_kernel::Plane_3 plane(n[0], n[1], n[2], - n * pos);

View File

@ -12,6 +12,7 @@ Scene_plane_item::Scene_plane_item(const CGAL::Three::Scene_interface* scene_int
frame(new ManipulatedFrame()) frame(new ManipulatedFrame())
{ {
setNormal(0., 0., 1.); setNormal(0., 0., 1.);
//Generates an integer which will be used as ID for each buffer //Generates an integer which will be used as ID for each buffer
invalidateOpenGLBuffers(); invalidateOpenGLBuffers();
} }
@ -50,6 +51,7 @@ void Scene_plane_item::initializeBuffers(Viewer_interface *viewer) const
void Scene_plane_item::compute_normals_and_vertices(void) const void Scene_plane_item::compute_normals_and_vertices(void) const
{ {
const qglviewer::Vec offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
positions_quad.resize(0); positions_quad.resize(0);
positions_lines.resize(0); positions_lines.resize(0);
@ -60,23 +62,23 @@ void Scene_plane_item::compute_normals_and_vertices(void) const
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
positions_quad.push_back(-diag); positions_quad.push_back(-diag);
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(diag); positions_quad.push_back(diag );
positions_quad.push_back(0.0); positions_quad.push_back(0.0 );
} }
//The grid //The grid
@ -87,23 +89,23 @@ void Scene_plane_item::compute_normals_and_vertices(void) const
{ {
positions_lines.push_back(-diag + x* u); positions_lines.push_back(-diag + x* u);
positions_lines.push_back(-diag); positions_lines.push_back(-diag );
positions_lines.push_back(0.0); positions_lines.push_back(0.0 );
positions_lines.push_back(-diag + x* u); positions_lines.push_back(-diag + x* u);
positions_lines.push_back(diag); positions_lines.push_back(diag );
positions_lines.push_back(0.0); positions_lines.push_back(0.0 );
} }
for(int v=0; v<11; v++) for(int v=0; v<11; v++)
{ {
positions_lines.push_back(-diag); positions_lines.push_back(-diag );
positions_lines.push_back(-diag + v * y); positions_lines.push_back(-diag + v * y);
positions_lines.push_back(0.0); positions_lines.push_back(0.0 );
positions_lines.push_back(diag); positions_lines.push_back(diag );
positions_lines.push_back(-diag + v * y); positions_lines.push_back(-diag + v * y);
positions_lines.push_back(0.0); positions_lines.push_back(0.0 );
} }
} }
@ -227,7 +229,8 @@ void Scene_plane_item::setPosition(float x, float y, float z) {
} }
void Scene_plane_item::setPosition(double x, double y, double z) { void Scene_plane_item::setPosition(double x, double y, double z) {
frame->setPosition((float)x, (float)y, (float)z); const qglviewer::Vec offset = static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first())->offset();
frame->setPosition((float)x+offset.x, (float)y+offset.y, (float)z+offset.z);
} }
void Scene_plane_item::setNormal(float x, float y, float z) { void Scene_plane_item::setNormal(float x, float y, float z) {