gKitGL
|
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