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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // MeshTransport.cc
  4. //
  5. // Matt Ginzton
  6. // Tue Feb  9 16:38:33 CET 1999
  7. //
  8. // Wrapper class for sending geometry information, as one or
  9. // more triangle meshes, from point a to b, managing memory
  10. // issues along the way.
  11. //
  12. //############################################################
  13. #include "MeshTransport.h"
  14. #ifdef SCZ_NORMAL_FORCEFLOAT
  15. const GLenum MeshTransport::normal_type = GL_FLOAT;
  16. #else
  17. const GLenum MeshTransport::normal_type = GL_SHORT;
  18. #endif
  19. MeshTransport::MeshTransport()
  20. {
  21. }
  22. void
  23. MeshTransport::setVtx (const vector<Pnt3>* in,
  24.        TransportMode mode,
  25.        const Xform<float>& xfBy)
  26. {
  27.   switch (mode) {
  28.   case copy:
  29.     vtx.push_back (new vector<Pnt3> (*in));
  30.     freeVtx.push_back (true);
  31.     break;
  32.   case share:
  33.     vtx.push_back (in);
  34.     freeVtx.push_back (false);
  35.     break;
  36.   case steal:
  37.     vtx.push_back (in);
  38.     freeVtx.push_back (true);
  39.   }
  40.   xf.push_back (xfBy);
  41.   bbox.push_back(Bbox());
  42. }
  43. void
  44. MeshTransport::setBbox (const Bbox& in)
  45. {
  46.   // depends on being called after setVtx has already pushed a blank bbox
  47.   // on the end of the bbox vector
  48.   assert (bbox.size() > 0);
  49.   assert (!bbox.back().valid());
  50.   bbox.back() = in;
  51. }
  52. void
  53. MeshTransport::setNrm (const vector<short>* in,
  54.        TransportMode mode)
  55. {
  56. #ifndef SCZ_NORMAL_FORCEFLOAT
  57.   switch (mode) {
  58.   case copy:
  59.     nrm.push_back (new vector<short> (*in));
  60.     freeNrm.push_back (true);
  61.     break;
  62.   case share:
  63.     nrm.push_back (in);
  64.     freeNrm.push_back (false);
  65.     break;
  66.   case steal:
  67.     nrm.push_back (in);
  68.     freeNrm.push_back (true);
  69.   }
  70. #else
  71. #pragma message ( "Normals will be floats! ")
  72.   // convert normals to float, always copy
  73.   // this is a slow hack workaround for the fact that some graphics cards, 
  74.   // including many PC implementations, can't render normals-as-shorts right
  75.   vector<float>* out = new vector<float> (in->size());
  76.   float* pOut;
  77.   const short* pIn;
  78.   for (pIn = in->begin(), pOut = out->begin();
  79.        pIn != in->end();
  80.        pIn++, pOut++) {
  81.     *pOut = *pIn / 32767.0;
  82.   }
  83.   nrm.push_back (out);
  84.   freeNrm.push_back (true);
  85. #endif
  86. }
  87. #ifdef SCZ_NORMAL_FORCEFLOAT
  88. void
  89. MeshTransport::setNrm (const vector<float>* in, TransportMode mode)
  90. {
  91.   // to be called only by appendMT
  92.   switch (mode) {
  93.   case share:
  94.     nrm.push_back (in);
  95.     freeNrm.push_back (false);
  96.     break;
  97.   case steal:
  98.     nrm.push_back (in);
  99.     freeNrm.push_back (true);
  100.   }
  101. }
  102. #endif
  103. void
  104. MeshTransport::setTris (const vector<int>* in,
  105. TransportMode mode)
  106. {
  107.   switch (mode) {
  108.   case copy:
  109.     tri_inds.push_back (new vector<int> (*in));
  110.     freeTris.push_back (true);
  111.     break;
  112.   case share:
  113.     tri_inds.push_back (in);
  114.     freeTris.push_back (false);
  115.     break;
  116.   case steal:
  117.     tri_inds.push_back (in);
  118.     freeTris.push_back (true);
  119.   }
  120. }
  121. void
  122. MeshTransport::setColor (const vector<uchar>* in,
  123.  TransportMode mode)
  124. {
  125.   switch (mode) {
  126.   case copy:
  127.     color.push_back (new vector<uchar> (*in));
  128.     freeColor.push_back (true);
  129.     break;
  130.   case share:
  131.     color.push_back (in);
  132.     freeColor.push_back (false);
  133.     break;
  134.   case steal:
  135.     color.push_back (in);
  136.     freeColor.push_back (true);
  137.   }
  138. }
  139. void
  140. MeshTransport::appendMT (MeshTransport* in,
  141.  const Xform<float>& xfBy)
  142. {
  143.   for (int i = 0; i < in->vtx.size(); i++) {
  144.     setVtx (in->vtx[i], in->freeVtx[i] ? steal : share, xfBy * in->xf[i]);
  145.     in->freeVtx[i] = false;
  146.     setBbox (in->bbox[i]);
  147.     setNrm (in->nrm[i], in->freeNrm[i] ? steal : share);
  148.     in->freeNrm[i] = false;
  149.     setTris (in->tri_inds[i], in->freeTris[i] ? steal : share);
  150.     in->freeTris[i] = false;
  151.     if (i < in->color.size()) {
  152.       setColor (in->color[i], in->freeColor[i] ? steal : share);
  153.       in->freeColor[i] = false;
  154.     }
  155.   }
  156. }
  157. MeshTransport::~MeshTransport()
  158. {
  159.   int i;
  160.   for (i = 0; i < vtx.size(); i++)
  161.     if (freeVtx[i])
  162.       delete vtx[i];
  163.   for (i = 0; i < nrm.size(); i++)
  164.     if (freeNrm[i])
  165.       delete nrm[i];
  166.   for (i = 0; i < tri_inds.size(); i++)
  167.     if (freeTris[i])
  168.       delete tri_inds[i];
  169.   for (i = 0; i < color.size(); i++)
  170.     if (freeColor[i])
  171.       delete color[i];
  172. }