मुझे भी इसी तरह की समस्या थी। यह कष्टप्रद है कि glfwSetWindowUserPointer और glfGetWindowUserPointer का उपयोग करने पर बहुत कम प्रलेखन है। यहाँ आपकी समस्या का समाधान है:
WindowManager::WindowManager() {
// ...
glfwSetUserPointer(window_, this);
glfwSetKeyCallback(window_, key_callback_);
// ...
}
void WindowManager::key_callback(GLFWwindow *window, int, int ,int, int) {
WindowManager *windowManager =
static_cast<WindowManager*>(glfwGetUserPointer(window));
Keyboard *keyboard = windowManager->keyboard_;
switch(key) {
case GLFW_KEY_ESCAPE:
keyboard->reconfigure();
break;
}
}
वैसे भी, क्योंकि यह C ++ कक्षाओं के साथ GLFW का उपयोग करने के लिए शीर्ष परिणामों में से एक है, मैं C ++ वर्ग में एक glfwWindow को एन्कैप्सुलेट करने की अपनी विधि भी प्रदान करूंगा। मुझे लगता है कि यह इसे करने के लिए सबसे सुरुचिपूर्ण तरीका है, क्योंकि यह ग्लोबल्स, सिंगलटन या यूनिक_प्रेटर्स का उपयोग करने से बचता है, प्रोग्रामर को विंडो को बहुत अधिक OO / C ++ - y शैली में हेरफेर करने देता है, और अनुक्रमण (लागत पर) की अनुमति देता है थोड़ा और अधिक अव्यवस्थित हेडर फ़ाइल)।
// Window.hpp
#include <GLFW/glfw3.h>
class Window {
public:
Window();
auto ViewportDidResize(int w, int h) -> void;
// Make virtual you want to subclass so that windows have
// different contents. Another strategy is to split the
// rendering calls into a renderer class.
(virtual) auto RenderScene(void) -> void;
(virtual) auto UpdateScene(double ms) -> void;
// etc for input, quitting
private:
GLFWwindow *m_glfwWindow;
// Here are our callbacks. I like making them inline so they don't take up
// any of the cpp file
inline static auto WindowResizeCallback(
GLFWwindow *win,
int w,
int h) -> void {
Window *window = static_cast<Window*>(glfwGetUserPointer(win));
window->ViewportDidResize(w, h);
}
inline static auto WindowRefreshCallback(
void) -> void {
Window *window = static_cast<Window*>(glfwGetUserPointer(win));
window->RenderScene(void);
}
// same for input, quitting
}
और किसके लिए:
// Window.cpp
#include <GLFW/glfw3.h>
#include "Window.hpp"
Window::Window() {
// initialise glfw and m_glfwWindow,
// create openGL context, initialise any other c++ resources
glfwInit();
m_glfwWindow = glfwCreateWindow(800, 600, "GL", NULL, NULL);
// needed for glfwGetUserPointer to work
glfwSetWindowUserPointer(m_glfwWindow, this);
// set our static functions as callbacks
glfwSetFramebufferSizeCallback(m_glfwWindow, WindowResizeCallback);
glfwSetWindowRefreshCallback(m_glfwWindow, WindowRefreshCallback);
}
// Standard window methods are called for each window
auto
Window::ViewportDidResize(int w, int h) -> void
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
}
यह शायद एक WindowManager / InputManager वर्ग के साथ काफी आसानी से एकीकृत किया जा सकता है, लेकिन मुझे लगता है कि प्रत्येक विंडो को स्वयं प्रबंधित करना आसान है।