gKitGL
GLManager.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends