23 static std::vector<unsigned char> key_states;
26 SDL_Scancode code= SDL_GetScancodeFromKey(key);
27 assert((
size_t) code < key_states.size());
28 return (
int) key_states[code];
32 SDL_Scancode code= SDL_GetScancodeFromKey(key);
33 assert((
size_t) code < key_states.size());
37 static SDL_KeyboardEvent last_key;
45 last_key.keysym.sym= 0;
48 static SDL_TextInputEvent last_text;
58 static std::string last_drop;
59 const char *drop_event( )
61 return last_drop.c_str();
63 void clear_drop_event( )
68 static SDL_MouseButtonEvent last_button;
78 static SDL_MouseWheelEvent last_wheel;
93 int run( Window window,
int (*
draw)() )
96 glViewport(0, 0, width, height);
106 SDL_GL_SwapWindow(window);
116 while(SDL_PollEvent(&event))
120 case SDL_WINDOWEVENT:
122 if(event.window.event == SDL_WINDOWEVENT_RESIZED)
125 width=
event.window.data1;
126 height=
event.window.data2;
127 SDL_SetWindowSize(window, width, height);
130 glViewport(0, 0, width, height);
135 last_drop.assign(event.drop.file);
136 SDL_free(event.drop.file);
141 last_text=
event.text;
146 if((
size_t) event.key.keysym.scancode < key_states.size())
148 key_states[
event.key.keysym.scancode]= 1;
153 if(event.key.keysym.sym == SDLK_ESCAPE)
159 if((
size_t)
event.key.keysym.scancode < key_states.size())
161 key_states[
event.key.keysym.scancode]= 0;
166 case SDL_MOUSEBUTTONDOWN:
167 case SDL_MOUSEBUTTONUP:
168 last_button=
event.button;
172 last_wheel=
event.wheel;
189 if(SDL_Init(SDL_INIT_EVERYTHING | SDL_INIT_NOPARACHUTE ) < 0)
191 printf(
"[error] SDL_Init() failed:\n%s\n", SDL_GetError());
199 Window window= SDL_CreateWindow(
"gKit",
200 SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h,
201 SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
204 printf(
"[error] SDL_CreateWindow() failed.\n");
210 const unsigned char *state= SDL_GetKeyboardState(&keys);
211 key_states.assign(state, state + keys);
213 SDL_SetWindowDisplayMode(window, NULL);
214 SDL_StartTextInput();
217 SDL_GetWindowSize(window, &width, &height);
225 SDL_DestroyWindow(window);
233 void GLAPIENTRY debug( GLenum source, GLenum type,
unsigned int id, GLenum severity, GLsizei
length,
234 const char *message,
const void *userParam )
236 static std::set<std::string> log;
237 if(log.insert(message).second ==
false)
241 if(severity == GL_DEBUG_SEVERITY_HIGH)
242 printf(
"[openGL error]\n%s\n", message);
243 else if(severity == GL_DEBUG_SEVERITY_MEDIUM)
244 printf(
"[openGL warning]\n%s\n", message);
246 printf(
"[openGL message]\n%s\n", message);
258 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
259 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
261 SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
263 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
265 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 15);
266 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
268 Context context= SDL_GL_CreateContext(window);
271 printf(
"[error] creating openGL context.\n");
275 SDL_GL_SetSwapInterval(1);
280 GLenum err= glewInit();
283 printf(
"[error] loading extensions\n%s\n", glewGetErrorString(err));
284 SDL_GL_DeleteContext(context);
289 while(glGetError() != GL_NO_ERROR) {;}
293 if(GLEW_ARB_debug_output)
295 printf(
"debug output enabled...\n");
296 glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
298 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
308 SDL_GL_DeleteContext(context);
Context create_context(Window window, const int major, const int minor)
cree et configure un contexte opengl
SDL_TextInputEvent text_event()
renvoie le dernier evenement. saisie de texte.
SDL_MouseButtonEvent button_event()
renvoie le dernier evenement. etat des boutons de la souris.
float length(const Vector &v)
renvoie la longueur d'un vecteur.
int events(Window window)
fonction interne de gestion d'evenements.
void clear_wheel_event()
desactive l'evenement.
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
void clear_key_event()
desactive l'evenement.
void draw(Mesh &m, const Transform &model, const Transform &view, const Transform &projection, const GLuint texture)
applique une texture a la surface de l'objet. ne fonctionne que si les coordonnees de textures sont f...
int window_width()
renvoie la largeur de la fenetre de l'application.
Window create_window(const int w, const int h)
creation d'une fenetre pour l'application.
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
int window_height()
renvoie la hauteur de la fenetre de l'application.
void release_context(Context context)
detruit le contexte openGL.
void clear_button_event()
desactive l'evenement.
void clear_text_event()
desactive l'evenement.
SDL_KeyboardEvent key_event()
renvoie le dernier evenement. touche speciales.
void release_window(Window window)
destruction de la fenetre.
int run(Window window, int(*draw)(void))
fonction principale. gestion des evenements et appel de la fonction draw de l'application.