📄 vdpmclientviewerwidget.cc
字号:
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
vertex_handle = mesh_.add_vertex(p);
node_index = vhierarchy_.generate_node_index(i, 1);
node_handle = vhierarchy_.add_node();
vhierarchy_.node(node_handle).set_index(node_index);
vhierarchy_.node(node_handle).set_vertex_handle(vertex_handle);
mesh_.vertex(vertex_handle).set_vhierarchy_node_handle(node_handle);
vhierarchy_.node(node_handle).set_radius(radius);
vhierarchy_.node(node_handle).set_normal(normal);
vhierarchy_.node(node_handle).set_sin_square(sin_square);
vhierarchy_.node(node_handle).set_mue_square(mue_square);
vhierarchy_.node(node_handle).set_sigma_square(sigma_square);
mesh_.set_normal(vertex_handle, normal);
index2handle_map[node_index] = node_handle;
roots.push_back(node_handle);
}
vfront_.init(roots, n_details_);
for (i=0; i<n_base_faces_; ++i)
{
OpenMesh::IO::restore(ifs, fvi[0], swap);
OpenMesh::IO::restore(ifs, fvi[1], swap);
OpenMesh::IO::restore(ifs, fvi[2], swap);
mesh_.add_face(mesh_.vertex_handle(fvi[0]),
mesh_.vertex_handle(fvi[1]),
mesh_.vertex_handle(fvi[2]));
}
// load details
for (i=0; i<n_details_; ++i)
{
// position of v0
OpenMesh::IO::restore(ifs, p, swap);
// vsplit info.
OpenMesh::IO::restore(ifs, value, swap);
node_index = VHierarchyNodeIndex(value);
OpenMesh::IO::restore(ifs, value, swap);
fund_lcut_index = VHierarchyNodeIndex(value);
OpenMesh::IO::restore(ifs, value, swap);
fund_rcut_index = VHierarchyNodeIndex(value);
node_handle = index2handle_map[node_index];
vhierarchy_.make_children(node_handle);
lchild_handle = vhierarchy_.node(node_handle).lchild_handle();
rchild_handle = vhierarchy_.node(node_handle).rchild_handle();
vhierarchy_.node(node_handle).set_fund_lcut(fund_lcut_index);
vhierarchy_.node(node_handle).set_fund_rcut(fund_rcut_index);
vertex_handle = mesh_.add_vertex(p);
vhierarchy_.node(lchild_handle).set_vertex_handle(vertex_handle);
vhierarchy_.node(rchild_handle).set_vertex_handle(vhierarchy_.node(node_handle).vertex_handle());
index2handle_map[vhierarchy_.node(lchild_handle).node_index()] = lchild_handle;
index2handle_map[vhierarchy_.node(rchild_handle).node_index()] = rchild_handle;
// view-dependent parameters
OpenMesh::IO::restore(ifs, radius, swap);
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
vhierarchy_.node(lchild_handle).set_radius(radius);
vhierarchy_.node(lchild_handle).set_normal(normal);
vhierarchy_.node(lchild_handle).set_sin_square(sin_square);
vhierarchy_.node(lchild_handle).set_mue_square(mue_square);
vhierarchy_.node(lchild_handle).set_sigma_square(sigma_square);
OpenMesh::IO::restore(ifs, radius, swap);
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
vhierarchy_.node(rchild_handle).set_radius(radius);
vhierarchy_.node(rchild_handle).set_normal(normal);
vhierarchy_.node(rchild_handle).set_sin_square(sin_square);
vhierarchy_.node(rchild_handle).set_mue_square(mue_square);
vhierarchy_.node(rchild_handle).set_sigma_square(sigma_square);
}
ifs.close();
// update face and vertex normals
mesh_.update_face_normals();
// bounding box
MyMesh::ConstVertexIter
vIt(mesh_.vertices_begin()),
vEnd(mesh_.vertices_end());
bbMin_ = bbMax_ = mesh_.point(vIt);
for (; vIt!=vEnd; ++vIt)
{
bbMin_.minimize(mesh_.point(vIt));
bbMax_.maximize(mesh_.point(vIt));
}
// set center and radius
set_scene_pos(0.5f*(bbMin_ + bbMax_), 0.5*(bbMin_ - bbMax_).norm());
// info
std::cerr << mesh_.n_vertices() << " vertices, "
<< mesh_.n_edges() << " edge, "
<< mesh_.n_faces() << " faces, "
<< n_details_ << " detail vertices\n";
updateGL();
}
void
VDPMClientViewerWidget::
open_vd_base_mesh(const char* _filename)
{
unsigned int i;
unsigned int fvi[3];
//int tree_id, node_id;
char fileformat[16];
OpenMesh::Vec3f p, normal;
float radius, sin_square, mue_square, sigma_square;
VHierarchyNodeHandleContainer roots;
OpenMesh::VertexHandle vertex_handle;
VHierarchyNodeIndex node_index;
VHierarchyNodeHandle node_handle;
std::map<VHierarchyNodeIndex, VHierarchyNodeHandle> index2handle_map;
std::ifstream ifs(_filename, std::ios::binary);
if (!ifs)
{
std::cerr << "read error\n";
exit(1);
}
//
bool swap = OpenMesh::Endian::local() != OpenMesh::Endian::LSB;
// read header
ifs.read(fileformat, 10); fileformat[10] = '\0';
if (std::string(fileformat) != std::string("VDProgMesh"))
{
std::cerr << "Wrong file format.\n";
ifs.close();
exit(1);
}
OpenMesh::IO::restore(ifs, n_base_vertices_, swap);
OpenMesh::IO::restore(ifs, n_base_faces_, swap);
OpenMesh::IO::restore(ifs, n_details_, swap);
mesh_.clear();
vfront_.clear();
vhierarchy_.clear();
vhierarchy_.set_num_roots(n_base_vertices_);
// load base mesh
for (i=0; i<n_base_vertices_; ++i)
{
OpenMesh::IO::restore(ifs, p, swap);
OpenMesh::IO::restore(ifs, radius, swap);
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
vertex_handle = mesh_.add_vertex(p);
node_index = vhierarchy_.generate_node_index(i, 1);
node_handle = vhierarchy_.add_node();
vhierarchy_.node(node_handle).set_index(node_index);
vhierarchy_.node(node_handle).set_vertex_handle(vertex_handle);
mesh_.vertex(vertex_handle).set_vhierarchy_node_handle(node_handle);
vhierarchy_.node(node_handle).set_radius(radius);
vhierarchy_.node(node_handle).set_normal(normal);
vhierarchy_.node(node_handle).set_sin_square(sin_square);
vhierarchy_.node(node_handle).set_mue_square(mue_square);
vhierarchy_.node(node_handle).set_sigma_square(sigma_square);
mesh_.set_normal(vertex_handle, normal);
index2handle_map[node_index] = node_handle;
roots.push_back(node_handle);
#ifdef EXAMPLE_CREATION
g_index2numdesc_map[node_index] = 1;
#endif
}
vfront_.init(roots, n_details_);
for (i=0; i<n_base_faces_; ++i)
{
OpenMesh::IO::restore(ifs, fvi[0], swap);
OpenMesh::IO::restore(ifs, fvi[1], swap);
OpenMesh::IO::restore(ifs, fvi[2], swap);
mesh_.add_face(mesh_.vertex_handle(fvi[0]),
mesh_.vertex_handle(fvi[1]),
mesh_.vertex_handle(fvi[2]));
}
#ifdef EXAMPLE_CREATION
int tree_id, node_id;
// load details
for (i=0; i<n_details_; ++i)
{
// position of v0
OpenMesh::IO::restore(ifs, p, swap);
// vsplit info.
OpenMesh::IO::restore(ifs, value, swap);
node_index = vhierarchy_.generate_node_index(value);
// fundamental cut vertices
OpenMesh::IO::restore(ifs, value, swap);
OpenMesh::IO::restore(ifs, value, swap);
// view-dependent parameters
OpenMesh::IO::restore(ifs, radius, swap);
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
OpenMesh::IO::restore(ifs, radius, swap);
OpenMesh::IO::restore(ifs, normal, swap);
OpenMesh::IO::restore(ifs, sin_square, swap);
OpenMesh::IO::restore(ifs, mue_square, swap);
OpenMesh::IO::restore(ifs, sigma_square, swap);
__add_children(node_index, false);
}
// set max_descendents of root vertices
for (i=0; i<n_base_vertices_; ++i)
{
node_index = vhierarchy_.generate_node_index(i, 1);
VHierarchyNodeHandle node_handle = index2handle_map[node_index];
VertexHandle vh = vhierarchy_.node(node_handle).vertex_handle();
mesh_.set_color(vh, myYellow);
}
#endif
ifs.close();
// update face and vertex normals
mesh_.update_face_normals();
// bounding box
MyMesh::ConstVertexIter
vIt(mesh_.vertices_begin()),
vEnd(mesh_.vertices_end());
bbMin_ = bbMax_ = mesh_.point(vIt);
for (; vIt!=vEnd; ++vIt)
{
bbMin_.minimize(mesh_.point(vIt));
bbMax_.maximize(mesh_.point(vIt));
}
// set center and radius
set_scene_pos(0.5f*(bbMin_ + bbMax_), 0.5*(bbMin_ - bbMax_).norm());
save_views();
// info
std::cerr << mesh_.n_vertices() << " vertices, "
<< mesh_.n_edges() << " edge, "
<< mesh_.n_faces() << " faces, "
<< n_details_ << " detail vertices\n";
updateGL();
}
void VDPMClientViewerWidget::keyPressEvent(QKeyEvent* _event)
{
bool handled(false);
switch (_event->key())
{
case Key_Plus:
viewing_parameters_.increase_tolerance();
std::cout << "Scree-space error tolerance^2 is increased by "
<< viewing_parameters_.tolerance_square() << std::endl;
updateGL();
break;
case Key_Minus:
viewing_parameters_.decrease_tolerance();
std::cout << "Screen-space error tolerance^2 is decreased by "
<< viewing_parameters_.tolerance_square() << std::endl;
updateGL();
break;
case Key_A:
adaptive_mode_ = !(adaptive_mode_);
std::cout << "Adaptive refinement mode is "
<< ((adaptive_mode_ == true) ? "on" : "off") << std::endl;
updateGL();
break;
case Key_D:
set_debug_print(!debug_print());
break;
case Key_O:
qFilename_ = QFileDialog::getOpenFileName("d:/data/models/spm/", "*.spm");
open_vd_base_mesh(qFilename_);
break;
case Key_BracketLeft:
max_transmitted_datasize_ -= 10000;
std::cout << "Max transmitted data: " << max_transmitted_datasize_ << std::endl;
break;
case Key_BracketRight:
max_transmitted_datasize_ += 10000;
std::cout << "Max transmitted data: " << max_transmitted_datasize_ << std::endl;
break;
case Key_Space:
memcpy(reserved_modelview_matrix_, modelview_matrix(), 16*sizeof(GLdouble));
memcpy(reserved_projection_matrix_, projection_matrix(), 16*sizeof(GLdouble));
std::cout << "Reserving current view-point" << std::endl;
break;
case Key_R:
request_base_mesh();
break;
case Key_S:
save_views();
std::cout << "Saving view-points" << std::endl;
break;
case Key_F:
frame_ = 0;
std::cout << "Frame is set to 0" << std::endl;
break;
case Key_M:
adaptive_mode_ = false;
current_max_resolution();
updateGL();
std::cout << "Current max resolution mesh" << std::endl;
break;
case Key_V:
vd_streaming_ = !(vd_streaming_);
if (vd_streaming_)
std::cout << "View-dependent streaing mode" << std::endl;
else
std::cout << "Sequential streaming mode" << std::endl;
break;
case Key_C:
adaptive_mode_ = false;
qCameraFileName_ = QFileDialog::getOpenFileName("./", "*.cmr");
load_views(qCameraFileName_);
std::cout << "Loading view-points" << std::endl;
updateGL();
break;
case Key_9:
save_screen(true);
break;
case Key_0:
std::cout << "#faces: " << mesh_.n_faces() << std::endl;
break;
case Key_P:
if (qAnimationTimer_->isActive())
{
qAnimationTimer_->stop();
std::cout << "print_statistics mode is stopped!" << std::endl;
}
else
{
qAnimationTimer_->start(0, true);
std::cout << "print_statistics mode is started!" << std::endl;
adaptive_mode_ = true;
set_scene_pos(
Vec3f(0.5f*(bbMin_[0] + bbMax_[0]), 0.9f*bbMax_[1], 0.5f*(bbMin_[2] + bbMax_[2])),
0.15f*(bbMin_ - bbMax_).norm());
nth_viewpoint_ = 0;
print_statistics();
}
std::cout << "Frame: " << frame_ << std::endl;
break;
case Key_L:
if (qAnimationTimer_->isActive())
{
qAnimationTimer_->stop();
std::cout << "look_around mode is stopped!" << std::endl;
}
else
{
qAnimationTimer_->start(0, true);
std::cout << "look_around mode is started!" << std::endl;
adaptive_mode_ = true;
set_scene_pos(
Vec3f(0.5f*(bbMin_[0] + bbMax_[0]), 0.9f*bbMax_[1], 0.5f*(bbMin_[2] + bbMax_[2])),
0.15f*(bbMin_ - bbMax_).norm());
frame_ = 0;
nth_viewpoint_ = 0;
look_around();
}
break;
case Key_Q:
case Key_Escape:
qApp->quit();
default:
this->MeshViewerWidget::keyPressEvent( _event );
}
if (!handled)
_event->ignore();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -