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

3D图形编程

开发平台:

Visual C++

  1.  //############################################################
  2. // 
  3. // ResolutionCtrl.cc
  4. //
  5. // Kari Pulli
  6. // Fri Jul  3 11:52:55 PDT 1998
  7. //
  8. //############################################################
  9. #include "ResolutionCtrl.h"
  10. #include "plvGlobals.h"
  11. #include "plvScene.h"
  12. void
  13. ResolutionCtrl::split_name(void)
  14. {
  15.   basename = name;
  16.   crope::const_iterator it = basename.end()-1;
  17.   // Special case - gzipped scans
  18.   if ((basename.size() > 3) &&
  19.       (*(it-2) == '.') &&
  20.       (*(it-1) == 'g') &&
  21.       (*(it  ) == 'z'))
  22.           it -= 3;
  23.   // Search for a dot
  24.   while (*it != '.' && it != basename.begin()) it--;
  25.   if (it == basename.begin()) it = basename.end();
  26.   ending = basename.substr(it+1, basename.end());
  27.   basename = basename.substr (basename.begin(), it);
  28. }
  29. void
  30. ResolutionCtrl::set_name(const char  *n)
  31. {
  32.   name = crope(n);
  33.   // remove trailing slash, if a directory name
  34.   if (name.back() == '/' || name.back() == '\') name.pop_back();
  35.   split_name();
  36. }
  37. void
  38. ResolutionCtrl::set_name(const crope &n)
  39. {
  40.   name = n;
  41.   // remove trailing slash, if a directory name
  42.   if (name.back() == '/' || name.back() == '\') name.pop_back();
  43.   split_name();
  44. }
  45. crope
  46. ResolutionCtrl::get_name(void)
  47. {
  48.   return name;
  49. }
  50. crope
  51. ResolutionCtrl::get_basename(void)
  52. {
  53.   return basename;
  54. }
  55. crope
  56. ResolutionCtrl::get_nameending(void)
  57. {
  58.   return ending;
  59. }
  60. bool
  61. ResolutionCtrl::has_ending(const char *end)
  62. {
  63.   if (end[0] == '.') return ending == crope(end+1);
  64.   else               return ending == crope(end);
  65. }
  66. bool 
  67. ResolutionCtrl::select_finest(void)
  68. {
  69.   if (!resolutions.size()) return false;
  70.   return switchToResLevel (0);
  71. }
  72. bool 
  73. ResolutionCtrl::select_coarsest(void)
  74. {
  75.   if (!resolutions.size()) return false;
  76.   return switchToResLevel (resolutions.size()-1);
  77. }      
  78. bool 
  79. ResolutionCtrl::select_finer(void)
  80. {
  81.   if (!resolutions.size()) return false;
  82.   if (curr_res == 0) return false;
  83.   if (switchToResLevel (curr_res - 1)) return true;
  84.   return false;
  85.   //return select_finest();
  86. }
  87. bool 
  88. ResolutionCtrl::select_coarser(void)
  89. {
  90.   if (!resolutions.size()) return false;
  91.   if (curr_res == resolutions.size()-1) return false;
  92.   if (switchToResLevel (curr_res + 1)) return true;
  93.   
  94.   return false;
  95.   //return select_coarsest();
  96. }
  97. bool 
  98. ResolutionCtrl::select_by_count(int n)
  99. {
  100.   return switchToResLevel (findLevelForRes (n));
  101. }
  102. int
  103. ResolutionCtrl::create_resolution_absolute(int budget, Decimator dec)
  104. { return 0; }
  105. bool 
  106. ResolutionCtrl::delete_resolution (int abs_res)
  107. { return false; }
  108. void
  109. ResolutionCtrl::insert_resolution (int abs, crope filename,
  110.    bool in_mem, bool desired_mem)
  111. {
  112.   res_info res;
  113.   res.abs_resolution = abs;
  114.   res.filename = filename;
  115.   res.in_memory = in_mem;
  116.   res.desired_in_mem = desired_mem;
  117.   int n = resolutions.size();
  118.   resolutions.push_back (res);
  119.   inplace_merge (resolutions.begin(), &resolutions[n], resolutions.end());
  120. }
  121. bool
  122. ResolutionCtrl::set_load_desired (int res, bool desired)
  123. {
  124.   int i = findLevelForRes (res);
  125.   if (i >= 0) {
  126.     resolutions[i].desired_in_mem = desired;
  127.     return true;
  128.   }
  129.   return false;
  130. }
  131. void 
  132. ResolutionCtrl::existing_resolutions(vector<res_info> &res)
  133. { res = resolutions; }
  134. ResolutionCtrl::res_info 
  135. ResolutionCtrl::current_resolution(void)
  136. {
  137.   if (curr_res < 0 || curr_res >= resolutions.size())
  138.   {
  139.     static res_info bogus;
  140.     memset (&bogus, 0, sizeof(bogus));
  141.     return bogus;
  142.   }
  143.   return resolutions[curr_res];
  144. }
  145. bool 
  146. ResolutionCtrl::load_resolution(int i)
  147. { return 0; }
  148. bool 
  149. ResolutionCtrl::release_resolution(int nPolys)
  150. {
  151.   cerr << "Warning: no memory was actually freed" << endl;
  152.   return 0;
  153. }
  154. bool
  155. ResolutionCtrl::switchToResLevel (int iRes)
  156. {
  157.   if (iRes < 0 || iRes >= resolutions.size())
  158.     return false;
  159.   if (!resolutions[iRes].in_memory) {
  160.     if (!load_resolution (iRes))
  161.       return false;
  162.   }
  163.   curr_res = iRes;
  164.   return true;
  165. }
  166. int
  167. ResolutionCtrl::current_resolution_index (void)
  168. {
  169.   int globalRes = theScene->getMeshResolution();
  170.   switch (globalRes) {
  171.   case Scene::resTempHigh:
  172.     return 0;
  173.   case Scene::resTempLow:
  174.     return resolutions.size() - 1;
  175.   case Scene::resDefault:
  176.   default:
  177.     assert (curr_res >= 0 && curr_res < resolutions.size());
  178.     return curr_res;
  179.   }
  180. }
  181. int
  182. ResolutionCtrl::findLevelForRes (int n)
  183. {
  184.   for (int i=0; i<resolutions.size(); i++) {
  185.     if (n == resolutions[i].abs_resolution) {
  186.       return i;
  187.     }
  188.   }
  189.   return -1;
  190. }
  191. int
  192. ResolutionCtrl::findResForLevel (int n)
  193. {
  194.   assert (n >= 0 && n < resolutions.size());
  195.   return resolutions[n].abs_resolution;
  196. }