Partage
  • Partager sur Facebook
  • Partager sur Twitter

[GLFW] - Coordonnées curseur via callback

Récupérer via click

    1 février 2019 à 1:26:04

    Bonjour,

    Voici le problème que je rencontre:

    J'utilise GLFW 3.2.1 pour faire un petit programme qui crée des points sur ma fenêtre quand on clique dessus.

    Le hic, c'est que je n'arrive pas à récupérer les coordonnées du clic. Dans mon programme j'utilise la fonction:

    glfwSetMouseButtonCallback(window, callback)

    C'est justement ça le problème, dans la fonction de callback j'utilise :

    glfwGetCursorPos(window, &int, &int);

    pour avoir les coordonnées du click. Je voudrais ensuite créer une instance de ma classe Point et l'ajouter à un vecteur.

    Il y a un soucis de scope car je ne sais pas comment accéder aux deux int de GetCursorPos.

    J'avais envisagé de passer une lambda à la place du callback en capturant le vecteur, mais j'ai une erreur de type : "No matching function for call to 'glfwSetMouseButtonCallback'" à la ligne 19. Voici le code de mon main.cpp :

    int main(void){
        if (!glfwInit())
        {
            std::cout<<"INIT KO\n";
        }
    
        glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
    
        GLFWwindow* window = glfwCreateWindow(1000, 750, "My Title", NULL, NULL);
        if (!window)
        {
            std::cout<<"WINDOW CREATED KO\n";
        }
        std::vector<Point> v;
    
        glfwMakeContextCurrent(window);
        glfwSetMouseButtonCallback(window, [&v](GLFWwindow* window, int button, int action, int mods) { //ERREUR ICI
            double xpos, ypos;
            if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
                glfwGetCursorPos(window, &xpos, &ypos);
                Point *p = new Point((float) xpos, (float) ypos);
                v.push_back(&p); //J'ai aussi une erreur similaire ici
                std::cout << "Click ! : "<<xpos<<", "<<ypos<<"\n";
            }
        });
    
        while (!glfwWindowShouldClose(window))
        {
            //Poll for and process events
            glfwPollEvents();
        }
    
        glfwTerminate();
        return 0;
    
    }

    Je voudrais savoir si vous aviez des suggestions pour pouvoir créer mes points à partir d'un click utilisateur.

    Merci d'avoir lu ! :D

    -
    Edité par VincentMaquiaba 1 février 2019 à 19:54:50

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2019 à 3:59:15

      Lu, 

      Les lambda ont des types qui varient en fonction du compilateur, du coup leurs types ne correspondent pas à ce que glfw attend. 

      Sinon il existe 2 fonctions qui pourraient t'aider: glfwSetWindowUserPointer et glfwGetWindowUserPointer. A utiliser de cette manière :

      glfwSetWindowUserPointer(window, &v);
      
      // Dans le callback
      
      auto points = static_cast<std::vector<Point>*>(glfwGetWindowUserPointer(window));
      
      assert(points);
      
      points->push_back(Point{static_cast<float>(xpos), static_cast<float>(ypos)});


      Sinon les pointeurs nus et les cast C-style ne sont pas terribles... 

      -
      Edité par eugchriss 2 février 2019 à 8:26:47

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

      [GLFW] - Coordonnées curseur via callback

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown