Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [OS X] Plusieurs fenêtres ouvertes = pas de display ?  (Lu 2774 fois)

0 Membres et 1 Invité sur ce sujet

posva

  • Full Member
  • ***
  • Messages: 118
  • Feed me pls
    • Voir le profil
    • Posva Dev Blog
[OS X] Plusieurs fenêtres ouvertes = pas de display ?
« le: Avril 09, 2012, 11:56:13 am »
Salut!
J'ai un problème quand j'éssaille de créer une deuxième fenetre sous os x, le display ne marche pas correctement. Tout marche bien si on ferme la fenetre avant d'ouvrir une nouvelle et puis quand on ferme cette deuxieme on reouvre la 1ere. Voila un code minimal, j'utilise de l'OpenGL

#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>


void glDrawCube(float size);

int main()
{
    // Create the main window
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL", sf::Style::Default, sf::ContextSettings(32));
    window.setVerticalSyncEnabled(true);


    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(1.f);

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);

    glColor4f(1.f, 1.f, 1.f, 1.f);

    // Create a clock for measuring the time elapsed
    sf::Clock clock;

    // Start game loop
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close window : exit
            if (event.type == sf::Event::Closed)
                window.close();

            // Escape key : exit
            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
                window.close();

if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W)
{
//window.close();
sf::RenderWindow window2(sf::VideoMode(800, 600), "SFML OpenGL", sf::Style::Default, sf::ContextSettings(32));
window2.setVerticalSyncEnabled(true);

// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glClearDepth(1.f);

// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);

glColor4f(1.f, 1.f, 1.f, 1.f);

while (window2.isOpen())
{
sf::Event event2;
while (window2.pollEvent(event2))
{
// Close window : exit
if (event2.type == sf::Event::Closed)
window2.close();

// Escape key : exit
if ((event2.type == sf::Event::KeyPressed) && (event2.key.code == sf::Keyboard::Escape))
window2.close();

// Adjust the viewport when the window is resized
if (event2.type == sf::Event::Resized)
glViewport(0, 0, event2.size.width, event2.size.height);
}

window2.setActive();

// Clear the depth buffer
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

// We get the position of the mouse cursor, so that we can move the box accordingly
float x =  sf::Mouse::getPosition(window2).x * 200.f / window2.getSize().x - 100.f;
float y = -sf::Mouse::getPosition(window2).y * 200.f / window2.getSize().y + 100.f;

// Apply some transformations
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(x, y, -100.f);
glRotatef(clock.getElapsedTime().asSeconds() * 50.f, 1.f, 0.f, 0.f);
glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f);
glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);

glDrawCube(20.f);


// Finally, display the rendered frame on screen
window2.display();


}
//window.create(sf::VideoMode(800, 600), "SFML OpenGL", sf::Style::Default, sf::ContextSettings(32));

// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glClearDepth(1.f);

// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);

glColor4f(1.f, 1.f, 1.f, 1.f);
}

            // Adjust the viewport when the window is resized
            if (event.type == sf::Event::Resized)
                glViewport(0, 0, event.size.width, event.size.height);
        }


        // Activate the window before using OpenGL commands.
        // This is useless here because we have only one window which is
        // always the active one, but don't forget it if you use multiple windows
        window.setActive();

        // Clear the depth buffer
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

        // We get the position of the mouse cursor, so that we can move the box accordingly
        float x =  sf::Mouse::getPosition(window).x * 200.f / window.getSize().x - 100.f;
        float y = -sf::Mouse::getPosition(window).y * 200.f / window.getSize().y + 100.f;

        // Apply some transformations
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(x, y, -100.f);
        glRotatef(clock.getElapsedTime().asSeconds() * 50.f, 1.f, 0.f, 0.f);
        glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f);
        glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);

        glDrawCube(20.f);


        // Finally, display the rendered frame on screen
        window.display();
    }

    return EXIT_SUCCESS;
}


void glDrawCube(float size)
{
glBegin(GL_QUADS);

glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);

glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(0, 1); glVertex3f(-size,  size, size);
glTexCoord2f(1, 1); glVertex3f( size,  size, size);
glTexCoord2f(1, 0); glVertex3f( size, -size, size);

glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
glTexCoord2f(1, 1); glVertex3f(-size,  size,  size);
glTexCoord2f(1, 0); glVertex3f(-size, -size,  size);

glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
glTexCoord2f(0, 1); glVertex3f(size,  size, -size);
glTexCoord2f(1, 1); glVertex3f(size,  size,  size);
glTexCoord2f(1, 0); glVertex3f(size, -size,  size);

glTexCoord2f(0, 1); glVertex3f(-size, -size,  size);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
glTexCoord2f(1, 1); glVertex3f( size, -size,  size);

glTexCoord2f(0, 1); glVertex3f(-size, size,  size);
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
glTexCoord2f(1, 0); glVertex3f( size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size,  size);

glEnd();
}

Si on enleve les commentaires pour fermer et ouvrir les fenetres tout va bien!


merci!

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re : [OS X] Plusieurs fenêtres ouvertes = pas de display ?
« Réponse #1 le: Avril 09, 2012, 12:34:02 pm »
Tu créés la 2e fenêtre dans la boucle de gestion des événements de la 1e. Donc les événement et l'affichage de la 1e fenêtre ne sont plus gérés tant que la 2e fenêtre n'est pas fermée.

Au lieu de ça tu devrais probablement déclarer la 2e fenêtre à l'extérieur des boucles et gérer les événements des deux fenêtres dans la même boucle. De même pour l'affichage, de façon à ce que la 2e fenêtre ne bloque pas la 1e.
Want to play movies in your SFML application? Check out sfeMovie!

posva

  • Full Member
  • ***
  • Messages: 118
  • Feed me pls
    • Voir le profil
    • Posva Dev Blog
Re : [OS X] Plusieurs fenêtres ouvertes = pas de display ?
« Réponse #2 le: Avril 09, 2012, 12:50:18 pm »
Tu créés la 2e fenêtre dans la boucle de gestion des événements de la 1e. Donc les événement et l'affichage de la 1e fenêtre ne sont plus gérés tant que la 2e fenêtre n'est pas fermée.

Au lieu de ça tu devrais probablement déclarer la 2e fenêtre à l'extérieur des boucles et gérer les événements des deux fenêtres dans la même boucle. De même pour l'affichage, de façon à ce que la 2e fenêtre ne bloque pas la 1e.

Ok, merci. même si j'arrive pas à le faire marcher xD. De toutes façons avec une seule fenêtre ouverte c'est bon, c'est le mieux pour mon cas

 

anything