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

📄 meshviewerwidgett.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 2 页
字号:
    glBegin(GL_TRIANGLES);    for (; fIt!=fEnd; ++fIt)    {      fvIt = mesh_.cfv_iter(fIt.handle());       glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());    }    glEnd();        glDisableClientState(GL_VERTEX_ARRAY);    glDisableClientState(GL_NORMAL_ARRAY);    glDisableClientState(GL_COLOR_ARRAY);  }    else if (_draw_mode == "Solid Colored Faces") // -----------------------------  {    glEnableClientState(GL_VERTEX_ARRAY);    glVertexPointer(3, GL_FLOAT, 0, mesh_.points());    glEnableClientState(GL_NORMAL_ARRAY);    glNormalPointer(GL_FLOAT, 0, mesh_.vertex_normals());    glBegin(GL_TRIANGLES);    for (; fIt!=fEnd; ++fIt)    {      glColor( fIt.handle() );      fvIt = mesh_.cfv_iter(fIt.handle());       glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());    }    glEnd();        glDisableClientState(GL_VERTEX_ARRAY);    glDisableClientState(GL_NORMAL_ARRAY);  }    else if (_draw_mode == "Smooth Colored Faces") // ---------------------------  {    glEnableClientState(GL_VERTEX_ARRAY);    glVertexPointer(3, GL_FLOAT, 0, mesh_.points());    glEnableClientState(GL_NORMAL_ARRAY);    glNormalPointer(GL_FLOAT, 0, mesh_.vertex_normals());    glBegin(GL_TRIANGLES);    for (; fIt!=fEnd; ++fIt)    {      glMaterial( fIt.handle() );      fvIt = mesh_.cfv_iter(fIt.handle());       glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());      ++fvIt;      glArrayElement(fvIt.handle().idx());    }    glEnd();        glDisableClientState(GL_VERTEX_ARRAY);    glDisableClientState(GL_NORMAL_ARRAY);  }    else if ( _draw_mode == "Strips'n VertexArrays" ) // ------------------------  {    glEnableClientState(GL_VERTEX_ARRAY);    glVertexPointer(3, GL_FLOAT, 0, mesh_.points());    glEnableClientState(GL_NORMAL_ARRAY);    glNormalPointer(GL_FLOAT, 0, mesh_.vertex_normals());    if ( tex_id_ && mesh_.has_vertex_texcoords2D() )    {      glEnableClientState(GL_TEXTURE_COORD_ARRAY);      glTexCoordPointer(2, GL_FLOAT, 0, mesh_.texcoords2D());      glEnable(GL_TEXTURE_2D);      glBindTexture(GL_TEXTURE_2D, tex_id_);      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, tex_mode_);    }    typename MyStripifier::StripsIterator strip_it = strips_.begin();    typename MyStripifier::StripsIterator strip_last = strips_.end();    // Draw all strips    for (; strip_it!=strip_last; ++strip_it)    {      glDrawElements(GL_TRIANGLE_STRIP, 		     strip_it->size(), GL_UNSIGNED_INT, &(*strip_it)[0] );    }    glDisableClientState(GL_VERTEX_ARRAY);    glDisableClientState(GL_NORMAL_ARRAY);    glDisableClientState(GL_TEXTURE_COORD_ARRAY);  }  else if (_draw_mode == "Show Strips" && strips_.is_valid() ) // -------------  {    typename MyStripifier::StripsIterator strip_it = strips_.begin();    typename MyStripifier::StripsIterator strip_last = strips_.end();    float cmax  = 256.0f;    int   range = 220;    int   base  = (int)cmax-range;    int   drcol  = 13;    int   dgcol  = 31;    int   dbcol  = 17;        int rcol=0, gcol=dgcol, bcol=dbcol+dbcol;             // Draw all strips    for (; strip_it!=strip_last; ++strip_it)    {      typename MyStripifier::IndexIterator idx_it   = strip_it->begin();      typename MyStripifier::IndexIterator idx_last = strip_it->end();            rcol = (rcol+drcol) % range;      gcol = (gcol+dgcol) % range;      bcol = (bcol+dbcol) % range;            glBegin(GL_TRIANGLE_STRIP);      glColor3f((rcol+base)/cmax, (gcol+base)/cmax, (bcol+base)/cmax);      for ( ;idx_it != idx_last; ++idx_it )        glVertex3fv(&mesh_.point( OM_TYPENAME Mesh::VertexHandle(*idx_it))[0]);      glEnd();    }    glColor3f(1.0, 1.0, 1.0);  }  else if( _draw_mode == "Points" ) // -----------------------------------------  {    glEnableClientState(GL_VERTEX_ARRAY);    glVertexPointer(3, GL_FLOAT, 0, mesh_.points());    if (mesh_.has_vertex_colors() && use_color_)    {      glEnableClientState(GL_COLOR_ARRAY);      glColorPointer(3, GL_UNSIGNED_BYTE, 0, mesh_.vertex_colors());    }    glDrawArrays( GL_POINTS, 0, mesh_.n_vertices() );    glDisableClientState(GL_VERTEX_ARRAY);    glDisableClientState(GL_COLOR_ARRAY);  }}//-----------------------------------------------------------------------------template <typename M>void MeshViewerWidgetT<M>::draw_scene(const std::string& _draw_mode){    if ( ! mesh_.n_vertices() )    return;   #if defined(OM_USE_OSG) && OM_USE_OSG  else if ( _draw_mode == "OpenSG Indices")  {         glEnable(GL_LIGHTING);    glShadeModel(GL_SMOOTH);    draw_openmesh( _draw_mode );  }       else#endif  if ( _draw_mode == "Points" )  {    glDisable(GL_LIGHTING);    draw_openmesh(_draw_mode);  }  else if (_draw_mode == "Wireframe")  {    glDisable(GL_LIGHTING);    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);    draw_openmesh(_draw_mode);    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);  }    else if ( _draw_mode == "Hidden-Line" )  {    glDisable(GL_LIGHTING);    glShadeModel(GL_FLAT);    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);    glColor4f( 0.0f, 0.0f, 0.0f, 1.0f );    glDepthRange(0.01, 1.0);    draw_openmesh( "Wireframe" );        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE);    glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );    glDepthRange( 0.0, 1.0 );    draw_openmesh( "Wireframe" );        glPolygonMode( GL_FRONT_AND_BACK, GL_FILL);            }    else if (_draw_mode == "Solid Flat")  {    glEnable(GL_LIGHTING);    glShadeModel(GL_FLAT);    draw_openmesh(_draw_mode);  }    else if (_draw_mode == "Solid Smooth"        ||	   _draw_mode == "Strips'n VertexArrays" )  {    glEnable(GL_LIGHTING);    glShadeModel(GL_SMOOTH);    draw_openmesh(_draw_mode);  }    else if (_draw_mode == "Show Strips")  {    glDisable(GL_LIGHTING);    draw_openmesh(_draw_mode);  }    else if (_draw_mode == "Colored Vertices" )  {    glDisable(GL_LIGHTING);    glShadeModel(GL_SMOOTH);    draw_openmesh(_draw_mode);  }  else if (_draw_mode == "Solid Colored Faces")  {    glDisable(GL_LIGHTING);    glShadeModel(GL_FLAT);    draw_openmesh(_draw_mode);    setDefaultMaterial();  }    else if (_draw_mode == "Smooth Colored Faces" )  {    glEnable(GL_LIGHTING);    glShadeModel(GL_SMOOTH);    draw_openmesh(_draw_mode);    setDefaultMaterial();  }  if (show_vnormals_)  {    typename Mesh::VertexIter vit;    glDisable(GL_LIGHTING);    glBegin(GL_LINES);    glColor3f(1.000f, 0.803f, 0.027f); // orange    for(vit=mesh_.vertices_begin(); vit!=mesh_.vertices_end(); ++vit)    {      glVertex( vit );      glVertex( mesh_.point( vit ) + normal_scale_*mesh_.normal( vit ) );    }    glEnd();  }  if (show_fnormals_)  {    typename Mesh::FaceIter fit;    glDisable(GL_LIGHTING);    glBegin(GL_LINES);    glColor3f(0.705f, 0.976f, 0.270f); // greenish    for(fit=mesh_.faces_begin(); fit!=mesh_.faces_end(); ++fit)    {      glVertex( mesh_.property(fp_normal_base_, fit) );      glVertex( mesh_.property(fp_normal_base_, fit) +                 normal_scale_*mesh_.normal( fit ) );    }    glEnd();  }}//-----------------------------------------------------------------------------template <typename M>void MeshViewerWidgetT<M>::enable_strips() {   if (!f_strips_)  {    f_strips_ = true;      add_draw_mode("Strips'n VertexArrays");    add_draw_mode("Show Strips");  }}//-----------------------------------------------------------------------------template <typename M>void MeshViewerWidgetT<M>::disable_strips() {   if (f_strips_)  {    f_strips_ = false;     del_draw_mode("Show Strips");    del_draw_mode("Strip'n VertexArrays");  }}//-----------------------------------------------------------------------------#define TEXMODE( Mode ) \   tex_mode_ = Mode; std::cout << "Texture mode set to " << #Mode << std::endltemplate <typename M>void MeshViewerWidgetT<M>::keyPressEvent( QKeyEvent* _event){  switch( _event->key() )  {    case Key_D:      if ( mesh_.has_vertex_colors() && (current_draw_mode()=="Points") )      {        use_color_ = !use_color_;        std::cout << "use color: " << (use_color_?"yes\n":"no\n");        if (!use_color_)          glColor3f(1.0f, 1.0f, 1.0f);        updateGL();      }      break;    case Key_N:      if ( _event->state() & ShiftButton )      {        show_fnormals_ = !show_fnormals_;        std::cout << "show face normals: " << (show_fnormals_?"yes\n":"no\n");      }      else      {        show_vnormals_ = !show_vnormals_;        std::cout << "show vertex normals: " << (show_vnormals_?"yes\n":"no\n");      }      updateGL();      break;    case Key_I:      std::cout << "\n# Vertices     : " << mesh_.n_vertices() << std::endl;      std::cout << "# Edges        : " << mesh_.n_edges()    << std::endl;      std::cout << "# Faces        : " << mesh_.n_faces()    << std::endl;      std::cout << "binary  input  : " << opt_.check(opt_.Binary) << std::endl;      std::cout << "swapped input  : " << opt_.check(opt_.Swap) << std::endl;      std::cout << "vertex normal  : "                 << opt_.check(opt_.VertexNormal) << std::endl;      std::cout << "vertex texcoord: "                 << opt_.check(opt_.VertexTexCoord) << std::endl;      std::cout << "vertex color   : "                 << opt_.check(opt_.VertexColor) << std::endl;      std::cout << "face normal    : "                 << opt_.check(opt_.FaceNormal) << std::endl;      std::cout << "face color     : "                 << opt_.check(opt_.FaceColor) << std::endl;      this->QGLViewerWidget::keyPressEvent( _event );      break;    case Key_T:      switch( tex_mode_ )      {        case GL_MODULATE: TEXMODE(GL_DECAL); break;        case GL_DECAL:    TEXMODE(GL_BLEND); break;        case GL_BLEND:    TEXMODE(GL_REPLACE); break;        case GL_REPLACE:  TEXMODE(GL_MODULATE); break;      }      updateGL();      break;    default:      this->QGLViewerWidget::keyPressEvent( _event );  }}#undef TEXMODE//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -