⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vdpmclientviewerwidget.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 3 页
字号:
    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 + -