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

3D图形编程

开发平台:

Visual C++

  1. // ProxyScan.cc                placeholder for unloaded scans
  2. // created 3/12/99             Matt Ginzton (magi@cs)
  3. #include "ProxyScan.h"
  4. #include "MeshTransport.h"
  5. #include "TriMeshUtils.h"
  6. ProxyScan::ProxyScan (const crope& proxyForFileName,
  7.       const Pnt3& min, const Pnt3& max)
  8. {
  9.   set_name (proxyForFileName);
  10.   TbObj::readXform (get_basename());
  11.   // set the bbox, but only if min<max; an uninitialized bbox
  12.   // will come in as max<min.  But adding these two points to
  13.   // the bbox will result in a valid bbox bounding everything.
  14.   if (min[0] < max[0] && min[1] < max[1] && min[2] < max[2]) {
  15.     bbox.add (min);
  16.     bbox.add (max);
  17.   }
  18.   insert_resolution (0, proxyForFileName, false, false);
  19. }
  20. ProxyScan::~ProxyScan()
  21. {
  22. }
  23. MeshTransport*
  24. ProxyScan::mesh (bool perVertex, bool stripped,
  25.  ColorSource color, int colorSize)
  26. {
  27.   MeshTransport* mt = new MeshTransport;
  28.   vector<Pnt3>* vtx = new vector<Pnt3>;
  29.   vtx->reserve (8);
  30.   for (int i = 0; i < 8; i++) {
  31.     vtx->push_back (bbox.corner(i));
  32.   }
  33.   vector<short>* nrm = new vector<short>;
  34.   if (perVertex) {
  35.     nrm->reserve(24);
  36.     for (i = 0; i < 8; i++) {
  37.       pushNormalAsShorts (*nrm, (bbox.corner(i) - bbox.center()).normalize());
  38.     }
  39.   } else {
  40.     nrm->reserve (36);
  41.   }
  42.   const int faceInd[12][3] = {
  43.     { 0, 1, 2 },
  44.     { 1, 3, 2 },
  45.     { 2, 3, 6 },
  46.     { 3, 7, 6 },
  47.     { 6, 7, 4 },
  48.     { 7, 5, 4 },
  49.     { 0, 4, 1 },
  50.     { 1, 4, 5 },
  51.     { 0, 6, 4 },
  52.     { 0, 2, 6 },
  53.     { 1, 5, 7 },
  54.     { 1, 7, 3 }
  55.   };
  56.   vector<int>* tri_inds = new vector<int>;
  57.   for (i = 0; i < 12; i++) {
  58.     int t1 = faceInd[i][0];
  59.     int t2 = faceInd[i][1];
  60.     int t3 = faceInd[i][2];
  61.     tri_inds->push_back (t1);
  62.     tri_inds->push_back (t2);
  63.     tri_inds->push_back (t3);
  64.     if (!perVertex) {
  65.       Pnt3 normal = cross (((*vtx)[t1] - (*vtx)[t2]),
  66.    ((*vtx)[t1] - (*vtx)[t3]));
  67.       normal.normalize();
  68.       pushNormalAsShorts (*nrm, normal);
  69.     }
  70.     if (stripped)              // end strip
  71.       tri_inds->push_back (-1);
  72.   }
  73.   mt->setVtx (vtx, MeshTransport::steal);
  74.   mt->setNrm (nrm, MeshTransport::steal);
  75.   mt->setTris (tri_inds, MeshTransport::steal);
  76.   return mt;
  77. }
  78. crope
  79. ProxyScan::getInfo (void)
  80. {
  81.   return crope ("Proxy scan, data not loaded.nn") + RigidScan::getInfo();
  82. }