gKitGL
|
00001 00002 #ifndef _GLMANAGER_H 00003 #define _GLMANAGER_H 00004 00005 #include <string> 00006 #include <map> 00007 #include <vector> 00008 00009 namespace gk { 00010 00011 //! \ingroup openGL 00012 //@{ 00013 00014 //! manager pour les ressources openGL crees directement par l'application. la classe Object doit implementer createGLResource() / releaseGLResource(), cf GLResource. 00015 //! \todo GL4.3 glObjectLabel(), definir un label, utiliser le nom de la ressource 00016 00017 template< class Object > 00018 class GLManager 00019 { 00020 typedef std::map<std::string, int> name_map_type; 00021 name_map_type m_names_map; 00022 00023 //~ typedef std::map<Object *, int> object_map_type; 00024 //~ object_map_type m_objects_map; 00025 00026 std::vector<Object *> m_objects; 00027 00028 //! non copyable. 00029 GLManager( const GLManager& ); 00030 //! non copyable. 00031 GLManager& operator=( const GLManager& ); 00032 00033 //! constructeur. 00034 GLManager( ) 00035 : 00036 m_names_map(), 00037 m_objects() 00038 {} 00039 00040 //! destructeur. 00041 virtual ~GLManager( ) 00042 { 00043 const int n= (int) m_objects.size(); 00044 for(int i= 0; i < n; i++) 00045 { 00046 if(m_objects[i] == NULL) 00047 continue; 00048 00049 // libere les ressources openGL 00050 m_objects[i]->releaseGLResource(); 00051 // et detruit l'objet 00052 delete m_objects[i]; 00053 } 00054 } 00055 00056 public: 00057 //! reference un nouvel objet nomme. 00058 Object *insert( Object *object, const std::string& name= "" ) 00059 { 00060 if(name.empty() == false) 00061 // n'insere que les objets nommes dans la map. 00062 m_names_map.insert( std::make_pair(name, m_objects.size()) ); 00063 00064 m_objects.push_back(object); 00065 return object; 00066 } 00067 00068 //! recherche un objet nomme. 00069 Object *find( const std::string& name ) 00070 { 00071 typename name_map_type::iterator found= m_names_map.find(name); 00072 if(found == m_names_map.end()) 00073 return NULL; 00074 00075 return m_objects[found->second]; 00076 } 00077 00078 //~ //! detruit un objet nomme. 00079 //~ int release( const std::string& name ) 00080 //~ { 00081 //~ typename name_map_type::iterator found= m_names_map.find(name); 00082 //~ if(found == m_names_map.end()) 00083 //~ return -1; 00084 00085 //~ // libere les ressources openGL, de-reference l'objet 00086 //~ Object *object= m_objects[found->second]; 00087 //~ if(object == NULL) 00088 //~ return -1; 00089 00090 //~ m_names_map.erase(found); 00091 //~ m_objects_map.erase(object); 00092 00093 //~ object->releaseGLResource(); 00094 //~ delete object; 00095 //~ m_objects[found->second]= NULL; 00096 //~ return 0; 00097 //~ } 00098 00099 //~ //! detruit un objet. 00100 //~ int release( const Object *object ) 00101 //~ { 00102 //~ if(object == NULL) 00103 //~ return -1; 00104 00105 //~ typename object_map_type::iterator found= m_objects_map.find(object); 00106 //~ if(found == m_objects_map.end()) 00107 //~ return -1; 00108 00109 //~ m_objects_map.erase(found); 00110 00111 //~ // libere les ressources openGL, de-reference l'objet 00112 //~ object->releaseGLResource(); 00113 //~ delete object; 00114 //~ m_objects[found->second]= NULL; 00115 //~ return 0; 00116 //~ } 00117 00118 static 00119 GLManager& manager( ) // singleton 00120 { 00121 static GLManager manager; 00122 return manager; 00123 } 00124 }; 00125 00126 //@} 00127 00128 } // namespace 00129 00130 #endif