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