Mesh.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #ifndef _MESH_
  2. #define _MESH_
  3. #include <limits.h>
  4. #include <vector.h>
  5. #include "ResolutionCtrl.h"
  6. #include "defines.h"
  7. #include "Bbox.h"
  8. #include <set.h>
  9. typedef set<int, less<int> > TriList; // List of triangles attached to a single vtx
  10. typedef set<int, less<int> >::iterator TriListI;
  11. class Mesh {
  12. private:
  13.   vector<Pnt3> vtx;
  14.   vector<short> nrm;
  15.   vector<Pnt3> orig_vtx;    // Used by JED during fairing
  16.                             // we want to constrain the surface
  17.                             // to lie near the original noisy surface
  18.   vector<TriList> vtxTris;  // The list of tris attached to each vtx
  19.   
  20.   vec3uc *vertMatDiff;
  21.   vec2f *texture;
  22.   float *vertIntensity;
  23.   float *vertConfidence;
  24.   int hasVertNormals;
  25.   vector<char> bdry; // 1 for boundary vtx, used for registration
  26.   
  27.   char texFileName[PATH_MAX];
  28.   
  29.   vector<int> tris;
  30.   /* store voxels each tri is from - for display voxel feature */
  31.   vector<float> fromVoxels;
  32.   bool hasVoxels;
  33.   vector<int> tstrips;
  34.   int numTris;
  35.   vec3uc *triMatDiff;
  36.   Bbox bbox;
  37.   Pnt3  center;
  38.   float radius;
  39.   
  40.   void subsample_points(float rate, vector<Pnt3> &pts);
  41.   void subsample_points(float rate, vector<Pnt3> &pts,
  42. vector<Pnt3> &nrms);
  43.   bool subsample_points(int n, vector<Pnt3> &pts);
  44.   bool subsample_points(int n, vector<Pnt3> &pts, 
  45. vector<Pnt3> &nrms);
  46.   void remove_unused_vtxs(void);
  47.   void init (void);
  48.   void computeBBox(); // private; call updateScale() instead
  49. public:
  50.   Mesh();
  51.   Mesh (const vector<Pnt3>& _vtx, const vector<int>& _tris);
  52.   ~Mesh();
  53.   
  54.   void flipNormals();
  55.   void initNormals(int useArea = FALSE);
  56.   
  57.   vector<int>& getTris();
  58.   vector<int>& getTstrips();
  59.   const Pnt3& Vtx (int v) { return vtx[v]; }
  60.   void simulateFaceNormals (vector<short>& facen);
  61.   void freeTris (void);
  62.   void freeTStrips (void);
  63.   
  64.   void updateScale();
  65.   void showBBox(void) 
  66.     { cout << bbox.min() << " " << bbox.max() << endl; }
  67.   bool bNeedsSave;
  68.   
  69.   int  num_tris(void);
  70.   int  num_verts(void)  { return vtx.size(); }
  71.   void mark_boundary_verts(void);
  72.   // routines for smoothing - JED
  73.   void dequantizationSmoothing(double maxDisplacement);
  74.   void restoreOrigVerts();
  75.   void saveOrigVerts();
  76.   void calcTriLists();
  77.   // -----------
  78.   
  79.   Mesh *Decimate (int numFaces, int optLevel,
  80.   float errLevel, float boundWeight,
  81.   ResolutionCtrl::Decimator dec = ResolutionCtrl::decQslim);
  82.   void remove_stepedges(int percentile = 50, int factor = 4);
  83.   int  readPlyFile (const char *filename);
  84.   int  writePlyFile (const char *filename, int useColorNotTexture, 
  85.      int writeNormals);
  86.   void addTri(int v1, int v2, int v3)
  87.     {
  88.       assert(tris.size()%3 == 0);
  89.       int vs = vtx.size();
  90.       if (v1 < 0 || v1 >= vs || v2 < 0 || v2 >= vs || v3 < 0 || v3 >= vs) {
  91. cerr << "nnRed alert: invalid triangle "
  92.      << v1 << " " << v2 << " "  << v3
  93.      << " (tri " << tris.size()/3
  94.      << ", valid range=0.." << vs-1 << ")n" << endl;
  95.       } else {
  96. tris.push_back(v1);        /* tris is a vector of ints */
  97. tris.push_back(v2);
  98. tris.push_back(v3);
  99.       }
  100.     }
  101.   void addVoxelInfo(int v1, int v2, int v3,
  102. float fromVoxel1, float fromVoxel2, float fromVoxel3)
  103.     {
  104.       assert(tris.size()%3 == 0);
  105.       int vs = vtx.size();
  106.       if (v1 < 0 || v1 >= vs || v2 < 0 || v2 >= vs || v3 < 0 || v3 >= vs) {
  107. cerr << "nnRed alert: invalid triangle "
  108.      << v1 << " " << v2 << " "  << v3
  109.      << " (tri " << tris.size()/3
  110.      << ", valid range=0.." << vs-1 << ")n" << endl;
  111.       } else {
  112.        /* store voxels in fromVoxels - for display voxel feature */
  113. fromVoxels.push_back(fromVoxel1);
  114. fromVoxels.push_back(fromVoxel2);
  115. fromVoxels.push_back(fromVoxel3);
  116.       }
  117.     }
  118.   void copyTriFrom (Mesh *mSrc, int src, int dst);
  119.   void copyVertFrom (Mesh *mSrc, int src, int dst);
  120.   friend class RangeGrid;
  121.   friend class GenericScan;
  122.   // added by wsh for tweaking violins
  123.   void Warp();
  124. };
  125. /* typedef: optLevelT
  126.  * -------
  127.  * Used to select the level of optimization for Decimate().
  128.  * Refers to the placement of points after pair contraction.
  129.  * The options:
  130.  *   - PLACE_ENDPOINTS: consider only the ends of the line segment
  131.  *   - PLACE_ENDORMID:  consider ends or mids of the line segment
  132.  *   - PLACE_LINE:      find the best position on the line segment
  133.  *   - PLACE_OPTIMAL:   find the best position anywhere in space
  134.  */
  135. //typedef enum {
  136. //  PLACE_ENDPOINTS, PLACE_ENDORMID, PLACE_LINE, PLACE_OPTIMAL 
  137. //} optLevelT;
  138. #endif