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

3D图形编程

开发平台:

Visual C++

  1. // ScanFactory.cc              Create objects of individual scan classes
  2. // created 11/26/98            Matt Ginzton (magi@cs)
  3. //
  4. // No other file but this one should need to reference any *Scan except
  5. // at the RigidScan level.
  6. #include "Mesh.h"
  7. #include "GenericScan.h"
  8. #include "CyberScan.h"
  9. #include "CyraScan.h"
  10. #include "MMScan.h"
  11. #include "SyntheticScan.h"
  12. #include "GroupScan.h"
  13. #include "ProxyScan.h"
  14. RigidScan*
  15. CreateScanFromGeometry (const vector<Pnt3>& vtx,
  16. const vector<int>& tris,
  17. const crope& name)
  18. {
  19.   Mesh* mesh = new Mesh (vtx, tris);
  20.   GenericScan* gs = new GenericScan (mesh, name);
  21.   return gs;
  22. }
  23. static bool 
  24. has_ending(const crope& filename, const crope& ending)
  25. {
  26.   int lenf = filename.size();
  27.   int lene = ending.size();
  28.   if (lenf <= lene)
  29.     return FALSE;
  30.   return (ending == filename.substr (lenf - lene, lenf));
  31. }
  32. RigidScan*
  33. CreateScanFromFile (const crope& filename)
  34. {
  35.   RigidScan *scan = NULL;
  36.   if      (has_ending(filename, ".ply"))
  37.     scan = new GenericScan;
  38.   else if (has_ending(filename, ".ply.gz"))
  39.     scan = new GenericScan;
  40.   else if (has_ending(filename, ".set"))
  41.     scan = new GenericScan;
  42.   else if (has_ending(filename, ".sd"))
  43.     scan = new CyberScan;
  44.   else if (has_ending(filename, ".sd.gz"))
  45.     scan = new CyberScan;
  46.   else if (has_ending(filename, ".cta"))
  47.     scan = new MMScan;
  48.   else if (has_ending(filename, ".mms"))
  49.     scan = new MMScan;
  50.   else if (has_ending(filename, ".pts"))
  51.     scan = new CyraScan;
  52.   else
  53.     scan = new GenericScan;
  54.   if (scan) {
  55.     if (!scan->read (filename)) {
  56.       delete scan;
  57.       scan = NULL;
  58.     }
  59.   }
  60.   return scan;
  61. }
  62. RigidScan*
  63. CreateScanFromThinAir (float size, int type)
  64. {
  65.   // note -- types not supported; just for future options
  66.   RigidScan* scan = new SyntheticScan (size);
  67.   return scan;
  68. }
  69. RigidScan*
  70. CreateScanGroup (const vector<DisplayableMesh*>& members, const char *nameToUse, bool bDirty)
  71. {
  72.   RigidScan* scan = new GroupScan (members, bDirty);
  73.   scan->set_name (strdup(nameToUse));
  74.   
  75.   return scan;
  76. }
  77. vector<DisplayableMesh*>
  78. BreakScanGroup (RigidScan* scan)
  79. {
  80.   vector<DisplayableMesh*> members;
  81.   GroupScan* group = dynamic_cast<GroupScan*> (scan);
  82.   if (group) {
  83.     if (group->get_children_for_display (members)) {
  84.       for (DisplayableMesh** mem = members.begin();
  85.    mem < members.end(); mem++) {
  86. group->RemoveScan (*mem);
  87.       }
  88.     }
  89.   } else {
  90.     members.clear();
  91.   }
  92.   return members;
  93. }
  94. RigidScan*
  95. CreateScanFromBbox (const crope& name, const Pnt3& min, const Pnt3& max)
  96. {
  97.   return new ProxyScan (name, min, max);
  98. }
  99. bool
  100. isScanLoaded (const RigidScan* scan)
  101. {
  102.   return dynamic_cast<const ProxyScan*> (scan) == NULL;
  103. }