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

3D图形编程

开发平台:

Visual C++

  1. // GroupUI.cc             manage interface to groupscan
  2. // created 1/30/99        magi@cs
  3. #include <vector.h>
  4. #include "DisplayMesh.h"
  5. #include "GroupScan.h"
  6. #include "plvScene.h"
  7. #include "ScanFactory.h"
  8. #include "plvGlobals.h"
  9. DisplayableMesh*
  10. groupScans (vector<DisplayableMesh*>& scans, char* nameToUse, bool bDirty)
  11. {
  12.   for (DisplayableMesh** pdm = scans.begin(); pdm != scans.end(); pdm++) {
  13.     (*pdm)->invalidateCachedData();    // memory won't be used for a while
  14.     (*pdm)->setVisible (false);
  15.   }
  16.   RigidScan* group = CreateScanGroup (scans, nameToUse, bDirty);
  17.   DisplayableMesh* dm = theScene->addMeshSet (group, false);
  18.   // The code below removes each child of the group from the
  19.   // vector theScene->meshSets, which is the place where all the
  20.   // meshes in the current scene are stored. This is in accordance
  21.   // with the strategy of storing only a list of all the "root"
  22.   // meshes, and then calling get_children_for_display etc. to
  23.   // get the remaining meshes if necessary.
  24.   vector <DisplayableMesh *>children;
  25.   crope names;
  26.   GroupScan *g = dynamic_cast<GroupScan *>(group);
  27.   if (group) {
  28.     if (g->get_children_for_display (children)) {
  29.       for (int i = 0; i < children.size(); i++) {
  30. for (DisplayableMesh** scan = theScene->meshSets.begin(); 
  31.      scan != theScene->meshSets.end(); scan++) {
  32.   if (!strcmp((*scan)->getName(), children[i]->getName())) {
  33.     names += crope (" ") + (*scan)->getName();
  34.     theScene->meshSets.erase(scan);
  35.     scan--;
  36.   }
  37. }
  38.       }
  39.     }
  40.   }
  41.   return dm; 
  42. }
  43. vector<DisplayableMesh*>
  44. ungroupScans (DisplayableMesh* group)
  45. {
  46.   assert (group);
  47.   bool wasVis = group->getVisible();
  48.   RigidScan* scanGroup = group->getMeshData();
  49.   vector<DisplayableMesh*> scans = BreakScanGroup (scanGroup);
  50.   if (scans.size()) {
  51.     for (DisplayableMesh** scan = scans.begin(); scan != scans.end(); scan++) {
  52.       (*scan)->setVisible (wasVis);
  53.       // add children back
  54.       theScene->meshSets.push_back(*scan);
  55.     }
  56.     theScene->deleteMeshSet (group);
  57.   }
  58.   return scans;
  59. }
  60. static int iGroups = 1;
  61. char *
  62. getNextUnusedGroupName ()
  63. {
  64.   char buf[256];
  65.   
  66.   sprintf(buf, "group%d", iGroups++);
  67.   return (strdup(buf));
  68. }
  69.   
  70. bool
  71. addToGroup (DisplayableMesh* group, DisplayableMesh* scan)
  72. {
  73.   // TODO
  74.   return false;
  75. }
  76. bool
  77. removeFromGroup (DisplayableMesh* group, DisplayableMesh* scan)
  78. {
  79.   // TODO
  80.   return false;
  81. }