gKitGL
App.h
00001 
00002 #ifndef _GK_APP_H
00003 #define _GK_APP_H
00004 
00005 #include "SDLPlatform.h"
00006 
00007 namespace gk {
00008 
00009 //! parametres de creation du contexte openGL.
00010 struct AppSettings
00011 {
00012     int depth_size;     //!< precision du zbuffer.
00013     int double_buffer;  //!< buffers de dessin et d'affichage separes.
00014     int swap_control;   //!< synchronisation de l'affichage avec l'ecran.
00015     
00016     int multi_samples;  //!< sur-echantillonnage, mode msaa
00017     
00018     int major_version;  //!< version openGL.
00019     int minor_version;  //!< version openGL.
00020     unsigned int context_flags; //!< parametres de creation du contexte, debug par exemple.
00021     unsigned int profile_flags; //!< parametres de creation du contexte, core profile par exemple.
00022     
00023     unsigned int flags; //! \todo GK_OPENCL
00024     
00025     //! constructeur par defaut.
00026     AppSettings( )
00027         :
00028         depth_size(16),
00029         double_buffer(1),
00030         swap_control(1),
00031         multi_samples(0),
00032         major_version(0),
00033         minor_version(0),
00034         context_flags(0),
00035         profile_flags(0),
00036         flags(0)
00037     {
00038         //~ flags= flags | SDL_OPENGL | SDL_RESIZABLE;
00039         flags= flags | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
00040     }
00041     
00042     ~AppSettings( ) {}
00043     
00044     //! constructeur par defaut. parametres de la fenetre : fullscreen, resizeable, etc. cf SDL_CreateWindow.
00045     AppSettings( const unsigned int _flags )
00046         :
00047         depth_size(16),
00048         double_buffer(1),
00049         swap_control(1),
00050         multi_samples(0),
00051         major_version(0),
00052         minor_version(0),
00053         context_flags(0),
00054         profile_flags(0),
00055         flags(_flags)
00056     {
00057         flags= flags | SDL_WINDOW_OPENGL;
00058     }
00059     
00060     //! fixe les parametres de la fenetre. cf SDL_CreateWindow.
00061     void setFlags( const unsigned int _flags )
00062     {
00063         flags= _flags | SDL_WINDOW_OPENGL;
00064     }
00065     
00066     //! desactive des parametres de la fenetre. cf SDL_CreateWindow.
00067     void maskFlags( const unsigned int _flags )
00068     {
00069         flags= (flags & ~_flags) | SDL_WINDOW_OPENGL;
00070     }
00071     
00072     //! active le mode plein ecran, au lieu du mode fenetre definit par defaut.
00073     void setFullscreen( )
00074     {
00075         flags= (flags & ~SDL_WINDOW_RESIZABLE) | SDL_WINDOW_FULLSCREEN;
00076         // fullscreen et resizable sont mutuellement exclusifs
00077     }
00078     
00079     //! taux de sur-echantillonnage.
00080     void setSamples( const int samples )
00081     {
00082         multi_samples= samples;
00083     }
00084     
00085     //! precision du zbuffer.
00086     void setDepthBufferSize( const int size )
00087     {
00088         depth_size= size;
00089     }
00090     
00091     //! active (1) /desactive (0) la synchronisation de l'affichage.
00092     void setSwapControl( const int swap= 1 )
00093     {
00094         swap_control= swap;
00095     }
00096     
00097     //! fixe la version openGL du contexte, par exemple setGLVersion(3,3).
00098     void setGLVersion( const int major, const int minor )
00099     {
00100         major_version= major;
00101         minor_version= minor;
00102     }
00103     
00104     //! utilisation interne. fixe les parametres de creation du contexte, cf. SDL_GL_SetAttribute.
00105     void setGLContextFlags( const unsigned int flags )
00106     {
00107         context_flags= flags;
00108     }
00109     
00110     //! utilisation interne. fixe les parametres du type de contexte (compatibility, debug, etc.), cf. SDL_GL_SetAttribute.
00111     void setGLProfileFlags( const unsigned int flags )
00112     {
00113         profile_flags= flags;
00114     }
00115     
00116     //! demande la creation d'un contexte debug.
00117     void setGLDebugContext( )
00118     {
00119         setGLContextFlags(context_flags | SDL_GL_CONTEXT_DEBUG_FLAG);
00120     }
00121     
00122     //! demande la creation d'un contexte core profile.
00123     void setGLCoreProfile( )
00124     {
00125         setGLProfileFlags(profile_flags | SDL_GL_CONTEXT_PROFILE_CORE);
00126     }
00127    
00128     //! demande la creation d'un contexte openGL ES 1/2.
00129     void setGLESProfile( const int major )
00130     {
00131         setGLProfileFlags(profile_flags | SDL_GL_CONTEXT_PROFILE_ES);
00132     }
00133     
00134     //! utilisation interne. 
00135     void apply( ) const;
00136 };
00137 
00138     
00139 //! application de base SDL + openGL. 
00140 //! consultez le <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/index.html">libSDL Programming Guide</a> 
00141 class App
00142 {
00143 protected:
00144     SDL_Window *m_window;
00145     SDL_GLContext m_gl_context;
00146 
00147     unsigned char *m_key_state;
00148     unsigned int *m_key_map;
00149 
00150     int m_width, m_height;
00151     SDL_bool m_fullscreen;
00152     int m_stop;
00153 
00154     App( const App& );
00155     App& operator=( const App& );
00156 
00157     int createGLContext( const AppSettings& settings );
00158 
00159 public:
00160     //! \name initialisation manuelle de l'application.
00161     // @{
00162     //! construction d'une application par defaut (non initialisee, pas de contexte opengl, pas de fenetre, appeller createWindow() pour initialiser opengl).
00163     App( );
00164 
00165     //! cree une fenetre de dimension w x h et termine l'initialisation.
00166     int createWindow( const int w, const int h, const AppSettings& flags= AppSettings() );
00167 
00168     //! \name initialisation complete de l'application.
00169     // @{
00170     //! construction d'une application.
00171     //! \param w largeur de la fenetre
00172     //! \param h largeur de la fenetre
00173     App( const int w, const int h, const AppSettings& flags= AppSettings() );
00174     // @}
00175 
00176     //! destruction de l'application.
00177     virtual ~App( );
00178 
00179     //! redimensionne la fenetre.
00180     int resizeWindow( const int w, const int h );
00181     
00182     //~ //! passe en plein ecran
00183     //~ int setFullscreen( const int flag );
00184     //~ //! bacule plein ecran/mode fenetre
00185     //~ int toggleFullscreen( );
00186 
00187     //! renvoie les dimensions de la fenetre
00188     int windowWidth( ) const
00189     {
00190         return m_width;
00191     }
00192 
00193     //! renvoie les dimensions de la fenetre
00194     int windowHeight( ) const
00195     {
00196         return m_height;
00197     }
00198     
00199     //! indique si la fenetre est fermee.
00200     bool isClosed( );
00201 
00202     //! demander a fermer la fenetre.
00203     void close( );
00204     
00205     //! demande a afficher l'image construite par opengl
00206     void swap( );
00207     
00208     //! traitement des evenements systemes : clavier, souris, fenetre, etc.
00209     bool processEvents( );
00210 
00211     //! \name interception des evenements clavier / souris / redimensionnement.
00212     //! App fournit une implementation par defaut qui ne fait rien 
00213     //! (les evenements sont reellement traites par processEvents()).
00214     //! a deriver, pour integrer nvWidgets, par exemple.
00215     
00216     // @{
00217     //! traitement des redimensionnements de la fenetre de l'application.
00218     virtual void processWindowResize( SDL_WindowEvent& event )
00219     {
00220         return;
00221     }
00222     
00223     //! traitement des clicks souris.
00224     virtual void processMouseButtonEvent( SDL_MouseButtonEvent& event )
00225     {
00226         return;
00227     }
00228     
00229     //! traitement des deplacements de la souris.
00230     virtual void processMouseMotionEvent( SDL_MouseMotionEvent& event )
00231     {
00232         return;
00233     }
00234     
00235     //! traitement des evenements claviers.
00236     virtual void processKeyboardEvent( SDL_KeyboardEvent& event )
00237     {
00238         return;
00239     }
00240     // @}
00241     
00242     //! renvoie le tableau d'etat des touches du clavier.
00243     /*! permet de connaitre l'etat d'une touche. 
00244             le code ascii ou l'identifiant SDLK_xxx peuvent etre utilises comme indices dans le tableau. \n
00245             la liste des codes est dans <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/sdlkey.html">libSDL Programming Guide</a> 
00246 
00247             exemple : getKeys()['a'], ou getKeys()[SDLK_UP]
00248      */
00249     unsigned char *getKeys( );
00250 
00251     //! renvoie l'etat d'une touche selon son code ascii ou son identifiant SDLK_xxx. 
00252     //! la liste des codes est dans <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/sdlkey.html">libSDL Programming Guide</a> 
00253     /*! exemple : key('a'), ou key(SDLK_UP)
00254     
00255         la fonction renvoie une reference, on peut l'utiliser pour desactiver manuellement 
00256         une touche lorsque l'action a ete traitee et que l'on ne souhaite pas la re-executer a chaque image.
00257     
00258         \code
00259 if(key('a')) {
00260     printf("a\n"); 
00261     key('a')= 0; 
00262 }
00263         \endcode
00264      */
00265     unsigned char& key( const unsigned int key );
00266 
00267     //! \name encapsulation de la boucle principale
00268     //! deriver de App pour construire une nouvelle application.
00269 
00270     // @{
00271     //! appele apres l'initialisation complete de App et la creation du device.
00272     //! a redefinir en derivant App.
00273     //! doit renvoyer -1 en cas d'echec. 
00274     virtual int init( ) { return 0; }
00275 
00276     //! demarre la boucle principale.
00277     //! App fournit une version complete, il n'est pas necessaire de la redefinir.
00278     virtual int run( );
00279 
00280     //! appele avant la fermeture de l'application.
00281     //! a redefinir en derivant App.
00282     //! doit renvoyer -1 en cas d'echec. 
00283     virtual int quit( ) { return 0; }
00284 
00285     //! appele regulierement pour mettre a jour la scene (animations, deplacements, etc.).
00286     //! \param time millisecondes ecoulees depuis le lancement,
00287     //! \param delta millisecondes ecoulees depuis l'appel precedent.
00288     //! a redefinir en derivant App.
00289     //! doit renvoyer 0 pour sortir de la boucle principale, ou 1 pour continuer.
00290     virtual int update( const int time, const int delta ) { return 1; }
00291     
00292     //! appele regulierement pour afficher la scene.
00293     //! a redefinir en derivant App.
00294     //! doit renvoyer 0 pour sortir de la boucle principale, ou 1 pour continuer.
00295     virtual int draw( ) { return 1; }
00296     // @}
00297 };
00298 
00299 }
00300 
00301 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerator Friends