Plusieurs fenêtres OpenGL SFML

Comment créer deux fenêtres SFML, puis les dessiner avec OpenGL?

Si vous vous êtes déjà demandé comment créer et utiliser deux fenêtres SFML ou plus avec OpenGL, voici la solution. Je n’ai pas été en mesure de trouver l’information sur la façon de le faire ailleurs sur Internet, alors la voici. J’espère que cela sera utile à quelqu’un, un jour.

En passant, vous voudrez peut-être savoir pourquoi cela pourrait être utile:

C’est une chose très utile pour les physiciens de pouvoir montrer des animations de systèmes à d’autres personnes, car nous voulons souvent programmer une démonstration de quelque chose pour nous aider à l’expliquer. Un exemple sortingvial serait le comportement des particules de gaz dans une boîte. Dans la fenêtre, les particules seraient dessinées et déplacées comme dans le monde réel grâce à nos calculs de physique sophistiqués. Dans l’autre fenêtre, des graphiques pourraient être dessinés pour montrer l’énergie totale à l’intérieur de la boîte ou la vitesse moyenne des particules (température). et d’autres choses semblables. Un autre bon exemple serait une simulation du système solaire. Les données sur les planètes peuvent être dessinées dans une seule fenêtre et une vue du système solaire peut être attirée sur une autre.

Plusieurs étapes sont nécessaires pour que cela fonctionne. Le subtil avec plusieurs fenêtres réside dans le fait que vous devez redimensionner chaque fenêtre avant de la dessiner, ou du moins c’est la manière la plus simple de faire les choses. Avec une fenêtre, vous ne pouvez redimensionner qu’après la création de la fenêtre et à chaque fois qu’elle a été redimensionnée ou modifiée. Vous pourriez faire valoir qu’il existe de meilleures façons de le faire en appuyant sur la stack de masortingces et en la faisant disparaître. Dans ce cas, veuillez commenter et laisser d’autres réponses.

Tout d’abord, vous devez déclarer deux fenêtres sfml, comme prévu: sf::Window window, window2; (Vous devriez probablement vérifier qu’ils sont tous les deux fermés à la fin de l’exécution du programme!)

Deuxièmement, implémentez une méthode de redimensionnement pour les deux. Quelque chose comme ça va faire.

 /// Window glViewport(0, 0, window.GetWidth(), window.GetHeight()); // Set masortingx mode back again glMasortingxMode(GL_PROJECTION); // Reset masortingx stack glLoadIdentity(); // Set drawing surface properties - either Perspective or Orthographic ///gluPerspective(45.0, (double)w / (double)h, 1.0d, 100.0d); glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d); // Put masortingx mode back glMasortingxMode(GL_MODELVIEW); 

Et maintenant l’autre:

 /// Window2, which can be different to window! glViewport(0, 0, window.GetWidth(), window.GetHeight()); // Set masortingx mode back again glMasortingxMode(GL_PROJECTION); // Reset masortingx stack glLoadIdentity(); // Set drawing surface properties - either Perspective or Orthographic ///gluPerspective(45.0, (double)w / (double)h, 1.0d, 100.0d); glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d); // Put masortingx mode back glMasortingxMode(GL_MODELVIEW); 

Vous voudrez peut-être mettre ces deux blocs de code dans deux fonctions différentes et peut-être implémenter une classe de caméras de votre choix. La raison en est que vous devrez appeler la fonction de redimensionnement pour chaque fenêtre avant de la dessiner à l’aide des différentes méthodes de dessin OpenGL.

Maintenant, pour la partie amusante. Avant de dessiner, appelez la méthode de redimensionnement de la fenêtre dans laquelle vous allez dessiner. Ensuite, si vous devez appeler glMasortingxMode(GL_MODELVIEW); (juste au cas où!), glLoadIdentity(); et glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); . Evidemment, si vous ne voulez pas effacer l’écran, n’appelez pas glClear ou glLoadIdentity, si vous ne voulez pas réinitialiser la stack de transformation de masortingce …

Faites maintenant votre dessin: glBegin() et glEnd() et toutes les autres choses à faire.

Enfin, appelez window.Display() ou window2.Display() , en fonction de lequel vous venez de dessiner. Revenez maintenant à la partie amusante ci-dessus, et appelez la méthode de redimensionnement pour l’autre fenêtre, et continuez à faire tout ce que vous devez faire pour cette deuxième fenêtre, exactement comme pour la première!

Profitez maintenant de la programmation OpenGL SFML avec plusieurs fenêtres. Vous voudrez peut-être lancer un chargement de fenêtres dans un vecteur ou un autre conteneur sophistiqué.

[EDIT] Pour une raison quelconque, sf :: Windows ne peut pas être copié, ce qui signifie que vous ne pouvez pas les push_back () dans un conteneur comme un deque ou un vecteur. Cela est probablement dû à certaines choses spécifiques à OpenGL, qui “échoueraient” si vous tentiez de copier tous les bits d’une classe de fenêtre à une autre. (Peut-être?) Au lieu de cela, un sf::Window* = new sf::Window[number_of_windows] et un unsigned int number_of_windows = 2 suffiront, bien que ce ne soit pas aussi agréable …