Callback method von GLFW window beim Schliessen (glfwSetWindowCloseCallback)
-
Hey Leute!
Ist es moeglich die GLFW FunktionglfwSetWindowCloseCallback (GLFWwindow *window, GLFWwindowclosefun cbfun)
http://www.glfw.org/docs/latest/group__window.html#gaade9264e79fae52bdb78e2df11ee8d6a
mit einem Callback in einer Klasse so aufzurufen, dass man im Callback auf die Klassen-Memberattribute zugreifen kann?
In meinem konkreten Beispiel:
class Frame { public: Frame() { glfwSetWindowCloseCallback(m_window, [this](GLFWwindow* m_window) { this->setWindowShouldClose(true) }); // Das Probkem ist das "[this]", da glfwSetWindowCloseCallback dies nicht zulaesst. } ~Frame(){} GLFWwindow* m_window; // glfwSetWindowShouldClose ist fuer mich keine Option! inline void setWindowShouldClose(bool windowShouldClose) { m_windowShouldClose = true; } inline bool windowShouldClose() const { return m_windowShouldClose; } private: bool m_windowShouldClose; }
Kann ich irgendwie eine Referenz auf das Frame Object an die Callback Funktion uebergeben, ohne gegen die glfwSetWindowCloseCallback Funktionsdefinition zu verstossen? (statische Member sind keine Option!)
Danke fier eure Hilfe!
-
Da GLFW keine 'UserData'-Parameter unterstützt, geht das direkt nicht.
Wenn du nur ein Frame-Objekt hast, dann kannst du einfach ein statisches Frame-Objekt anlegen und mittels diesem darauf zugreifen.
Bei mehreren Frame-Objekten kannst du eine statische Map dafür anlegen:static std::map<GLFWwindow*, Frame*> mapFrames;
und vor dem Callback füllen
mapFrames.Add(m_window, this);
Und in der (statischen) Callback-Funktion entsprechend auslesen:
Frame *frame = mapFrames[window];
-
Th69 schrieb:
Da GLFW keine 'UserData'-Parameter unterstützt, geht das direkt nicht.
Wenn du nur ein Frame-Objekt hast, dann kannst du einfach ein statisches Frame-Objekt anlegen und mittels diesem darauf zugreifen.
Bei mehreren Frame-Objekten kannst du eine statische Map dafür anlegen:Okay, das mit der statischen Map duerfte funktionieren.
Danke fuer den Loesungsansatz, allein waer ich da wahrscheinlich nicht mehr drauf gekommen.
-
Habe jetzt eine schönere Lösung gefunden, die ohne statische std::map funktioniert!
Wenn man eine eigene Window class hat, die den Code von GLFW abstrahiert, kann man einen Pointer zur Instanz des eigenen Windows and das GLFWwindow koppeln.Dazu verwendet man:
// void glfwSetWindowUserPointer(GLFWwindow*, OwnWindowClass*); glfwSetWindowUserPointer(m_window, this);
Eigene Window-Class-Instanz zurückerhalten:
// void* glfwGetWindowUserPointer(GLFWwindow*); OwnWindowClass* ownWindow = glfwGetWindowUserPointer(m_window);
-
@rnholzinger01 Hab ich auch so
glfwSetWindowUserPointer(window, this);
Sehe aber gerade, dass ich in den statischen Memberfunktionen bisher Membervariablen gar nicht brauche.
Sehe aber gerade, dass ich Membervariablen bisher gar nicht brauche.Praktisch finde ich mit OpenGL auch
glEnable(GL_DEBUG_OUTPUT)
auch mit Callback FunktionspointerglDebugMessageCallback(&DebugCallback, this)
Was sind denn dass für Membervariablen die du beim schliessen brauchst? Habe zwar auch eine Klasse für GLFW geschrieben, habe aber nur
GLFWwindow* window
als Membervariable. Sonst brauche ich nur gl... Funktionen und glew wird noch initialisiert.