mirror of https://github.com/CGAL/cgal
D-pointer for Scene_edit_polyhedron_item
This commit is contained in:
parent
cdcd5626e7
commit
00b834b7d8
File diff suppressed because it is too large
Load Diff
|
|
@ -33,9 +33,9 @@
|
||||||
#include <QGLShaderProgram>
|
#include <QGLShaderProgram>
|
||||||
|
|
||||||
|
|
||||||
typedef Polyhedron::Vertex_handle Vertex_handle;
|
typedef Polyhedron::Vertex_handle Vertex_handle;
|
||||||
typedef boost::graph_traits<Polyhedron>::vertex_descriptor vertex_descriptor;
|
typedef boost::graph_traits<Polyhedron>::vertex_descriptor vertex_descriptor;
|
||||||
typedef boost::graph_traits<Polyhedron>::vertex_iterator vertex_iterator;
|
typedef boost::graph_traits<Polyhedron>::vertex_iterator vertex_iterator;
|
||||||
typedef boost::graph_traits<Polyhedron>::face_descriptor face_descriptor;
|
typedef boost::graph_traits<Polyhedron>::face_descriptor face_descriptor;
|
||||||
typedef boost::graph_traits<Polyhedron>::halfedge_descriptor halfedge_descriptor;
|
typedef boost::graph_traits<Polyhedron>::halfedge_descriptor halfedge_descriptor;
|
||||||
typedef boost::graph_traits<Polyhedron>::edge_descriptor edge_descriptor;
|
typedef boost::graph_traits<Polyhedron>::edge_descriptor edge_descriptor;
|
||||||
|
|
@ -193,6 +193,8 @@ struct Mouse_keyboard_state_deformation
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::list<Control_vertices_data> Ctrl_vertices_group_data_list;
|
||||||
|
struct Scene_edit_polyhedron_item_priv;
|
||||||
// This class represents a polyhedron in the OpenGL scene
|
// This class represents a polyhedron in the OpenGL scene
|
||||||
class SCENE_EDIT_POLYHEDRON_ITEM_EXPORT Scene_edit_polyhedron_item
|
class SCENE_EDIT_POLYHEDRON_ITEM_EXPORT Scene_edit_polyhedron_item
|
||||||
: public CGAL::Three::Scene_group_item {
|
: public CGAL::Three::Scene_group_item {
|
||||||
|
|
@ -242,8 +244,8 @@ public:
|
||||||
void compute_bbox() const;
|
void compute_bbox() const;
|
||||||
Bbox bbox() const{return Scene_item::bbox();}
|
Bbox bbox() const{return Scene_item::bbox();}
|
||||||
|
|
||||||
int get_k_ring() { return k_ring_selector.k_ring; }
|
int get_k_ring();
|
||||||
void set_k_ring(int v) { k_ring_selector.k_ring = v; }
|
void set_k_ring(int v);
|
||||||
|
|
||||||
// take mouse events from viewer, main-window does not work
|
// take mouse events from viewer, main-window does not work
|
||||||
// take keyboard events from main-window, which is more stable
|
// take keyboard events from main-window, which is more stable
|
||||||
|
|
@ -252,34 +254,12 @@ public:
|
||||||
void ShowAsSphere(bool b);
|
void ShowAsSphere(bool b);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void reset_spheres()
|
void reset_spheres();
|
||||||
{
|
|
||||||
spheres = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateDeform();
|
void updateDeform();
|
||||||
void change();
|
void change();
|
||||||
|
|
||||||
void invalidateOpenGLBuffers();
|
void invalidateOpenGLBuffers();
|
||||||
void selected(const std::set<Polyhedron::Vertex_handle>& m)
|
void selected(const std::set<Polyhedron::Vertex_handle>& m);
|
||||||
{
|
|
||||||
bool any_changes = false;
|
|
||||||
for(std::set<vertex_descriptor>::const_iterator it = m.begin(); it != m.end(); ++it)
|
|
||||||
{
|
|
||||||
vertex_descriptor vh = *it;
|
|
||||||
bool changed = false;
|
|
||||||
if(ui_widget->ROIRadioButton->isChecked()) {
|
|
||||||
if(ui_widget->InsertRadioButton->isChecked()) { changed = insert_roi_vertex(vh);}
|
|
||||||
else { changed = erase_roi_vertex(vh); }
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(ui_widget->InsertRadioButton->isChecked()) { changed = insert_control_vertex(vh); }
|
|
||||||
else { changed = erase_control_vertex(vh); }
|
|
||||||
}
|
|
||||||
any_changes |= changed;
|
|
||||||
}
|
|
||||||
if(any_changes) { invalidateOpenGLBuffers(); Q_EMIT itemChanged(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
void select(double orig_x,
|
void select(double orig_x,
|
||||||
double orig_y,
|
double orig_y,
|
||||||
|
|
@ -291,119 +271,20 @@ public Q_SLOTS:
|
||||||
void deform(); // deform the mesh
|
void deform(); // deform the mesh
|
||||||
void remesh();
|
void remesh();
|
||||||
|
|
||||||
// members
|
protected:
|
||||||
private:
|
friend struct Scene_edit_polyhedron_item_priv;
|
||||||
Ui::DeformMesh* ui_widget;
|
Scene_edit_polyhedron_item_priv* d;
|
||||||
Scene_polyhedron_item* poly_item;
|
|
||||||
bool need_change;
|
|
||||||
// For drawing
|
|
||||||
mutable std::vector<GLdouble> positions;
|
|
||||||
mutable std::vector<unsigned int> tris;
|
|
||||||
mutable std::vector<unsigned int> edges;
|
|
||||||
mutable std::vector<GLdouble> color_lines;
|
|
||||||
mutable std::vector<GLdouble> color_bbox;
|
|
||||||
mutable std::vector<GLdouble> ROI_points;
|
|
||||||
mutable std::vector<GLdouble> control_points;
|
|
||||||
mutable std::vector<GLdouble> ROI_color;
|
|
||||||
mutable std::vector<GLdouble> control_color;
|
|
||||||
mutable std::vector<GLdouble> normals;
|
|
||||||
mutable std::vector<GLdouble> pos_bbox;
|
|
||||||
mutable std::vector<GLdouble> pos_axis;
|
|
||||||
mutable std::vector<GLdouble> pos_frame_plane;
|
|
||||||
mutable QOpenGLShaderProgram *program;
|
|
||||||
mutable QOpenGLShaderProgram bbox_program;
|
|
||||||
mutable std::size_t nb_ROI;
|
|
||||||
mutable std::size_t nb_control;
|
|
||||||
mutable std::size_t nb_axis;
|
|
||||||
mutable std::size_t nb_bbox;
|
|
||||||
mutable Scene_spheres_item* spheres;
|
|
||||||
|
|
||||||
enum Buffer
|
|
||||||
{
|
|
||||||
Facet_vertices =0,
|
|
||||||
Facet_normals,
|
|
||||||
Roi_vertices,
|
|
||||||
Control_vertices,
|
|
||||||
Bbox_vertices,
|
|
||||||
Axis_vertices,
|
|
||||||
Axis_colors,
|
|
||||||
Frame_vertices,
|
|
||||||
NumberOfBuffers
|
|
||||||
};
|
|
||||||
enum Vao
|
|
||||||
{
|
|
||||||
Facets=0,
|
|
||||||
Roi_points,
|
|
||||||
Edges,
|
|
||||||
BBox,
|
|
||||||
Control_points,
|
|
||||||
Axis,
|
|
||||||
Frame_plane,
|
|
||||||
NumberOfVaos
|
|
||||||
};
|
|
||||||
mutable QOpenGLBuffer *in_bu;
|
|
||||||
using CGAL::Three::Scene_item::initializeBuffers;
|
|
||||||
void initializeBuffers(CGAL::Three::Viewer_interface *viewer) const;
|
|
||||||
void compute_normals_and_vertices(void);
|
|
||||||
void compute_bbox(const CGAL::Three::Scene_interface::Bbox&);
|
|
||||||
void reset_drawing_data();
|
|
||||||
|
|
||||||
Deform_mesh* deform_mesh;
|
|
||||||
typedef std::list<Control_vertices_data> Ctrl_vertices_group_data_list;
|
|
||||||
Ctrl_vertices_group_data_list::iterator active_group;
|
|
||||||
Ctrl_vertices_group_data_list ctrl_vertex_frame_map; // keep list of group of control vertices with assoc data
|
|
||||||
|
|
||||||
double length_of_axis; // for drawing axis at a group of control vertices
|
|
||||||
|
|
||||||
// by interleaving 'viewer's events (check constructor), keep followings:
|
|
||||||
Mouse_keyboard_state_deformation state;
|
|
||||||
|
|
||||||
//For constraint rotation
|
|
||||||
qglviewer::LocalConstraint rot_constraint;
|
|
||||||
bool is_rot_free;
|
|
||||||
|
|
||||||
bool own_poly_item; //indicates if the poly_item should be deleted by the destructor
|
|
||||||
Scene_polyhedron_item_k_ring_selection k_ring_selector;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Deformation related functions //
|
// Deformation related functions //
|
||||||
bool insert_control_vertex(vertex_descriptor v)
|
bool insert_control_vertex(vertex_descriptor v);
|
||||||
{
|
|
||||||
if(!is_there_any_ctrl_vertices_group()) {
|
|
||||||
print_message("There is no group of control vertices, create one!");
|
|
||||||
return false;
|
|
||||||
} // no group of control vertices to insert
|
|
||||||
|
|
||||||
bool inserted = deform_mesh->insert_control_vertex(v);
|
bool insert_roi_vertex(vertex_descriptor v);
|
||||||
if(inserted) {
|
|
||||||
active_group->ctrl_vertices_group.push_back(v);
|
|
||||||
active_group->refresh();
|
|
||||||
}
|
|
||||||
return inserted;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool insert_roi_vertex(vertex_descriptor v)
|
|
||||||
{
|
|
||||||
return deform_mesh->insert_roi_vertex(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool erase_control_vertex(vertex_descriptor v)
|
bool erase_control_vertex(vertex_descriptor v);
|
||||||
{
|
|
||||||
if(deform_mesh->erase_control_vertex(v)) // API should be safe enough to do that (without checking empty group of control vertices etc.)
|
|
||||||
{
|
|
||||||
refresh_all_group_centers(); // since we don't know which group of control vertices v is erased from, refresh all
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_message("Selected vertex is not a control vertex!");
|
bool erase_roi_vertex(vertex_descriptor v);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool erase_roi_vertex(vertex_descriptor v)
|
|
||||||
{
|
|
||||||
erase_control_vertex(v); // erase control vertex
|
|
||||||
return deform_mesh->erase_roi_vertex(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_all_vertices_as_roi()
|
void set_all_vertices_as_roi()
|
||||||
{
|
{
|
||||||
|
|
@ -414,208 +295,23 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_roi()
|
void clear_roi();
|
||||||
{
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
delete it->frame;
|
|
||||||
}
|
|
||||||
ctrl_vertex_frame_map.clear();
|
|
||||||
deform_mesh->clear_roi_vertices();
|
|
||||||
|
|
||||||
create_ctrl_vertices_group(); // create one new group of control vertices
|
void create_ctrl_vertices_group();
|
||||||
}
|
|
||||||
|
|
||||||
void create_ctrl_vertices_group()
|
void delete_ctrl_vertices_group(bool create_new = true);
|
||||||
{
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it) {
|
|
||||||
if(it->ctrl_vertices_group.empty()) {
|
|
||||||
active_group = it;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// No empty group of control vertices
|
void prev_ctrl_vertices_group();
|
||||||
qglviewer::ManipulatedFrame* new_frame = new qglviewer::ManipulatedFrame();
|
void next_ctrl_vertices_group();
|
||||||
new_frame->setRotationSensitivity(2.0f);
|
void pivoting_end();
|
||||||
connect(new_frame, SIGNAL(manipulated()), this, SLOT(change()));
|
|
||||||
|
|
||||||
Control_vertices_data hgd(deform_mesh, new_frame);
|
void pivoting_begin();
|
||||||
ctrl_vertex_frame_map.push_back(hgd);
|
|
||||||
hgd.refresh();
|
|
||||||
|
|
||||||
active_group = --ctrl_vertex_frame_map.end();
|
void save_roi(const char* file_name) const;
|
||||||
|
void read_roi(const char* file_name);
|
||||||
invalidateOpenGLBuffers();
|
void overwrite_deform_object();
|
||||||
Q_EMIT itemChanged();
|
|
||||||
|
|
||||||
print_message("A new empty group of control vertices is created.");
|
|
||||||
}
|
|
||||||
|
|
||||||
void delete_ctrl_vertices_group(bool create_new = true)
|
|
||||||
{
|
|
||||||
if(!is_there_any_ctrl_vertices_group()) {
|
|
||||||
print_message("There is no group of control vertices to be deleted!");
|
|
||||||
return;
|
|
||||||
} // no group of control vertices
|
|
||||||
|
|
||||||
// delete group representative
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
if(it == active_group)
|
|
||||||
{
|
|
||||||
delete it->frame;
|
|
||||||
for(std::vector<vertex_descriptor>::iterator v_it = it->ctrl_vertices_group.begin(); v_it != it->ctrl_vertices_group.end(); ++v_it) {
|
|
||||||
deform_mesh->erase_control_vertex(*v_it);
|
|
||||||
}
|
|
||||||
ctrl_vertex_frame_map.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// assign another ctrl_vertices_group to active_group
|
|
||||||
Ctrl_vertices_group_data_list::iterator hgb, hge;
|
|
||||||
if( is_there_any_ctrl_vertices_group(hgb, hge) )
|
|
||||||
{
|
|
||||||
active_group = hgb;
|
|
||||||
} // no group of control vertices
|
|
||||||
else if(create_new)
|
|
||||||
{
|
|
||||||
create_ctrl_vertices_group();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void prev_ctrl_vertices_group()
|
|
||||||
{
|
|
||||||
Ctrl_vertices_group_data_list::iterator hgb, hge;
|
|
||||||
if( !is_there_any_ctrl_vertices_group(hgb, hge) ) {
|
|
||||||
print_message("There is no group of control vertices to iterate on!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// shift
|
|
||||||
if(hgb == active_group) { active_group = --hge; }
|
|
||||||
else {--active_group; }
|
|
||||||
}
|
|
||||||
|
|
||||||
void next_ctrl_vertices_group()
|
|
||||||
{
|
|
||||||
Ctrl_vertices_group_data_list::iterator hgb, hge;
|
|
||||||
if( !is_there_any_ctrl_vertices_group(hgb, hge) ) {
|
|
||||||
print_message("There is no group of control vertices to iterate on!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// shift
|
|
||||||
if(--hge == active_group) { active_group = hgb; }
|
|
||||||
else {++active_group; }
|
|
||||||
}
|
|
||||||
|
|
||||||
void pivoting_end()
|
|
||||||
{
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
//update constraint rotation vector, set only for the last group
|
|
||||||
it->rot_direction = it->frame->rotation().rotate( qglviewer::Vec(0.,0.,1.) );
|
|
||||||
//translate center of the frame
|
|
||||||
qglviewer::Vec vec= it->frame->position();
|
|
||||||
it->refresh();
|
|
||||||
it->frame_initial_center = vec;
|
|
||||||
it->frame->setPosition(vec);
|
|
||||||
}
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
it->frame->blockSignals(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pivoting_begin()
|
|
||||||
{
|
|
||||||
is_rot_free=true;
|
|
||||||
rot_constraint.setRotationConstraintType(qglviewer::AxisPlaneConstraint::FREE);
|
|
||||||
rot_constraint.setTranslationConstraintType(qglviewer::AxisPlaneConstraint::FREE);
|
|
||||||
|
|
||||||
// just block signals to prevent deformation
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
it->frame->blockSignals(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void save_roi(const char* file_name) const
|
|
||||||
{
|
|
||||||
std::ofstream out(file_name);
|
|
||||||
// save roi
|
|
||||||
out << deform_mesh->roi_vertices().size() << std::endl;
|
|
||||||
BOOST_FOREACH(vertex_descriptor vd, deform_mesh->roi_vertices())
|
|
||||||
{
|
|
||||||
out << vd->id() << " ";
|
|
||||||
}
|
|
||||||
out << std::endl;
|
|
||||||
// save control vertices
|
|
||||||
|
|
||||||
out << ctrl_vertex_frame_map.size() << std::endl; // control vertices count
|
|
||||||
for(Ctrl_vertices_group_data_list::const_iterator hgb = ctrl_vertex_frame_map.begin(); hgb != ctrl_vertex_frame_map.end(); ++hgb) {
|
|
||||||
|
|
||||||
out << hgb->ctrl_vertices_group.size() << std::endl;
|
|
||||||
for(std::vector<vertex_descriptor>::const_iterator hb = hgb->ctrl_vertices_group.begin(); hb != hgb->ctrl_vertices_group.end(); ++hb)
|
|
||||||
{
|
|
||||||
out << (*hb)->id() << " ";
|
|
||||||
}
|
|
||||||
out << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void read_roi(const char* file_name)
|
|
||||||
{
|
|
||||||
clear_roi();
|
|
||||||
delete_ctrl_vertices_group(false);
|
|
||||||
|
|
||||||
// put vertices to vector
|
|
||||||
std::vector<vertex_descriptor> all_vertices;
|
|
||||||
all_vertices.reserve(num_vertices(deform_mesh->halfedge_graph()));
|
|
||||||
vertex_iterator vb, ve;
|
|
||||||
for(boost::tie(vb, ve) = vertices(deform_mesh->halfedge_graph()); vb != ve; ++vb) {
|
|
||||||
all_vertices.push_back(*vb);
|
|
||||||
}
|
|
||||||
// read roi
|
|
||||||
std::ifstream in(file_name);
|
|
||||||
int roi_size;
|
|
||||||
in >> roi_size;
|
|
||||||
while(roi_size-- > 0)
|
|
||||||
{
|
|
||||||
std::size_t v_id;
|
|
||||||
in >> v_id;
|
|
||||||
insert_roi_vertex(all_vertices[v_id]);
|
|
||||||
}
|
|
||||||
// read control vertices
|
|
||||||
int ctrl_vertices_group_size;
|
|
||||||
in >> ctrl_vertices_group_size;
|
|
||||||
while(ctrl_vertices_group_size-- > 0)
|
|
||||||
{
|
|
||||||
create_ctrl_vertices_group();
|
|
||||||
int ctrl_size;
|
|
||||||
in >> ctrl_size;
|
|
||||||
while(ctrl_size-- > 0)
|
|
||||||
{
|
|
||||||
std::size_t v_id;
|
|
||||||
in >> v_id;
|
|
||||||
insert_control_vertex(all_vertices[v_id]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void overwrite_deform_object()
|
|
||||||
{
|
|
||||||
deform_mesh->overwrite_initial_geometry();
|
|
||||||
|
|
||||||
refresh_all_group_centers();
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset_deform_object()
|
|
||||||
{
|
|
||||||
deform_mesh->reset();
|
|
||||||
refresh_all_group_centers();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void reset_deform_object();
|
||||||
struct Is_selected {
|
struct Is_selected {
|
||||||
Deform_mesh* dm;
|
Deform_mesh* dm;
|
||||||
Is_selected(Deform_mesh* dm) : dm(dm) {}
|
Is_selected(Deform_mesh* dm) : dm(dm) {}
|
||||||
|
|
@ -624,14 +320,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::optional<std::size_t> get_minimum_isolated_component() {
|
boost::optional<std::size_t> get_minimum_isolated_component();
|
||||||
Travel_isolated_components::Minimum_visitor visitor;
|
|
||||||
Travel_isolated_components().travel<Vertex_handle>
|
|
||||||
(vertices(*polyhedron()).first, vertices(*polyhedron()).second,
|
|
||||||
polyhedron()->size_of_vertices(), Is_selected(deform_mesh), visitor);
|
|
||||||
return visitor.minimum;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Select_roi_output {
|
struct Select_roi_output {
|
||||||
Select_roi_output(Deform_mesh* dm) : dm(dm) { }
|
Select_roi_output(Deform_mesh* dm) : dm(dm) { }
|
||||||
void operator()(Vertex_handle vh) {
|
void operator()(Vertex_handle vh) {
|
||||||
|
|
@ -640,18 +329,8 @@ public:
|
||||||
Deform_mesh* dm;
|
Deform_mesh* dm;
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::optional<std::size_t> select_isolated_components(std::size_t threshold) {
|
boost::optional<std::size_t> select_isolated_components(std::size_t threshold) ;
|
||||||
typedef boost::function_output_iterator<Select_roi_output> Output_iterator;
|
|
||||||
Output_iterator out(deform_mesh);
|
|
||||||
|
|
||||||
Travel_isolated_components::Selection_visitor<Output_iterator> visitor(threshold, out);
|
|
||||||
Travel_isolated_components().travel<Vertex_handle>
|
|
||||||
(vertices(*polyhedron()).first, vertices(*polyhedron()).second,
|
|
||||||
polyhedron()->size_of_vertices(), Is_selected(deform_mesh), visitor);
|
|
||||||
|
|
||||||
if(visitor.any_inserted) { invalidateOpenGLBuffers(); Q_EMIT itemChanged(); }
|
|
||||||
return visitor.minimum_visitor.minimum;
|
|
||||||
}
|
|
||||||
protected:
|
protected:
|
||||||
// Deformation related functions //
|
// Deformation related functions //
|
||||||
void print_message(const QString& /*message*/)
|
void print_message(const QString& /*message*/)
|
||||||
|
|
@ -659,113 +338,17 @@ protected:
|
||||||
// std::cout << message.toStdString() << std::endl;
|
// std::cout << message.toStdString() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_there_any_ctrl_vertices_group(Ctrl_vertices_group_data_list::iterator& hgb, Ctrl_vertices_group_data_list::iterator& hge)
|
bool is_there_any_ctrl_vertices_group(Ctrl_vertices_group_data_list::iterator& hgb, Ctrl_vertices_group_data_list::iterator& hge);
|
||||||
{
|
|
||||||
hgb = ctrl_vertex_frame_map.begin(); hge = ctrl_vertex_frame_map.end();
|
|
||||||
return hgb != hge;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_there_any_ctrl_vertices_group()
|
bool is_there_any_ctrl_vertices_group();
|
||||||
{
|
|
||||||
Ctrl_vertices_group_data_list::iterator hgb, hge;
|
|
||||||
return is_there_any_ctrl_vertices_group(hgb, hge);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_there_any_ctrl_vertices()
|
bool is_there_any_ctrl_vertices();
|
||||||
{
|
void refresh_all_group_centers();
|
||||||
Ctrl_vertices_group_data_list::iterator hgb, hge;
|
bool activate_closest_manipulated_frame(int x, int y);
|
||||||
if(!is_there_any_ctrl_vertices_group(hgb, hge)) { return false; } // there isn't any group of control vertices
|
|
||||||
|
|
||||||
for(; hgb != hge; ++hgb) // check inside groups of control vertices
|
|
||||||
{
|
|
||||||
if(!hgb->ctrl_vertices_group.empty()) { return true; }
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void refresh_all_group_centers()
|
|
||||||
{
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{ it->refresh(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
bool activate_closest_manipulated_frame(int x, int y)
|
|
||||||
{
|
|
||||||
if(state.ctrl_pressing && (state.left_button_pressing || state.right_button_pressing) )
|
|
||||||
{ // user is deforming currently don't change the state
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(ctrl_vertex_frame_map.empty()) { return false; }
|
|
||||||
|
|
||||||
rot_constraint.setRotationConstraintType(qglviewer::AxisPlaneConstraint::FREE);
|
|
||||||
rot_constraint.setTranslationConstraintType(qglviewer::AxisPlaneConstraint::FREE);
|
|
||||||
|
|
||||||
QGLViewer* viewer = *QGLViewer::QGLViewerPool().begin();
|
|
||||||
qglviewer::Camera* camera = viewer->camera();
|
|
||||||
|
|
||||||
if(!state.ctrl_pressing)
|
|
||||||
{
|
|
||||||
if(viewer->manipulatedFrame() == NULL)
|
|
||||||
{ return false;}
|
|
||||||
viewer->setManipulatedFrame(NULL);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// now find closest frame and make it active manipulated frame
|
|
||||||
Ctrl_vertices_group_data_list::iterator min_it = ctrl_vertex_frame_map.begin();
|
|
||||||
const qglviewer::Vec& pos_it = camera->projectedCoordinatesOf(min_it->frame->position());
|
|
||||||
float min_dist = std::pow(pos_it.x - x, 2) + std::pow(pos_it.y - y, 2);
|
|
||||||
|
|
||||||
for(Ctrl_vertices_group_data_list::iterator it = ctrl_vertex_frame_map.begin(); it != ctrl_vertex_frame_map.end(); ++it)
|
|
||||||
{
|
|
||||||
const qglviewer::Vec& pos_it = camera->projectedCoordinatesOf(it->frame->position());
|
|
||||||
float dist = std::pow(pos_it.x - x, 2) + std::pow(pos_it.y - y, 2);
|
|
||||||
if(dist < min_dist) {
|
|
||||||
min_dist = dist;
|
|
||||||
min_it = it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//set rotation constraint for the manipulated frame
|
|
||||||
if (!is_rot_free){
|
|
||||||
rot_constraint.setRotationConstraintDirection(min_it->rot_direction);
|
|
||||||
rot_constraint.setRotationConstraintType(qglviewer::AxisPlaneConstraint::AXIS);
|
|
||||||
min_it->frame->setConstraint(&rot_constraint);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( ui_widget->ActivateFixedPlaneCheckBox->isChecked())
|
|
||||||
{
|
|
||||||
// the constraint is local to the frame
|
|
||||||
rot_constraint.setTranslationConstraint(qglviewer::AxisPlaneConstraint::PLANE,qglviewer::Vec(0,0,1));
|
|
||||||
if(!ui_widget->ActivatePivotingCheckBox->isChecked()){
|
|
||||||
rot_constraint.setRotationConstraintType(qglviewer::AxisPlaneConstraint::FORBIDDEN);
|
|
||||||
}
|
|
||||||
min_it->frame->setConstraint(&rot_constraint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(viewer->manipulatedFrame() == min_it->frame)
|
|
||||||
{ return false; }
|
|
||||||
viewer->setManipulatedFrame(min_it->frame);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool keyPressEvent(QKeyEvent* e);
|
bool keyPressEvent(QKeyEvent* e);
|
||||||
|
|
||||||
void update_normals() {
|
void update_normals();
|
||||||
BOOST_FOREACH(vertex_descriptor vd, deform_mesh->roi_vertices())
|
|
||||||
{
|
|
||||||
std::size_t id = vd->id();
|
|
||||||
const Polyhedron::Traits::Vector_3& n =
|
|
||||||
CGAL::Polygon_mesh_processing::compute_vertex_normal(vd, deform_mesh->halfedge_graph());
|
|
||||||
normals[id*3] = n.x();
|
|
||||||
normals[id*3+1] = n.y();
|
|
||||||
normals[id*3+2] = n.z();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double scene_diag() const {
|
double scene_diag() const {
|
||||||
const double& xdelta = bbox().xmax() - bbox().xmin();
|
const double& xdelta = bbox().xmax() - bbox().xmin();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue