gKitGL
GLShaderObjectIO.h
00001 
00002 #ifndef _GLSHADERIO_H
00003 #define _GLSHADERIO_H
00004 
00005 #include "IOManager.h"
00006 #include "TextFileIO.h"
00007 #include "GL/GLShaderObject.h"
00008 
00009 
00010 namespace gk {
00011 
00012 template< class Shader >
00013 class TShaderIO : public IOManager<Shader>
00014 {
00015     // non copyable
00016     TShaderIO( const TShaderIO& );
00017     TShaderIO& operator=( const TShaderIO& );
00018     
00019     // private default constructor, singleton
00020     TShaderIO( )
00021         :
00022         IOManager<Shader>()
00023     {}
00024     
00025     ~TShaderIO( )
00026     {
00027         // detruire les ressources GL, ~IOManager() detruit les objets.
00028         for(typename std::map<IOName, Shader *>::iterator 
00029             i= IOManager<Shader>::m_names_map.begin(); 
00030             i != IOManager<Shader>::m_names_map.end(); ++i)
00031             i->second->releaseGLResource();
00032     }
00033     
00034 public:
00035     //! importe le shader 'name' a partir du ficher 'filename'
00036     static
00037     Shader *read( const std::string& filename, const std::string& name= "" ) 
00038     {
00039         // importer le fichier, si necessaire
00040         Shader *shader= manager().find(filename, name);
00041         if(shader != NULL)
00042             return shader;
00043         
00044         // cree le shader directement' sans utiliser GLManager / GLContext, l'objet ne doit etre gere que par un seul manager !!
00045         TextFile *source= TextFileIO::read(filename);
00046         if(source == NULL)
00047             return NULL;
00048         
00049         shader= new Shader();
00050         if(shader->pushSource(source) < 0)
00051         {
00052             delete shader;
00053             return NULL;
00054         }
00055         
00056         // reference le shader avec le manager
00057         return manager().insert(shader, filename, name);
00058     }
00059 
00060     static
00061     TShaderIO<Shader>& manager( )  // singleton
00062     {
00063         static TShaderIO<Shader> manager;
00064         return manager;
00065     }
00066 };
00067 
00068 typedef TShaderIO<GLVertexShader> GLVertexShaderIO;
00069 typedef TShaderIO<GLFragmentShader> GLFragmentShaderIO;
00070 
00071 #if defined GK_OPENGL3 || defined GK_OPENGL4
00072 typedef TShaderIO<GLGeometryShader> GLGeometryShaderIO;
00073 #endif
00074 
00075 #ifdef GK_OPENGL4
00076 typedef TShaderIO<GLControlShader> GLControlShaderIO;
00077 typedef TShaderIO<GLEvaluationShader> GLEvaluationShaderIO;
00078 #endif
00079 
00080 }       // namespace
00081 
00082 #endif
00083 
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends