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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // DrawObj.h
  4. //
  5. // Kari Pulli
  6. // Thu Jan 21 18:14:19 CET 1999
  7. //
  8. // A plugin object for adding OpenGL renderings into your
  9. // refresh routine.
  10. //
  11. //############################################################
  12. #ifndef _DRAWOBJ_H_
  13. #define _DRAWOBJ_H_
  14. #include <vector.h>
  15. #include <GL/gl.h>
  16. class DrawObj {
  17. private:
  18.   bool enabled;
  19. public:
  20.   DrawObj(void) : enabled(1) {}
  21.   ~DrawObj(void) {}
  22.   void enable(void)  { enabled = true; }
  23.   void disable(void) { enabled = false; }
  24.   void draw(void) 
  25.     {
  26.       if (!enabled) return;
  27.       glPushAttrib(GL_ALL_ATTRIB_BITS);
  28.       drawthis();
  29.       glPopAttrib();
  30.     }
  31.   virtual void drawthis(void) = 0;
  32. };
  33. // make an instance of the following object just
  34. // in one place and use it as external variable
  35. // to add/remove DrawObj's
  36. class DrawObjects {
  37. private:
  38.   vector<DrawObj *> list;
  39.   typedef vector<DrawObj*>::iterator itT;
  40. public:
  41.   DrawObjects(void) {}
  42.   ~DrawObjects(void) 
  43.     {
  44.       // magi -- this seems like a bad idea, since we don't know who added 
  45.       // stuff here or why, so we can't assume ownership.  Plus it's not
  46.       // that useful, since this class is only instantiated once, as a
  47.       // static object, so the only time this destructor will be called is 
  48.       // at exit time... who really cares about freeing memory.  But
  49.       // crashes on exit look bad, and purify showed this actually getting 
  50.       // called for stuff that had already been freed... not sure how, but 
  51.       // easiest to disable it.
  52.       //for (itT it = list.begin(); it != list.end(); it++) {
  53.       //delete *it;
  54.       //}
  55.     }
  56.   void operator()(void)
  57.     {
  58.       for (itT it = list.begin(); it != list.end(); it++) {
  59. (*it)->draw();
  60.       }
  61.     }
  62.   
  63.   bool add(DrawObj *o)
  64.     {
  65.       if (find(list.begin(), list.end(), o) == list.end()) {
  66. list.push_back(o);
  67. return true;
  68.       } else {
  69. return false;
  70.       }
  71.     }
  72.   bool remove(DrawObj *o)
  73.     {
  74.       itT it = find(list.begin(), list.end(), o);
  75.       if (it == list.end()) {
  76. return false;
  77.       } else {
  78. list.erase(it);
  79. return true;
  80.       }
  81.     }
  82. };
  83. #endif