16/17

9. Evènements

Les évènements correspondent à la demande d’une action dont l’instant ne peut pas être prévu à l’avance. Les évènements sont typiquement liés aux actions de l’utilisateur telles que l’utilisation de la souris ou du clavier, et peuvent, n’être jamais exécutés, ou exécutées de nombreuses fois à différents instants et avec différents paramètres. Le type de programmation permettant de gérer ce type d’évènement est appelé la programmation evènementielle (events based programming).

L’objectif général de la programmation évènementielle est de lier la réception d’un évènement au lancement d’une action, généralement codée comme une fonction spécifique. La programmation évènementielle est souvent décrite suivant le principe suivant

  • Un écouteur (listener) est mis en place sur un évènement particulier (ex. déplacement de souris, touche de clavier, etc.)

  • Une fois l’évènement détecté, l’écouteur lance la réponse en appelant une fonction d’action.

Les fonctions d’actions sont souvent appelées Callback Functions. D’une manière générale, les callback functions sont des fonctions passées en paramètres d’autre fonction dont le rôle est de les appeler sous certaines conditions.

Évènements en GLFW

GLFW peut gérer nativement un certain nombre d’écouteurs (input events).

Ex. Code mettant en place un écouteur sur la position du curseur et un callback sur une fonction nommée cursor_position_callback

glfwSetCursorPosCallback(window, cursor_position_callback );

En pratique, à chaque fois que le curseur est déplacé (ex. la souris est déplacée, ou le touchpad est activé), la fonction cursor_position_callback est appelée.

Dans ce cas, la fonction de callback cursos_position_callback recoit trois paramètres: le pointeur sur la fenêtre courante, et les positions \(x\) et \(y\) du curseur dans la fenêtre (exprimé en pixels).

Application à la translation

Le code suivant utilise la détection de la position du curseur pour modéliser une translation du point de vue de la caméra (ou similairement une translation (inverse) de la forme) suivant les coordonnées \((x,y)\).

// Function called every time the mouse is moved
void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)
{
    const bool mouse_click_left   = (glfwGetMouseButton(window,GLFW_MOUSE_BUTTON_LEFT )==GLFW_PRESS);
    if(mouse_click_left)
    {
        tr_x += 0.0025*(xpos-x_prev);
        tr_y -= 0.0025*(ypos-y_prev);
    }

    x_prev = xpos;
    y_prev = ypos;
}

Exécutez le code et observez la translation en utilisant la souris (gardez le bouton gauche pressé et déplacez la souris).

Notez que le vecteur de translation est passé en tant que paramètre uniform au shader.

Exercise

Utilisez l’écouteur sur le clavier pour modifier la couleur de la forme à chaque fois que l’utilisateur appuie sur la touche c.