gKitGL
|
00001 00002 #ifndef _GKEFFECT_SHADER_MANAGER_H 00003 #define _GKEFFECT_SHADER_MANAGER_H 00004 00005 #include <string> 00006 00007 #include "Name.h" 00008 #include "Effect.h" 00009 #include "IOFileManager.h" 00010 #include "GL/TPShaderProgram.h" 00011 00012 00013 namespace gk { 00014 00015 //! creation simplifiee d'un shader program a partir d'un script. 00016 class EffectShaderManager 00017 { 00018 Effect *m_effect; 00019 00020 std::map<Name, int> m_programs_map; 00021 std::vector<GLShaderProgram *> m_programs; 00022 std::vector<std::string> m_program_names; 00023 00024 // non copyable. 00025 EffectShaderManager( const EffectShaderManager& ); 00026 EffectShaderManager& operator= ( const EffectShaderManager& ); 00027 00028 public: 00029 //! constructeur par defaut 00030 EffectShaderManager( ); 00031 00032 //! charge le script. 00033 int read( const std::string& effect ); 00034 00035 //! constructeur. charge le script. 00036 EffectShaderManager( const std::string& effect ); 00037 00038 //! constructeur. reference un script deja charge. 00039 EffectShaderManager( Effect *effect ); 00040 00041 //! destructeur. 00042 ~EffectShaderManager( ); 00043 00044 //! recharge le fichier de configuration et reinitialise les shader programs deja references/crees par l'application. 00045 //! renvoie -1 en cas d'erreur, 0 si le fichier n'est pas modifie et 1 si le fichier est modifie + recharge. 00046 int reload( ); 00047 00048 //! insere un shader program existant dans le manager. 00049 GLShaderProgram *insert( GLShaderProgram *program, const std::string& name ) 00050 { 00051 m_programs_map.insert( std::make_pair( name, m_programs.size()) ); 00052 m_programs.push_back( program ); 00053 m_program_names.push_back( name ); 00054 assert(m_programs.size() == m_program_names.size()); 00055 return program; 00056 } 00057 00058 //! retrouve un shader program. renvoie eventuellement NULL si le programe n'existe pas. 00059 GLShaderProgram *program( const Name& name ) 00060 { 00061 std::map<Name, int>::iterator found= m_programs_map.find(name); 00062 if(found == m_programs_map.end()) 00063 return NULL; 00064 else 00065 return m_programs[found->second]; 00066 } 00067 00068 //! retouve un shader program. renvoie eventuellement NULL si le programe n'existe pas. 00069 GLShaderProgram *operator[] ( const Name &name ) 00070 { 00071 return program(name); 00072 } 00073 00074 //! cree un shader program opengl a partir d'une section complete. 00075 GLShaderProgram *createShaderProgram( const std::string& program_key ); 00076 }; 00077 00078 } // namespace gk 00079 00080 #endif